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