[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [RFC PATCH v2 6/8] arm/mem_access: Add long-descriptor based gpt



Hi Julien,

[...]

>
>> +        {
>> +            input_size = REGISTER_WIDTH_64_BIT - t0_sz;
>> +
>> +            if ( input_size > IPS_MAX )
>> +                /* We limit the input_size to be max 48 bit. */
>> +                input_size = IPS_MAX;
>> +            else if ( input_size < IPS_MIN )
>> +                /* We limit the input_size to be max 25 bit. */
>> +                input_size = IPS_MIN;
>
> like this could be simplified by using min/max. But I think we should
> bail out here. Likely something in the page table is wrong and
> ignoring is the worst thing to do.
>
> For instance ARMv8.2 has extended the input size to 52 bits. It would
> be difficult to catch what is missing because of that, not mentioning
> that the only caller today will be memaccess that is not enabled by
> default.
>

Agreed.

>> +
>> +            /* Normalize granule size. */
>
> I think 0, 1, 2 is more confusing to read. It would be better to use
> directly TCR_TG0_*.
>

I agree, however the ARM architecture uses different granularity
encodigs for TG0 and TG1. That is the values for (tcr & TCR_TG0_MASK) >>
TCR_TG0_SHIFT are different for the same granularity (e.g. shifted
TCR_TG0_4K == 0x0 vs. TCR_EL1_TG1_4K == 0x2).


Because of this, we won't be able to use TCR_TG0_* and TCR_TG1_*
directly. It would be probably easier to read/review the code if a part
of this functionality would be in a separate function (e.g.
get_granularity()), though. I will see what I can do at this point.

>> +            switch ( tcr & TCR_TG0_MASK ) {
>> +            case TCR_TG0_16K:
>> +                gran = 1;
>> +                break;
>> +            case TCR_TG0_64K:
>> +                gran = 2;
>> +                break;
>> +            default:
>> +                gran = 0;
>> +            } > +
>> +            /* Use TTBR0 for GVA to IPA translation. */
>> +            ttbr = READ_SYSREG64(TTBR0_EL1);
>> +
>> +            /* If TCR.EPD0 is set, translations using TTBR0 are
>> disabled. */
>> +            disabled = ( tcr & TCR_EPD0 ) ? 1 : 0;
>> +        }
>> +        else
>> +        {
>> +            input_size = REGISTER_WIDTH_64_BIT - t1_sz;
>> +
>> +            if ( input_size > IPS_MAX )
>> +                /* We limit the input_size to be max 48 bit. */
>> +                input_size = IPS_MAX;
>> +            else if ( input_size < IPS_MIN )
>> +                /* We limit the input_size to be max 25 bit. */
>> +                input_size = IPS_MIN;
>> +
>> +            /* Normalize granule size. */
>> +            switch ( tcr & TCR_TG1_MASK ) {
>> +            case TCR_TG1_16K:
> If you shift your tcr by TCR_TG1_SHIFT then all this code can become
> generic. Avoiding duplication, reviewing twice similar code and
> potential bug.

Please see my comment above.

[...]

Cheers,
~Sergej


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.