#ifndef __ASSEMBLY__
+/*
+ * Unlike arm64, there are no reserved 0 bits beyond base and limit bitfield in
+ * prbar and prlar registers respectively.
+ */
+#define MPU_REGION_RES0 0x0
+
+/* Hypervisor Protection Region Base Address Register */
+typedef union {
+ struct {
+ unsigned int xn:1; /* Execute-Never */
+ unsigned int ap_0:1; /* Access Permission AP[0] */
+ unsigned int ro:1; /* Access Permission AP[1] */
+ unsigned int sh:2; /* Shareability */
+ unsigned int res0:1;
+ 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 */
+ unsigned int res0:2;
+ unsigned int limit:26; /* Limit Address */
+ } reg;
+ uint32_t bits;
+} prlar_t;
+
/* MPU Protection Region */
typedef struct {
- uint32_t prbar;
- uint32_t prlar;
+ prbar_t prbar;
+ prlar_t prlar;
} pr_t;
#endif /* __ASSEMBLY__ */
/* Build up value for PRBAR_EL2. */
prbar = (prbar_t) {
.reg = {
+#ifdef CONFIG_ARM_64
.xn_0 = 0,
+#endif
.xn = PAGE_XN_MASK(flags),
.ap_0 = 0,
.ro = PAGE_RO_MASK(flags)
/* Build up value for PRLAR_EL2. */
prlar = (prlar_t) {
.reg = {
+#ifdef CONFIG_ARM_64
.ns = 0, /* Hyp mode is in secure world */
+#endif
.ai = attr_idx,
.en = 1, /* Region enabled */
}};