9os

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

commit edce04c86b297ce915e51ad6690f4e92a8e220aa
parent b4cb38218803346f94ec3c197d50ff0b70a45d33
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date:   Wed, 21 Nov 2018 13:52:33 +0000

Merge "[rmode/rom.c] Factorize main()"
Diffstat:
March/rmode/crt.s | 7++++---
March/rmode/rom.c | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Minclude/rcode.h | 2++
3 files changed, 85 insertions(+), 23 deletions(-)

diff --git a/arch/rmode/crt.s b/arch/rmode/crt.s @@ -19,14 +19,15 @@ getpc: isb ldr x0,=SRAMADDR - mov x1,#SRAMSIZE /* Stack grows down towards BSS */ + mov x1,#512 /* Setup a initial stack at the botton */ add x0,x0,x1 mov sp,x0 mov x29,#0 mov x0,x19 - ldr x1,=SRAMADDR - mov x2,#SRAMSIZE + ldr x1,=.data + ldr x2,=SRAMADDR + mov x3,#SRAMSIZE bl main adr x0,outsync b panic diff --git a/arch/rmode/rom.c b/arch/rmode/rom.c @@ -6,41 +6,100 @@ #include "sysreg.h" #include "arch.h" +#define ENVSIZ 100 +#define BSSSIZ 1024 + +typedef struct mach Mach; + +struct mach { + struct trapframe frame; + void *env; + size_t envsiz; + void *txt; + size_t txtsiz; + void *ram; + size_t ramsiz; + void *bss_; + size_t bsssiz; + void *sp; + size_t stacksiz; +}; + +static void +imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz) +{ + char *bp, *ramp; + struct trapframe *fp = &mp->frame; + + mp->txt = txt; + mp->ram = ram; + mp->txtsiz = txtsiz; + mp->ramsiz = ramsiz; + memset(fp, 0, sizeof(*fp)); + + ramp = ram; + bp = ramp + ramsiz; + + mp->env = (bp -= ENVSIZ); + mp->bss_ = (bp -= BSSSIZ); + mp->sp = bp - 16; + + mp->stacksiz = bp - ramp; + mp->envsiz = ENVSIZ; + mp->bsssiz = BSSSIZ; + + fp->sp = mp->sp; + fp->elr = (void *) rsysreg(RVBAR_EL3); + fp->spsr = 0xf << 6 | 0xd; + + invicache(); + invdcache(); +} + static void -ibss(void *text) +ibss(Mach *mp) { - bss->text = text; + wsysreg(TPIDR_R, (uintptr_t) mp->bss_); + bss->text = mp->txt; bss->backtrace = 1; bss->dumpstack = 1; bss->uartbase = (void *)UARTBASE; + bss->bsssize = sizeof(struct bssmap); } static void -imach(struct trapframe *fp, void *sp) +idev(Mach *mp) { - memset(fp, 0, sizeof(*fp)); - fp->sp = sp; - fp->elr = (void *) rsysreg(RVBAR_EL3); - fp->spsr = 0xf << 6 | 0xd; + uartinit(UARTCLK, UARTBAUDRATE); +} - invicache(); - invdcache(); +static void +info(Mach *mp) +{ + dbg("romfw: version %d\n" + "txt = %p, txtsiz = 0x%llx\n" + "ram = %p, ramsiz = 0x%llx\n" + "bss = %p, bsssiz = 0x%llx\n" + "env = %p, envsiz = 0x%llx\n" + "sp = %p, stacksiz = 0x%llx\n", + 1, + mp->txt, (unsigned long long) mp->txtsiz, + mp->ram, (unsigned long long) mp->ramsiz, + mp->bss_, (unsigned long long) mp->bsssiz, + mp->env, (unsigned long long) mp->envsiz, + mp->sp, (unsigned long long) mp->stacksiz); } void -main(void *text, void *ram, size_t ramsiz) +main(void *txt, size_t txtsiz, void *ram, size_t ramsiz) { - struct trapframe frame; - char *sp = (char *) ram + ramsiz; + Mach mach; - ibss(text); - imach(&frame, sp); - uartinit(UARTCLK, UARTBAUDRATE); + imach(&mach, txt, txtsiz, ram, ramsiz); + ibss(&mach); + idev(&mach); enaint(); barrier(ISB); - - dbg("romfw: text = %p, ram = %p, ramsiz = 0x%llx\n", - text, ram, (unsigned long long)ramsiz); - - swtch(&frame); + info(&mach); + swtch(&mach.frame); } diff --git a/include/rcode.h b/include/rcode.h @@ -112,6 +112,8 @@ struct bssmap { unsigned char dumpstack; unsigned char backtrace; void *text; + size_t bsssize; + void *uartbase; const char *errstr; jmp_buf dbgrecover;