9os

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

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:
Minclude/os9/os9.h | 2+-
Msrc/os9/arch/arm64/arch.s | 1-
Msrc/os9/arch/arm64/crt.s | 14+++++++++++++-
Msrc/os9/arch/arm64/fvp.c | 12+++---------
Msrc/os9/arch/arm64/mmu.c | 16++--------------
Msrc/os9/arch/arm64/panic.c | 2+-
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",