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:
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);
}