commit 8c9778a676b3b52bb6e7d17201fdbdee9cb0793e
parent 2fbc7e1e4d90acdca4873a5adb69f09284f0619f
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Tue, 13 Nov 2018 15:46:27 +0000
[arm64] Implement barrier()
Change-Id: I29d342d669c8d38b85c36ccfa2e04bbfc9b9d871
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
3 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/arch/arm64/arch.s b/arch/arm64/arch.s
@@ -6,17 +6,13 @@
.globl rd_id_aa64rmfr0_r,wr_id_aa64rmfr0_r
.globl rd_rcr_r,wr_rcr_r,rd_rdscr_r,wr_rdscr_r
.globl rd_sctlr_r,wr_sctlr_r,rd_rvbar_el3
- .globl vectbl,doswtch,isb,inm8,inm16,inm32
+ .globl barrier,vectbl,doswtch,inm8,inm16,inm32
.globl outm8,outm16,outm32
enaint:
msr daifclr,#15
ret
-isb:
- isb
- ret
-
rd_actlr_r:
mrs x0,S3_6_C1_C0_3
ret
@@ -61,6 +57,18 @@ rd_rvbar_el3:
mrs x0,rvbar_el3
ret
+barrier:
+ adr x1, 1f
+ lsl x0, x0, #3
+ add x1, x1, x0
+ br x1
+
+1:
+ isb
+ ret
+ dsb sy
+ ret
+
inm8:
ldrb w0,[x0]
ret
diff --git a/arch/arm64/rom-rmode.c b/arch/arm64/rom-rmode.c
@@ -21,7 +21,7 @@ main(void *text, void *ram, size_t ramsiz)
bss->uartbase = (void *)UARTBASE;
uartinit(UARTCLK, UARTBAUDRATE);
enaint();
- isb();
+ barrier(ISB);
frame.sp = bp + ramsiz;
frame.elr = rd_rvbar_el3();
diff --git a/include/rcode.h b/include/rcode.h
@@ -73,6 +73,11 @@ enum ecvals {
NR_EC_VALS
};
+enum barrier_type {
+ ISB,
+ DSB_SY,
+};
+
#ifdef NDEBUG
#define NR_EC_STR 0
#else
@@ -161,7 +166,7 @@ extern void wr_rdscr_r(unsigned long long v);
extern unsigned long long rd_sctlr_r(void);
extern void wr_sctlr_r(unsigned long long v);
extern void *rd_rvbar_el3(void);
-extern void isb(void);
+extern void barrier(enum barrier_type type);
extern uint8_t inm8(void *addr);
extern uint16_t inm16(void *addr);
extern uint32_t inm32(void *addr);