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