Skip to content

Commit 061deed

Browse files
ref(armv8-r): Update armv8-r MPU driver
The MPU driver for armv8-r had to be updated according to the new VMPU implementation. Signed-off-by: Miguel Silva <[email protected]>
1 parent 55b2ad2 commit 061deed

File tree

7 files changed

+259
-568
lines changed

7 files changed

+259
-568
lines changed

src/arch/armv8/aarch32/exceptions.S

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

53+
mrc p15, 4, r0, c13, c0, 2 // Read HTPIDR (CPU base address)
54+
mov r1, #CPU_VCPU_OFF
55+
ldr r0, [r0, r1]
56+
add r0, r0, #CPU_AS_ARCH_MASK_OFF
57+
mcr p15, 4, r0, c6, c1, 1 //HPRENR
58+
59+
//cpu.as.arch.entry_mask
60+
//trocar HPRENR
61+
5362
.endm
5463

5564

@@ -133,7 +142,26 @@
133142

134143
.macro VM_ENTRY
135144

145+
136146
mrc p15, 4, r0, c13, c0, 2 // Read HTPIDR (CPU base address)
147+
148+
//#ifdef MEM_PROT_MPU //0x2043a780
149+
//trocar o HPRENR
150+
//cpu->vcpu->vm->as.arch.entry_mask | cpu.arch.profile.mpu.locked
151+
ldr r1, [r0, #CPU_VCPU_OFF]
152+
mov r2, #VCPU_VM_OFF
153+
add r1, r1, r2
154+
ldr r1, [r1]
155+
ldr r1, [r1, #VM_AS_ARCH_MASK_OFF]
156+
157+
mov r2, #CPU_ARCH_PROFILE_MPU_LOCKED_OFF
158+
add r2, r2, r0
159+
ldr r2, [r2]
160+
161+
orr r1, r1, r2
162+
mcr p15, 4, r1, c6, c1, 1 //HPRENR
163+
//#endif
164+
137165
ldr r0, [r0, #CPU_VCPU_OFF]
138166
add r0, r0, #VCPU_REGS_OFF
139167
mov sp, r0
@@ -143,6 +171,7 @@
143171
LOAD_SP
144172
pop {r14}
145173
174+
146175
eret
147176
b .
148177

src/arch/armv8/armv8-r/aarch32/boot.S

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -55,64 +55,64 @@ boot_arch_profile_init:
5555
* If the vm image section is used and has built-in vm images, we need to map the loadble and
5656
* non-loadble region of the image separately. Otherwise we can map it as a single region.
5757
*/
58-
add r4, r4, #1
59-
mcr p15, 4, r4, c6, c2, 1 // HPRSELR
60-
ldr r3, =_image_start
61-
and r3, r3, #PRBAR_BASE_MSK
62-
orr r3, r3, #PRBAR_SH_IS
63-
orr r3, r3, #PRBAR_AP_RW_EL2
64-
mcr p15, 4, r3, c6, c3, 0 // HPRBAR
65-
ldr r10, =_image_load_end
66-
ldr r11, =_image_noload_start
67-
cmp r10, r11
68-
ldreq r3, =_image_end
69-
ldrne r3, =_image_load_end
70-
sub r3, r3, #1
71-
and r3, r3, #PRLAR_LIMIT_MSK
72-
orr r3, r3, #(PRLAR_ATTR(1) | PRLAR_EN)
73-
mcr p15, 4, r3, c6, c3, 1 // HPRLAR
58+
//add r4, r4, #1
59+
//mcr p15, 4, r4, c6, c2, 1 // HPRSELR
60+
//ldr r3, =_image_start
61+
//and r3, r3, #PRBAR_BASE_MSK
62+
//orr r3, r3, #PRBAR_SH_IS
63+
//orr r3, r3, #PRBAR_AP_RW_EL2
64+
//mcr p15, 4, r3, c6, c3, 0 // HPRBAR
65+
//ldr r10, =_image_load_end
66+
//ldr r11, =_image_noload_start
67+
//cmp r10, r11
68+
//ldreq r3, =_image_end
69+
//ldrne r3, =_image_load_end
70+
//sub r3, r3, #1
71+
//and r3, r3, #PRLAR_LIMIT_MSK
72+
//orr r3, r3, #(PRLAR_ATTR(1) | PRLAR_EN)
73+
//mcr p15, 4, r3, c6, c3, 1 // HPRLAR
7474

7575
/* Map Image Non-loadable if needed */
76-
ldr r10, =_image_load_end
77-
ldr r11, =_image_noload_start
78-
cmp r10, r11
79-
beq skip_non_loadable
80-
add r4, r4, #1
81-
mcr p15, 4, r4, c6, c2, 1 // HPRSELR
82-
ldr r3, =_image_noload_start
83-
and r3, r3, #PRBAR_BASE_MSK
84-
orr r3, r3, #PRBAR_SH_IS
85-
orr r3, r3, #PRBAR_AP_RW_EL2
86-
mcr p15, 4, r3, c6, c3, 0 // HPRBAR
87-
ldr r3, =_image_end
88-
sub r3, r3, #1
89-
and r3, r3, #PRLAR_LIMIT_MSK
90-
orr r3, r3, #(PRLAR_ATTR(1) | PRLAR_EN)
91-
mcr p15, 4, r3, c6, c3, 1 // HPRLAR
76+
//ldr r10, =_image_load_end
77+
//ldr r11, =_image_noload_start
78+
//cmp r10, r11
79+
//beq skip_non_loadable
80+
//add r4, r4, #1
81+
//mcr p15, 4, r4, c6, c2, 1 // HPRSELR
82+
//ldr r3, =_image_noload_start
83+
//and r3, r3, #PRBAR_BASE_MSK
84+
//orr r3, r3, #PRBAR_SH_IS
85+
//orr r3, r3, #PRBAR_AP_RW_EL2
86+
//mcr p15, 4, r3, c6, c3, 0 // HPRBAR
87+
//ldr r3, =_image_end
88+
//sub r3, r3, #1
89+
//and r3, r3, #PRLAR_LIMIT_MSK
90+
//orr r3, r3, #(PRLAR_ATTR(1) | PRLAR_EN)
91+
//mcr p15, 4, r3, c6, c3, 1 // HPRLAR
9292

9393
skip_non_loadable:
9494

9595
/* Region 2 - CPU */
96-
add r4, r4, #1
97-
mcr p15, 4, r4, c6, c2, 1 // HPRSELR
98-
mrc p15, 4, r3, c13, c0, 2 // HTPIDR (read CPU base addr)
99-
and r3, r3, #PRBAR_BASE_MSK
100-
orr r3, r3, #PRBAR_SH_IS
101-
orr r3, r3, #PRBAR_AP_RW_EL2
102-
mcr p15, 4, r3, c6, c3, 0 // HPRBAR
103-
mrc p15, 4, r3, c13, c0, 2 // HTPIDR (read CPU base addr)
104-
add r3, r3, #CPU_SIZE
105-
sub r3, r3, #1
106-
and r3, r3, #PRLAR_LIMIT_MSK
107-
orr r3, #(PRLAR_ATTR(1) | PRLAR_EN)
108-
mcr p15, 4, r3, c6, c3, 1 // HPRLAR
96+
//add r4, r4, #1
97+
//mcr p15, 4, r4, c6, c2, 1 // HPRSELR
98+
//mrc p15, 4, r3, c13, c0, 2 // HTPIDR (read CPU base addr)
99+
//and r3, r3, #PRBAR_BASE_MSK
100+
//orr r3, r3, #PRBAR_SH_IS
101+
//orr r3, r3, #PRBAR_AP_RW_EL2
102+
//mcr p15, 4, r3, c6, c3, 0 // HPRBAR
103+
//mrc p15, 4, r3, c13, c0, 2 // HTPIDR (read CPU base addr)
104+
//add r3, r3, #CPU_SIZE
105+
//sub r3, r3, #1
106+
//and r3, r3, #PRLAR_LIMIT_MSK
107+
//orr r3, #(PRLAR_ATTR(1) | PRLAR_EN)
108+
//mcr p15, 4, r3, c6, c3, 1 // HPRLAR
109109

110110
dsb
111111
isb
112112

113113
/* Enable caches and MPU */
114-
ldr r4, =(SCTLR_RES1_AARCH32 | SCTLR_C | SCTLR_I | SCTLR_M)
115-
mcr p15, 4, r4, c1, c0, 0 // HSCTLR
114+
//ldr r4, =(SCTLR_RES1_AARCH32 | SCTLR_C | SCTLR_I | SCTLR_M)
115+
//mcr p15, 4, r4, c1, c0, 0 // HSCTLR
116116

117117
dsb
118118
isb

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#ifndef __ARCH_BAO_H__
77
#define __ARCH_BAO_H__
88

9-
#define BAO_VAS_BASE CONFIG_HYP_BASE_ADDR
9+
#define BAO_VAS_BASE 0x20000000 // CONFIG_HYP_BASE_ADDR
1010
#define PAGE_SIZE (64)
1111
#define STACK_SIZE (0x1000)
1212

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

Lines changed: 5 additions & 1 deletion
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 entry_mask;
41+
};
42+
3943
#define PTE_FLAGS(_prbar, _prlar) \
4044
((mem_flags_t){ \
4145
.prbar = (_prbar), \
@@ -50,7 +54,7 @@ typedef union {
5054
#define PTE_VM_DEV_FLAGS \
5155
PTE_FLAGS(PRBAR_XN | PRBAR_AP_RW_EL1_EL2 | PRBAR_SH_IS, PRLAR_ATTR(2) | PRLAR_EN)
5256

53-
#define MPU_ARCH_MAX_NUM_ENTRIES (64)
57+
#define MPU_ARCH_MAX_NUM_ENTRIES 16 //(64)
5458

5559
static inline size_t mpu_granularity(void)
5660
{

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

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,26 @@
99

1010
#include <bao.h>
1111
#include <arch/sysregs.h>
12+
#include <bitmap.h>
13+
#include <mem.h>
1214

13-
void mpu_arch_init(void);
14-
void mpu_arch_enable(void);
15-
bool mpu_add_region(struct mp_region* reg, bool locked);
16-
bool mpu_remove_region(struct mp_region* reg);
17-
bool mpu_update_region(struct mp_region* reg);
15+
struct mpu_perms {
16+
perms_t el2;
17+
perms_t el1;
18+
};
19+
20+
struct mpu_arch {
21+
unsigned long bitmap;
22+
unsigned long locked;
23+
24+
struct mpu_perms entry_perms[MPU_ARCH_MAX_NUM_ENTRIES];
25+
};
26+
27+
// void mpu_arch_init(void);
28+
// void mpu_arch_enable(void);
29+
// bool mpu_add_region(struct mp_region* reg, bool locked);
30+
// bool mpu_remove_region(struct mp_region* reg);
31+
// bool mpu_update_region(struct mp_region* reg);
1832
bool mpu_perms_compatible(uint32_t perms1, uint32_t perms2);
1933

20-
#endif /* __ARCH_MPU_H__ */
34+
#endif /* __ARCH_MPU_H__ */

src/arch/armv8/armv8-r/inc/arch/profile/cpu.h

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,14 @@
88

99
#include <bao.h>
1010
#include <arch/sysregs.h>
11+
#include <arch/mpu.h>
1112
#include <bitmap.h>
1213
#include <list.h>
1314
#include <mem.h>
1415
#include <list.h>
1516

1617
struct cpu_arch_profile {
17-
struct {
18-
BITMAP_ALLOC(bitmap, MPU_ARCH_MAX_NUM_ENTRIES);
19-
/**
20-
* A locked region means that it can never be removed from the MPU. For example,
21-
*/
22-
BITMAP_ALLOC(locked, MPU_ARCH_MAX_NUM_ENTRIES);
23-
struct mpu_perms {
24-
perms_t el2;
25-
perms_t el1;
26-
} perms[MPU_ARCH_MAX_NUM_ENTRIES];
27-
/**
28-
* We maintain an ordered list of the regions currently in the mpu to simplify the merging
29-
* algorithm when mapping an overllaping region.
30-
*/
31-
struct {
32-
struct list list;
33-
struct mpu_node {
34-
node_t node;
35-
mpid_t mpid;
36-
} node[MPU_ARCH_MAX_NUM_ENTRIES];
37-
} order;
38-
} mpu;
18+
struct mpu_arch mpu;
3919
};
4020

4121
static inline struct cpu* cpu(void)

0 commit comments

Comments
 (0)