9os

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

commit e735682d9b21dcb2bacc8fe4a32df9b049b5cfd2
parent 48bb7dda49c31f3099f81a5a0192b9045ec72e03
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Fri, 12 Oct 2018 18:23:06 +0100

Synch changes

Change-Id: I27667d101b3f592867f2786862294221d7859522

Diffstat:
March/amd64/Makefile | 4++--
March/amd64/ram.c | 10----------
March/amd64/rom.c | 18++++++++----------
March/arm64/Makefile | 4++--
March/arm64/cdeps.c | 2+-
March/arm64/panic.c | 1-
March/arm64/ram.c | 16++--------------
March/arm64/rom.c | 23++++++++++++++++++++++-
Dinclude/machine.h | 24------------------------
Minclude/rcode.h | 51+++++++++++++++++++++++++++++++++++----------------
Mscripts/gentbl.sh | 6+++---
Mscripts/rules.mk | 5++++-
Msrc/librmu/RMU_Crypto_Random.c | 2+-
Msrc/librmu/RMU_Local_Load.c | 2+-
Msrc/librmu/RMU_Local_Status.c | 2+-
Msrc/librmu/RMU_Local_Validate.c | 2+-
Msrc/librmu/RMU_REC_Prepare.c | 2+-
Msrc/librmu/RMU_REC_ReadGeneralPurposeRegister.c | 2+-
Msrc/librmu/RMU_REC_ReadSystemRegister.c | 2+-
Msrc/librmu/RMU_REC_ReadVectorRegister.c | 2+-
Msrc/librmu/RMU_REC_Register.c | 2+-
Msrc/librmu/RMU_REC_Release.c | 2+-
Msrc/librmu/RMU_REC_Size.c | 2+-
Msrc/librmu/RMU_REC_WriteGeneralPurposeRegister.c | 2+-
Msrc/librmu/RMU_REC_WriteSystemRegister.c | 2+-
Msrc/librmu/RMU_REC_WriteVectorRegister.c | 2+-
Msrc/librmu/RMU_Realm_Activate.c | 2+-
Msrc/librmu/RMU_Realm_AttestationReport.c | 2+-
Msrc/librmu/RMU_Realm_AttestationReportInit.c | 2+-
Msrc/librmu/RMU_Realm_AttestationReportSize.c | 2+-
Msrc/librmu/RMU_Realm_CreateZeroMetadata.c | 2+-
Msrc/librmu/RMU_Realm_DeriveBindingKey.c | 2+-
Msrc/librmu/RMU_Realm_ExtendBindingKeySeedValue.c | 2+-
Msrc/librmu/RMU_Realm_GetBindingKeySeedValue.c | 2+-
Msrc/librmu/RMU_Realm_GetMetadata.c | 2+-
Msrc/librmu/RMU_Realm_GetParameterInheritance.c | 2+-
Msrc/librmu/RMU_Realm_GetParameterValue.c | 2+-
Msrc/librmu/RMU_Realm_Info.c | 2+-
Msrc/librmu/RMU_Realm_Initialize.c | 2+-
Msrc/librmu/RMU_Realm_Invalidate.c | 2+-
Msrc/librmu/RMU_Realm_InvalidateCurrent.c | 2+-
Msrc/librmu/RMU_Realm_Populate.c | 2+-
Msrc/librmu/RMU_Realm_Prepare.c | 2+-
Msrc/librmu/RMU_Realm_ReadMemory.c | 2+-
Msrc/librmu/RMU_Realm_Register.c | 2+-
Msrc/librmu/RMU_Realm_Release.c | 2+-
Msrc/librmu/RMU_Realm_SetBindingKeySeedLock.c | 2+-
Msrc/librmu/RMU_Realm_SetCommandTrap.c | 2+-
Msrc/librmu/RMU_Realm_SetMetadata.c | 2+-
Msrc/librmu/RMU_Realm_SetParameterInheritance.c | 2+-
Msrc/librmu/RMU_Realm_SetParameterValue.c | 2+-
Msrc/librmu/RMU_Realm_WriteMemory.c | 2+-
Msrc/librmu/RMU_System_Enable.c | 2+-
Msrc/librmu/RMU_System_InterfaceVersion.c | 2+-
Msrc/librmu/RMU_System_Status.c | 2+-
Msrc/rmc.c | 22++++------------------
Mtest/test1/.gitignore | 44+-------------------------------------------
Mtest/test1/Makefile | 94++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mtest/test1/genrmu.sh | 88++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mtest/test1/test.c | 20++++++++++++++++----
60 files changed, 234 insertions(+), 284 deletions(-)

diff --git a/arch/amd64/Makefile b/arch/amd64/Makefile @@ -5,8 +5,8 @@ ROMOBJS = crt-$(SYS).o panic.o arch.o rom.o $(SRCDIR)/romfw/builtin.o RAMOBJS = crt-$(SYS).o panic.o arch.o rom.o $(SRCDIR)/ramfw/builtin.o TARGET = $(BINDIR)/romfw.elf $(BINDIR)/ramfw.elf -LIBS = -lrmu -lc -LIBDEP = $(LIBDIR)/librmu.a $(LIBDIR)/libc.a +LIBS = -lhdl -lrmu -lc +LIBDEP = $(LIBDIR)/libhdl.a $(LIBDIR)/librmu.a $(LIBDIR)/libc.a all: $(TARGET) diff --git a/arch/amd64/ram.c b/arch/amd64/ram.c @@ -5,14 +5,4 @@ int main(int argc, char *argv[]) { - unsigned i, j; - Ctx ctx; - - for (i = 0; i <= 9; i++) { - for (j = 0; j <= 14; j++) { - printk("%u\t%u\t", i, j); - rmc(i, j, &ctx); - } - } - return 0; } diff --git a/arch/amd64/rom.c b/arch/amd64/rom.c @@ -2,17 +2,15 @@ #include <rcode.h> +void +badrmc(Rmucmd *cmd, int error) +{ + dbg("bad RMC: %d, %d = %d\n", cmd->imm1, cmd->imm2, error); + cmd->fp->x0 = error; + longjmp(cmd->recover, 1); +} + int main(int argc, char *argv[]) { - unsigned i, j; - Ctx ctx; - - for (i = 0; i <= 9; i++) { - for (j = 0; j <= 14; j++) { - printk("%u\t%u\t", i, j); - rmc(i, j, &ctx); - } - } - return 0; } diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile @@ -5,8 +5,8 @@ ROMOBJS = rom-crt-$(SYS).o panic.o arch.o rom.o $(SRCDIR)/romfw/builtin.o RAMOBJS = ram-crt-$(SYS).o panic.o arch.o ram.o $(SRCDIR)/ramfw/builtin.o TARGET = $(BINDIR)/romfw.bin $(BINDIR)/ramfw.bin -LIBS = -lrmu -lc -LIBDEP = $(LIBDIR)/librmu.a $(LIBDIR)/libc.a +LIBS = -lhdl -lrmu -lc +LIBDEP = $(LIBDIR)/libhdl.a $(LIBDIR)/librmu.a $(LIBDIR)/libc.a all: $(TARGET) diff --git a/arch/arm64/cdeps.c b/arch/arm64/cdeps.c @@ -1,7 +1,7 @@ #include <stddef.h> #include <stdio.h> -#include <machine.h> +#include <rcode.h> int main(void) diff --git a/arch/arm64/panic.c b/arch/arm64/panic.c @@ -1,5 +1,4 @@ #include <rcode.h> -#include <machine.h> void dumpregs(struct trapframe *fp) diff --git a/arch/arm64/ram.c b/arch/arm64/ram.c @@ -1,18 +1,6 @@ -#include <stdint.h> - #include <rcode.h> -int -main(int argc, char *argv[]) +void +main(struct trapframe *fp) { - unsigned i, j; - Ctx ctx; - - for (i = 0; i <= 9; i++) { - for (j = 0; j <= 14; j++) { - printk("%u\t%u\t", i, j); - rmc(i, j, &ctx); - } - } - return 0; } diff --git a/arch/arm64/rom.c b/arch/arm64/rom.c @@ -1,16 +1,37 @@ #include <string.h> -#include <machine.h> #include <rcode.h> void synchdl(struct trapframe *fp) { + Rmucmd cmd; + unsigned why; + dbg("sync handler\n"); + + why = fp->esr >> 16; + cmd.imm1 = fp->esr & 0xff; + cmd.imm2 = (fp->esr >> 8) & 0xff; + + if (why != 0x2e) + panic("wrong exception"); + + if (!setjmp(cmd.recover)) + rmc(cmd.imm1, cmd.imm2, &cmd); + swtch(fp); } void +badrmc(Rmucmd *cmd, int error) +{ + dbg("bad RMC: %d, %d = %d\n", cmd->imm1, cmd->imm2, error); + cmd->fp->x0 = error; + longjmp(cmd->recover, 1); +} + +void main(struct trapframe *fp) { unsigned long long rvbar_el3; diff --git a/include/machine.h b/include/machine.h @@ -1,24 +0,0 @@ -struct trapframe { - unsigned long long far; - unsigned long long esr; - unsigned long long spsr; - unsigned long long elr; - unsigned long long sp; - unsigned long long x30,x29,x28,x27; - unsigned long long x26,x25,x24,x23; - unsigned long long x22,x21,x20,x19; - unsigned long long x18,x17,x16,x15; - unsigned long long x14,x13,x12,x11; - unsigned long long x10,x9,x8,x7; - unsigned long long x6,x5,x4,x3; - unsigned long long x2,x1,x0; -}; - -extern void cpanic(const char *msg, struct trapframe *fp); -extern void enaabt(void); -extern void disabt(void); -extern void enadbg(void); -extern void disdbg(void); -extern void wfi(void); -extern void wfe(void); -extern void swtch(struct trapframe *fp); diff --git a/include/rcode.h b/include/rcode.h @@ -1,5 +1,5 @@ -#include <stdint.h> #include <setjmp.h> +#include <stdint.h> #ifndef NDEBUG #define dbg printk @@ -9,9 +9,6 @@ #define PAGESIZE 4096 -typedef uint64_t lock_t; -typedef struct context Ctx; -typedef struct rscb Rscb; typedef struct rmucmd Rmucmd; struct bssmap { @@ -23,13 +20,27 @@ struct rowidx { unsigned char cnt; }; -#ifdef setjmp -struct context { - unsigned char imm1, imm2; +struct trapframe { + unsigned long long far; + unsigned long long esr; + unsigned long long spsr; + unsigned long long elr; + unsigned long long sp; + unsigned long long x30,x29,x28,x27; + unsigned long long x26,x25,x24,x23; + unsigned long long x22,x21,x20,x19; + unsigned long long x18,x17,x16,x15; + unsigned long long x14,x13,x12,x11; + unsigned long long x10,x9,x8,x7; + unsigned long long x6,x5,x4,x3; + unsigned long long x2,x1,x0; +}; + +struct rmucmd { + unsigned imm1, imm2; + struct trapframe *fp; jmp_buf recover; - int error; }; -#endif static inline struct bssmap * bss(void) @@ -41,12 +52,20 @@ bss(void) } #define bss bss() -extern void rmc(unsigned imm1, unsigned imm2, Ctx *ctx); -extern void lock(lock_t *lck); -extern void unlock(lock_t *lck); +extern void badrmc(Rmucmd *cmd, int error); +extern void panic(const char *msg); +extern void printk(const char * restrict fmt, ...); +extern void rmc(unsigned imm1, unsigned imm2, Rmucmd *cmd); +extern void swtch(struct trapframe *fp); -extern const struct rowidx rowidx[]; -extern void (*const handler[])(void); +/* architectural functions */ +extern void enaabt(void); +extern void disabt(void); +extern void enadbg(void); +extern void disdbg(void); +extern void wfi(void); +extern void wfe(void); -extern void printk(const char * restrict fmt, ...); -extern void panic(const char *msg); +/* global constant variables */ +extern const struct rowidx rowidx[]; +extern void (*const handler[])(Rmucmd *cmd); diff --git a/scripts/gentbl.sh b/scripts/gentbl.sh @@ -47,7 +47,7 @@ NF == 3 && $1 ~ /[0-9]*/ && $2 ~ /[0-9]*/ { END { for (cmd in cmds) - print "extern void " cmds[cmd] "(void);" + print "extern void hdl_" cmds[cmd] "(Rmucmd *cmd);" print "" print "const struct rowidx rowidx[256] = {" @@ -58,9 +58,9 @@ END { } print "};" - print "void (*const handler[])(void) = {" + print "void (*const handler[])(Rmucmd *cmd) = {" for (row in rowcnt) for (col = 0; col < rowcnt[row]; col++) - printf "\t[%d] = %s,\n", begin[row] + col, cmds[row,col] + printf "\t[%d] = hdl_%s,\n", begin[row] + col, cmds[row,col] print "};" }' > $tmp && mv $tmp rmctbl.c diff --git a/scripts/rules.mk b/scripts/rules.mk @@ -19,7 +19,7 @@ RCODE_LDFLAGS = $(MORELDFLAGS) \ $(SYSLDFLAGS) \ $(LDFLAGS) -RCODE_ASFLAGS = $(MOREAFLAGS) \ +RCODE_ASFLAGS = $(MOREASFLAGS) \ $(SYSASFLAGS) \ $(ASFLAGS) @@ -45,6 +45,9 @@ HOSTCC=$(COMP) .c.s: $(CC) $(RCODE_CFLAGS) -o $@ -S $< +.s.o: + $(AS) $(RCODE_ASFLAGS) -o $@ $< + FORALL= +@set -e ;\ pwd=$$PWD; \ for i in $(DIRS); \ diff --git a/src/librmu/RMU_Crypto_Random.c b/src/librmu/RMU_Crypto_Random.c @@ -3,5 +3,5 @@ void RMU_Crypto_Random(void) { - dbg("RMU_Crypto_Random\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Local_Load.c b/src/librmu/RMU_Local_Load.c @@ -3,5 +3,5 @@ void RMU_Local_Load(void) { - dbg("RMU_Local_Load\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Local_Status.c b/src/librmu/RMU_Local_Status.c @@ -3,5 +3,5 @@ void RMU_Local_Status(void) { - dbg("RMU_Local_Status\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Local_Validate.c b/src/librmu/RMU_Local_Validate.c @@ -3,5 +3,5 @@ void RMU_Local_Validate(void) { - dbg("RMU_Local_Validate\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_Prepare.c b/src/librmu/RMU_REC_Prepare.c @@ -3,5 +3,5 @@ void RMU_REC_Prepare(void) { - dbg("RMU_REC_Prepare\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_ReadGeneralPurposeRegister.c b/src/librmu/RMU_REC_ReadGeneralPurposeRegister.c @@ -3,5 +3,5 @@ void RMU_REC_ReadGeneralPurposeRegister(void) { - dbg("RMU_REC_ReadGeneralPurposeRegister\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_ReadSystemRegister.c b/src/librmu/RMU_REC_ReadSystemRegister.c @@ -3,5 +3,5 @@ void RMU_REC_ReadSystemRegister(void) { - dbg("RMU_REC_ReadSystemRegister\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_ReadVectorRegister.c b/src/librmu/RMU_REC_ReadVectorRegister.c @@ -3,5 +3,5 @@ void RMU_REC_ReadVectorRegister(void) { - dbg("RMU_REC_ReadVectorRegister\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_Register.c b/src/librmu/RMU_REC_Register.c @@ -3,5 +3,5 @@ void RMU_REC_Register(void) { - dbg("RMU_REC_Register\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_Release.c b/src/librmu/RMU_REC_Release.c @@ -3,5 +3,5 @@ void RMU_REC_Release(void) { - dbg("RMU_REC_Release\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_Size.c b/src/librmu/RMU_REC_Size.c @@ -3,5 +3,5 @@ void RMU_REC_Size(void) { - dbg("RMU_REC_Size\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_WriteGeneralPurposeRegister.c b/src/librmu/RMU_REC_WriteGeneralPurposeRegister.c @@ -3,5 +3,5 @@ void RMU_REC_WriteGeneralPurposeRegister(void) { - dbg("RMU_REC_WriteGeneralPurposeRegister\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_WriteSystemRegister.c b/src/librmu/RMU_REC_WriteSystemRegister.c @@ -3,5 +3,5 @@ void RMU_REC_WriteSystemRegister(void) { - dbg("RMU_REC_WriteSystemRegister\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_REC_WriteVectorRegister.c b/src/librmu/RMU_REC_WriteVectorRegister.c @@ -3,5 +3,5 @@ void RMU_REC_WriteVectorRegister(void) { - dbg("RMU_REC_WriteVectorRegister\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Activate.c b/src/librmu/RMU_Realm_Activate.c @@ -3,5 +3,5 @@ void RMU_Realm_Activate(void) { - dbg("RMU_Realm_Activate\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_AttestationReport.c b/src/librmu/RMU_Realm_AttestationReport.c @@ -3,5 +3,5 @@ void RMU_Realm_AttestationReport(void) { - dbg("RMU_Realm_AttestationReport\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_AttestationReportInit.c b/src/librmu/RMU_Realm_AttestationReportInit.c @@ -3,5 +3,5 @@ void RMU_Realm_AttestationReportInit(void) { - dbg("RMU_Realm_AttestationReportInit\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_AttestationReportSize.c b/src/librmu/RMU_Realm_AttestationReportSize.c @@ -3,5 +3,5 @@ void RMU_Realm_AttestationReportSize(void) { - dbg("RMU_Realm_AttestationReportSize\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_CreateZeroMetadata.c b/src/librmu/RMU_Realm_CreateZeroMetadata.c @@ -3,5 +3,5 @@ void RMU_Realm_CreateZeroMetadata(void) { - dbg("RMU_Realm_CreateZeroMetadata\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_DeriveBindingKey.c b/src/librmu/RMU_Realm_DeriveBindingKey.c @@ -3,5 +3,5 @@ void RMU_Realm_DeriveBindingKey(void) { - dbg("RMU_Realm_DeriveBindingKey\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_ExtendBindingKeySeedValue.c b/src/librmu/RMU_Realm_ExtendBindingKeySeedValue.c @@ -3,5 +3,5 @@ void RMU_Realm_ExtendBindingKeySeedValue(void) { - dbg("RMU_Realm_ExtendBindingKeySeedValue\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_GetBindingKeySeedValue.c b/src/librmu/RMU_Realm_GetBindingKeySeedValue.c @@ -3,5 +3,5 @@ void RMU_Realm_GetBindingKeySeedValue(void) { - dbg("RMU_Realm_GetBindingKeySeedValue\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_GetMetadata.c b/src/librmu/RMU_Realm_GetMetadata.c @@ -3,5 +3,5 @@ void RMU_Realm_GetMetadata(void) { - dbg("RMU_Realm_GetMetadata\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_GetParameterInheritance.c b/src/librmu/RMU_Realm_GetParameterInheritance.c @@ -3,5 +3,5 @@ void RMU_Realm_GetParameterInheritance(void) { - dbg("RMU_Realm_GetParameterInheritance\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_GetParameterValue.c b/src/librmu/RMU_Realm_GetParameterValue.c @@ -3,5 +3,5 @@ void RMU_Realm_GetParameterValue(void) { - dbg("RMU_Realm_GetParameterValue\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Info.c b/src/librmu/RMU_Realm_Info.c @@ -3,5 +3,5 @@ void RMU_Realm_Info(void) { - dbg("RMU_Realm_Info\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Initialize.c b/src/librmu/RMU_Realm_Initialize.c @@ -3,5 +3,5 @@ void RMU_Realm_Initialize(void) { - dbg("RMU_Realm_Initialize\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Invalidate.c b/src/librmu/RMU_Realm_Invalidate.c @@ -3,5 +3,5 @@ void RMU_Realm_Invalidate(void) { - dbg("RMU_Realm_Invalidate\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_InvalidateCurrent.c b/src/librmu/RMU_Realm_InvalidateCurrent.c @@ -3,5 +3,5 @@ void RMU_Realm_InvalidateCurrent(void) { - dbg("RMU_Realm_InvalidateCurrent\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Populate.c b/src/librmu/RMU_Realm_Populate.c @@ -3,5 +3,5 @@ void RMU_Realm_Populate(void) { - dbg("RMU_Realm_Populate\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Prepare.c b/src/librmu/RMU_Realm_Prepare.c @@ -3,5 +3,5 @@ void RMU_Realm_Prepare(void) { - dbg("RMU_Realm_Prepare\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_ReadMemory.c b/src/librmu/RMU_Realm_ReadMemory.c @@ -3,5 +3,5 @@ void RMU_Realm_ReadMemory(void) { - dbg("RMU_Realm_ReadMemory\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Register.c b/src/librmu/RMU_Realm_Register.c @@ -3,5 +3,5 @@ void RMU_Realm_Register(void) { - dbg("RMU_Realm_Register\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_Release.c b/src/librmu/RMU_Realm_Release.c @@ -3,5 +3,5 @@ void RMU_Realm_Release(void) { - dbg("RMU_Realm_Release\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_SetBindingKeySeedLock.c b/src/librmu/RMU_Realm_SetBindingKeySeedLock.c @@ -3,5 +3,5 @@ void RMU_Realm_SetBindingKeySeedLock(void) { - dbg("RMU_Realm_SetBindingKeySeedLock\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_SetCommandTrap.c b/src/librmu/RMU_Realm_SetCommandTrap.c @@ -3,5 +3,5 @@ void RMU_Realm_SetCommandTrap(void) { - dbg("RMU_Realm_SetCommandTrap\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_SetMetadata.c b/src/librmu/RMU_Realm_SetMetadata.c @@ -3,5 +3,5 @@ void RMU_Realm_SetMetadata(void) { - dbg("RMU_Realm_SetMetadata\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_SetParameterInheritance.c b/src/librmu/RMU_Realm_SetParameterInheritance.c @@ -3,5 +3,5 @@ void RMU_Realm_SetParameterInheritance(void) { - dbg("RMU_Realm_SetParameterInheritance\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_SetParameterValue.c b/src/librmu/RMU_Realm_SetParameterValue.c @@ -3,5 +3,5 @@ void RMU_Realm_SetParameterValue(void) { - dbg("RMU_Realm_SetParameterValue\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_Realm_WriteMemory.c b/src/librmu/RMU_Realm_WriteMemory.c @@ -3,5 +3,5 @@ void RMU_Realm_WriteMemory(void) { - dbg("RMU_Realm_WriteMemory\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_System_Enable.c b/src/librmu/RMU_System_Enable.c @@ -3,5 +3,5 @@ void RMU_System_Enable(void) { - dbg("RMU_System_Enable\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_System_InterfaceVersion.c b/src/librmu/RMU_System_InterfaceVersion.c @@ -3,5 +3,5 @@ void RMU_System_InterfaceVersion(void) { - dbg("RMU_System_InterfaceVersion\n"); + panic("not implemented"); } diff --git a/src/librmu/RMU_System_Status.c b/src/librmu/RMU_System_Status.c @@ -3,5 +3,5 @@ void RMU_System_Status(void) { - dbg("RMU_System_Status\n"); + panic("not implemented"); } diff --git a/src/rmc.c b/src/rmc.c @@ -1,13 +1,5 @@ #include <rcode.h> -void -bad_rmc(Ctx *ctx, int error) -{ - dbg("bad RMC: %d, %d = %d\n", ctx->imm1, ctx->imm2, error); - ctx->error = error; - longjmp(ctx->recover, 1); -} - /* * The dispatcher cannot be implemented using a table * because the rmu command number is composed by two @@ -29,24 +21,18 @@ bad_rmc(Ctx *ctx, int error) * ... ... */ void -rmc(unsigned imm1, unsigned imm2, Ctx *ctx) +rmc(unsigned imm1, unsigned imm2, Rmucmd *cmd) { const struct rowidx *idx; - if (setjmp(ctx->recover)) - return; - if (imm1 > 255 || imm2 > 255) panic("rmc"); - ctx->imm1 = imm1; - ctx->imm2 = imm2; - idx = &rowidx[imm1]; if (imm2 >= idx->cnt) - bad_rmc(ctx, 1); + badrmc(cmd, 1); /* TODO: put the correct code */ - (*handler[idx->off + imm2])(); + (*handler[idx->off + imm2])(cmd); - ctx->error = 0; + cmd->fp->x0 = 0; /* TODO: 0 means success */ } diff --git a/test/test1/.gitignore b/test/test1/.gitignore @@ -1,43 +1 @@ -RMU_Crypto_Random.c -RMU_Local_Load.c -RMU_Local_Status.c -RMU_Local_Validate.c -RMU_REC_Prepare.c -RMU_REC_ReadGeneralPurposeRegister.c -RMU_REC_ReadSystemRegister.c -RMU_REC_ReadVectorRegister.c -RMU_REC_Register.c -RMU_REC_Release.c -RMU_REC_Size.c -RMU_REC_WriteGeneralPurposeRegister.c -RMU_REC_WriteSystemRegister.c -RMU_REC_WriteVectorRegister.c -RMU_Realm_Activate.c -RMU_Realm_AttestationReport.c -RMU_Realm_AttestationReportInit.c -RMU_Realm_AttestationReportSize.c -RMU_Realm_CreateZeroMetadata.c -RMU_Realm_DeriveBindingKey.c -RMU_Realm_ExtendBindingKeySeedValue.c -RMU_Realm_GetBindingKeySeedValue.c -RMU_Realm_GetMetadata.c -RMU_Realm_GetParameterInheritance.c -RMU_Realm_GetParameterValue.c -RMU_Realm_Info.c -RMU_Realm_Initialize.c -RMU_Realm_Invalidate.c -RMU_Realm_InvalidateCurrent.c -RMU_Realm_Populate.c -RMU_Realm_Prepare.c -RMU_Realm_ReadMemory.c -RMU_Realm_Register.c -RMU_Realm_Release.c -RMU_Realm_SetBindingKeySeedLock.c -RMU_Realm_SetCommandTrap.c -RMU_Realm_SetMetadata.c -RMU_Realm_SetParameterInheritance.c -RMU_Realm_SetParameterValue.c -RMU_Realm_WriteMemory.c -RMU_System_Enable.c -RMU_System_InterfaceVersion.c -RMU_System_Status.c +hdl_*.c diff --git a/test/test1/Makefile b/test/test1/Makefile @@ -1,62 +1,62 @@ PROJECTDIR = ../.. include $(PROJECTDIR)/scripts/rules.mk -LIBOBJ = RMU_Crypto_Random.o \ - RMU_Local_Load.o \ - RMU_Local_Status.o \ - RMU_Local_Validate.o \ - RMU_REC_Prepare.o \ - RMU_REC_ReadGeneralPurposeRegister.o \ - RMU_REC_ReadSystemRegister.o \ - RMU_REC_ReadVectorRegister.o \ - RMU_REC_Register.o \ - RMU_REC_Release.o \ - RMU_REC_Size.o \ - RMU_REC_WriteGeneralPurposeRegister.o \ - RMU_REC_WriteSystemRegister.o \ - RMU_REC_WriteVectorRegister.o \ - RMU_Realm_Activate.o \ - RMU_Realm_AttestationReport.o \ - RMU_Realm_AttestationReportInit.o \ - RMU_Realm_AttestationReportSize.o \ - RMU_Realm_CreateZeroMetadata.o \ - RMU_Realm_DeriveBindingKey.o \ - RMU_Realm_ExtendBindingKeySeedValue.o \ - RMU_Realm_GetBindingKeySeedValue.o \ - RMU_Realm_GetMetadata.o \ - RMU_Realm_GetParameterInheritance.o \ - RMU_Realm_GetParameterValue.o \ - RMU_Realm_Info.o \ - RMU_Realm_Initialize.o \ - RMU_Realm_Invalidate.o \ - RMU_Realm_InvalidateCurrent.o \ - RMU_Realm_Populate.o \ - RMU_Realm_Prepare.o \ - RMU_Realm_ReadMemory.o \ - RMU_Realm_Register.o \ - RMU_Realm_Release.o \ - RMU_Realm_SetBindingKeySeedLock.o \ - RMU_Realm_SetCommandTrap.o \ - RMU_Realm_SetMetadata.o \ - RMU_Realm_SetParameterInheritance.o \ - RMU_Realm_SetParameterValue.o \ - RMU_Realm_WriteMemory.o \ - RMU_System_Enable.o \ - RMU_System_InterfaceVersion.o \ - RMU_System_Status.o \ +LIBOBJ = hdl_RMU_Crypto_Random.o \ + hdl_RMU_Local_Load.o \ + hdl_RMU_Local_Status.o \ + hdl_RMU_Local_Validate.o \ + hdl_RMU_REC_Prepare.o \ + hdl_RMU_REC_ReadGeneralPurposeRegister.o \ + hdl_RMU_REC_ReadSystemRegister.o \ + hdl_RMU_REC_ReadVectorRegister.o \ + hdl_RMU_REC_Register.o \ + hdl_RMU_REC_Release.o \ + hdl_RMU_REC_Size.o \ + hdl_RMU_REC_WriteGeneralPurposeRegister.o \ + hdl_RMU_REC_WriteSystemRegister.o \ + hdl_RMU_REC_WriteVectorRegister.o \ + hdl_RMU_Realm_Activate.o \ + hdl_RMU_Realm_AttestationReport.o \ + hdl_RMU_Realm_AttestationReportInit.o \ + hdl_RMU_Realm_AttestationReportSize.o \ + hdl_RMU_Realm_CreateZeroMetadata.o \ + hdl_RMU_Realm_DeriveBindingKey.o \ + hdl_RMU_Realm_ExtendBindingKeySeedValue.o \ + hdl_RMU_Realm_GetBindingKeySeedValue.o \ + hdl_RMU_Realm_GetMetadata.o \ + hdl_RMU_Realm_GetParameterInheritance.o \ + hdl_RMU_Realm_GetParameterValue.o \ + hdl_RMU_Realm_Info.o \ + hdl_RMU_Realm_Initialize.o \ + hdl_RMU_Realm_Invalidate.o \ + hdl_RMU_Realm_InvalidateCurrent.o \ + hdl_RMU_Realm_Populate.o \ + hdl_RMU_Realm_Prepare.o \ + hdl_RMU_Realm_ReadMemory.o \ + hdl_RMU_Realm_Register.o \ + hdl_RMU_Realm_Release.o \ + hdl_RMU_Realm_SetBindingKeySeedLock.o \ + hdl_RMU_Realm_SetCommandTrap.o \ + hdl_RMU_Realm_SetMetadata.o \ + hdl_RMU_Realm_SetParameterInheritance.o \ + hdl_RMU_Realm_SetParameterValue.o \ + hdl_RMU_Realm_WriteMemory.o \ + hdl_RMU_System_Enable.o \ + hdl_RMU_System_InterfaceVersion.o \ + hdl_RMU_System_Status.o \ OBJS = $(ARCHDIR)/crt-$(SYS).o $(SRCDIR)/romfw/builtin.o test.o -LIBS = -lrmu -lc -LIBDEP = librmu.a $(LIBDIR)/libc.a +LIBS = -lhdl -lc +LIBDEP = libhdl.a $(LIBDIR)/libc.a TARGET = run all: $(TARGET) $(TARGET): $(OBJS) $(LIBDEP) - $(LD) $(RCODE_LDFLAGS) $(OBJS) $(LIBS) -o $@ + $(LD) -L. $(RCODE_LDFLAGS) $(OBJS) $(LIBS) -o $@ -librmu.a: $(LIBOBJ) +libhdl.a: $(LIBOBJ) $(AR) $(ARFLAGS) $@ $? ranlib $@ diff --git a/test/test1/genrmu.sh b/test/test1/genrmu.sh @@ -8,54 +8,54 @@ genfile() void $1(void) { - dbg("$1\n"); + printf("$1\n"); } FILE } cat <<EOF | while read i; do genfile $i; done -RMU_REC_WriteVectorRegister -RMU_Realm_SetMetadata -RMU_Realm_GetParameterValue -RMU_REC_ReadSystemRegister -RMU_Realm_GetMetadata -RMU_Realm_SetParameterValue -RMU_REC_WriteSystemRegister -RMU_Realm_CreateZeroMetadata -RMU_Realm_GetParameterInheritance -RMU_Realm_SetParameterInheritance -RMU_Realm_Initialize -RMU_Realm_Prepare -RMU_Local_Status -RMU_Realm_Populate -RMU_Local_Load -RMU_Realm_Activate -RMU_Local_Validate -RMU_Realm_Info -RMU_Realm_SetCommandTrap -RMU_Crypto_Random -RMU_Realm_AttestationReportSize -RMU_Realm_AttestationReportInit -RMU_Realm_AttestationReport -RMU_Realm_Register -RMU_Realm_Release -RMU_Realm_ExtendBindingKeySeedValue -RMU_Realm_SetBindingKeySeedLock -RMU_Realm_DeriveBindingKey -RMU_Realm_GetBindingKeySeedValue -RMU_Realm_InvalidateCurrent -RMU_REC_Size -RMU_REC_Register -RMU_System_InterfaceVersion -RMU_REC_Prepare -RMU_System_Status -RMU_REC_Release -RMU_System_Enable -RMU_REC_ReadGeneralPurposeRegister -RMU_REC_WriteGeneralPurposeRegister -RMU_Realm_ReadMemory -RMU_REC_ReadVectorRegister -RMU_Realm_WriteMemory -RMU_Realm_Invalidate +hdl_RMU_REC_WriteVectorRegister +hdl_RMU_Realm_SetMetadata +hdl_RMU_Realm_GetParameterValue +hdl_RMU_REC_ReadSystemRegister +hdl_RMU_Realm_GetMetadata +hdl_RMU_Realm_SetParameterValue +hdl_RMU_REC_WriteSystemRegister +hdl_RMU_Realm_CreateZeroMetadata +hdl_RMU_Realm_GetParameterInheritance +hdl_RMU_Realm_SetParameterInheritance +hdl_RMU_Realm_Initialize +hdl_RMU_Realm_Prepare +hdl_RMU_Local_Status +hdl_RMU_Realm_Populate +hdl_RMU_Local_Load +hdl_RMU_Realm_Activate +hdl_RMU_Local_Validate +hdl_RMU_Realm_Info +hdl_RMU_Realm_SetCommandTrap +hdl_RMU_Crypto_Random +hdl_RMU_Realm_AttestationReportSize +hdl_RMU_Realm_AttestationReportInit +hdl_RMU_Realm_AttestationReport +hdl_RMU_Realm_Register +hdl_RMU_Realm_Release +hdl_RMU_Realm_ExtendBindingKeySeedValue +hdl_RMU_Realm_SetBindingKeySeedLock +hdl_RMU_Realm_DeriveBindingKey +hdl_RMU_Realm_GetBindingKeySeedValue +hdl_RMU_Realm_InvalidateCurrent +hdl_RMU_REC_Size +hdl_RMU_REC_Register +hdl_RMU_System_InterfaceVersion +hdl_RMU_REC_Prepare +hdl_RMU_System_Status +hdl_RMU_REC_Release +hdl_RMU_System_Enable +hdl_RMU_REC_ReadGeneralPurposeRegister +hdl_RMU_REC_WriteGeneralPurposeRegister +hdl_RMU_Realm_ReadMemory +hdl_RMU_REC_ReadVectorRegister +hdl_RMU_Realm_WriteMemory +hdl_RMU_Realm_Invalidate EOF diff --git a/test/test1/test.c b/test/test1/test.c @@ -1,4 +1,5 @@ #include <assert.h> +#include <stdlib.h> #include <rcode.h> @@ -6,12 +7,17 @@ int main(int argc, char *argv[]) { unsigned i, j; - Ctx ctx; + Rmucmd cmd; + struct trapframe frame; + cmd.fp = &frame; for (i = 0; i < 256; i++) { for (j = 0; j < 256; j++) { + cmd.imm1 = i; + cmd.imm2 = j; dbg("%u\t%u\t", i, j); - rmc(i, j, &ctx); + if (!setjmp(cmd.recover)) + rmc(i, j, &cmd); } } return 0; @@ -21,6 +27,12 @@ void panic(const char *msg) { printk("panic: %s\n", msg); - for (;;) - ; + abort(); +} + +void +badrmc(Rmucmd *cmd, int error) +{ + dbg("bad RMC: %d, %d = %d\n", cmd->imm1, cmd->imm2, error); + longjmp(cmd->recover, 1); }