9os

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

commit 293e94cee3b5a915ebb1a4cef0c93210d4a8e075
parent 7358f3ab5ae9eb51290ac8e4d96a8ef4eafb660e
Author: Roberto Vargas <roberto.vargas@arm.com>
Date:   Thu,  4 Apr 2019 11:04:55 +0100

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

Change-Id: I5ee0377e0e8c80081e850f53bbc34e57b2a77ad0

Diffstat:
Aconfig/arm64-rcode.mk | 6++++++
Dconfig/rmode-rcode.mk | 5-----
Mconfig/toolchain/gnu.ld | 9+++++----
Mdrivers/pl011.c | 15+++++++++------
Dinclude/bits/rmode/arch/limits.h | 18------------------
Dinclude/bits/rmode/arch/setjmp.h | 1-
Dinclude/bits/rmode/arch/stddef.h | 9---------
Dinclude/bits/rmode/arch/stdint.h | 109-------------------------------------------------------------------------------
Dinclude/bits/rmode/arch/stdio.h | 15---------------
Dinclude/bits/rmode/arch/stdlib.h | 21---------------------
Dinclude/bits/rmode/arch/string.h | 6------
Dinclude/bits/rmode/arch/time.h | 8--------
Dinclude/bits/rmode/arch/types.h | 2--
Minclude/rcode/rcode.h | 2++
Mscripts/rules.mk | 2+-
Msrc/libc/arch/Makefile | 2+-
Msrc/libc/arch/amd64/darwin/Makefile | 1+
Asrc/libc/arch/amd64/darwin/putenv.c | 1+
Msrc/libc/arch/amd64/dragonfly/Makefile | 1+
Asrc/libc/arch/amd64/dragonfly/putenv.c | 1+
Msrc/libc/arch/amd64/linux/Makefile | 1+
Asrc/libc/arch/amd64/linux/putenv.c | 1+
Msrc/libc/arch/amd64/netbsd/Makefile | 1+
Asrc/libc/arch/amd64/netbsd/putenv.c | 1+
Msrc/libc/arch/amd64/openbsd/Makefile | 1+
Asrc/libc/arch/amd64/openbsd/putenv.c | 1+
Msrc/libc/arch/arm32/linux/Makefile | 1+
Asrc/libc/arch/arm32/linux/putenv.c | 1+
Msrc/libc/arch/arm64/Makefile | 2+-
Rsrc/libc/arch/rmode/rcode/.gitignore -> src/libc/arch/arm64/rcode/.gitignore | 0
Asrc/libc/arch/arm64/rcode/Makefile | 18++++++++++++++++++
Rsrc/libc/arch/rmode/rcode/_Exit.c -> src/libc/arch/arm64/rcode/_Exit.c | 0
Rsrc/libc/arch/rmode/rcode/_read.s -> src/libc/arch/arm64/rcode/_read.s | 0
Rsrc/libc/arch/rmode/rcode/_write.s -> src/libc/arch/arm64/rcode/_write.s | 0
Rsrc/libc/arch/rmode/rcode/crt.s -> src/libc/arch/arm64/rcode/crt.s | 0
Asrc/libc/arch/arm64/rcode/getenv.c | 1+
Asrc/libc/arch/arm64/rcode/putenv.c | 1+
Rsrc/libc/arch/rmode/rcode/raise.c -> src/libc/arch/arm64/rcode/raise.c | 0
Rsrc/libk/putenv-hosted.c -> src/libc/arch/posix/putenv.c | 0
Dsrc/libc/arch/rmode/Makefile | 14--------------
Dsrc/libc/arch/rmode/longjmp.s | 18------------------
Dsrc/libc/arch/rmode/rcode/Makefile | 17-----------------
Dsrc/libc/arch/rmode/rcode/getenv.c | 24------------------------
Dsrc/libc/arch/rmode/setjmp.s | 20--------------------
Msrc/libk/Makefile | 1-
Dsrc/libk/putenv-native.c | 36------------------------------------
Msrc/romfw/rmc.c | 2++
Mtarget/hosted/rom.c | 1-
Mtarget/native/arch.s | 113+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mtarget/native/crt.s | 43++++++++++++-------------------------------
Mtarget/native/rom.c | 122++++++++++++++++++++++++++++++-------------------------------------------------
Mtarget/native/sysreg.lst | 11++++-------
52 files changed, 189 insertions(+), 497 deletions(-)

diff --git a/config/arm64-rcode.mk b/config/arm64-rcode.mk @@ -0,0 +1,6 @@ +ARCH = arm64 +SYS = rcode +MODE = native +SYSASFLAGS = $(RCODE_ASFLAGS) $(ARMV81_ASFLAGS) +SYSCFLAGS = $(RCODE_CFLAGS) +SYSLDFLAGS = -Ttext=0x4024000 diff --git a/config/rmode-rcode.mk b/config/rmode-rcode.mk @@ -1,5 +0,0 @@ -ARCH = rmode -SYS = rcode -MODE = native -SYSASFLAGS = $(RCODE_ASFLAGS) $(ARMV81_ASFLAGS) -SYSCFLAGS = $(RCODE_CFLAGS) diff --git a/config/toolchain/gnu.ld b/config/toolchain/gnu.ld @@ -1,16 +1,17 @@ SECTIONS { .text : { - *crt-none.o(.text*) + *crt.o(.text*) *(.text) + etext = .; } .data : { *(.data) + edata = .; } .bss : { *(.bss) - } - /DISCARD/ : { - *(.ARM.use_no_argv) + *(COMMON) + end = .; } } diff --git a/drivers/pl011.c b/drivers/pl011.c @@ -9,8 +9,11 @@ enum phyregs { UARTDR, /* Data register */ UARTRSR, /* Receive status register */ RES1, /* Reserved */ - UARTFR, /* Flag register */ RES2, /* Reserved */ + RES3, /* Reserved */ + RES4, /* Reserved */ + UARTFR, /* Flag register */ + RES5, /* Reserved */ UARTILPR, /* IrDA low-power count register */ UARTIBRD, /* Integer baud rate */ UARTFBRD, /* Fractional baud rate register */ @@ -22,10 +25,10 @@ enum phyregs { UARTMIS, /* Masked interrupt register */ UARTICR, /* Interrupt clear register */ UARTDMACR, /* DMA control register */ - RES3, /* Reserved */ - RES4, /* Reserved */ - RES5, /* Reserved */ RES6, /* Reserved */ + RES7, /* Reserved */ + RES8, /* Reserved */ + RES9, /* Reserved */ UARTPID0, /* UART Periph ID0 */ UARTPID1, /* UART Periph ID1 */ UARTPID2, /* UART Periph ID2 */ @@ -171,7 +174,7 @@ pl011read(Uart *up, void *buf, int n) char *bp = buf; for (i = 0; i < n; i++) { - while ((plin(up, UARTFR) & FR_RXFE) == 0) + while ((plin(up, UARTFR) & FR_RXFE) != 0) ; bp[i] = plin(up, UARTDR); } @@ -185,7 +188,7 @@ pl011write(Uart *up, void *buf, int n) char *bp = buf; for (i = 0; i < n; i++) { - while ((plin(up, UARTFR) & FR_TXFF) == 0) + while ((plin(up, UARTFR) & FR_TXFF) != 0) ; plout(up, UARTDR, bp[i]); } diff --git a/include/bits/rmode/arch/limits.h b/include/bits/rmode/arch/limits.h @@ -1,18 +0,0 @@ -#define CHAR_BIT 8 -#define SCHAR_MAX 0x7F -#define SCHAR_MIN (-SCHAR_MIN - 1) -#define CHAR_MAX 0x7F -#define CHAR_MIN (-CHAR_MAX - 1) -#define UCHAR_MAX 0xFFU -#define SHRT_MAX 0x7FFF -#define SHRT_MIN (-SHRT_MAX - 1) -#define USHRT_MAX 0xFFFFU -#define INT_MAX 0x7FFFFFFF -#define INT_MIN (-INT_MAX - 1) -#define UINT_MAX 0xFFFFFFFFU -#define LONG_MAX 0x7FFFFFFFFFFFFFFFL -#define LONG_MIN (-LONG_MAX - 1L) -#define ULONG_MAX 0xFFFFFFFFFFFFFFFFUL -#define LLONG_MAX 0x7FFFFFFFFFFFFFFFLL -#define LLONG_MIN (-LLONG_MAX - 1LL) -#define ULLONG_MAX 0xFFFFFFFFFFFFFFFFULL diff --git a/include/bits/rmode/arch/setjmp.h b/include/bits/rmode/arch/setjmp.h @@ -1 +0,0 @@ -typedef unsigned long long jmp_buf[14]; diff --git a/include/bits/rmode/arch/stddef.h b/include/bits/rmode/arch/stddef.h @@ -1,9 +0,0 @@ -#ifndef SIZET_ -typedef unsigned long size_t; -#define SIZET_ -#endif - -#ifndef _PTRDIFF_T -typedef long ptrdiff_t; -#define _PTRDIFF_T -#endif diff --git a/include/bits/rmode/arch/stdint.h b/include/bits/rmode/arch/stdint.h @@ -1,109 +0,0 @@ -#define INT8_MAX 0x7F -#define INT8_MIN (-INT8_MAX - 1) -#define UINT8_MAX 0xFFU - -#define INT16_MAX 0x7FFF -#define INT16_MIN (-INT16_MAX - 1) -#define UINT16_MAX 0xFFFFU - -#define INT32_MAX 0x7FFFFFFF -#define INT32_MIN (-INT32_MAX - 1) -#define UINT32_MAX 0xFFFFFFFFU - -#define INT64_MAX 0x7FFFFFFFFFFFFFFFLL -#define INT64_MIN (-INT64_MAX - 1LL) -#define UINT64_MAX 0xFFFFFFFFFFFFFFFFULL - -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define UINT_LEAST8_MAX UINT8_MAX - -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define UINT_LEAST16_MAX UINT16_MAX - -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define UINT_LEAST32_MAX UINT32_MAX - -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -#define INT_FAST8_MIN INT32_MIN -#define INT_FAST8_MAX INT32_MAX -#define UINT_FAST8_MAX UINT32_MAX - -#define INT_FAST16_MIN INT32_MIN -#define INT_FAST16_MAX INT32_MAX -#define UINT_FAST16_MAX UINT32_MAX - -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define UINT_FAST32_MAX UINT32_MAX - -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST64_MAX UINT64_MAX - -#define INTPTR_MIN INT64_MIN -#define INTPTR_MAX INT64_MAX -#define UINTPTR_MAX UINT64_MAX - -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -#define PTRDIFF_MIN INT64_MIN -#define PTRDIFF_MAX INT64_MAX - -#define SIZE_MAX UINT64_MAX - -#define INT8_C(x) x -#define INT16_C(x) x -#define INT32_C(x) x -#define INT64_C(x) x ## LL - -#define UINT8_C(x) x -#define UINT16_C(x) x -#define UINT32_C(x) x ## U -#define UINT64_C(x) x ## ULL - -#define INTMAX_C(x) x ## L -#define UINTMAX_C(x) x ## ULL - -typedef signed char int8_t; -typedef short int16_t; -typedef int int32_t; -typedef long long int64_t; - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -typedef signed char int8_least_t; -typedef short int16_least_t; -typedef int int32_least_t; -typedef long long int64_least_t; - -typedef unsigned char uint8_least_t; -typedef unsigned short uint16_least_t; -typedef unsigned int uint32_least_t; -typedef unsigned long long uint64_least_t; - -typedef int int8_fast_t; -typedef int int16_fast_t; -typedef int int32_fast_t; -typedef long long int64_fast_t; - -typedef unsigned int uint8_fast_t; -typedef unsigned int uint16_fast_t; -typedef unsigned int uint32_fast_t; -typedef unsigned long long uint64_fast_t; - -typedef long intptr_t; -typedef unsigned long uintptr_t; - -typedef long intmax_t; -typedef unsigned long uintmax_t; diff --git a/include/bits/rmode/arch/stdio.h b/include/bits/rmode/arch/stdio.h @@ -1,15 +0,0 @@ -#ifndef _SIZET -typedef unsigned long size_t; -#define _SIZET -#endif - -#define BUFSIZ 512 -#define FILENAME_MAX 256 -#define FOPEN_MAX 16 - -#define TMP_MAX 25 -#define L_tmpnam 256 - -#define _TMPNAME "/tmp/tmp.0000000" - -typedef int fpos_t; diff --git a/include/bits/rmode/arch/stdlib.h b/include/bits/rmode/arch/stdlib.h @@ -1,21 +0,0 @@ -#ifndef SIZET_ -typedef unsigned long size_t; -#define SIZET_ -#endif - -struct _Env { - int nvars; - char *vars[]; -}; - -extern struct _Env *_environ(); - -#define EXIT_FAILURE 1 -#define EXIT_SUCCESS 0 - -#ifndef _WCHAR_T -typedef int wchar_t; -#define _WCHAR_T -#endif - -#define _ALIGNTYPE long double diff --git a/include/bits/rmode/arch/string.h b/include/bits/rmode/arch/string.h @@ -1,6 +0,0 @@ -#ifndef SIZET_ -typedef unsigned long size_t; -#define SIZET_ -#endif - -#define __NUMCHARS 128 diff --git a/include/bits/rmode/arch/time.h b/include/bits/rmode/arch/time.h @@ -1,8 +0,0 @@ -#ifndef _SIZET -typedef unsigned long size_t; -#define _SIZET -#endif - -#define _MAXYEAR 9999 - -typedef long int time_t; diff --git a/include/bits/rmode/arch/types.h b/include/bits/rmode/arch/types.h @@ -1,2 +0,0 @@ -typedef int atomic_t; -typedef unsigned long mutex_t; diff --git a/include/rcode/rcode.h b/include/rcode/rcode.h @@ -63,6 +63,8 @@ enum regidx { ESR, SP, FAR, + SCR, + UNUSED, NR_REGS }; diff --git a/scripts/rules.mk b/scripts/rules.mk @@ -1,4 +1,4 @@ -CONF = rmode-rcode +CONF = arm64-rcode TOOL = gnu include $(PROJECTDIR)/config/$(CONF).mk include $(PROJECTDIR)/config/toolchain/$(TOOL).mk diff --git a/src/libc/arch/Makefile b/src/libc/arch/Makefile @@ -3,7 +3,7 @@ PROJECTDIR =../../.. include $(PROJECTDIR)/scripts/rules.mk include ../rules.mk -DIRS = amd64 arm32 arm64 rmode +DIRS = amd64 arm32 arm64 all: +@cd $(ARCH) && $(MAKE) diff --git a/src/libc/arch/amd64/darwin/Makefile b/src/libc/arch/amd64/darwin/Makefile @@ -15,6 +15,7 @@ OBJS = __Exit.o \ _getheap.o \ _tzone.o \ getenv.o \ + putenv.o \ raise.o \ signal.o \ time.o \ diff --git a/src/libc/arch/amd64/darwin/putenv.c b/src/libc/arch/amd64/darwin/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/amd64/dragonfly/Makefile b/src/libc/arch/amd64/dragonfly/Makefile @@ -16,6 +16,7 @@ OBJS = _Exit.o \ _sigaction.o\ _tzone.o \ getenv.o \ + putenv.o \ raise.o \ signal.o \ time.o \ diff --git a/src/libc/arch/amd64/dragonfly/putenv.c b/src/libc/arch/amd64/dragonfly/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/amd64/linux/Makefile b/src/libc/arch/amd64/linux/Makefile @@ -18,6 +18,7 @@ OBJS = _Exit.o \ _sigaction.o \ _tzone.o \ getenv.o \ + putenv.o \ raise.o \ signal.o \ time.o \ diff --git a/src/libc/arch/amd64/linux/putenv.c b/src/libc/arch/amd64/linux/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/amd64/netbsd/Makefile b/src/libc/arch/amd64/netbsd/Makefile @@ -19,6 +19,7 @@ OBJS = _Exit.o \ _sigaction.o\ _tzone.o \ getenv.o \ + putenv.o \ raise.o \ signal.o \ time.o \ diff --git a/src/libc/arch/amd64/netbsd/putenv.c b/src/libc/arch/amd64/netbsd/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/amd64/openbsd/Makefile b/src/libc/arch/amd64/openbsd/Makefile @@ -16,6 +16,7 @@ OBJS = _Exit.o \ _sigaction.o\ _tzone.o \ getenv.o \ + putenv.o \ raise.o \ signal.o \ time.o \ diff --git a/src/libc/arch/amd64/openbsd/putenv.c b/src/libc/arch/amd64/openbsd/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/arm32/linux/Makefile b/src/libc/arch/arm32/linux/Makefile @@ -18,6 +18,7 @@ OBJS = _Exit.o \ _sigaction.o \ _tzone.o \ getenv.o \ + putenv.o \ raise.o \ signal.o \ time.o \ diff --git a/src/libc/arch/arm32/linux/putenv.c b/src/libc/arch/arm32/linux/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/arm64/Makefile b/src/libc/arch/arm64/Makefile @@ -4,7 +4,7 @@ include $(PROJECTDIR)/scripts/rules.mk include ../../rules.mk OBJS = longjmp.o setjmp.o -DIRS = linux +DIRS = linux rcode all: $(OBJS) $(SYS) diff --git a/src/libc/arch/rmode/rcode/.gitignore b/src/libc/arch/arm64/rcode/.gitignore diff --git a/src/libc/arch/arm64/rcode/Makefile b/src/libc/arch/arm64/rcode/Makefile @@ -0,0 +1,18 @@ +.POSIX: +PROJECTDIR =../../../../.. +include $(PROJECTDIR)/scripts/rules.mk +include ../../../rules.mk + +OBJS = _Exit.o \ + raise.o \ + _write.o \ + _sys_errlist.o \ + _read.o \ + getenv.o \ + putenv.o \ + crt.o \ + +all: $(OBJS) + +clean: + rm -f _sys_errlist.c diff --git a/src/libc/arch/rmode/rcode/_Exit.c b/src/libc/arch/arm64/rcode/_Exit.c diff --git a/src/libc/arch/rmode/rcode/_read.s b/src/libc/arch/arm64/rcode/_read.s diff --git a/src/libc/arch/rmode/rcode/_write.s b/src/libc/arch/arm64/rcode/_write.s diff --git a/src/libc/arch/rmode/rcode/crt.s b/src/libc/arch/arm64/rcode/crt.s diff --git a/src/libc/arch/arm64/rcode/getenv.c b/src/libc/arch/arm64/rcode/getenv.c @@ -0,0 +1 @@ +#include "../../posix/getenv.c" diff --git a/src/libc/arch/arm64/rcode/putenv.c b/src/libc/arch/arm64/rcode/putenv.c @@ -0,0 +1 @@ +#include "../../posix/putenv.c" diff --git a/src/libc/arch/rmode/rcode/raise.c b/src/libc/arch/arm64/rcode/raise.c diff --git a/src/libk/putenv-hosted.c b/src/libc/arch/posix/putenv.c diff --git a/src/libc/arch/rmode/Makefile b/src/libc/arch/rmode/Makefile @@ -1,14 +0,0 @@ -.POSIX: -PROJECTDIR =../../../.. -include $(PROJECTDIR)/scripts/rules.mk - -OBJS = longjmp.o setjmp.o -DIRS = rcode - -all: $(OBJS) $(SYS) - -$(SYS): FORCE - +@cd $@ && $(MAKE) - -clean: - $(FORALL) diff --git a/src/libc/arch/rmode/longjmp.s b/src/libc/arch/rmode/longjmp.s @@ -1,18 +0,0 @@ - .file "longjmp.s" - - .text - .globl longjmp -longjmp: - ldp x19, x20, [x0,#0] - ldp x21, x22, [x0,#16] - ldp x23, x24, [x0,#32] - ldp x25, x26, [x0,#48] - ldp x27, x28, [x0,#64] - ldp x29, x30, [x0,#80] - ldr x2, [x0,#104] - mov sp, x2 - - mov x0, x1 - cbnz x1, 1f - mov x0, #1 -1: br x30 diff --git a/src/libc/arch/rmode/rcode/Makefile b/src/libc/arch/rmode/rcode/Makefile @@ -1,17 +0,0 @@ -.POSIX: -PROJECTDIR =../../../../.. -include $(PROJECTDIR)/scripts/rules.mk -include ../../../rules.mk - -OBJS = _Exit.o \ - raise.o \ - _write.o \ - _sys_errlist.o \ - _read.o \ - getenv.o \ - crt.o \ - -all: $(OBJS) - -clean: - rm -f _sys_errlist.c diff --git a/src/libc/arch/rmode/rcode/getenv.c b/src/libc/arch/rmode/rcode/getenv.c @@ -1,24 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -#undef getenv - -extern void *getenviron(void); - -char * -getenv(const char *name) -{ - int i; - char *s; - struct _Env *envp; - size_t len = strlen(name); - - envp = getenviron(); - for (i = 0; i < envp->nvars; i++) { - if ((s = envp->vars[i]) == NULL) - break; - if (!strncmp(name, s, len) && s[len] == '=') - return s + len + 1; - } - return NULL; -} diff --git a/src/libc/arch/rmode/setjmp.s b/src/libc/arch/rmode/setjmp.s @@ -1,20 +0,0 @@ - .file "setjmp.s" - - .text - .globl setjmp -setjmp: - // IHI0055B_aapcs64.pdf 5.1.1, 5.1.2 callee saved registers - stp x19, x20, [x0,#0] - stp x21, x22, [x0,#16] - stp x23, x24, [x0,#32] - stp x25, x26, [x0,#48] - stp x27, x28, [x0,#64] - stp x29, x30, [x0,#80] - mov x2, sp - str x2, [x0,#104] - stp d8, d9, [x0,#112] - stp d10, d11, [x0,#128] - stp d12, d13, [x0,#144] - stp d14, d15, [x0,#160] - mov x0, #0 - ret diff --git a/src/libk/Makefile b/src/libk/Makefile @@ -13,7 +13,6 @@ OBJS = doprnt.o \ kerror.o \ kwrite.o \ tokenize.o \ - putenv-$(MODE).o \ __assert.o \ TARGET = $(LIBDIR)/libk.a diff --git a/src/libk/putenv-native.c b/src/libk/putenv-native.c @@ -1,36 +0,0 @@ -#include <errno.h> -#include <stdlib.h> -#include <string.h> - -extern void *getenviron(void); - -int -putenv(char *name) -{ - int i; - char *s; - struct _Env *envp; - size_t len; - - if ((s = strchr(name, '=')) == NULL) { - errno = EINVAL; - return -1; - } - len = s - name; - - envp = getenviron(); - for (i = 0; i < envp->nvars; i++) { - if ((s = envp->vars[i]) == NULL) - break; - if (!strncmp(name, s, len) && s[len] == '=') - break; - } - - if (i == envp->nvars) { - errno = ENOMEM; - return -1; - } - envp->vars[i] = name; - - return 0; -} diff --git a/src/romfw/rmc.c b/src/romfw/rmc.c @@ -53,6 +53,8 @@ const char *const regnames[] = { [ESR] = "esr", [SP] = "sp", [FAR] = "far", + [SCR] = "scr", + [UNUSED] = "unused", NULL }; diff --git a/target/hosted/rom.c b/target/hosted/rom.c @@ -10,7 +10,6 @@ static struct trapframe *frame(void); -void *environ; struct trapframe trapframe, *framep; struct trapframe *(*getframe)(void) = frame; diff --git a/target/native/arch.s b/target/native/arch.s @@ -71,6 +71,7 @@ outm32: ret lock: + ret // TODO: fix casa external data abort mov w2,#1 sevl 1: @@ -93,34 +94,38 @@ dohalt: dopanic: exception: msr spsel,#1 - stp x0,x1,[sp,#-16*(18-0)] - stp x2,x3,[sp,#-16*(18-1)] - stp x4,x5,[sp,#-16*(18-2)] - stp x6,x7,[sp,#-16*(18-3)] - stp x8,x9,[sp,#-16*(18-4)] - stp x10,x11,[sp,#-16*(18-5)] - stp x12,x13,[sp,#-16*(18-6)] - stp x14,x15,[sp,#-16*(18-7)] - stp x16,x17,[sp,#-16*(18-8)] - stp x18,x19,[sp,#-16*(18-9)] - stp x20,x21,[sp,#-16*(18-10)] - stp x22,x23,[sp,#-16*(18-11)] - stp x24,x25,[sp,#-16*(18-12)] - stp x26,x27,[sp,#-16*(18-13)] - stp x28,x29,[sp,#-16*(18-14)] - - mrs x9,S3_6_C4_C0_3 /* ELR_R */ - stp x9,x30,[sp,#-16*(18-15)] - - mrs x9,S3_6_C4_C0_6 /* SPSR_R */ - mrs x10,S3_6_C5_C2_6 /* ESR_R */ - stp x9,x10,[sp,#-16*(18-16)] + stp x0,x1,[sp,#-16*(19-0)] + stp x2,x3,[sp,#-16*(19-1)] + stp x4,x5,[sp,#-16*(19-2)] + stp x6,x7,[sp,#-16*(19-3)] + stp x8,x9,[sp,#-16*(19-4)] + stp x10,x11,[sp,#-16*(19-5)] + stp x12,x13,[sp,#-16*(19-6)] + stp x14,x15,[sp,#-16*(19-7)] + stp x16,x17,[sp,#-16*(19-8)] + stp x18,x19,[sp,#-16*(19-9)] + stp x20,x21,[sp,#-16*(19-10)] + stp x22,x23,[sp,#-16*(19-11)] + stp x24,x25,[sp,#-16*(19-12)] + stp x26,x27,[sp,#-16*(19-13)] + stp x28,x29,[sp,#-16*(19-14)] + + mrs x9,ELR_EL3 + stp x9,x30,[sp,#-16*(19-15)] + + mrs x9,SPSR_EL3 + mrs x10,ESR_EL3 + stp x9,x10,[sp,#-16*(19-16)] mov x9,sp - mrs x10,S3_6_C6_C0_6 /* FAR_R */ - stp x9,x10,[sp,#-16*(18-17)] + mrs x10,FAR_EL3 + stp x9,x10,[sp,#-16*(19-17)] - sub sp,sp,#16*18 + mrs x9,scr_el3 + mov x10,#0 /* unused */ + stp x9,x10,[sp,#-16*(19-18)] + + sub sp,sp,#16*19 mov x0,sp mov x29,#0 bl trap @@ -133,16 +138,19 @@ outsync: .text doswtch: + ldp x9,x10,[x0,#16*18] + msr SCR_EL3,x9 + ldp x9,x10,[x0,#16*17] - msr S3_6_C6_C0_6,x10 /* FAR_R */ + msr FAR_EL3,x10 mov sp,x9 ldp x9,x10,[x0,#16*16] - msr S3_6_C4_C0_6,x9 /* SPSR_R */ - msr S3_6_C5_C2_6,x10 /* ESR_R */ + msr ESR_EL3,x10 + msr SPSR_EL3,x9 ldp x9,x30,[x0,#16*15] - msr S3_6_C4_C0_3,x9 /* ELR_R */ + msr ELR_EL3,x9 ldp x28,x29,[x0,#16*14] ldp x26,x27,[x0,#16*13] @@ -165,25 +173,40 @@ doswtch: .align 11 vectbl: /* Current EL with SP0 */ - b exception; nop /* Sync */ - b exception; nop /* IRQ/vIRQ */ - b exception; nop /* FIQ/vFIQ */ - b exception; nop /* SError/VSError */ + b exception /* Sync */ + .align 7 + b exception /* IRQ/vIRQ */ + .align 7 + b exception /* FIQ/vFIQ */ + .align 7 + b exception /* SError/VSError */ /* Current EL with SPx */ - b exception; nop /* Sync */ - b exception; nop /* IRQ/vIRQ */ - b exception; nop /* FIQ/vFIQ */ - b exception; nop /* SError/VSError */ + .align 7 + b exception /* Sync */ + .align 7 + b exception /* IRQ/vIRQ */ + .align 7 + b exception /* FIQ/vFIQ */ + .align 7 + b exception /* SError/VSError */ /* Lower EL using AArch64 */ - b exception; nop /* Sync */ - b exception; nop /* IRQ/vIRQ */ - b exception; nop /* FIQ/vFIQ */ - b exception; nop /* SError/VSError */ + .align 7 + b exception /* Sync */ + .align 7 + b exception /* IRQ/vIRQ */ + .align 7 + b exception /* FIQ/vFIQ */ + .align 7 + b exception /* SError/VSError */ /* Lower EL using AArch32 */ - b exception; nop /* Sync */ - b exception; nop /* IRQ/vIRQ */ - b exception; nop /* FIQ/vFIQ */ - b exception; nop /* SError/VSError */ + .align 7 + b exception /* Sync */ + .align 7 + b exception /* IRQ/vIRQ */ + .align 7 + b exception /* FIQ/vFIQ */ + .align 7 + b exception /* SError/VSError */ diff --git a/target/native/crt.s b/target/native/crt.s @@ -1,48 +1,29 @@ -/* TODO: extract data section address from RSCB */ -SRAMADDR = 0x2E00F000 -SRAMSIZE = 4096 + .file "crt.s" .text .globl _start -_start: - bl getpc -getpc: - sub x30,x30,4 - mov x19,x30 - - ldr x0,=SRAMADDR - mov x1,#SRAMSIZE - bl initmem +_start: adr x0,vectbl - msr S3_6_C12_C0_6,x0 /* VBAR_R */ + msr VBAR_EL3,x0 isb - ldr x0,=SRAMADDR - mov x1,#1024 /* Setup a initial stack at the bottom */ + ldr x0,=end /* Setup an initial stack */ + mov x1,#0x100f /* 1 page + 15 */ add x0,x0,x1 + bic x0,x0,#0xf /* Align to 16 bytes */ mov sp,x0 - mov x29,#0 - mov x0,x19 - ldr x1,=.data - ldr x2,=SRAMADDR - mov x3,#SRAMSIZE + ldr x0,=edata /* BSS clean */ + mov x1,#0 + ldr x2,=end + sub x2,x2,x0 + bl memset + bl main adr x0,outsync b panic -/* Scrub SRAM */ -initmem: - stp xzr,xzr,[x0],#16 - stp xzr,xzr,[x0],#16 - stp xzr,xzr,[x0],#16 - stp xzr,xzr,[x0],#16 - sub x1,x1,#64 - cmp x1,#0 - b.ne initmem - ret - .section .rodata outsync: .asciz "out of sync" diff --git a/target/native/rom.c b/target/native/rom.c @@ -10,37 +10,22 @@ #include "sysreg.h" #include "arch.h" -#define ENVPOS 7 -#define ENVSIZ (sizeof(struct _Env) + ENVPOS*sizeof(char *)) -#define BSSSIZ 2048 -#define STACKSIZ 1024 -#define HEAPSIZ 1024 +#define ENVSIZ 512 +#define STACKSIZ 1792 +#define HEAPSIZ 1792 typedef struct mach Mach; -void *environ; +char **_environ; struct trapframe trapframe, *framep; struct mach { - struct trapframe frame; - void *env; - size_t envsiz; - void *txt; - size_t txtsiz; - void *ram; - size_t ramsiz; - void *bss_; - size_t bsssiz; void *sp; size_t stacksiz; + void *env; + size_t envsiz; }; -struct _Env * -getenviron(void) -{ - return environ; -} - void * alloc(size_t size) { @@ -65,97 +50,82 @@ alloc(size_t size) } static void -imach(Mach *mp, void *txt, size_t txtsiz, void *ram, size_t ramsiz) +imach(Mach *mp, void *stackp) { - char *bp, *ramp; - struct trapframe *fp = &mp->frame; - - mp->txt = txt; - mp->ram = ram; - mp->txtsiz = txtsiz; - mp->ramsiz = ramsiz; - memset(fp, 0, sizeof(*fp)); - - ramp = ram; - bp = ramp + ramsiz; - - mp->env = (bp -= ENVSIZ); - mp->bss_ = (bp -= BSSSIZ); - mp->sp = bp - 16; - - wsysreg(TPIDR_R, (uintptr_t) mp->bss_); - - /* - * At this moment we can panic safely - * but we will not see any message - * because we don't have configured - * a console - */ - if (ENVSIZ + BSSSIZ + STACKSIZ > ramsiz) - panic("imach"); - - mp->stacksiz = bp - ramp; + framep = &trapframe; + memset(framep, 0, sizeof(*framep)); + + mp->sp = stackp; + mp->stacksiz = STACKSIZ; + mp->env = stackp + ENVSIZ; mp->envsiz = ENVSIZ; - mp->bsssiz = BSSSIZ; - fp->r[SP] = (unsigned long long)mp->sp; - fp->r[ELR] = rsysreg(RVBAR_EL3); - fp->r[SPSR] = 0xf << 6 | 0xd; + _environ = mp->env; + + framep->r[SP] = (unsigned long long)mp->sp; + framep->r[ELR] = rsysreg(RVBAR_EL3); + framep->r[SPSR] = 0xf << 6 | 0xd; + + rmctab = &romtab; invicache(); invdcache(); } static void -ibss(Mach *mp) +itty(void) { - struct _Env *envp; + static char lnm[] = "\x1b[20h"; + static char srm[] = "\x1b[12l"; - rmctab = &romtab; - envp = environ = mp->env; - envp->nvars = ENVPOS; + write(1, lnm, sizeof(lnm)); + write(1, srm, sizeof(srm)); } static void info(Mach *mp) { dbg("romfw: version %s\n" - "ram = %p, ramsiz = 0x%zx\n" - "txt = %p, txtsiz = 0x%zx\n" "env = %p, envsiz = 0x%zx\n" - "bss = %p, bsssiz = 0x%zx\n" "sp = %p, stacksiz = 0x%zx\n", RCODEVERSION, - mp->ram, mp->ramsiz, - mp->txt, mp->txtsiz, mp->env, mp->envsiz, - mp->bss_, mp->bsssiz, mp->sp, mp->stacksiz); } static void namespace(void) { - int fd; - - if (bind("#t", "/dev") < 0) - panic("namespace:bind"); - - if (open("/dev/uart0/raw", O_READ | O_WRITE) != 0) - panic("namespace:open"); + if (open("#t0/raw", O_READ) != 0) + goto error; + if (open("#t0/raw", O_WRITE) != 1) + goto error; + if (open("#t0/raw", O_WRITE) != 2) + goto error; + + if (bind("#t0", "/dev/uart") < 0) + goto error; + if (bind("#t0", "/dev/cons") < 0) + goto error; + return; + +error: + kerror("namespace"); + panic("namespace"); } void -main(void *txt, size_t txtsiz, void *ram, size_t ramsiz) +main(void *stackp) { Mach mach; - imach(&mach, txt, txtsiz, ram, ramsiz); - ibss(&mach); + imach(&mach, stackp); idev(); intr(IENABLE); barrier(ISB); namespace(); + itty(); info(&mach); - swtch(&mach.frame); + debug(); + swtch(framep); } diff --git a/target/native/sysreg.lst b/target/native/sysreg.lst @@ -1,11 +1,8 @@ -ACTLR_R S3_6_C1_C0_3 -ID_AA64RMFR0_R S3_6_C0_C7_6 -RCR_R S3_6_C1_C1_6 -RDSCR_R S3_6_C6_C15_6 -SCTLR_R S3_6_C1_C0_6 +ACTLR_EL3 S3_6_C1_C0_1 +SCTLR_EL3 S3_6_C1_C0_0 RVBAR_EL3 S3_6_C12_C0_1 -VBAR_R S3_6_C12_C0_6 -TPIDR_R S3_6_C13_C0_6 +VBAR_EL3 S3_6_C12_C0_0 +TPIDR_EL3 S3_6_C13_C0_2 CLIDR_EL1 S3_1_C0_C0_1 CCSIDR_EL1 S3_1_C0_C0_0 CSSELR_EL1 S3_2_C0_C0_0