On 1 October 2015 at 19:44, Edgar E. Iglesias <edgar.igles...@xilinx.com> wrote:
> On Wed, Sep 23, 2015 at 09:55:05AM -0700, Peter Maydell wrote:
>> This isn't right -- the XN bit controls executability and the
>> S2AP bits don't affect it at all. I think you want:
>>
>>     int prot_rw = 0;
>>     if (s2ap & 1) {
>>         prot_rw |= PAGE_READ;
>>     }
>>     if (s2ap & 2) {
>>         prot_rw |= PAGE_WRITE;
>>     }
>>     if (!xn) {
>>         prot_rw |= PAGE_EXEC;
>>     }
>
>
> Thanks, this was the stuff I was worried about when we talked about it
> last time. I've got the following now which seems to be the same as
> you suggest:
>
> static int get_S2prot(CPUARMState *env, int s2ap, int xn)
> {
>     int prot;
>
>     prot = s2ap & 1 ? PAGE_READ : 0;
>     prot |= s2ap & 2 ? PAGE_WRITE : 0;
>     if (!xn) {
>         prot |= PAGE_EXEC;
>     }
>     return prot;
> }
Yep, that's the right logic, though it seems a bit odd not
to consistently use either 'if' or '?:' for all 3 bits.

thanks
-- PMM

Reply via email to