9os

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

commit 9e6e8186f0731876c879eb750ff3a6d1ae50a74b
parent 1f3bd526cba2cd599ef429af7d68928c36799828
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Tue, 27 Nov 2018 16:05:17 +0000

Split functionality between rom and ram

Change-Id: Iae980a08d1d742ed6004ed44c53ca60452cf493b

Diffstat:
Mdrivers/pl011.c | 1+
Ainclude/ramfw.h | 3+++
Minclude/rcode.h | 61+++++++++----------------------------------------------------
Ainclude/romfw.h | 47+++++++++++++++++++++++++++++++++++++++++++++++
Dscripts/gentbl.sh | 66------------------------------------------------------------------
Ascripts/mkrmctab | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/.gitignore | 2--
Msrc/Makefile | 7+------
Dsrc/ec.h | 45---------------------------------------------
Msrc/libhdl/hdl_RMU_Crypto_Random.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Add.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_AddInit.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Claim.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Clean.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Detail.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Export.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_ExportInit.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Fuse.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Import.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_ImportInit.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Info.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Invalidate.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Reclaim.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Release.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_SetGlobalVisibility.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_SetPermissions.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Shatter.c | 2+-
Msrc/libhdl/hdl_RMU_Granule_Sync.c | 2+-
Msrc/libhdl/hdl_RMU_Local_Load.c | 2+-
Msrc/libhdl/hdl_RMU_Local_Status.c | 2+-
Msrc/libhdl/hdl_RMU_Local_Validate.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_BufferSize.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_Info.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_Move.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_ReadStorage.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_Register.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_Release.c | 2+-
Msrc/libhdl/hdl_RMU_MDT_WriteStorage.c | 2+-
Msrc/libhdl/hdl_RMU_REC_Prepare.c | 2+-
Msrc/libhdl/hdl_RMU_REC_ReadGeneralPurposeRegister.c | 2+-
Msrc/libhdl/hdl_RMU_REC_ReadSystemRegister.c | 2+-
Msrc/libhdl/hdl_RMU_REC_ReadVectorRegister.c | 2+-
Msrc/libhdl/hdl_RMU_REC_Register.c | 2+-
Msrc/libhdl/hdl_RMU_REC_Release.c | 2+-
Msrc/libhdl/hdl_RMU_REC_Size.c | 2+-
Msrc/libhdl/hdl_RMU_REC_WriteGeneralPurposeRegister.c | 2+-
Msrc/libhdl/hdl_RMU_REC_WriteSystemRegister.c | 2+-
Msrc/libhdl/hdl_RMU_REC_WriteVectorRegister.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Activate.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_AttestationReport.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_AttestationReportInit.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_AttestationReportSize.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_CreateZeroMetadata.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_DeriveBindingKey.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_ExtendBindingKeySeedValue.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_GetBindingKeySeedValue.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_GetMetadata.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_GetParameterInheritance.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_GetParameterValue.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Info.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Initialize.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Invalidate.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_InvalidateCurrent.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Populate.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Prepare.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_ReadMemory.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Register.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_Release.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_SetBindingKeySeedLock.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_SetCommandTrap.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_SetMetadata.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_SetParameterInheritance.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_SetParameterValue.c | 2+-
Msrc/libhdl/hdl_RMU_Realm_WriteMemory.c | 2+-
Msrc/libhdl/hdl_RMU_System_Enable.c | 2+-
Msrc/libhdl/hdl_RMU_System_InterfaceVersion.c | 6+++---
Msrc/libhdl/hdl_RMU_System_Status.c | 4++--
Msrc/librmu/RMU_System_Enable.c | 2++
Msrc/librmu/RMU_System_Status.c | 2++
Dsrc/mkecstr | 21---------------------
Asrc/ramfw/.gitignore | 1+
Msrc/ramfw/Makefile | 10++--------
Dsrc/rmc.c | 189-------------------------------------------------------------------------------
Msrc/romfw/.gitignore | 2++
Msrc/romfw/Makefile | 13++++++-------
Msrc/romfw/dlang.c | 3++-
Asrc/romfw/ec.h | 47+++++++++++++++++++++++++++++++++++++++++++++++
Asrc/romfw/mkecstr | 19+++++++++++++++++++
Asrc/romfw/rmc.c | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtarget/hosted/Makefile | 8++++++++
Mtarget/hosted/arch.c | 5+++--
Mtarget/hosted/hosted.h | 1+
Mtarget/hosted/ram.c | 3+++
Mtarget/hosted/rom.c | 10++--------
Mtarget/native/Makefile | 9+++++++++
Mtarget/native/rom.c | 2++
96 files changed, 498 insertions(+), 478 deletions(-)

diff --git a/drivers/pl011.c b/drivers/pl011.c @@ -1,5 +1,6 @@ #include <uart.h> #include <rcode.h> +#include <romfw.h> #define NRETRY 10000 diff --git a/include/ramfw.h b/include/ramfw.h @@ -0,0 +1,3 @@ +struct bssmap { + void *text; +}; diff --git a/include/rcode.h b/include/rcode.h @@ -1,5 +1,3 @@ -#include <setjmp.h> -#include <stdarg.h> #include <stddef.h> #include <stdint.h> @@ -7,10 +5,8 @@ #ifndef NDEBUG #define dbg kprint - #define NR_EC_STR NR_EC_VALS #else #define dbg - #define NR_EC_STR 0 #endif #define PAGESIZE 4096 @@ -26,32 +22,6 @@ enum devflags { typedef struct rmucmd Rmucmd; -struct bssmap { - unsigned char in_panic; - unsigned char in_debug; - unsigned char dumpstack; - unsigned char backtrace; - void *text; - void *environ; - size_t bsssize; - - void *uartbase; - const char *errstr; - jmp_buf dbgrecover; - struct trapframe *fp; - Rmucmd *cmd; - - unsigned char enable; /* System realm enablement */ - unsigned char hascrypto; /* System-wide memory encryption */ - - int errno_; -}; - -struct rowidx { - unsigned char off; - unsigned char cnt; -}; - struct trapframe { unsigned long long x0, x1; unsigned long long x2, x3; @@ -78,8 +48,17 @@ struct trapframe { unsigned long long far; }; +struct rmctab { + struct rmcclass { + unsigned char off; + unsigned char cnt; + } class[256]; + void *handler[]; +}; + struct rmucmd { unsigned class, func; + struct trapframe *fp; }; extern noreturn void halt(void); @@ -104,31 +83,9 @@ extern noreturn void dohalt(void); extern noreturn void dopanic(void); extern noreturn void doswtch(struct trapframe *fp); extern void intr(int mode); -extern struct bssmap *bss(void); extern uint8_t inm8(void *addr); extern uint16_t inm16(void *addr); extern uint32_t inm32(void *addr); extern uint8_t outm8(uint8_t, void *addr); extern uint16_t outm16(uint16_t, void *addr); extern uint32_t outm32(uint32_t, void *addr); - -/* global constant variables */ -extern const struct rowidx rowidx[]; -extern const void *const handler[]; -extern const char *const ecstr[]; - -#define bss bss() - -/* - * Reloc() is used to relocate address - * because we are linked at address 0 but we can be - * loaded at any address - */ -static inline void * -reloc(const void *addr) -{ - uintptr_t a = (uintptr_t) addr; - uintptr_t off = (uintptr_t) bss->text; - - return (void *) (a + off); -} diff --git a/include/romfw.h b/include/romfw.h @@ -0,0 +1,47 @@ +#include <stddef.h> +#include <stdint.h> +#include <setjmp.h> + +struct rmctab; +struct trapframe; + +struct bssmap { + unsigned char in_panic; + unsigned char in_debug; + unsigned char dumpstack; + unsigned char backtrace; + void *text; + void *environ; + size_t bsssize; + + void *uartbase; + const char *errstr; + jmp_buf dbgrecover; + struct rmctab *rmctab; + struct trapframe *fp; + Rmucmd *cmd; + + unsigned char enable; /* System realm enablement */ + unsigned char hascrypto; /* System-wide memory encryption */ + + int errno_; +}; + +extern struct bssmap *bss(void); +#define bss bss() + +/* + * Reloc() is used to relocate address + * because we are linked at address 0 but we can be + * loaded at any address + */ +static inline void * +reloc(const void *addr) +{ + uintptr_t a = (uintptr_t) addr; + uintptr_t off = (uintptr_t) bss->text; + + return (void *) (a + off); +} + +extern struct rmctab romtab; diff --git a/scripts/gentbl.sh b/scripts/gentbl.sh @@ -1,66 +0,0 @@ -#!/bin/sh - -in=rmu.cmd -out=rmutbl.c -tmp=gentbl.$$ -img=rom - -for i -do - case $i in - -o) - out=$2 - shift 2 - ;; - -b) - img=$2 - shift 2 - ;; - -i) - in=$2 - shift 2 - ;; - --) - shift - ;; - -*) - echo usage: gentbl.sh [-o file] >&2 - exit 1 - ;; - esac -done - -trap "rm -f $tmp" EXIT HUP QUIT INT TERM - -sort -n -k1,2 < $in | -awk ' -BEGIN { - print "#include <rcode.h>\n" -}; - -NF == 4 && $1 ~ /[0-9]*/ && $2 ~ /[0-9]*/ && /'$img'/ { - rowcnt[$1]++ - gsub(/\./, "_", $3) - cmds[$1,$2] = $3 - next -} - -END { - for (cmd in cmds) - print "extern void hdl_" cmds[cmd] "(Rmucmd *cmd);" - print "" - - print "const struct rowidx rowidx[256] = {" - for (row in rowcnt) { - begin[row] = colcnt - printf "\t[%d] = {.off = %d, .cnt = %d},\n", row, colcnt, rowcnt[row] - colcnt += rowcnt[row] - } - print "};" - - print "const void *const handler[] = {" - for (row in rowcnt) - for (col = 0; col < rowcnt[row]; col++) - printf "\t[%d] = hdl_%s,\n", begin[row] + col, cmds[row,col] - print "};" -}' > $tmp && mv $tmp rmctbl.c diff --git a/scripts/mkrmctab b/scripts/mkrmctab @@ -0,0 +1,65 @@ +#!/bin/sh + +in=rmu.cmd +out=rmutbl.c +tmp=gentbl.$$ +img=rom + +for i +do + case $i in + -o) + out=$2 + shift 2 + ;; + -b) + img=$2 + shift 2 + ;; + -i) + in=$2 + shift 2 + ;; + --) + shift + ;; + -*) + echo usage: mkrmctab [-o file] >&2 + exit 1 + ;; + esac +done + +trap "rm -f $tmp" EXIT HUP QUIT INT TERM + +sort -n -k1,2 < $in | +awk ' +BEGIN { + print "#include <rcode.h>\n" +}; + +NF == 4 && $1 ~ /[0-9]*/ && $2 ~ /[0-9]*/ && /'$img'/ { + rowcnt[$1]++ + gsub(/\./, "_", $3) + cmds[$1,$2] = $3 + next +} + +END { + for (cmd in cmds) + print "extern void hdl_" cmds[cmd] "(Rmucmd *cmd);" + print "" + + print "const struct rmctab '$img'tab = {" + print "\t.class = {" + for (row in rowcnt) { + begin[row] = colcnt + printf "\t\t[%d] = {.off = %d, .cnt = %d},\n", row, colcnt, rowcnt[row] + colcnt += rowcnt[row] + } + print "\t},\n\t.handler = {" + for (row in rowcnt) + for (col = 0; col < rowcnt[row]; col++) + printf "\t[%d] = hdl_%s,\n", begin[row] + col, cmds[row,col] + print "\t}\n};" +}' > $tmp && mv $tmp ${out-rmctab.c} diff --git a/src/.gitignore b/src/.gitignore @@ -1,2 +0,0 @@ -ecstr.c -rmctbl.c diff --git a/src/Makefile b/src/Makefile @@ -5,21 +5,16 @@ include $(PROJECTDIR)/scripts/rules.mk LIBS = libk libc librmu libtypes libhdl IMGS = ramfw romfw DIRS = $(LIBS) $(IMGS) -OBJS = rmc.o ecstr.o all: $(IMGS) gen: FORCE +@cd libtypes && $(MAKE) gen -ecstr.c: ec.h - ./mkecstr ec.h - -$(IMGS): $(LIBS) $(OBJS) +$(IMGS): $(LIBS) $(DIRS): FORCE +@cd $@ && $(MAKE) clean: $(FORALL) - rm -f ecstr.c diff --git a/src/ec.h b/src/ec.h @@ -1,45 +0,0 @@ -enum ecvals { - UNKNOWN = 0x00, /* unknown reason */ - TRAPWFI = 0x01, /* trapped wfi or wfe */ - TRAPMCR = 0x03, /* trapped mcr or mrc (coproc == 1111) */ - TRAPMCRR = 0x04, /* trapped mcrr or mrrc (coproc == 1111) */ - TRAPMCR2 = 0x05, /* trapped mcr or mrc (coproc == 1110) */ - TRAPLDC = 0x06, /* trapped LDC or STC */ - TRAPSVE = 0x07, /* trapped SVE */ - TRAPVMRS = 0x08, /* trapped VMRS */ - TRAPPTRA = 0x09, /* trapped pointer autentication */ - TRAPMCRR2 = 0x0c, /* trapped mcrr or mrrc (coproc == 1110) */ - ILL = 0x0f, /* Illegal execution state */ - SVC32 = 0x11, /* SVC in AArch32 */ - HVC32 = 0x12, /* HVC in AArch32 */ - SMC32 = 0x13, /* SVC in AArch32 */ - SVC = 0x15, /* SVC */ - HVC = 0x16, /* HVC */ - SMC = 0x17, /* SMC */ - TRAPSYS = 0x18, /* Trapped MSR, MRS or System instruction */ - SVE = 0x19, /* SVE */ - TRAP = 0x1a, /* trapped ERET, ERETAA, ERETAB */ - EL3EXCP = 0x1f, /* implementation defined exception to EL3 */ - IABORTL = 0x20, /* Instruction abort from lower level */ - IABORT = 0x21, /* Instruction abort from current level */ - PCALIGN = 0x22, /* PC aligment fault exception */ - DABORTL = 0x24, /* Data abort from lower level */ - DABORT = 0x25, /* Data abort from current level */ - SPALIGN = 0x26, /* SP aligment fault exception */ - FPE32 = 0x28, /* Floating-point exception in AArch32 */ - FPE = 0x2c, /* Floating-point exception in AArch64 */ - SOFTRES = 0x2d, /* Software defined fault syndrome */ - RMC = 0x2e, /* RMC */ - SERROR = 0x2f, /* Serror interrupt */ - BREAKL = 0x30, /* Breakpoint exception from lower level */ - BREAK = 0x31, /* Breakpoint exception from current level */ - STEPL = 0x32, /* Software step from lower level */ - STEP = 0x33, /* Software step from current level */ - WATCHL = 0x34, /* Watchpoint from lower level */ - WATCH = 0x35, /* Watchpoint from current level */ - BKPT = 0x38, /* BKPT instruction in AArch32 */ - VECTOR = 0x3a, /* Vector catch exception in AArch32 */ - TRAPL = 0x3b, /* Trap from lower level */ - BRK = 0x3c, /* BRK instruction in AArch64 */ - NR_EC_VALS -}; diff --git a/src/libhdl/hdl_RMU_Crypto_Random.c b/src/libhdl/hdl_RMU_Crypto_Random.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Crypto_Random(void) +hdl_RMU_Crypto_Random(Rmucmd *cmd) { panic("hdl_RMU_Crypto_Random"); } diff --git a/src/libhdl/hdl_RMU_Granule_Add.c b/src/libhdl/hdl_RMU_Granule_Add.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Add(void) +hdl_RMU_Granule_Add(Rmucmd *cmd) { panic("hdl_RMU_Granule_Add"); } diff --git a/src/libhdl/hdl_RMU_Granule_AddInit.c b/src/libhdl/hdl_RMU_Granule_AddInit.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_AddInit(void) +hdl_RMU_Granule_AddInit(Rmucmd *cmd) { panic("hdl_RMU_Granule_AddInit"); } diff --git a/src/libhdl/hdl_RMU_Granule_Claim.c b/src/libhdl/hdl_RMU_Granule_Claim.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Claim(void) +hdl_RMU_Granule_Claim(Rmucmd *cmd) { panic("hdl_RMU_Granule_Claim"); } diff --git a/src/libhdl/hdl_RMU_Granule_Clean.c b/src/libhdl/hdl_RMU_Granule_Clean.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Clean(void) +hdl_RMU_Granule_Clean(Rmucmd *cmd) { panic("hdl_RMU_Granule_Clean"); } diff --git a/src/libhdl/hdl_RMU_Granule_Detail.c b/src/libhdl/hdl_RMU_Granule_Detail.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Detail(void) +hdl_RMU_Granule_Detail(Rmucmd *cmd) { panic("hdl_RMU_Granule_Detail"); } diff --git a/src/libhdl/hdl_RMU_Granule_Export.c b/src/libhdl/hdl_RMU_Granule_Export.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Export(void) +hdl_RMU_Granule_Export(Rmucmd *cmd) { panic("hdl_RMU_Granule_Export"); } diff --git a/src/libhdl/hdl_RMU_Granule_ExportInit.c b/src/libhdl/hdl_RMU_Granule_ExportInit.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_ExportInit(void) +hdl_RMU_Granule_ExportInit(Rmucmd *cmd) { panic("hdl_RMU_Granule_ExportInit"); } diff --git a/src/libhdl/hdl_RMU_Granule_Fuse.c b/src/libhdl/hdl_RMU_Granule_Fuse.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Fuse(void) +hdl_RMU_Granule_Fuse(Rmucmd *cmd) { panic("hdl_RMU_Granule_Fuse"); } diff --git a/src/libhdl/hdl_RMU_Granule_Import.c b/src/libhdl/hdl_RMU_Granule_Import.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Import(void) +hdl_RMU_Granule_Import(Rmucmd *cmd) { panic("hdl_RMU_Granule_Import"); } diff --git a/src/libhdl/hdl_RMU_Granule_ImportInit.c b/src/libhdl/hdl_RMU_Granule_ImportInit.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_ImportInit(void) +hdl_RMU_Granule_ImportInit(Rmucmd *cmd) { panic("hdl_RMU_Granule_ImportInit"); } diff --git a/src/libhdl/hdl_RMU_Granule_Info.c b/src/libhdl/hdl_RMU_Granule_Info.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Info(void) +hdl_RMU_Granule_Info(Rmucmd *cmd) { panic("hdl_RMU_Granule_Info"); } diff --git a/src/libhdl/hdl_RMU_Granule_Invalidate.c b/src/libhdl/hdl_RMU_Granule_Invalidate.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Invalidate(void) +hdl_RMU_Granule_Invalidate(Rmucmd *cmd) { panic("hdl_RMU_Granule_Invalidate"); } diff --git a/src/libhdl/hdl_RMU_Granule_Reclaim.c b/src/libhdl/hdl_RMU_Granule_Reclaim.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Reclaim(void) +hdl_RMU_Granule_Reclaim(Rmucmd *cmd) { panic("hdl_RMU_Granule_Reclaim"); } diff --git a/src/libhdl/hdl_RMU_Granule_Release.c b/src/libhdl/hdl_RMU_Granule_Release.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Release(void) +hdl_RMU_Granule_Release(Rmucmd *cmd) { panic("hdl_RMU_Granule_Release"); } diff --git a/src/libhdl/hdl_RMU_Granule_SetGlobalVisibility.c b/src/libhdl/hdl_RMU_Granule_SetGlobalVisibility.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_SetGlobalVisibility(void) +hdl_RMU_Granule_SetGlobalVisibility(Rmucmd *cmd) { panic("hdl_RMU_Granule_SetGlobalVisibility"); } diff --git a/src/libhdl/hdl_RMU_Granule_SetPermissions.c b/src/libhdl/hdl_RMU_Granule_SetPermissions.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_SetPermissions(void) +hdl_RMU_Granule_SetPermissions(Rmucmd *cmd) { panic("hdl_RMU_Granule_SetPermissions"); } diff --git a/src/libhdl/hdl_RMU_Granule_Shatter.c b/src/libhdl/hdl_RMU_Granule_Shatter.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Shatter(void) +hdl_RMU_Granule_Shatter(Rmucmd *cmd) { panic("hdl_RMU_Granule_Shatter"); } diff --git a/src/libhdl/hdl_RMU_Granule_Sync.c b/src/libhdl/hdl_RMU_Granule_Sync.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Granule_Sync(void) +hdl_RMU_Granule_Sync(Rmucmd *cmd) { panic("hdl_RMU_Granule_Sync"); } diff --git a/src/libhdl/hdl_RMU_Local_Load.c b/src/libhdl/hdl_RMU_Local_Load.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Local_Load(void) +hdl_RMU_Local_Load(Rmucmd *cmd) { panic("hdl_RMU_Local_Load"); } diff --git a/src/libhdl/hdl_RMU_Local_Status.c b/src/libhdl/hdl_RMU_Local_Status.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Local_Status(void) +hdl_RMU_Local_Status(Rmucmd *cmd) { panic("hdl_RMU_Local_Status"); } diff --git a/src/libhdl/hdl_RMU_Local_Validate.c b/src/libhdl/hdl_RMU_Local_Validate.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Local_Validate(void) +hdl_RMU_Local_Validate(Rmucmd *cmd) { panic("hdl_RMU_Local_Validate"); } diff --git a/src/libhdl/hdl_RMU_MDT_BufferSize.c b/src/libhdl/hdl_RMU_MDT_BufferSize.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_BufferSize(void) +hdl_RMU_MDT_BufferSize(Rmucmd *cmd) { panic("hdl_RMU_MDT_BufferSize"); } diff --git a/src/libhdl/hdl_RMU_MDT_Info.c b/src/libhdl/hdl_RMU_MDT_Info.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_Info(void) +hdl_RMU_MDT_Info(Rmucmd *cmd) { panic("hdl_RMU_MDT_Info"); } diff --git a/src/libhdl/hdl_RMU_MDT_Move.c b/src/libhdl/hdl_RMU_MDT_Move.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_Move(void) +hdl_RMU_MDT_Move(Rmucmd *cmd) { panic("hdl_RMU_MDT_Move"); } diff --git a/src/libhdl/hdl_RMU_MDT_ReadStorage.c b/src/libhdl/hdl_RMU_MDT_ReadStorage.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_ReadStorage(void) +hdl_RMU_MDT_ReadStorage(Rmucmd *cmd) { panic("hdl_RMU_MDT_ReadStorage"); } diff --git a/src/libhdl/hdl_RMU_MDT_Register.c b/src/libhdl/hdl_RMU_MDT_Register.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_Register(void) +hdl_RMU_MDT_Register(Rmucmd *cmd) { panic("hdl_RMU_MDT_Register"); } diff --git a/src/libhdl/hdl_RMU_MDT_Release.c b/src/libhdl/hdl_RMU_MDT_Release.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_Release(void) +hdl_RMU_MDT_Release(Rmucmd *cmd) { panic("hdl_RMU_MDT_Release"); } diff --git a/src/libhdl/hdl_RMU_MDT_WriteStorage.c b/src/libhdl/hdl_RMU_MDT_WriteStorage.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_MDT_WriteStorage(void) +hdl_RMU_MDT_WriteStorage(Rmucmd *cmd) { panic("hdl_RMU_MDT_WriteStorage"); } diff --git a/src/libhdl/hdl_RMU_REC_Prepare.c b/src/libhdl/hdl_RMU_REC_Prepare.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_Prepare(void) +hdl_RMU_REC_Prepare(Rmucmd *cmd) { panic("hdl_RMU_REC_Prepare"); } diff --git a/src/libhdl/hdl_RMU_REC_ReadGeneralPurposeRegister.c b/src/libhdl/hdl_RMU_REC_ReadGeneralPurposeRegister.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_ReadGeneralPurposeRegister(void) +hdl_RMU_REC_ReadGeneralPurposeRegister(Rmucmd *cmd) { panic("hdl_RMU_REC_ReadGeneralPurposeRegister"); } diff --git a/src/libhdl/hdl_RMU_REC_ReadSystemRegister.c b/src/libhdl/hdl_RMU_REC_ReadSystemRegister.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_ReadSystemRegister(void) +hdl_RMU_REC_ReadSystemRegister(Rmucmd *cmd) { panic("hdl_RMU_REC_ReadSystemRegister"); } diff --git a/src/libhdl/hdl_RMU_REC_ReadVectorRegister.c b/src/libhdl/hdl_RMU_REC_ReadVectorRegister.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_ReadVectorRegister(void) +hdl_RMU_REC_ReadVectorRegister(Rmucmd *cmd) { panic("hdl_RMU_REC_ReadVectorRegister"); } diff --git a/src/libhdl/hdl_RMU_REC_Register.c b/src/libhdl/hdl_RMU_REC_Register.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_Register(void) +hdl_RMU_REC_Register(Rmucmd *cmd) { panic("hdl_RMU_REC_Register"); } diff --git a/src/libhdl/hdl_RMU_REC_Release.c b/src/libhdl/hdl_RMU_REC_Release.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_Release(void) +hdl_RMU_REC_Release(Rmucmd *cmd) { panic("hdl_RMU_REC_Release"); } diff --git a/src/libhdl/hdl_RMU_REC_Size.c b/src/libhdl/hdl_RMU_REC_Size.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_Size(void) +hdl_RMU_REC_Size(Rmucmd *cmd) { panic("hdl_RMU_REC_Size"); } diff --git a/src/libhdl/hdl_RMU_REC_WriteGeneralPurposeRegister.c b/src/libhdl/hdl_RMU_REC_WriteGeneralPurposeRegister.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_WriteGeneralPurposeRegister(void) +hdl_RMU_REC_WriteGeneralPurposeRegister(Rmucmd *cmd) { panic("hdl_RMU_REC_WriteGeneralPurposeRegister"); } diff --git a/src/libhdl/hdl_RMU_REC_WriteSystemRegister.c b/src/libhdl/hdl_RMU_REC_WriteSystemRegister.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_WriteSystemRegister(void) +hdl_RMU_REC_WriteSystemRegister(Rmucmd *cmd) { panic("hdl_RMU_REC_WriteSystemRegister"); } diff --git a/src/libhdl/hdl_RMU_REC_WriteVectorRegister.c b/src/libhdl/hdl_RMU_REC_WriteVectorRegister.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_REC_WriteVectorRegister(void) +hdl_RMU_REC_WriteVectorRegister(Rmucmd *cmd) { panic("hdl_RMU_REC_WriteVectorRegister"); } diff --git a/src/libhdl/hdl_RMU_Realm_Activate.c b/src/libhdl/hdl_RMU_Realm_Activate.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Activate(void) +hdl_RMU_Realm_Activate(Rmucmd *cmd) { panic("hdl_RMU_Realm_Activate"); } diff --git a/src/libhdl/hdl_RMU_Realm_AttestationReport.c b/src/libhdl/hdl_RMU_Realm_AttestationReport.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_AttestationReport(void) +hdl_RMU_Realm_AttestationReport(Rmucmd *cmd) { panic("hdl_RMU_Realm_AttestationReport"); } diff --git a/src/libhdl/hdl_RMU_Realm_AttestationReportInit.c b/src/libhdl/hdl_RMU_Realm_AttestationReportInit.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_AttestationReportInit(void) +hdl_RMU_Realm_AttestationReportInit(Rmucmd *cmd) { panic("hdl_RMU_Realm_AttestationReportInit"); } diff --git a/src/libhdl/hdl_RMU_Realm_AttestationReportSize.c b/src/libhdl/hdl_RMU_Realm_AttestationReportSize.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_AttestationReportSize(void) +hdl_RMU_Realm_AttestationReportSize(Rmucmd *cmd) { panic("hdl_RMU_Realm_AttestationReportSize"); } diff --git a/src/libhdl/hdl_RMU_Realm_CreateZeroMetadata.c b/src/libhdl/hdl_RMU_Realm_CreateZeroMetadata.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_CreateZeroMetadata(void) +hdl_RMU_Realm_CreateZeroMetadata(Rmucmd *cmd) { panic("hdl_RMU_Realm_CreateZeroMetadata"); } diff --git a/src/libhdl/hdl_RMU_Realm_DeriveBindingKey.c b/src/libhdl/hdl_RMU_Realm_DeriveBindingKey.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_DeriveBindingKey(void) +hdl_RMU_Realm_DeriveBindingKey(Rmucmd *cmd) { panic("hdl_RMU_Realm_DeriveBindingKey"); } diff --git a/src/libhdl/hdl_RMU_Realm_ExtendBindingKeySeedValue.c b/src/libhdl/hdl_RMU_Realm_ExtendBindingKeySeedValue.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_ExtendBindingKeySeedValue(void) +hdl_RMU_Realm_ExtendBindingKeySeedValue(Rmucmd *cmd) { panic("hdl_RMU_Realm_ExtendBindingKeySeedValue"); } diff --git a/src/libhdl/hdl_RMU_Realm_GetBindingKeySeedValue.c b/src/libhdl/hdl_RMU_Realm_GetBindingKeySeedValue.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_GetBindingKeySeedValue(void) +hdl_RMU_Realm_GetBindingKeySeedValue(Rmucmd *cmd) { panic("hdl_RMU_Realm_GetBindingKeySeedValue"); } diff --git a/src/libhdl/hdl_RMU_Realm_GetMetadata.c b/src/libhdl/hdl_RMU_Realm_GetMetadata.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_GetMetadata(void) +hdl_RMU_Realm_GetMetadata(Rmucmd *cmd) { panic("hdl_RMU_Realm_GetMetadata"); } diff --git a/src/libhdl/hdl_RMU_Realm_GetParameterInheritance.c b/src/libhdl/hdl_RMU_Realm_GetParameterInheritance.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_GetParameterInheritance(void) +hdl_RMU_Realm_GetParameterInheritance(Rmucmd *cmd) { panic("hdl_RMU_Realm_GetParameterInheritance"); } diff --git a/src/libhdl/hdl_RMU_Realm_GetParameterValue.c b/src/libhdl/hdl_RMU_Realm_GetParameterValue.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_GetParameterValue(void) +hdl_RMU_Realm_GetParameterValue(Rmucmd *cmd) { panic("hdl_RMU_Realm_GetParameterValue"); } diff --git a/src/libhdl/hdl_RMU_Realm_Info.c b/src/libhdl/hdl_RMU_Realm_Info.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Info(void) +hdl_RMU_Realm_Info(Rmucmd *cmd) { panic("hdl_RMU_Realm_Info"); } diff --git a/src/libhdl/hdl_RMU_Realm_Initialize.c b/src/libhdl/hdl_RMU_Realm_Initialize.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Initialize(void) +hdl_RMU_Realm_Initialize(Rmucmd *cmd) { panic("hdl_RMU_Realm_Initialize"); } diff --git a/src/libhdl/hdl_RMU_Realm_Invalidate.c b/src/libhdl/hdl_RMU_Realm_Invalidate.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Invalidate(void) +hdl_RMU_Realm_Invalidate(Rmucmd *cmd) { panic("hdl_RMU_Realm_Invalidate"); } diff --git a/src/libhdl/hdl_RMU_Realm_InvalidateCurrent.c b/src/libhdl/hdl_RMU_Realm_InvalidateCurrent.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_InvalidateCurrent(void) +hdl_RMU_Realm_InvalidateCurrent(Rmucmd *cmd) { panic("hdl_RMU_Realm_InvalidateCurrent"); } diff --git a/src/libhdl/hdl_RMU_Realm_Populate.c b/src/libhdl/hdl_RMU_Realm_Populate.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Populate(void) +hdl_RMU_Realm_Populate(Rmucmd *cmd) { panic("hdl_RMU_Realm_Populate"); } diff --git a/src/libhdl/hdl_RMU_Realm_Prepare.c b/src/libhdl/hdl_RMU_Realm_Prepare.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Prepare(void) +hdl_RMU_Realm_Prepare(Rmucmd *cmd) { panic("hdl_RMU_Realm_Prepare"); } diff --git a/src/libhdl/hdl_RMU_Realm_ReadMemory.c b/src/libhdl/hdl_RMU_Realm_ReadMemory.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_ReadMemory(void) +hdl_RMU_Realm_ReadMemory(Rmucmd *cmd) { panic("hdl_RMU_Realm_ReadMemory"); } diff --git a/src/libhdl/hdl_RMU_Realm_Register.c b/src/libhdl/hdl_RMU_Realm_Register.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Register(void) +hdl_RMU_Realm_Register(Rmucmd *cmd) { panic("hdl_RMU_Realm_Register"); } diff --git a/src/libhdl/hdl_RMU_Realm_Release.c b/src/libhdl/hdl_RMU_Realm_Release.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_Release(void) +hdl_RMU_Realm_Release(Rmucmd *cmd) { panic("hdl_RMU_Realm_Release"); } diff --git a/src/libhdl/hdl_RMU_Realm_SetBindingKeySeedLock.c b/src/libhdl/hdl_RMU_Realm_SetBindingKeySeedLock.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_SetBindingKeySeedLock(void) +hdl_RMU_Realm_SetBindingKeySeedLock(Rmucmd *cmd) { panic("hdl_RMU_Realm_SetBindingKeySeedLock"); } diff --git a/src/libhdl/hdl_RMU_Realm_SetCommandTrap.c b/src/libhdl/hdl_RMU_Realm_SetCommandTrap.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_SetCommandTrap(void) +hdl_RMU_Realm_SetCommandTrap(Rmucmd *cmd) { panic("hdl_RMU_Realm_SetCommandTrap"); } diff --git a/src/libhdl/hdl_RMU_Realm_SetMetadata.c b/src/libhdl/hdl_RMU_Realm_SetMetadata.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_SetMetadata(void) +hdl_RMU_Realm_SetMetadata(Rmucmd *cmd) { panic("hdl_RMU_Realm_SetMetadata"); } diff --git a/src/libhdl/hdl_RMU_Realm_SetParameterInheritance.c b/src/libhdl/hdl_RMU_Realm_SetParameterInheritance.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_SetParameterInheritance(void) +hdl_RMU_Realm_SetParameterInheritance(Rmucmd *cmd) { panic("hdl_RMU_Realm_SetParameterInheritance"); } diff --git a/src/libhdl/hdl_RMU_Realm_SetParameterValue.c b/src/libhdl/hdl_RMU_Realm_SetParameterValue.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_SetParameterValue(void) +hdl_RMU_Realm_SetParameterValue(Rmucmd *cmd) { panic("hdl_RMU_Realm_SetParameterValue"); } diff --git a/src/libhdl/hdl_RMU_Realm_WriteMemory.c b/src/libhdl/hdl_RMU_Realm_WriteMemory.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_Realm_WriteMemory(void) +hdl_RMU_Realm_WriteMemory(Rmucmd *cmd) { panic("hdl_RMU_Realm_WriteMemory"); } diff --git a/src/libhdl/hdl_RMU_System_Enable.c b/src/libhdl/hdl_RMU_System_Enable.c @@ -2,7 +2,7 @@ #include <rcode.h> void -hdl_RMU_System_Enable(void) +hdl_RMU_System_Enable(Rmucmd *cmd) { RMU_System_Enable(); } diff --git a/src/libhdl/hdl_RMU_System_InterfaceVersion.c b/src/libhdl/hdl_RMU_System_InterfaceVersion.c @@ -2,11 +2,11 @@ #include <rcode.h> void -hdl_RMU_System_InterfaceVersion(void) +hdl_RMU_System_InterfaceVersion(Rmucmd *cmd) { unsigned long maj, min; RMU_System_InterfaceVersion(&maj, &min); - bss->fp->x1 = maj; - bss->fp->x2 = min; + cmd->fp->x1 = maj; + cmd->fp->x2 = min; } diff --git a/src/libhdl/hdl_RMU_System_Status.c b/src/libhdl/hdl_RMU_System_Status.c @@ -2,10 +2,10 @@ #include <rcode.h> void -hdl_RMU_System_Status(void) +hdl_RMU_System_Status(Rmucmd *cmd) { int enabled; RMU_System_Status(&enabled); - bss->fp->x1 = enabled; + cmd->fp->x1 = enabled; } diff --git a/src/librmu/RMU_System_Enable.c b/src/librmu/RMU_System_Enable.c @@ -4,9 +4,11 @@ void RMU_System_Enable(void) { +#if 0 if (bss->enable) badcmd(ERESOURCESTATE); if (bss->hascrypto) badcmd(ECRYPTO); bss->enable = 1; +#endif } diff --git a/src/librmu/RMU_System_Status.c b/src/librmu/RMU_System_Status.c @@ -3,5 +3,7 @@ void RMU_System_Status(int *enabled) { +#if 0 *enabled = bss->enable; +#endif } diff --git a/src/mkecstr b/src/mkecstr @@ -1,21 +0,0 @@ -#!/bin/sh - -set -e -trap 'r=$?;rm -f $$.c;exit $r' EXIT HUP QUIT INT TERM - -awk ' -BEGIN {print "#include \"ec.h\"\n"} -/^enum ecvals \{/ {print "const char *const ecstr[] = {" - print "#ifndef NDEBUG" - inhome = 1} - -inhome && /=/ {sub(/,/, "", $1) - printf("\t[%s] = \"", $1) - for (i = 5; i <= NF-1; ++i) - printf("%s%s", $i, (i == NF-1) ? "\"" : " ") - print ","} - -inhome && /^}/ {print "#endif" - print "\t0" - print "};" - inhome = 0}' $@ > $$.c && mv $$.c ecstr.c diff --git a/src/ramfw/.gitignore b/src/ramfw/.gitignore @@ -0,0 +1 @@ +rmctab.c diff --git a/src/ramfw/Makefile b/src/ramfw/Makefile @@ -2,18 +2,12 @@ PROJECTDIR=../.. include $(PROJECTDIR)/scripts/rules.mk -OBJS = ../rmc.o \ - ../ecstr.o \ - fs.o \ - rmctbl.o \ +OBJS = fs.o \ all: builtin.o builtin.o: $(OBJS) $(LD) $(RCODE_LDFLAGS) -r -o $@ $(OBJS) -rmctbl.c: $(SCRIPTDIR)/rmu.cmd - $(SCRIPTDIR)/gentbl.sh -o $@ -b ram -i $(SCRIPTDIR)/rmu.cmd - clean: - rm -f rmctbl.c + rm -f rmctab.c diff --git a/src/rmc.c b/src/rmc.c @@ -1,189 +0,0 @@ -#include <libk.h> -#include <rmu.h> -#include <rcode.h> - -#include "ec.h" - -static void -dumpregs(struct trapframe *fp) -{ - kprint("x0=%0llx\tx1=%0llx\nx2=%0llx\tx3=%0llx\n" - "x4=%0llx\tx5=%0llx\nx6=%0llx\tx7=%0llx\n" - "x8=%0llx\tx9=%0llx\nx10=%0llx\tx11=%0llx\n" - "x12=%0llx\tx13=%0llx\nx14=%0llx\tx15=%0llx\n" - "x16=%0llx\tx17=%0llx\nx18=%0llx\tx19=%0llx\n" - "x20=%0llx\tx21=%0llx\nx22=%0llx\tx23=%0llx\n" - "x24=%0llx\tx25=%0llx\nx26=%0llx\tx27=%0llx\n" - "x28=%0llx\tx29=%0llx\nx30=%0llx\telr=%p\n" - "spsr=%0llx\tesr=%0llx\nfar=%0llx\tsp=%p\n", - fp->x0, fp->x1, fp->x2, fp->x3, - fp->x4, fp->x5, fp->x6, fp->x7, - fp->x8, fp->x9, fp->x10, fp->x11, - fp->x12, fp->x13, fp->x14, fp->x15, - fp->x16, fp->x17, fp->x18, fp->x19, - fp->x20, fp->x21, fp->x22, fp->x23, - fp->x24, fp->x25, fp->x26, fp->x27, - fp->x28, fp->x29, fp->x30, fp->elr, - fp->spsr, fp->esr, fp->far, fp->sp); -} - -static void -backtrace(struct trapframe *fp) -{ - void **bp; - - if (!bss->backtrace) - return; - kprint("backtrace:\n"); - kprint("%llx\n", fp->x30); - for (bp = (void **) fp->x29; *bp; bp = (void **) *bp) - kprint("%p\n", bp[1]); -} - -static void -dumpstack(struct trapframe *fp) -{ - long long *sp, i; - - if (!bss->dumpstack) - return; - kprint("stack dump:\n"); - sp = fp->sp; - for (i = 1; i <= 16; i++) - kprint("%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); -} - -static void -panicfmt(const char *msg, struct trapframe *fp) -{ - /* - * check against 1 to be more robust - * against memory corruptions - */ - if (bss->in_panic == 1) { - for (;;) - ; - } - - bss->in_panic = 1; - kprint("panic: %s\n", msg); - - dumpregs(fp); - backtrace(fp); - dumpstack(fp); -} - -void -halt(void) -{ - if (bss->in_debug) - longjmp(bss->dbgrecover, 1); - dohalt(); -} - -void -panic(const char *msg) -{ - bss->errstr = msg; - if (bss->in_debug) - longjmp(bss->dbgrecover, 1); - dopanic(); -} - -void -swtch(struct trapframe *fp) -{ - if (bss->in_debug) - longjmp(bss->dbgrecover, 1); - doswtch(fp); -} - -void -trap(struct trapframe *fp) -{ - Rmucmd cmd; - enum ecvals ec; - const char *msg; - - if (bss->errstr) { - panicfmt(bss->errstr, fp); - halt(); - } - dbg("exception handler\n"); - - ec = (fp->esr >> 26) & 0x3f; - - if (ec != RMC) { - msg = NULL; - if (ec < NR_EC_STR) - msg = reloc(ecstr[ec]); - if (!msg) - msg = "unknown reason"; - panicfmt(msg, fp); - halt(); - } - - cmd.class = fp->esr & 0xff; - cmd.func = (fp->esr >> 8) & 0xff; - bss->fp = fp; - bss->cmd = &cmd; - - rmc(&cmd); - swtch(fp); -} - -void -badcmd(int error) -{ - Rmucmd *cmd = bss->cmd; - - dbg("bad RMC: %d, %d = %d\n", cmd->class, cmd->func, error); - bss->fp->x0 = error; - swtch(bss->fp); -} - -/* - * The dispatcher cannot be implemented using a table - * because the rmu command number is composed by two - * immediates, class and func, which don't generate - * consecutive values. The approach is to use a sparse - * matrix, where we store all the function pointers - * consecutive and we create a row index table which - * the offset from the beginning of the handler table - * and number of entries in that table for that row. - * - * rowidx handler - * --------------- -------- - * | off = 0,cnt=1 | | fun0 | - * --------------- -------- - * class --> | off = 1,cnt=2 | ---> off + func --> | fun1 | - * --------------- -------- - * | off = 3,cnt=1 | | fun2 | - * --------------- -------- - * ... ... - */ -void -rmc(Rmucmd *cmd) -{ - const struct rowidx *idx; - void (*fp)(Rmucmd *cmd); - void *bp; - unsigned off; - - if (cmd->class > 255 || cmd->func > 255) - panic("rmc1"); - - idx = &rowidx[cmd->class]; - if (cmd->func >= idx->cnt) - badcmd(-1); /* TODO: put the correct code */ - - off = idx->off + cmd->func; - if (off > 255) - panic("rmc2"); - - bp = reloc(handler[off]); - fp = (void (*) (Rmucmd *)) bp; - (*fp)(cmd); - - bss->fp->x0 = SUCCESS; -} diff --git a/src/romfw/.gitignore b/src/romfw/.gitignore @@ -1 +1,3 @@ rmu.c +ecstr.c +rmctab.c diff --git a/src/romfw/Makefile b/src/romfw/Makefile @@ -2,9 +2,8 @@ PROJECTDIR=../.. include $(PROJECTDIR)/scripts/rules.mk -OBJS = ../rmc.o \ - ../ecstr.o \ - rmctbl.o \ +OBJS = rmc.o \ + ecstr.o \ rmu.o \ dlang.o \ @@ -13,11 +12,11 @@ all: builtin.o builtin.o: $(OBJS) $(LD) $(RCODE_LDFLAGS) -r -o $@ $(OBJS) +ecstr.c: ec.h + ./mkecstr ec.h + rmu.c: $(SCRIPTDIR)/rmu.cmd ./mkrmu -o $@ $(SCRIPTDIR)/rmu.cmd -rmctbl.c: $(SCRIPTDIR)/rmu.cmd - $(SCRIPTDIR)/gentbl.sh -o $@ -b rom -i $(SCRIPTDIR)/rmu.cmd - clean: - rm -f rmctbl.c rmu.c + rm -f rmu.c ecstr.c diff --git a/src/romfw/dlang.c b/src/romfw/dlang.c @@ -8,8 +8,9 @@ #include <libk.h> #include <rcode.h> +#include <romfw.h> -#include "../ec.h" +#include "ec.h" #include "dlang.h" #define PREFIX "> " diff --git a/src/romfw/ec.h b/src/romfw/ec.h @@ -0,0 +1,47 @@ +enum ecvals { + UNKNOWN = 0x00, /* unknown reason */ + TRAPWFI = 0x01, /* trapped wfi or wfe */ + TRAPMCR = 0x03, /* trapped mcr or mrc (coproc == 1111) */ + TRAPMCRR = 0x04, /* trapped mcrr or mrrc (coproc == 1111) */ + TRAPMCR2 = 0x05, /* trapped mcr or mrc (coproc == 1110) */ + TRAPLDC = 0x06, /* trapped LDC or STC */ + TRAPSVE = 0x07, /* trapped SVE */ + TRAPVMRS = 0x08, /* trapped VMRS */ + TRAPPTRA = 0x09, /* trapped pointer autentication */ + TRAPMCRR2 = 0x0c, /* trapped mcrr or mrrc (coproc == 1110) */ + ILL = 0x0f, /* Illegal execution state */ + SVC32 = 0x11, /* SVC in AArch32 */ + HVC32 = 0x12, /* HVC in AArch32 */ + SMC32 = 0x13, /* SVC in AArch32 */ + SVC = 0x15, /* SVC */ + HVC = 0x16, /* HVC */ + SMC = 0x17, /* SMC */ + TRAPSYS = 0x18, /* Trapped MSR, MRS or System instruction */ + SVE = 0x19, /* SVE */ + TRAP = 0x1a, /* trapped ERET, ERETAA, ERETAB */ + EL3EXCP = 0x1f, /* implementation defined exception to EL3 */ + IABORTL = 0x20, /* Instruction abort from lower level */ + IABORT = 0x21, /* Instruction abort from current level */ + PCALIGN = 0x22, /* PC aligment fault exception */ + DABORTL = 0x24, /* Data abort from lower level */ + DABORT = 0x25, /* Data abort from current level */ + SPALIGN = 0x26, /* SP aligment fault exception */ + FPE32 = 0x28, /* Floating-point exception in AArch32 */ + FPE = 0x2c, /* Floating-point exception in AArch64 */ + SOFTRES = 0x2d, /* Software defined fault syndrome */ + RMC = 0x2e, /* RMC */ + SERROR = 0x2f, /* Serror interrupt */ + BREAKL = 0x30, /* Breakpoint exception from lower level */ + BREAK = 0x31, /* Breakpoint exception from current level */ + STEPL = 0x32, /* Software step from lower level */ + STEP = 0x33, /* Software step from current level */ + WATCHL = 0x34, /* Watchpoint from lower level */ + WATCH = 0x35, /* Watchpoint from current level */ + BKPT = 0x38, /* BKPT instruction in AArch32 */ + VECTOR = 0x3a, /* Vector catch exception in AArch32 */ + TRAPL = 0x3b, /* Trap from lower level */ + BRK = 0x3c, /* BRK instruction in AArch64 */ + NR_EC_VALS +}; + +extern const char *const ecstr[]; diff --git a/src/romfw/mkecstr b/src/romfw/mkecstr @@ -0,0 +1,19 @@ +#!/bin/sh + +set -e +trap 'r=$?;rm -f $$.c;exit $r' EXIT HUP QUIT INT TERM + +awk ' +BEGIN {print "#include \"ec.h\"\n"} +/^enum ecvals \{/ {print "const char *const ecstr[] = {" + inhome = 1} + +inhome && /=/ {sub(/,/, "", $1) + printf("\t[%s] = \"", $1) + for (i = 5; i <= NF-1; ++i) + printf("%s%s", $i, (i == NF-1) ? "\"" : " ") + print ","} + +inhome && /^}/ {print "\t0" + print "};" + inhome = 0}' $@ > $$.c && mv $$.c ecstr.c diff --git a/src/romfw/rmc.c b/src/romfw/rmc.c @@ -0,0 +1,190 @@ +#include <setjmp.h> + +#include <libk.h> +#include <rmu.h> +#include <rcode.h> +#include <romfw.h> + +#include "ec.h" + +static void +dumpregs(struct trapframe *fp) +{ + kprint("x0=%0llx\tx1=%0llx\nx2=%0llx\tx3=%0llx\n" + "x4=%0llx\tx5=%0llx\nx6=%0llx\tx7=%0llx\n" + "x8=%0llx\tx9=%0llx\nx10=%0llx\tx11=%0llx\n" + "x12=%0llx\tx13=%0llx\nx14=%0llx\tx15=%0llx\n" + "x16=%0llx\tx17=%0llx\nx18=%0llx\tx19=%0llx\n" + "x20=%0llx\tx21=%0llx\nx22=%0llx\tx23=%0llx\n" + "x24=%0llx\tx25=%0llx\nx26=%0llx\tx27=%0llx\n" + "x28=%0llx\tx29=%0llx\nx30=%0llx\telr=%p\n" + "spsr=%0llx\tesr=%0llx\nfar=%0llx\tsp=%p\n", + fp->x0, fp->x1, fp->x2, fp->x3, + fp->x4, fp->x5, fp->x6, fp->x7, + fp->x8, fp->x9, fp->x10, fp->x11, + fp->x12, fp->x13, fp->x14, fp->x15, + fp->x16, fp->x17, fp->x18, fp->x19, + fp->x20, fp->x21, fp->x22, fp->x23, + fp->x24, fp->x25, fp->x26, fp->x27, + fp->x28, fp->x29, fp->x30, fp->elr, + fp->spsr, fp->esr, fp->far, fp->sp); +} + +static void +backtrace(struct trapframe *fp) +{ + void **bp; + + if (!bss->backtrace) + return; + kprint("backtrace:\n"); + kprint("%llx\n", fp->x30); + for (bp = (void **) fp->x29; *bp; bp = (void **) *bp) + kprint("%p\n", bp[1]); +} + +static void +dumpstack(struct trapframe *fp) +{ + long long *sp, i; + + if (!bss->dumpstack) + return; + kprint("stack dump:\n"); + sp = fp->sp; + for (i = 1; i <= 16; i++) + kprint("%0llx%c", *sp++, (i % 4 == 0) ? '\n' : ' '); +} + +static void +panicfmt(const char *msg, struct trapframe *fp) +{ + /* + * check against 1 to be more robust + * against memory corruptions + */ + if (bss->in_panic == 1) { + for (;;) + ; + } + + bss->in_panic = 1; + kprint("panic: %s\n", msg); + + dumpregs(fp); + backtrace(fp); + dumpstack(fp); +} + +void +halt(void) +{ + if (bss->in_debug) + longjmp(bss->dbgrecover, 1); + dohalt(); +} + +void +panic(const char *msg) +{ + bss->errstr = msg; + if (bss->in_debug) + longjmp(bss->dbgrecover, 1); + dopanic(); +} + +void +swtch(struct trapframe *fp) +{ + if (bss->in_debug) + longjmp(bss->dbgrecover, 1); + doswtch(fp); +} + +void +trap(struct trapframe *fp) +{ + Rmucmd cmd; + enum ecvals ec; + const char *msg; + + if (bss->errstr) { + panicfmt(bss->errstr, fp); + halt(); + } + dbg("exception handler\n"); + + ec = (fp->esr >> 26) & 0x3f; + + if (ec != RMC) { + msg = (ec < NR_EC_VALS) ? reloc(ecstr[ec]) : "unknown reason"; + panicfmt(msg, fp); + halt(); + } + + cmd.class = fp->esr & 0xff; + cmd.func = (fp->esr >> 8) & 0xff; + bss->fp = cmd.fp = fp; + bss->cmd = &cmd; + + rmc(&cmd); + swtch(fp); +} + +void +badcmd(int error) +{ + Rmucmd *cmd = bss->cmd; + + dbg("bad RMC: %d, %d = %d\n", cmd->class, cmd->func, error); + bss->fp->x0 = error; + swtch(bss->fp); +} + +/* + * The dispatcher cannot be implemented using a table + * because the rmu command number is composed by two + * immediates, class and func, which don't generate + * consecutive values. The approach is to use a sparse + * matrix, where we store all the function pointers + * consecutive and we create a row index table which + * the offset from the beginning of the handler table + * and number of entries in that table for that row. + * + * rowidx handler + * --------------- -------- + * | off = 0,cnt=1 | | fun0 | + * --------------- -------- + * class --> | off = 1,cnt=2 | ---> off + func --> | fun1 | + * --------------- -------- + * | off = 3,cnt=1 | | fun2 | + * --------------- -------- + * ... ... + */ +void +rmc(Rmucmd *cmd) +{ + struct rmctab *tab; + const struct rmcclass *class; + void (*fn)(Rmucmd *cmd); + void *bp; + unsigned off; + + if (cmd->class > 255 || cmd->func > 255) + panic("rmc1"); + + tab = bss->rmctab; + class = &tab->class[cmd->class]; + if (cmd->func >= class->cnt) + badcmd(-1); /* TODO: put the correct code */ + + off = class->off + cmd->func; + if (off > 255) + panic("rmc2"); + + bp = reloc(tab->handler[off]); + fn = (void (*) (Rmucmd *)) bp; + (*fn)(cmd); + + cmd->fp->x0 = SUCCESS; +} diff --git a/target/hosted/Makefile b/target/hosted/Makefile @@ -5,12 +5,14 @@ include $(PROJECTDIR)/scripts/rules.mk ROMOBJS = arch.o \ rom.o \ crt/crt.o \ + romtab.o \ $(DRVDIR)/builtin.o \ $(SRCDIR)/romfw/builtin.o \ RAMOBJS = arch.o \ ram.o \ crt/crt.o \ + ramtab.o \ $(SRCDIR)/ramfw/builtin.o \ TARGET = $(BINDIR)/romfw.elf $(BINDIR)/ramfw.elf @@ -23,6 +25,12 @@ crt/crt.o: crt $(DIRS): FORCE cd $@ && $(MAKE) +ramtab.c: $(SCRIPTDIR)/rmu.cmd + $(SCRIPTDIR)/mkrmctab -o $@ -b ram -i $(SCRIPTDIR)/rmu.cmd + +romtab.c: $(SCRIPTDIR)/rmu.cmd + $(SCRIPTDIR)/mkrmctab -o $@ -b rom -i $(SCRIPTDIR)/rmu.cmd + $(BINDIR)/romfw.elf: $(ROMOBJS) $(LIBDEP) $(LD) $(RCODE_LDFLAGS) $(ROMOBJS) $(RCODE_LDLIBS) -o $@ diff --git a/target/hosted/arch.c b/target/hosted/arch.c @@ -3,6 +3,9 @@ #include <stdlib.h> #include <rcode.h> + +#include "hosted.h" + #undef bss jmp_buf recover; @@ -15,8 +18,6 @@ int halted; struct bssmap * bss(void) { - static struct bssmap bssmap; - return &bssmap; } diff --git a/target/hosted/hosted.h b/target/hosted/hosted.h @@ -1,3 +1,4 @@ extern jmp_buf recover; extern int halted; extern struct trapframe *(*getframe)(void); +extern struct bssmap bssmap; diff --git a/target/hosted/ram.c b/target/hosted/ram.c @@ -1,4 +1,7 @@ #include <rcode.h> +#include <ramfw.h> + +struct bssmap bssmap; int main(int argc, char *argv[]) diff --git a/target/hosted/rom.c b/target/hosted/rom.c @@ -2,13 +2,7 @@ #include <string.h> #include <rcode.h> - -struct tree tree[] = { - {"/dev", FSDIR | FSCREATE | FSREAD}, - {"/dev/uart", FSDIR | FSREAD}, - {"/realms", FSDIR | FSREAD}, - {NULL} -}; +#include <romfw.h> int main(int argc, char *argv[]) @@ -19,8 +13,8 @@ main(int argc, char *argv[]) return 1; memset(bss, 0, sizeof(struct bssmap)); + bss->rmctab = &romtab; bss->fp = &(struct trapframe) {0}; - initfs(tree); return debug(); } diff --git a/target/native/Makefile b/target/native/Makefile @@ -10,6 +10,7 @@ ROMOBJS = rom-crt.o \ rom.o \ arch.o \ sysreg.o \ + romtab.o \ $(DRVDIR)/builtin.o \ $(SRCDIR)/romfw/builtin.o \ cache.o \ @@ -18,6 +19,7 @@ RAMOBJS = ram-crt.o \ ram.o \ arch.o \ sysreg.o \ + ramtab.o \ $(DRVDIR)/builtin.o \ $(SRCDIR)/ramfw/builtin.o \ @@ -44,6 +46,12 @@ sysreg.s: sysreg.lst version.h: ./mkver +ramtab.c: $(SCRIPTDIR)/rmu.cmd + $(SCRIPTDIR)/mkrmctab -o $@ -b ram -i $(SCRIPTDIR)/rmu.cmd + +romtab.c: $(SCRIPTDIR)/rmu.cmd + $(SCRIPTDIR)/mkrmctab -o $@ -b rom -i $(SCRIPTDIR)/rmu.cmd + $(BINDIR)/romfw.elf: $(ROMOBJS) $(LIBDEP) $(LD) $(RCODE_LDFLAGS) $(ROMOBJS) $(RCODE_LDLIBS) -o $@ @@ -57,3 +65,4 @@ clean: rm -f $(TARGET:.bin=.elf) rm -f $(TARGET:.bin=.tst) rm -f sysreg.h sysreg.s version.h + rm -f romtab.c ramtab.c diff --git a/target/native/rom.c b/target/native/rom.c @@ -4,6 +4,7 @@ #include <libk.h> #include <rcode.h> +#include <romfw.h> #include <uart.h> #include "version.h" @@ -98,6 +99,7 @@ ibss(Mach *mp) bss->dumpstack = 1; bss->uartbase = (void *)UARTBASE; bss->bsssize = sizeof(struct bssmap); + bss->rmctab = &romtab; envp = bss->environ = mp->env; envp->nvars = ENVPOS; }