9os

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

commit 5439539e4f336369757d96c578936d548598f12b
parent 5d980e4fbad5f499c0868db7f7b4655f45f859a3
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Wed,  8 May 2019 14:02:29 +0100

Merge branch 'master' of ssh://gerrit.oss.arm.com/trusted-firmware/rcode

Change-Id: I03c9e67475c8d83db8ad65ff44d4233e7c964ad9

Diffstat:
MREADME | 29+++++++++++++++++++++++------
Mconfig/arm64-rcode.mk | 1-
Mdrivers/dev.c | 6+++---
Mdrivers/devar.c | 19++++++++++++++-----
Mdrivers/devcons.c | 12++----------
Mdrivers/devfip.c | 19++++++++++++++-----
Mdrivers/mkdevc | 2+-
Minclude/features.h | 2+-
Minclude/libk.h | 14+++++++-------
Minclude/rcode/io.h | 8+++++---
Minclude/rcode/rcode.h | 2+-
Msrc/libk/Makefile | 1+
Msrc/libk/__assert.c | 2+-
Msrc/libk/doprnt.c | 2+-
Msrc/libk/kerror.c | 2+-
Msrc/libk/kgetc.c | 4++--
Msrc/libk/kgets.c | 4++--
Msrc/libk/kprint.c | 4++--
Msrc/libk/kputc.c | 4++--
Msrc/libk/kputs.c | 4++--
Asrc/libk/kstd.c | 3+++
Msrc/libk/kvprint.c | 4++--
Msrc/libk/kwrite.c | 4++--
Msrc/romfw/dlang.c | 26+++++++++++++-------------
Msrc/romfw/rmc.c | 26+++++++++++++-------------
Mtarget/hosted/rcode | 1+
Mtarget/hosted/rom.c | 30++++++++++++++++++++++++------
Mtarget/native/crt.s | 16++++++++++++++++
Mtarget/native/rcode | 2+-
Mtarget/native/rom.c | 84++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Mtest/unit/001/test.c | 2+-
31 files changed, 231 insertions(+), 108 deletions(-)

diff --git a/README b/README @@ -3,7 +3,7 @@ Building rmode target PATH=<path-to-aarch64-elf-toolchain>:$PATH export PATH -CROSS_COMPILE=aarch64-elf- make LDFLAGS=-Ttext=0x4024000 +CROSS_COMPILE=aarch64-elf- make LDFLAGS=-Ttext=0x6000000 Building on macOS ================= @@ -11,6 +11,12 @@ Building on macOS sudo /usr/sbin/DevToolsSecurity --enable make -e CONF=amd64-darwin-clang +Building the fip with bl2 at el3 +================================ + +make CROSS_COMPILE=aarch64-linux-gnu- BL2_AT_EL3=1 BL33=<bl33.bin> all fip +./tools/fiptool/fiptool update --tb-fw build/fvp/<mode>/bl2.bin buid/fvp/<mode>/fip.bin + Running rcode ============= @@ -22,6 +28,8 @@ fip_path=<path-to-fip.bin> romfw_path=<path-to-rcode-romfw.bin> uart0_path=<path-to-uart0.out> uart3_path=<path-to-uart3.out> +linux_path=<path-to-Image> +ramdisk_path=<path-to-ramdisk.img> FVP_Base_RevC-2xAEMv8A \ -p -S \ @@ -29,9 +37,18 @@ FVP_Base_RevC-2xAEMv8A \ -C bp.pl011_uart0.out_file="$uart0_path" \ -C bp.pl011_uart3.uart_enable=1 \ -C bp.pl011_uart3.out_file="$uart3_path" \ - -C cluster0.NUM_CORES=1 \ - -C cluster0.cpu0.RVBAR=0x4024000 \ - -C cluster0.max_32bit_el=0 \ + -C bp.secure_memory=0 \ + -C cluster0.cpu0.RVBAR=0x6000000 \ + -C cluster0.cpu1.RVBAR=0x6000000 \ + -C cluster0.cpu2.RVBAR=0x6000000 \ + -C cluster0.cpu3.RVBAR=0x6000000 \ + -C cluster1.cpu0.RVBAR=0x6000000 \ + -C cluster1.cpu1.RVBAR=0x6000000 \ + -C cluster1.cpu2.RVBAR=0x6000000 \ + -C cluster1.cpu3.RVBAR=0x6000000 \ -C cluster0.has_arm_v8-3=1 \ - --data cluster0.cpu0="$romfw_path"@0x4024000 \ - --data cluster0.cpu0="$fip_path"@0x1000 + -C cluster1.has_arm_v8-3=1 \ + -C bp.flashloader0.fname="$fip_path" \ + --data cluster0.cpu0="$romfw_path"@0x6000000 \ + --data cluster0.cpu0="$linux_path"@0x80080000 \ + --data cluster0.cpu0="$ramdisk_path"@0x84000000 diff --git a/config/arm64-rcode.mk b/config/arm64-rcode.mk @@ -3,4 +3,3 @@ SYS = rcode MODE = native SYSASFLAGS = $(RCODE_ASFLAGS) $(ARMV81_ASFLAGS) SYSCFLAGS = $(RCODE_CFLAGS) -SYSLDFLAGS = -Ttext=0x4024000 diff --git a/drivers/dev.c b/drivers/dev.c @@ -431,13 +431,13 @@ int devseek(Chan *c, long off, int whence) { switch (whence) { - case RSEEK_SET: + case KSEEK_SET: c->offset = off; break; - case RSEEK_CUR: + case KSEEK_CUR: c->offset += off; break; - case RSEEK_END: + case KSEEK_END: panic("seek"); /* TODO */ break; } diff --git a/drivers/devar.c b/drivers/devar.c @@ -78,7 +78,7 @@ argen(Chan *c, const Dirtab *tab, int ntab, int n, Dir *dir) if (ar->offset[i] == -1) return 0; off = ar->offset[i]; - if (devtab[c->type]->seek(&nc, off, RSEEK_SET) < 0) + if (devtab[c->type]->seek(&nc, off, KSEEK_SET) < 0) return -1; if ((r = gethdr(&nc, &hdr)) <= 0) return r; @@ -106,6 +106,7 @@ arread(Chan *c, void *buf, int n) long off; Chan cs; struct arfile *ar; + long size; if (c->qid == CHDIR) return dirread(c, buf, n, NULL, 0, argen); @@ -118,11 +119,19 @@ arread(Chan *c, void *buf, int n) panic("arread2"); clone(ar->c, &cs); - if (c->offset >= ar->size[c->qid]) + size = ar->size[c->qid]; + if (c->offset >= size) return 0; + if (n < 0) { + errno = EINVAL; + return -1; + } + if (n > size - c->offset) + n = size - c->offset; + off = ar->offset[c->qid] + c->offset + sizeof(struct ar_hdr); - if (devtab[cs.type]->seek(&cs, off, RSEEK_SET) < 0) + if (devtab[cs.type]->seek(&cs, off, KSEEK_SET) < 0) return -1; n = devtab[cs.type]->read(&cs, buf, n); @@ -151,7 +160,7 @@ armount(Chan *c, char *spec) for (n = 0; n < NR_FILES; n++) ar->offset[n] = -1; - if ((cspec = namec(spec, O_READ)) < 0) + if ((cspec = namec(spec, O_READ)) == NULL) return NULL; ar->c = cspec; @@ -178,7 +187,7 @@ armount(Chan *c, char *spec) len++; t = cspec->type; - if (devtab[t]->seek(cspec, len, RSEEK_CUR) < 0) + if (devtab[t]->seek(cspec, len, KSEEK_CUR) < 0) goto err; break; } diff --git a/drivers/devcons.c b/drivers/devcons.c @@ -302,20 +302,12 @@ consreadediting(Chan *c) return 0; } -static char -consreadone(void) -{ - char ch; - - return devtab[in->type]->read(in, &ch, 1) < 0 ? EOF : ch; -} - static int fillbuffer(Chan *c) { char ch; - while (head + 1 < sizeof(buffer) && (ch = consreadone()) != EOF) { + while (head + 1 < sizeof(buffer) && (ch = kgetc(in)) != EOF) { buffer[head] = ch; consreadediting(c); if (buffer[head++] == '\n') @@ -372,7 +364,7 @@ consread(Chan *c, void *buf, int n) } const Dev consdevtab = { - .id = 's', + .id = 'c', .clone = devclone, .attach = devattach, .walk = conswalk, diff --git a/drivers/devfip.c b/drivers/devfip.c @@ -124,7 +124,7 @@ fipgen(Chan *c, const Dirtab *tab, int ntab, int n, Dir *dir) for (i = 0; i <= n; i++) { if (fip->offset[i] == -1) return 0; - if (devtab[nc.type]->devseek(&nc, off, RSEEK_SET) < 0) + if (devtab[nc.type]->devseek(&nc, off, KSEEK_SET) < 0) return -1; if ((r = getntry(&nc, &ntry)) <= 0) return r; @@ -158,6 +158,7 @@ fipread(Chan *c, void *buf, int n) long off; Chan cs; struct fipfile *fip; + long size; if (c->qid == CHDIR) return dirread(c, buf, n, NULL, 0, fipgen); @@ -170,11 +171,19 @@ fipread(Chan *c, void *buf, int n) panic("fipread2"); clone(fip->c, &cs); - if (c->offset >= fip->size[c->qid]) + size = fip->size[c->qid]; + if (c->offset >= size) return 0; + if (n < 0) { + errno = EINVAL; + return -1; + } + if (n > size - c->offset) + n = size - c->offset; + off = fip->offset[c->qid] + c->offset; - if (devtab[cs.type]->seek(&cs, off, RSEEK_SET) < 0) + if (devtab[cs.type]->seek(&cs, off, KSEEK_SET) < 0) return -1; n = devtab[cs.type]->read(&cs, buf, n); @@ -203,7 +212,7 @@ fipmount(Chan *c, char *spec) for (n = 0; n < NR_FILES; n++) fip->offset[n] = -1; - if ((cspec = namec(spec, O_READ)) < 0) + if ((cspec = namec(spec, O_READ)) == NULL) return NULL; fip->c = cspec; @@ -217,7 +226,7 @@ fipmount(Chan *c, char *spec) } t = cspec->type; - if (devtab[t]->seek(cspec, sizeof(hdr), RSEEK_SET) < 0) + if (devtab[t]->seek(cspec, sizeof(hdr), KSEEK_SET) < 0) goto err; for (n = 0; n < NR_FILES; n++) { switch (getntry(cspec, &ntry)) { diff --git a/drivers/mkdevc b/drivers/mkdevc @@ -50,7 +50,7 @@ function devtab() print "\nDev *const devtab[] = {" for (i in devs) printf "\t&%sdevtab,\n", i - print "};\n" + print "\t0\n};\n" } function devlink() diff --git a/include/features.h b/include/features.h @@ -2,7 +2,7 @@ #define FEATURES_H_ #if __GNUC__ || __clang__ - #define KPRINTFMT __attribute__ ((format (printf, 1, 2))) + #define KPRINTFMT __attribute__ ((format (printf, 2, 3))) #define KSNPRINTFMT __attribute__ ((format (printf, 3, 4))) #define noreturn __attribute__((__noreturn__)) #else diff --git a/include/libk.h b/include/libk.h @@ -5,14 +5,14 @@ #include "features.h" -extern int kprint(const char *fmt, ...) KPRINTFMT; +extern int kprint(int fd, const char *fmt, ...) KPRINTFMT; extern int ksnprint(char *str, size_t len, const char *fmt, ...) KSNPRINTFMT; -extern char *kgets(char *s, int n); -extern int kgetc(void); -extern int kputc(int ch); -extern int kputs(const char *s); -extern int kvprint(const char *fmt, va_list va); -extern int kwrite(char *buf, int n); +extern char *kgets(int fd, char *s, int n); +extern int kgetc(int fd); +extern int kputc(int fd, int ch); +extern int kputs(int fd, const char *s); +extern int kvprint(int fd, const char *fmt, va_list va); +extern int kwrite(int fd, char *buf, int n); extern void kerror(const char *s); extern int putenv(char *name); extern int tokenize(char *line, int siz, char *tokens[], int ntoks); diff --git a/include/rcode/io.h b/include/rcode/io.h @@ -7,9 +7,9 @@ #define FILNAMLEN (2 + NAMELEN) #define DIRLEN (STATLEN + FILNAMLEN + 3*ROOTLEN) -#define RSEEK_SET 0 -#define RSEEK_CUR 1 -#define RSEEK_END 2 +#define KSEEK_SET 0 +#define KSEEK_CUR 1 +#define KSEEK_END 2 typedef struct dir Dir; typedef unsigned short Qid; @@ -57,4 +57,6 @@ extern int write(int fd, void *buf, int n); extern int seek(int fd, long off, int whence); extern int bind(char *path, char *where); +extern int kin, kout, kerr; + #endif /* IO_H */ diff --git a/include/rcode/rcode.h b/include/rcode/rcode.h @@ -88,7 +88,7 @@ extern noreturn void badcmd(int error); extern void rmc(Rmucmd *cmd); extern int debug(void); extern void idev(void); -extern void dumpregs(struct trapframe *fp); +extern void dumpregs(struct trapframe *fp, int fd); /* architectural functions */ extern void *alloc(size_t size); diff --git a/src/libk/Makefile b/src/libk/Makefile @@ -13,6 +13,7 @@ OBJS = doprnt.o \ kerror.o \ kwrite.o \ tokenize.o \ + kstd.o \ __assert.o \ TARGET = $(LIBDIR)/libk.a diff --git a/src/libk/__assert.c b/src/libk/__assert.c @@ -5,6 +5,6 @@ void __assert(char *exp, char *file, long line) { - kprint("%s:%ld: assertion failed '%s'\n", file, line, exp); + kprint(kerr, "%s:%ld: assertion failed '%s'\n", file, line, exp); abort(); } diff --git a/src/libk/doprnt.c b/src/libk/doprnt.c @@ -13,7 +13,7 @@ putch(Stream *sp, int c) if (sp->cnt < sp->len) sp->base[sp->cnt++] = c; } else { - kputc(c); + kputc(sp->fd, c); sp->cnt++; } } diff --git a/src/libk/kerror.c b/src/libk/kerror.c @@ -8,5 +8,5 @@ kerror(const char *s) { char *msg = strerror(errno); - kprint("%s: %s\n", s, msg); + kprint(kerr, "%s: %s\n", s, msg); } diff --git a/src/libk/kgetc.c b/src/libk/kgetc.c @@ -5,9 +5,9 @@ #include "../libc/syscall.h" int -kgetc(void) +kgetc(int fd) { char ch; - return (_read(0, &ch, 1) < 0) ? EOF : ch; + return (_read(fd, &ch, 1) < 0) ? EOF : ch; } diff --git a/src/libk/kgets.c b/src/libk/kgets.c @@ -3,12 +3,12 @@ #include <libk.h> char * -kgets(char *s, int n) +kgets(int fd, char *s, int n) { int ch = 0; char *t = s; - while (--n > 0 && (ch = kgetc()) != EOF) { + while (--n > 0 && (ch = kgetc(fd)) != EOF) { if ((*t++ = ch) == '\n') break; } diff --git a/src/libk/kprint.c b/src/libk/kprint.c @@ -5,12 +5,12 @@ #include "stream.h" int -kprint(const char *fmt, ...) +kprint(int fd, const char *fmt, ...) { va_list ap; Stream stream; - stream.fd = 1; + stream.fd = fd; stream.base = NULL; stream.len = 0; stream.cnt = 0; diff --git a/src/libk/kputc.c b/src/libk/kputc.c @@ -5,9 +5,9 @@ #include "../libc/syscall.h" int -kputc(int ch) +kputc(int fd, int ch) { char c = ch; - return (_write(1, &c, 1) < 0) ? EOF : 1; + return (_write(fd, &c, 1) < 0) ? EOF : 1; } diff --git a/src/libk/kputs.c b/src/libk/kputs.c @@ -3,9 +3,9 @@ #include <libk.h> int -kputs(const char *s) +kputs(int fd, const char *s) { - for ( ; *s && kputc(*s) != EOF; ++s) + for ( ; *s && kputc(fd, *s) != EOF; ++s) ; return (*s != '\0') ? EOF : 0; } diff --git a/src/libk/kstd.c b/src/libk/kstd.c @@ -0,0 +1,3 @@ +#include <rcode/io.h> + +int kin, kout, kerr; diff --git a/src/libk/kvprint.c b/src/libk/kvprint.c @@ -6,13 +6,13 @@ #include "stream.h" int -kvprint(const char *fmt, va_list va) +kvprint(int fd, const char *fmt, va_list va) { va_list ap; Stream stream; va_copy(ap, va); - stream.fd = 1; + stream.fd = fd; stream.base = NULL; stream.len = 0; stream.cnt = 0; diff --git a/src/libk/kwrite.c b/src/libk/kwrite.c @@ -5,7 +5,7 @@ #include "../libc/syscall.h" int -kwrite(char *buf, int n) +kwrite(int fd, char *buf, int n) { - return _write(1, buf, n); + return _write(fd, buf, n); } diff --git a/src/romfw/dlang.c b/src/romfw/dlang.c @@ -41,16 +41,16 @@ error(char *fmt, ...) va_list va; va_start(va, fmt); - kputs(PREFIX "ERR "); - kvprint(fmt, va); - kputc('\n'); + kputs(kerr, PREFIX "ERR "); + kvprint(kerr, fmt, va); + kputc(kerr, '\n'); longjmp(dbgrecover, 1); } static void ready(void) { - kputs(PREFIX "READY\n"); + kputs(kout, PREFIX "READY\n"); } /* Read a value in a given base between 2 and 16 0 means default base; @@ -132,14 +132,14 @@ do_get(const struct cmd *cmd, struct args *args) if (reg == NULL) error("get: %s: not found", args->argv[1]); - kprint("%llx\n", *reg); + kprint(kout, "%llx\n", *reg); return 0; } static int do_dump(const struct cmd *cmd, struct args *args) { - dumpregs(framep); + dumpregs(framep, kout); return 0; } @@ -174,7 +174,7 @@ do_rmu(const struct cmd *cmd, struct args *args) if (args->argv[1][0] == '?') { for (desc = rmudescs; desc->name; desc++) { char *s = desc->name; - kprint("%s\n", s); + kprint(kout, "%s\n", s); } return 0; } @@ -204,7 +204,7 @@ do_help(const struct cmd *cmd, struct args *args) { for (cmd = cmds; cmd->name; cmd++) { char *s = cmd->helpmsg; - kprint("%s\n", s); + kprint(kout, "%s\n", s); } return 0; } @@ -219,7 +219,7 @@ do_cat(const struct cmd *cmd, struct args *args) goto err; while ((n = read(fd, buf, sizeof(buf))) > 0) - kwrite(buf, n); + kwrite(kin, buf, n); if (close(fd) < 0 || n < 0) goto err; @@ -242,7 +242,7 @@ do_ls(const struct cmd *cmd, struct args *args) goto err; while ((n = readdir(dir, &d)) > 0) - kprint("%s\n", d.d_name); + kprint(kout, "%s\n", d.d_name); if (closedir(dir) < 0 || n < 0) goto err; @@ -315,7 +315,7 @@ run(struct args *args) size_t len; char buffer[LINELEN]; - if (kgets(buffer, sizeof(buffer)) == NULL) { + if (kgets(kin, buffer, sizeof(buffer)) == NULL) { args->status = 1; return -1; } @@ -345,13 +345,13 @@ debug(void) { struct args args; - kprint("begin debug language interface\n"); + kprint(kout, "begin debug language interface\n"); in_debug = 1; setjmp(dbgrecover); for (ready(); !run(&args); ready()) ; - kprint("end debug language interface\n"); + kprint(kout, "end debug language interface\n"); in_debug = 0; return args.status; diff --git a/src/romfw/rmc.c b/src/romfw/rmc.c @@ -59,15 +59,15 @@ const char *const regnames[] = { }; void -dumpregs(struct trapframe *fp) +dumpregs(struct trapframe *fp, int fd) { int i; for (i = 0; i < NR_REGS; i++) - kprint("%s=0x%llx%c", regnames[i], fp->r[i], + kprint(fd, "%s=0x%llx%c", regnames[i], fp->r[i], (i > 0 && i % 3 == 0) ? '\n' : ' '); if (i % 4 != 3) - kputc('\n'); + kputc(fd, '\n'); } static void @@ -77,10 +77,10 @@ backtrace(struct trapframe *fp) if (!in_backtrace) return; - kprint("backtrace:\n"); - kprint("%0llx\n", fp->r[X30]); + kprint(kerr, "backtrace:\n"); + kprint(kerr, "%0llx\n", fp->r[X30]); for (bp = (void **) fp->r[X29]; *bp; bp = (void **) *bp) - kprint("%p\n", bp[1]); + kprint(kerr, "%p\n", bp[1]); } static void @@ -90,10 +90,10 @@ dumpstack(struct trapframe *fp) if (!in_dumpstack) return; - kprint("stack dump:\n"); + kprint(kerr, "stack dump:\n"); sp = (long long *)fp->r[SP]; for (i = 1; i <= 16; i++) - kprint("%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); + kprint(kerr, "%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); } static void @@ -109,9 +109,9 @@ panicfmt(const char *msg, struct trapframe *fp) } in_panic = 1; - kprint("panic: %s\n", msg); + kprint(kerr, "panic: %s\n", msg); - dumpregs(fp); + dumpregs(fp, kerr); backtrace(fp); dumpstack(fp); } @@ -128,7 +128,7 @@ void panic(const char *msg) { if (in_debug) { - kprint("panic: %s\n", msg); + kprint(kerr, "panic: %s\n", msg); longjmp(dbgrecover, 1); } @@ -155,7 +155,7 @@ trap(struct trapframe *fp) panicfmt(errstr, fp); halt(); } - dbg("exception handler\n"); + dbg(kerr, "exception handler\n"); ec = (fp->r[ESR] >> 26) & 0x3f; @@ -179,7 +179,7 @@ badcmd(int error) { Rmucmd *cmd = rmucmd; - dbg("bad RMC: %d, %d = %d\n", cmd->class, cmd->func, error); + dbg(kerr, "bad RMC: %d, %d = %d\n", cmd->class, cmd->func, error); framep->r[X0] = error; swtch(framep); } diff --git a/target/hosted/rcode b/target/hosted/rcode @@ -3,6 +3,7 @@ dev uart pl011 base=0x1c0c0000,clk=24000000,cfg=b115200 l8 #t0 pl011 base=0x1c0c0100,clk=24000000 #t1 + cons ar blob bios 0x100,0x400 diff --git a/target/hosted/rom.c b/target/hosted/rom.c @@ -50,18 +50,36 @@ imach(void) static void namespace(void) { - if (bind("#t0", "/dev/uart0") < 0) { - kerror("/dev/uart0"); + /* Standard input set to 0 */ + kin = open("#c/raw", O_READ); + if (kin != 0) { + kerror("open:#c/raw read"); + goto error; + } + + /* Standard output set to 1 */ + kout = open("#c/raw", O_WRITE); + if (kout != 1) { + kerror("open:#c/raw write"); + goto error; + } + + /* Standard error set to 2 */ + kerr = open("#c/raw", O_WRITE); + if (kerr != 2) { + kerror("open:#c/raw write"); goto error; } - if (bind("#t0", "/dev/cons") < 0) { - kerror("/dev/cons"); + + if (bind("#t0", "/dev/uart0") < 0) { + kerror("bind:/dev/uart0"); goto error; } - if (mount("#R", "/arfs", "/blobs/example.a") < 0) { - kerror("mount /arfs"); + if (bind("#c", "/dev/cons") < 0) { + kerror("bind:/dev/cons"); goto error; } + return; error: diff --git a/target/native/crt.s b/target/native/crt.s @@ -8,6 +8,17 @@ _start: msr VBAR_EL3,x0 isb + /* Differentiate between cold and warm boot (FVP only) */ + mrs x2, mpidr_el1 + ldr x1,=0x1c100000 + str w2, [x1, 0x10] + ldr w2, [x1, 0x10] + ubfx w2, w2, 24, 2 + cmp w2, 2 + beq warm + cmp w2, 3 + beq warm + ldr x0,=end /* Setup an initial stack */ mov x1,#0x100f /* 1 page + 15 */ add x0,x0,x1 @@ -24,6 +35,11 @@ _start: adr x0,outsync b panic +warm: + /* Hardcoded address of BL2 at EL3 */ + ldr x0,=0x4022000 + br x0 + .section .rodata outsync: .asciz "out of sync" diff --git a/target/native/rcode b/target/native/rcode @@ -6,5 +6,5 @@ dev cons fip blob - fip.bin 0x1000,0x100000 + fip.bin 0x8000000,0x80000 end diff --git a/target/native/rom.c b/target/native/rom.c @@ -63,7 +63,7 @@ imach(Mach *mp, void *stackp) _environ = mp->env; framep->r[SP] = (unsigned long long)mp->sp; - framep->r[ELR] = rsysreg(RVBAR_EL3); + framep->r[ELR] = 0x4022000; framep->r[SPSR] = 0xf << 6 | 0xd; rmctab = &romtab; @@ -75,7 +75,8 @@ imach(Mach *mp, void *stackp) static void info(Mach *mp) { - dbg("romfw: version %s\n" + dbg(kout, + "romfw: version %s\n" "env = %p, envsiz = 0x%zx\n" "sp = %p, stacksiz = 0x%zx\n", RCODEVERSION, @@ -90,19 +91,28 @@ namespace(void) static char setin[] = "addin /dev/uart0/raw\n"; static char setout[] = "addout /dev/uart0/raw\n"; - if (open("#s0/raw", O_READ) != 0) { - kerror("#s0/raw read"); + /* Standard input set to 0 */ + kin = open("#c/raw", O_READ); + if (kin != 0) { + kerror("open:#c/raw read"); goto error; } - if (open("#s0/raw", O_WRITE) != 1) { - kerror("#s0/raw write"); + + /* Standard output set to 1 */ + kout = open("#c/raw", O_WRITE); + if (kout != 1) { + kerror("open:#c/raw write"); goto error; } - if (open("#s0/raw", O_WRITE) != 2) { - kerror("#s0/raw write"); + + /* Standard error set to 2 */ + kerr = open("#c/raw", O_WRITE); + if (kerr != 2) { + kerror("open:#c/raw write"); goto error; } - if (bind("#s0", "/dev/cons") < 0) { + + if (bind("#c", "/dev/cons") < 0) { kerror("bind:/dev/cons"); goto error; } @@ -115,17 +125,27 @@ namespace(void) goto error; } - if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) + if ((fd = open("/dev/cons/ctl", O_WRITE)) < 0) { + kerror("open:/dev/cons/ctl write"); goto error; - if (write(fd, setin, sizeof(setin)) < 0) + } + if (write(fd, setin, sizeof(setin)) < 0) { + kerror("write:setin"); goto error; - if (write(fd, setout, sizeof(setout)) < 0) + } + if (write(fd, setout, sizeof(setout)) < 0) { + kerror("write:setout"); goto error; - if (close(fd) < 0) + } + if (close(fd) < 0) { + kerror("close:/dev/cons/ctl"); goto error; + } - if (mount("#F", "/fip", "/blobs/fip.bin") < 0) + if (mount("#F", "/fip", "/blobs/fip.bin") < 0) { + kerror("mount:/fip"); goto error; + } return; @@ -134,6 +154,41 @@ error: } void +loadfip(void) +{ + int fd; + + fd = open("/fip/bl2.bin", O_READ); + if (fd < 0) { + kerror("bl2 missing"); + goto error; + } + read(fd, (void *) 0x4022000, 0x80000); + close(fd); + + fd = open("/fip/bl33.bin", O_READ); + if (fd < 0) { + kerror("bl33 missing"); + goto error; + } + read(fd, (void *) 0x88000000, 0x80000); + close(fd); + + fd = open("/fip/hw.cfg", O_READ); + if (fd < 0) { + kerror("dtb missing"); + goto error; + } + read(fd, (void *) 0x82000000, 0x80000); + close(fd); + + return; + +error: + panic("loadfip"); +} + +void main(void *stackp) { Mach mach; @@ -145,5 +200,6 @@ main(void *stackp) namespace(); info(&mach); debug(); + loadfip(); swtch(framep); } diff --git a/test/unit/001/test.c b/test/unit/001/test.c @@ -22,7 +22,7 @@ main(int argc, char *argv[]) cmd.class = i; cmd.func = j; bss->cmd = &cmd; - dbg("%u\t%u\t", i, j); + dbg(kout, "%u\t%u\t", i, j); if (!setjmp(recover)) rmc(&cmd); }