commit e4583ea4e14bf89e46cf8a43bc9f4db84e1111e0
parent 3c07ddb43d69e35b2f6e23736c5a5ddb8e00288d
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sat, 17 Oct 2020 19:57:04 +0200
arm64: Implement HMEM
Change-Id: I125cb3d25fc74c634458581c1ae9dcb223ab36d9
Diffstat:
6 files changed, 20 insertions(+), 27 deletions(-)
diff --git a/include/os9/os9.h b/include/os9/os9.h
@@ -108,8 +108,8 @@ struct map {
*/
struct mach {
phyaddr_t phystack;
- phyaddr_t ktzero;
phyaddr_t phytext;
+ phyaddr_t kzero;
phyaddr_t ptable;
Map *maps;
diff --git a/src/os9/arch/arm64/arch.s b/src/os9/arch/arm64/arch.s
@@ -136,7 +136,6 @@ getctx:
.TEXT
EXCEPTION:
- MOV SP,SP
STP X0,X1,[SP,#-16*(19-0)]
STP X2,X3,[SP,#-16*(19-1)]
STP X4,X5,[SP,#-16*(19-2)]
diff --git a/src/os9/arch/arm64/crt.s b/src/os9/arch/arm64/crt.s
@@ -52,5 +52,17 @@ EL1:
BL initmap
BL immu
BL kernelmap
- B swtch
+ BL HMEM
+ BL main
+ ADR X0,OUTSYNC
+ B panic
+ .TEXT
+HMEM:
+ ADR X0,mach
+ LDR X9,[X0,16]
+ ADD X30,X30,X9
+ RET
+
+ OUTSYNC:
+ .ASCIZ "Out of sync"
diff --git a/src/os9/arch/arm64/fvp.c b/src/os9/arch/arm64/fvp.c
@@ -14,16 +14,13 @@ static uint32_t *early = (uint32_t *) 0x1C090000;
Mach mach = {
.phystack = 0x80080000,
.phytext = 0x80000000,
- .ktzero = 0xFFFFFF0000000000- 0x80000000,
- .tables = 0x80080000,
+ .kzero = 0xFFFFFF0000000000 - 0x80000000,
.ptable = 0xA0000000,
- .ntables = 128,
};
void
imach(void)
{
- char *bp, *p;
Map *textp, *datap, *stackp;
static Map maps[4];
extern char text[], etext[], end[];
@@ -35,13 +32,13 @@ imach(void)
textp->name = "text";
textp->pa = mach.phytext;
- textp->va = mach.phytext + mach.ktzero;
+ textp->va = mach.phytext + mach.kzero;
textp->siz = etext - text;
textp->perm = MR | MX;
datap->name = "data";
datap->pa = textp->pa +textp->siz;
- datap->va = datap->pa + mach.ktzero;
+ datap->va = datap->pa + mach.kzero;
datap->siz = end - etext;
datap->perm = MR | MW;
@@ -51,9 +48,6 @@ imach(void)
stackp->siz = 4*KiB;
stackp->perm = MR | MW;
- bp = (char *) mach.tables;
- for (p = bp; p <&bp[mach.ntables]; p+= 4*KiB)
- memset(p, 0, 4*KiB);
barrier(DATA);
}
diff --git a/src/os9/arch/arm64/mmu.c b/src/os9/arch/arm64/mmu.c
@@ -234,13 +234,10 @@ mapseg(Map *mp)
return 0;
}
-Context *
+void
kernelmap(void)
{
Map *mp;
- static Context ctx = {
- .r[ELR] = (uintptr_t) main,
- };
/*
* FIXME: We are using a full page when
@@ -248,7 +245,7 @@ kernelmap(void)
*/
syswr(TTBR1_EL1, (pte_t) allocb(1));
- dbg("TTBR_EL1=%llx\n", sysrd(TTBR1_EL1));
+ dbg("TTBR1_EL1=%llx\n", sysrd(TTBR1_EL1));
for (mp = mach.maps; mp->siz != 0; mp++) {
if (mapseg(mp) < 0)
@@ -256,15 +253,6 @@ kernelmap(void)
}
barrier(DATA);
barrier(CODE);
-
- ctx.r[SP] = mach.phystack;
- ctx.r[TTBR0] = sysrd(TTBR0_EL1);
- ctx.r[TTBR1] = sysrd(TTBR1_EL1);
- ctx.r[SPSR] = DAIF(0xf) | AARCH(A64) | MODE(EL1h);
-
- dbg("end of kernelmap\n");
-
- return &ctx;
}
void
diff --git a/src/os9/arch/arm64/panic.c b/src/os9/arch/arm64/panic.c
@@ -3,7 +3,7 @@
#include "arch.h"
-static const char const regnames[][8] = {
+static char regnames[][8] = {
[X0] = "x0",
[X1] = "x1",
[X2] = "x2",