|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1] xen/arm: AArch32-V8R: Add MPU register definitions
Hi Ayan,
> On 25 Apr 2025, at 13:00, Ayan Kumar Halder <ayankuma@xxxxxxx> wrote:
>
> Hi Julien,
>
> cc-ed Luca for feedback on specific points.
>
> On 18/04/2025 05:54, Julien Grall wrote:
>> Hi Ayan,
>>
>> On 18/04/2025 00:55, Ayan Kumar Halder wrote:
>>> Add the definitions for HPRBAR<0..31>, HPRLAR<0..31> and HPRENR.
>>> The definitions are taken from ARM DDI 0568A.c ID110520, E2.2.3 HPRBAR<n>,
>>> E2.2.4 HPRENR and E2.2.6 HPRLAR<n>.
>>>
>>> Introduce pr_t typedef which is a structure having the prbar and prlar
>>> members,
>>> each being structured as the registers of the AArch32-V8R architecture.
>>> This is the arm32 equivalent of
>>> "arm/mpu: Introduce MPU memory region map structure".
>>>
>>> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx>
>>> ---
>>> This patch should be applied after
>>> "[PATCH v3 0/7] First chunk for Arm R82 and MPU support" in order to enable
>>> compilation for AArch32.
>>>
>>> xen/arch/arm/include/asm/arm32/mpu.h | 59 +++++++++++
>>> xen/arch/arm/include/asm/mpu.h | 4 +
>>> xen/arch/arm/include/asm/mpu/cpregs.h | 135 ++++++++++++++++++++++++++
>>> 3 files changed, 198 insertions(+)
>>> create mode 100644 xen/arch/arm/include/asm/arm32/mpu.h
>>>
>>> diff --git a/xen/arch/arm/include/asm/arm32/mpu.h
>>> b/xen/arch/arm/include/asm/arm32/mpu.h
>>> new file mode 100644
>>> index 0000000000..4aabd93479
>>> --- /dev/null
>>> +++ b/xen/arch/arm/include/asm/arm32/mpu.h
>>> @@ -0,0 +1,59 @@
>>> +/* SPDX-License-Identifier: GPL-2.0-only */
>>> +/*
>>> + * mpu.h: Arm Memory Protection Unit definitions for aarch64.
>>> + */
>>> +
>>> +#ifndef __ARM_ARM32_MPU_H
>>> +#define __ARM_ARM32_MPU_H
>>> +
>>> +#define XN_EL2_ENABLED 0x1
>>
>> I understand the define is introduced in Luca's patch, but this a bit
>> non-descriptive... Can we find a better name? Maybe by adding the name of
>> the register and some documentation?
>
> We can rename this as PRBAR_EL2_XN if this sounds better (cc @Luca) in Luca's
> patch
what about PRBAR_EL2_XN_ENABLED? I can change it in my serie
>
> The description can be
>
> Refer ARM DDI 0568A.c ID110520 , E2.2.2
>
> HPRBAR [0:1] Execute Never
>
>>
>>> +
>>> +#ifndef __ASSEMBLY__
>>> +
>>> +/* Hypervisor Protection Region Base Address Register */
>>> +typedef union {
>>> + struct {
>>> + unsigned int xn:1; /* Execute-Never */
>>> + unsigned int ap:2; /* Acess Permission */
>>> + unsigned int sh:2; /* Sharebility */
>>> + unsigned int res0:1; /* Reserved as 0 */
>>> + unsigned int base:26; /* Base Address */
>>> + } reg;
>>> + uint32_t bits;
>>> +} prbar_t;
>>> +
>>> +/* Hypervisor Protection Region Limit Address Register */
>>> +typedef union {
>>> + struct {
>>> + unsigned int en:1; /* Region enable */
>>> + unsigned int ai:3; /* Memory Attribute Index */
>>> + /*
>>> + * There is no actual ns bit in hardware. It is used here for
>>> + * compatibility with Armr64 code. Thus, we are reusing a res0 bit
>>> for ns.
>>
>> typo: Arm64.
> Ack
>>
>>> + */
>>
>> Hmmmm, this would mean someone may mistakenly set the bit to 0 by mistake.
>> If the field is always meant to be 0 on arm64, then I would consider to name
>> is res0 on arm64 with an explanation.
>>
>> This would make clear the bit is not supposed to have a value other than 0.
>
> On Arm64, ns == 0 as it can only support secure mode.
>
> So we can change this on Arm64 as well :-
>
> unsigned int res0:2; /* ns == 0 as only secure mode is supported */
>
> @Luca to clarify
From the specifications: "Non-secure bit. Specifies whether the output address
is in the Secure or Non-secure memory”, I’m not sure
that we should remove it from Arm64, so I don’t think you should have something
only for compatibility, maybe the code accessing .ns
can be compiled out for Arm32 or we can have arch-specific implementation. I
think you are referring to pr_of_xenaddr when you say
“compatibility with Arm64 code"
>
>>
>>> + unsigned int ns:1; /* Reserved 0 by hardware */
>>> + unsigned int res0:1; /* Reserved 0 by hardware */
> Then, we can change this on Arm32 as well.
>>> + unsigned int limit:26; /* Limit Address */
>>
>> NIT: Can we align the comments?
> Ack.
>>
>>> + } reg;
>>> + uint32_t bits;
>>> +} prlar_t;
>>> +
>>> +/* Protection Region */
>>> +typedef struct {
>>> + prbar_t prbar;
>>> + prlar_t prlar;
>>> + uint64_t p2m_type; /* Used to store p2m types. */
>>> +} pr_t;
>>
>> This looks to be common with arm64. If so, I would prefer if the structure
>> is in a common header.
>
> No, in arm64 this is
>
> typedef struct {
> prbar_t prbar;
> prlar_t prlar;
> } pr_t;
>
> The reason being Arm64 uses unused bits (ie 'pad') to store the type.
>
>>
>>> +
>>> +#endif /* __ASSEMBLY__ */
>>> +
>>> +#endif /* __ARM_ARM32_MPU_H */
>>> +
>>> +/*
>>> + * Local variables:
>>> + * mode: C
>>> + * c-file-style: "BSD"
>>> + * c-basic-offset: 4
>>> + * indent-tabs-mode: nil
>>> + * End:
>>> + */
>>> diff --git a/xen/arch/arm/include/asm/mpu.h b/xen/arch/arm/include/asm/mpu.h
>>> index 77d0566f97..67127149c0 100644
>>> --- a/xen/arch/arm/include/asm/mpu.h
>>> +++ b/xen/arch/arm/include/asm/mpu.h
>>> @@ -8,8 +8,12 @@
>>> #if defined(CONFIG_ARM_64)
>>> # include <asm/arm64/mpu.h>
>>> +#elif defined(CONFIG_ARM_32)
>>> +# include <asm/arm32/mpu.h>
>>> #endif
>>> +#define PRENR_MASK GENMASK(31, 0)
>>> +
>>> #define MPU_REGION_SHIFT 6
>>> #define MPU_REGION_ALIGN (_AC(1, UL) << MPU_REGION_SHIFT)
>>> #define MPU_REGION_MASK (~(MPU_REGION_ALIGN - 1))
>>> diff --git a/xen/arch/arm/include/asm/mpu/cpregs.h
>>> b/xen/arch/arm/include/asm/mpu/cpregs.h
>>> index d5cd0e04d5..7cf52aa09a 100644
>>> --- a/xen/arch/arm/include/asm/mpu/cpregs.h
>>> +++ b/xen/arch/arm/include/asm/mpu/cpregs.h
>>> @@ -6,18 +6,153 @@
>>> /* CP15 CR0: MPU Type Register */
>>> #define HMPUIR p15,4,c0,c0,4
>>> +/* CP15 CR6: Protection Region Enable Register */
>>> +#define HPRENR p15,4,c6,c1,1
>>> +
>>> /* CP15 CR6: MPU Protection Region Base/Limit/Select Address Register */
>>> #define HPRSELR p15,4,c6,c2,1
>>> #define HPRBAR p15,4,c6,c3,0
>>> #define HPRLAR p15,4,c6,c8,1
>>> +/* CP15 CR6: MPU Protection Region Base/Limit Address Register */
>>> +#define HPRBAR0 p15,4,c6,c8,0
>>> +#define HPRLAR0 p15,4,c6,c8,1
>>> +#define HPRBAR1 p15,4,c6,c8,4
>>> +#define HPRLAR1 p15,4,c6,c8,5
>>> +#define HPRBAR2 p15,4,c6,c9,0
>>> +#define HPRLAR2 p15,4,c6,c9,1
>>> +#define HPRBAR3 p15,4,c6,c9,4
>>> +#define HPRLAR3 p15,4,c6,c9,5
>>> +#define HPRBAR4 p15,4,c6,c10,0
>>> +#define HPRLAR4 p15,4,c6,c10,1
>>> +#define HPRBAR5 p15,4,c6,c10,4
>>> +#define HPRLAR5 p15,4,c6,c10,5
>>> +#define HPRBAR6 p15,4,c6,c11,0
>>> +#define HPRLAR6 p15,4,c6,c11,1
>>> +#define HPRBAR7 p15,4,c6,c11,4
>>> +#define HPRLAR7 p15,4,c6,c11,5
>>> +#define HPRBAR8 p15,4,c6,c12,0
>>> +#define HPRLAR8 p15,4,c6,c12,1
>>> +#define HPRBAR9 p15,4,c6,c12,4
>>> +#define HPRLAR9 p15,4,c6,c12,5
>>> +#define HPRBAR10 p15,4,c6,c13,0
>>> +#define HPRLAR10 p15,4,c6,c13,1
>>> +#define HPRBAR11 p15,4,c6,c13,4
>>> +#define HPRLAR11 p15,4,c6,c13,5
>>> +#define HPRBAR12 p15,4,c6,c14,0
>>> +#define HPRLAR12 p15,4,c6,c14,1
>>> +#define HPRBAR13 p15,4,c6,c14,4
>>> +#define HPRLAR13 p15,4,c6,c14,5
>>> +#define HPRBAR14 p15,4,c6,c15,0
>>> +#define HPRLAR14 p15,4,c6,c15,1
>>> +#define HPRBAR15 p15,4,c6,c15,4
>>> +#define HPRLAR15 p15,4,c6,c15,5
>>> +#define HPRBAR16 p15,5,c6,c8,0
>>> +#define HPRLAR16 p15,5,c6,c8,1
>>> +#define HPRBAR17 p15,5,c6,c8,4
>>> +#define HPRLAR17 p15,5,c6,c8,5
>>> +#define HPRBAR18 p15,5,c6,c9,0
>>> +#define HPRLAR18 p15,5,c6,c9,1
>>> +#define HPRBAR19 p15,5,c6,c9,4
>>> +#define HPRLAR19 p15,5,c6,c9,5
>>> +#define HPRBAR20 p15,5,c6,c10,0
>>> +#define HPRLAR20 p15,5,c6,c10,1
>>> +#define HPRBAR21 p15,5,c6,c10,4
>>> +#define HPRLAR21 p15,5,c6,c10,5
>>> +#define HPRBAR22 p15,5,c6,c11,0
>>> +#define HPRLAR22 p15,5,c6,c11,1
>>> +#define HPRBAR23 p15,5,c6,c11,4
>>> +#define HPRLAR23 p15,5,c6,c11,5
>>> +#define HPRBAR24 p15,5,c6,c12,0
>>> +#define HPRLAR24 p15,5,c6,c12,1
>>> +#define HPRBAR25 p15,5,c6,c12,4
>>> +#define HPRLAR25 p15,5,c6,c12,5
>>> +#define HPRBAR26 p15,5,c6,c13,0
>>> +#define HPRLAR26 p15,5,c6,c13,1
>>> +#define HPRBAR27 p15,5,c6,c13,4
>>> +#define HPRLAR27 p15,5,c6,c13,5
>>> +#define HPRBAR28 p15,5,c6,c14,0
>>> +#define HPRLAR28 p15,5,c6,c14,1
>>> +#define HPRBAR29 p15,5,c6,c14,4
>>> +#define HPRLAR29 p15,5,c6,c14,5
>>> +#define HPRBAR30 p15,5,c6,c15,0
>>> +#define HPRLAR30 p15,5,c6,c15,1
>>> +#define HPRBAR31 p15,5,c6,c15,4
>>> +#define HPRLAR31 p15,5,c6,c15,5
>>
>> NIT: Is there any way we could generate the values using macros?
> This looks tricky. So I will prefer to keep this as it is.
>>
>>> +
>>> /* Aliases of AArch64 names for use in common code */
>>> #ifdef CONFIG_ARM_32
>>> /* Alphabetically... */
>>> #define MPUIR_EL2 HMPUIR
>>> #define PRBAR_EL2 HPRBAR
>>> +#define PRBAR0_EL2 HPRBAR0
>>
>> AFAIU, the alias will be mainly used in the macro generate
>> the switch. Rather than open-coding all the PR*AR_EL2, can we
>> provide two macros PR{B, L}AR_N that will be implemented as
>> HPR{B,L}AR##n for arm32 and PR{B,L}AR##n for arm64?
>
> Yes , we can have
>
> #define PR{B,L}AR_EL2_(n) HPR{B,L}AR##n for arm32
>
> #define PR{B,L}AR_EL2_(n) PR{B,L}AR##n##_EL2
we could have them in mm.c, I see in your v2 you’ve put them in cpregs.h,
but since they are only used by the generator, I would put them there.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |