9os

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

commit 8b2ea53771b9eadca14e2a1f895f71ed89814c38
parent 7f42ca92b2796173938049ed1e69e37560d00557
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Thu,  8 Oct 2020 22:14:03 +0200

os9: Make barrier() in a portable function

At this moment barrier() was using ISB and DSB_SY that are very
dependend of the arm architecture, while we can have generic
DATA and CODE type of barriers.

Change-Id: If6ee06d51b46509ee2409bfb2f8439a70d9d4895

Diffstat:
Minclude/os9/os9.h | 6++++++
Msrc/os9/arch/arm64/arch.h | 6------
Msrc/os9/arch/arm64/cache.c | 6+++---
Msrc/os9/arch/arm64/fpu.c | 2+-
Msrc/os9/arch/arm64/fvp.c | 4++--
Msrc/os9/arch/arm64/gic.c | 2+-
Msrc/os9/arch/arm64/main.c | 4++--
Msrc/os9/arch/arm64/mmu.c | 12++++++------
8 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/include/os9/os9.h b/include/os9/os9.h @@ -43,6 +43,11 @@ typedef struct dir Dir; typedef struct mach Mach; typedef struct map Map; +enum barrier_type { + CODE, + DATA, +}; + enum devflags { O_READ = 1 << 0, O_WRITE = 1 << 1, @@ -208,6 +213,7 @@ extern uint32_t outm32(uint32_t, void *addr); extern void lock(mutex_t *m); extern void unlock(mutex_t *m); extern int trylock(mutex_t *m); +extern void barrier(int); /* devices functions */ extern Chan *devopen(char *name, int mode); diff --git a/src/os9/arch/arm64/arch.h b/src/os9/arch/arm64/arch.h @@ -20,11 +20,6 @@ #define EE (1ul << 25) #define UCI (1ul << 26) -enum barrier_type { - ISB, - DSB_SY, -}; - enum regidx { X0, X1, @@ -72,7 +67,6 @@ struct context { extern void main(Mach *); extern void syswr(int, unsigned long long); extern unsigned long long sysrd(int); -extern void barrier(int); extern void invicache(void); extern void invtlb(void); extern void invdcachesetway(void *); diff --git a/src/os9/arch/arm64/cache.c b/src/os9/arch/arm64/cache.c @@ -40,7 +40,7 @@ invdcachelvl(unsigned l) unsigned nsets, nways, size, shift, i, j; syswr(CSSELR_EL1, l << LEVEL_SHIFT); - barrier(ISB); + barrier(CODE); ccsidr = sysrd(CCSIDR_EL1); nsets = ((ccsidr >> NSETS_SHIFT) & NSETS_MASK) + 1; @@ -56,7 +56,7 @@ invdcachelvl(unsigned l) invdcachesetway((void *)addr); } } - barrier(DSB_SY); + barrier(DATA); } static void @@ -72,7 +72,7 @@ invdcache(void) UNIFIED } type; - barrier(DSB_SY); + barrier(DATA); clidr = sysrd(CLIDR_EL1); if (((clidr >> LOC_SHIFT) & LOC_MASK) == 0) diff --git a/src/os9/arch/arm64/fpu.c b/src/os9/arch/arm64/fpu.c @@ -22,5 +22,5 @@ ifpu(Mach *m) syswr(FPCR, 0); syswr(FPSR, 0); fpoff(); - barrier(ISB); + barrier(CODE); } diff --git a/src/os9/arch/arm64/fvp.c b/src/os9/arch/arm64/fvp.c @@ -40,6 +40,6 @@ putch(int c) putch('\r'); } - barrier(DSB_SY); - barrier(ISB); + barrier(DATA); + barrier(CODE); } diff --git a/src/os9/arch/arm64/gic.c b/src/os9/arch/arm64/gic.c @@ -7,5 +7,5 @@ void igic(Mach *m) { interrupt(ENABLE); - barrier(ISB); + barrier(CODE); } diff --git a/src/os9/arch/arm64/main.c b/src/os9/arch/arm64/main.c @@ -18,7 +18,7 @@ iarch(Mach *m) syswr(VBAR_EL1, (phyaddr_t) vectbl); syswr(SCTLR_EL1, SCTLR | SA0 | SA | A); - barrier(ISB); + barrier(CODE); } static void @@ -45,7 +45,7 @@ imach(Mach *m) bp = (char *) m->tables; for (p = bp; p <&bp[m->ntables]; p+= 4*KiB) memset(p, 0, 4*KiB); - barrier(DSB_SY); + barrier(DATA); } static void diff --git a/src/os9/arch/arm64/mmu.c b/src/os9/arch/arm64/mmu.c @@ -178,17 +178,17 @@ immu(Mach *m) syswr(TTBR0_EL1, ttbr); syswr(MAIR_EL1, 0xFF); syswr(TCR_EL1, tcr); - barrier(DSB_SY); - barrier(ISB); + barrier(DATA); + barrier(CODE); sctlr |= M; syswr(SCTLR_EL1, sctlr); - barrier(ISB); + barrier(CODE); ttbr = kernelmap(m); - barrier(DSB_SY); + barrier(DATA); syswr(TTBR1_EL1, ttbr); - barrier(DSB_SY); - barrier(ISB); + barrier(DATA); + barrier(CODE); }