diff mbox

xen/arm64: Fix incorrect memory region size in TCR2_EL2

Message ID 1457645293-4625-1-git-send-email-shankerd@codeaurora.org (mailing list archive)
State New, archived
Headers show

Commit Message

Shanker Donthineni March 10, 2016, 9:28 p.m. UTC
The maximum and minimum values for T0SZ depend on level of
translation as per AArch64 Virtual Memory System Architecture.
The current code sets T0SZ to zero in TCR2_EL2 which is not
valid and also might see unexpected behavior on some CPUs.

This patch sets T0SZ to (64-48)bits since XEN uses all 4 levels
to cover 48bit (256TB) virtual address space.

Signed-off-by: Shanker Donthineni <shankerd@codeaurora.org>
---
 xen/arch/arm/arm64/head.S | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Julien Grall March 12, 2016, 1:13 p.m. UTC | #1
Hi Shanker,

On 11/03/2016 04:28, Shanker Donthineni wrote:
> The maximum and minimum values for T0SZ depend on level of
> translation as per AArch64 Virtual Memory System Architecture.
> The current code sets T0SZ to zero in TCR2_EL2 which is not

s/TCR2_EL2/TCR_EL2/

> valid and also might see unexpected behavior on some CPUs.

Can you provide more details?

I looked at the specification, programming the field T0SZ to 0 is valid 
(see D4-1463 ARM DDI 0487A.b):

"For a stage 1 translation
The minimum TxSZ value is 16. If TxSZ is programmed to a value smaller 
than 16 then the implementation behaves as if the field were programmed 
to 16 for all purposes other than reading back the value of the field."

> This patch sets T0SZ to (64-48)bits since XEN uses all 4 levels
> to cover 48bit (256TB) virtual address space.
>
> Signed-off-by: Shanker Donthineni <shankerd@codeaurora.org>
> ---
>   xen/arch/arm/arm64/head.S | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S
> index 19fa2bb..28ee404 100644
> --- a/xen/arch/arm/arm64/head.S
> +++ b/xen/arch/arm/arm64/head.S
> @@ -343,7 +343,7 @@ skip_bss:
>            * PT walks use Inner-Shareable accesses,
>            * PT walks are write-back, write-allocate in both cache levels,
>            * Full 64-bit address space goes through this table. */

This comment is no longer valid with your changes. Please update it.

> -        ldr   x0, =(TCR_RES1|TCR_SH0_IS|TCR_ORGN0_WBWA|TCR_IRGN0_WBWA|TCR_T0SZ(0))
> +        ldr   x0, =(TCR_RES1|TCR_SH0_IS|TCR_ORGN0_WBWA|TCR_IRGN0_WBWA|TCR_T0SZ(64-48))
>           /* ID_AA64MMFR0_EL1[3:0] (PARange) corresponds to TCR_EL2[18:16] (PS) */
>           mrs   x1, ID_AA64MMFR0_EL1
>           bfi   x0, x1, #16, #3
>

Regards,
Shanker Donthineni March 14, 2016, 2:37 p.m. UTC | #2
HI Jullen,

On 03/12/2016 07:13 AM, Julien Grall wrote:
> Hi Shanker,
>
> On 11/03/2016 04:28, Shanker Donthineni wrote:
>> The maximum and minimum values for T0SZ depend on level of
>> translation as per AArch64 Virtual Memory System Architecture.
>> The current code sets T0SZ to zero in TCR2_EL2 which is not
>
> s/TCR2_EL2/TCR_EL2/
>

Sorry for typo, I will fix in next patch

>> valid and also might see unexpected behavior on some CPUs.
>
> Can you provide more details?
>

We are not able to boot XEN on Qualcomm platforms and CPU hung after
after executing this line of ASM code.

> I looked at the specification, programming the field T0SZ to 0 is valid
> (see D4-1463 ARM DDI 0487A.b):
>
> "For a stage 1 translation
> The minimum TxSZ value is 16. If TxSZ is programmed to a value smaller
> than 16 then the implementation behaves as if the field were programmed
> to 16 for all purposes other than reading back the value of the field."
>

The behavior of T0SZ=0 is described in ARM spec (DDI0487A_h, page 1752). Still I think setting
the T0SZ to 48bit is the right fix similar to LINUX KVM64 EL2 code.

For a stage 1 translation
The minimum TxSZ value is 16. If TxSZ is programmed to a value smaller than 16 then it is
IMPLEMENTATION DEFINED whether:

• The implementation behaves as if the field were programmed to 16 for all purposes other than
reading back the value of the field.

• Any use of the TxSZ value generates a stage 1 Level 0 Translation fault.


>> This patch sets T0SZ to (64-48)bits since XEN uses all 4 levels
>> to cover 48bit (256TB) virtual address space.
>>
>> Signed-off-by: Shanker Donthineni <shankerd@codeaurora.org>
>> ---
>>   xen/arch/arm/arm64/head.S | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S
>> index 19fa2bb..28ee404 100644
>> --- a/xen/arch/arm/arm64/head.S
>> +++ b/xen/arch/arm/arm64/head.S
>> @@ -343,7 +343,7 @@ skip_bss:
>>            * PT walks use Inner-Shareable accesses,
>>            * PT walks are write-back, write-allocate in both cache levels,
>>            * Full 64-bit address space goes through this table. */
>
> This comment is no longer valid with your changes. Please update it.
>

Sure, I will change to 48bit virtual address space.
>> -        ldr   x0, =(TCR_RES1|TCR_SH0_IS|TCR_ORGN0_WBWA|TCR_IRGN0_WBWA|TCR_T0SZ(0))
>> +        ldr   x0, =(TCR_RES1|TCR_SH0_IS|TCR_ORGN0_WBWA|TCR_IRGN0_WBWA|TCR_T0SZ(64-48))
>>           /* ID_AA64MMFR0_EL1[3:0] (PARange) corresponds to TCR_EL2[18:16] (PS) */
>>           mrs   x1, ID_AA64MMFR0_EL1
>>           bfi   x0, x1, #16, #3
>>
>
> Regards,
>
Julien Grall March 14, 2016, 2:58 p.m. UTC | #3
On 14/03/16 14:37, Shanker Donthineni wrote:
> HI Jullen,

Hi Shanker,

> On 03/12/2016 07:13 AM, Julien Grall wrote:
>> Hi Shanker,
>>
>> On 11/03/2016 04:28, Shanker Donthineni wrote:
>>> The maximum and minimum values for T0SZ depend on level of
>>> translation as per AArch64 Virtual Memory System Architecture.
>>> The current code sets T0SZ to zero in TCR2_EL2 which is not
>>
>> s/TCR2_EL2/TCR_EL2/
>>
>
> Sorry for typo, I will fix in next patch
>
>>> valid and also might see unexpected behavior on some CPUs.
>>
>> Can you provide more details?
>>
>
> We are not able to boot XEN on Qualcomm platforms and CPU hung after
> after executing this line of ASM code.
>
>> I looked at the specification, programming the field T0SZ to 0 is valid
>> (see D4-1463 ARM DDI 0487A.b):
>>
>> "For a stage 1 translation
>> The minimum TxSZ value is 16. If TxSZ is programmed to a value smaller
>> than 16 then the implementation behaves as if the field were programmed
>> to 16 for all purposes other than reading back the value of the field."
>>
>
> The behavior of T0SZ=0 is described in ARM spec (DDI0487A_h, page 1752). Still I think setting
> the T0SZ to 48bit is the right fix similar to LINUX KVM64 EL2 code.
>
> For a stage 1 translation
> The minimum TxSZ value is 16. If TxSZ is programmed to a value smaller than 16 then it is
> IMPLEMENTATION DEFINED whether:
>
> • The implementation behaves as if the field were programmed to 16 for all purposes other than
> reading back the value of the field.
>
> • Any use of the TxSZ value generates a stage 1 Level 0 Translation fault.

Sorry, I was looking at an older version of the ARM ARM where only a 
single possible behavior was described. So this change looks valid to me.

Can you please mention the version and the section of the spec in the 
commit message?

Regards,
diff mbox

Patch

diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S
index 19fa2bb..28ee404 100644
--- a/xen/arch/arm/arm64/head.S
+++ b/xen/arch/arm/arm64/head.S
@@ -343,7 +343,7 @@  skip_bss:
          * PT walks use Inner-Shareable accesses,
          * PT walks are write-back, write-allocate in both cache levels,
          * Full 64-bit address space goes through this table. */
-        ldr   x0, =(TCR_RES1|TCR_SH0_IS|TCR_ORGN0_WBWA|TCR_IRGN0_WBWA|TCR_T0SZ(0))
+        ldr   x0, =(TCR_RES1|TCR_SH0_IS|TCR_ORGN0_WBWA|TCR_IRGN0_WBWA|TCR_T0SZ(64-48))
         /* ID_AA64MMFR0_EL1[3:0] (PARange) corresponds to TCR_EL2[18:16] (PS) */
         mrs   x1, ID_AA64MMFR0_EL1
         bfi   x0, x1, #16, #3