9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
March/arm64/arch.s | 18+++++++++++++-----
March/arm64/rom-rmode.c | 2+-
Minclude/rcode.h | 7++++++-
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);