Skip to content

Commit c9b6fe4

Browse files
feat(arch/mpu): add mpu region context switch
During the context switch of MPU regions, locked entries are not disabled. Signed-off-by: Miguel Silva <[email protected]>
1 parent 8f70ed8 commit c9b6fe4

File tree

6 files changed

+54
-1
lines changed

6 files changed

+54
-1
lines changed

src/arch/armv8/aarch32/exceptions.S

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,34 @@
5050
push {r0-r12}
5151
SAVE_ELR_SPSR
5252

53+
#ifdef MEM_PROT_MPU
54+
mrc p15, 4, r0, c13, c0, 2 // Read HTPIDR (CPU base address)
55+
add r0, r0, #CPU_AS_ARCH_MASK_OFF
56+
ldr r0, [r0]
57+
mcr p15, 4, r0, c6, c1, 1
58+
#endif /* MEM_PROT_MPU */
59+
5360
.endm
5461

5562
.macro VM_ENTRY
5663

5764
mrc p15, 4, r0, c13, c0, 2 // Read HTPIDR (CPU base address)
65+
66+
#ifdef MEM_PROT_MPU
67+
ldr r1, [r0, #CPU_VCPU_OFF]
68+
mov r2, #VCPU_VM_OFF
69+
add r1, r1, r2
70+
ldr r1, [r1]
71+
ldr r1, [r1, #VM_AS_ARCH_MASK_OFF]
72+
73+
mov r2, #CPU_ARCH_PROFILE_MPU_LOCKED_OFF
74+
add r2, r2, r0
75+
ldr r2, [r2]
76+
77+
orr r1, r1, r2
78+
mcr p15, 4, r1, c6, c1, 1
79+
#endif /* MEM_PROT_MPU */
80+
5881
ldr r0, [r0, #CPU_VCPU_OFF]
5982
add r0, r0, #VCPU_REGS_OFF
6083
mov sp, r0

src/arch/armv8/aarch64/exceptions.S

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,35 @@
6464
add x0, x0, x1
6565
mov sp, x0
6666

67+
#ifdef MEM_PROT_MPU
68+
mrs x0, tpidr_el2
69+
add x0, x0, #CPU_AS_ARCH_MASK_OFF
70+
ldr x0, [x0]
71+
msr prenr_el2, x0
72+
#endif /* MEM_PROT_MPU */
73+
6774
.endm
6875

6976
.global vcpu_arch_entry
7077
vcpu_arch_entry:
7178
mrs x0, tpidr_el2
79+
80+
#ifdef MEM_PROT_MPU
81+
ldr x1, [x0, #CPU_VCPU_OFF]
82+
mov x2, #VCPU_VM_OFF
83+
add x1, x1, x2
84+
ldr x1, [x1]
85+
ldr x1, [x1, #VM_AS_ARCH_MASK_OFF]
86+
87+
mov x2, #CPU_ARCH_PROFILE_MPU_LOCKED_OFF
88+
add x2, x2, x0
89+
ldr x2, [x2]
90+
91+
orr x1, x1, x2
92+
93+
msr prenr_el2, x1
94+
#endif /* MEM_PROT_MPU */
95+
7296
ldr x0, [x0, #CPU_VCPU_OFF]
7397
add x0, x0, #VCPU_REGS_OFF
7498
mov sp, x0

src/arch/armv8/armv8-r/inc/arch/mem.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ typedef union {
3636
};
3737
} mem_flags_t;
3838

39+
struct addr_space_arch {
40+
unsigned long mpu_entry_mask;
41+
};
42+
3943
#define PTE_FLAGS(_prbar, _prlar) \
4044
((mem_flags_t){ \
4145
.prbar = (_prbar), \

src/arch/armv8/armv8-r/mem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77

88
void as_arch_init(struct addr_space* as)
99
{
10-
UNUSED_ARG(as);
10+
as->arch.mpu_entry_mask = 0;
1111
}

src/core/mpu/inc/mem_prot/mem.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct addr_space {
2727
enum AS_TYPE type;
2828
cpumap_t cpus;
2929
colormap_t colors;
30+
struct addr_space_arch arch;
3031
struct {
3132
struct list ordered_list;
3233
struct mpe {

src/core/mpu/mem.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <platform_defs.h>
1212
#include <objpool.h>
1313
#include <config.h>
14+
#include <arch/mpu.h>
1415

1516
struct shared_region {
1617
enum AS_TYPE as_type;

0 commit comments

Comments
 (0)