On 26.07.21 12:05, Dongjiu Geng wrote:
> According to spec, the {I}PS should be never larger
> than the CPU hardware implemented physical address
> size(ID_AA64MMFR0_EL1.PARange). Otherwise, it
> may lead to some unexpected issues.
> 
> we can refer to DDI0487G_a_armv8_arm's description below:
> If {I}PS is programmed to a value larger than the
> implemented PA size, then the PE behaves as if programmed
> with the implemented PA size, but software must not rely
> on this behavior. That is, the output address size is never
> largerthan the implemented PA size.
> 
> Signed-off-by: Dongjiu Geng <[email protected]>
> ---
> DDI0487G_a_armv8_arm: Physical address size implementation options
> ID_AA64MMFR0_EL1.PARange Total  PA size PA address size
>         0000                     4GB    32 bits, PA[31:0]
>         0001                     64GB   36 bits, PA[35:0]
>         0010                     1TB    40 bits, PA[39:0]
>         0011                     4TB    42 bits, PA[41:0]
>         0100                     16TB   44 bits, PA[43:0]
>         0101                     256TB  48 bits, PA[47:0]
>         0110                     4PB    52 bits, PA[51:0]
> ---
>  hypervisor/arch/arm64/entry.S              | 14 +++++++++++++-
>  hypervisor/arch/arm64/include/asm/paging.h |  5 +++++
>  2 files changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/hypervisor/arch/arm64/entry.S b/hypervisor/arch/arm64/entry.S
> index 3f4ee871..99738f28 100644
> --- a/hypervisor/arch/arm64/entry.S
> +++ b/hypervisor/arch/arm64/entry.S
> @@ -388,6 +388,16 @@ el1_trap:
>       isb
>  .endm
>  
> +/*
> + * set TCR.(I)PS to the highest supported ID_AA64MMFR0_EL1.PARange value
> + */
> +.macro tcr_compute_pa_size, tcr
> +     mrs     x9, id_aa64mmfr0_el1
> +     // Narrow PARange to fit the PS field in TCR_ELx
> +     ubfx    x9, x9, #ID_AA64MMFR0_PARANGE_SHIFT, #3
> +     bfi     \tcr, x9, #TCR_PS_SHIFT, #3
> +.endm
> +

Why a macro, why not inlined?

>  /*
>   * These are the default vectors. They are used on early startup and if no
>   * Spectre v2 mitigation is available.
> @@ -460,8 +470,10 @@ enable_mmu_el2:
>       ldr     x1, =(T0SZ(48) | (TCR_RGN_WB_WA << TCR_IRGN0_SHIFT)     \
>                              | (TCR_RGN_WB_WA << TCR_ORGN0_SHIFT)     \
>                              | (TCR_INNER_SHAREABLE << TCR_SH0_SHIFT) \
> -                            | (PARANGE_48B << TCR_PS_SHIFT)          \
>                              | TCR_EL2_RES1)
> +
> +     tcr_compute_pa_size x1
> +

So this is aiming at devices that have less than 48 bits parange, right?
Did you stumble over such a hardware? Or is this rather about devices
having more than 48 bits? Sorry, still trying to understand the details.

>       msr     tcr_el2, x1
>  
>       msr     ttbr0_el2, x0
> diff --git a/hypervisor/arch/arm64/include/asm/paging.h 
> b/hypervisor/arch/arm64/include/asm/paging.h
> index 932dbb50..1b588aad 100644
> --- a/hypervisor/arch/arm64/include/asm/paging.h
> +++ b/hypervisor/arch/arm64/include/asm/paging.h
> @@ -144,6 +144,11 @@
>                               | S1_PTE_FLAG_NORMAL | PTE_INNER_SHAREABLE\
>                               | S1_PTE_ACCESS_EL0)
>  
> +/**
> + * Memory Model Feature Register 0
> + */
> +#define ID_AA64MMFR0_PARANGE_SHIFT   0
> +
>  /* Macros used by the core, only for the EL2 stage-1 mappings */
>  #define PAGE_FLAG_FRAMEBUFFER        S1_PTE_FLAG_DEVICE
>  #define PAGE_FLAG_DEVICE     S1_PTE_FLAG_DEVICE
> 

Jan

-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/07afe6db-18e4-8dce-a4f2-434bde1afe44%40siemens.com.

Reply via email to