From a2e373d78d61f86293bdd23bceb4d0d6d456d845 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Wed, 11 Sep 2019 04:18:11 +0000 Subject: [PATCH] Missing files. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12979 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- os/sb/host/compilers/GCC/sbexc.S | 163 +++++ os/sb/host/compilers/GCC/sbhost.mk | 12 + os/sb/host/sbapi.c | 90 +++ os/sb/host/sbapi.h | 88 +++ os/sb/host/sbhost.c | 183 ++++++ os/sb/host/sbhost.h | 940 +++++++++++++++++++++++++++++ os/sb/user/sbuser.c | 57 ++ os/sb/user/sbuser.h | 143 +++++ os/sb/user/sbuser.mk | 11 + 9 files changed, 1687 insertions(+) create mode 100644 os/sb/host/compilers/GCC/sbexc.S create mode 100644 os/sb/host/compilers/GCC/sbhost.mk create mode 100644 os/sb/host/sbapi.c create mode 100644 os/sb/host/sbapi.h create mode 100644 os/sb/host/sbhost.c create mode 100644 os/sb/host/sbhost.h create mode 100644 os/sb/user/sbuser.c create mode 100644 os/sb/user/sbuser.h create mode 100644 os/sb/user/sbuser.mk diff --git a/os/sb/host/compilers/GCC/sbexc.S b/os/sb/host/compilers/GCC/sbexc.S new file mode 100644 index 000000000..0380dac64 --- /dev/null +++ b/os/sb/host/compilers/GCC/sbexc.S @@ -0,0 +1,163 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbexc.S + * @brief Exception handlers for sandbox. + * + * @defgroup ARMV7M_SANDBOX_EXCEPTIONS SandBox Exception Vectors + * @{ + */ + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Code section. */ +/*===========================================================================*/ + +#if !defined(__DOXYGEN__) + + .syntax unified + .cpu cortex-m3 + .thumb + + .text + + .align 2 + .thumb_func + .global port_syscall +port_syscall: + ldr r3, =sb_syscalls + ldr.w r3, [r3, r1, lsl #2] + mov r4, r0 + blx r3 + str r0, [r4, #0] + svc 0 +.zombies1: b .zombies1 + + .align 2 + .thumb_func + .global HardFault_Handler +HardFault_Handler: + tst.w lr, #8 + beq.n .normal_hf + mrs r3, CONTROL + tst.w r3, #1 + bne.w .exit_thd +.normal_hf: ldr r3, =HardFault_Handler_SB + bx r3 + + .align 2 + .thumb_func + .global MemManage_Handler +MemManage_Handler: + tst.w lr, #8 + beq.n .normal_mm + mrs r3, CONTROL + tst.w r3, #1 + bne.w .exit_thd +.normal_mm: ldr r3, =MemManage_Handler_SB + bx r3 + + .align 2 + .thumb_func + .global BusFault_Handler +BusFault_Handler: + tst.w lr, #8 + beq.n .normal_bf + mrs r3, CONTROL + tst.w r3, #1 + bne.w .exit_thd +.normal_bf: ldr r3, =BusFault_Handler_SB + bx r3 + + .align 2 + .thumb_func + .global UsageFault_Handler +UsageFault_Handler: + tst.w lr, #8 + beq.n .normal_uf + mrs r3, CONTROL + tst.w r3, #1 + bne.w .exit_thd +.normal_uf: ldr r3, =UsageFault_Handler_SB + bx r3 + +/* + * Common thread-exit handler on exception. + * Makes the current exception return on chThdExit() with the PSR + * value as exit message. + */ +.exit_thd: + mov.w r4, lr + + /* This thread is going to die so going back on + S-PSP and working safely from there.*/ + bl port_get_s_psp + sub.w r0, r0, #32 // TODO: FPU + msr PSP, r0 + + /* Forcing return on exit syscall code with PSR + value as exit message.*/ + mrs r2, PSR + str r2, [r0, #0] + ldr r2, =.do_exit + str r2, [r0, #24] + ldr r2, =0x01000000 + str r2, [r0, #28] + + /* Back to privileged mode.*/ + mrs r3, CONTROL + bic.w r3, #1 + msr CONTROL, r3 + + /* Making sure there are no chained exceptions or interrupts + in the way, we need to exit this one atomically.*/ + bl port_syslock_noinline +# cpsid i + bx r4 + + /* Exception exit point.*/ +.do_exit: +# cpsie i + bl chThdExitS +.zombies2: b .zombies2 + + .align 2 + .thumb_func + .weak HardFault_Handler_SB + .weak MemManage_Handler_SB + .weak BusFault_Handler_SB + .weak UsageFault_Handler_SB +HardFault_Handler_SB: +MemManage_Handler_SB: +BusFault_Handler_SB: +UsageFault_Handler_SB: + ldr r3, =_unhandled_exception + bx r3 + +#endif /* !defined(__DOXYGEN__) */ + +/** @} */ diff --git a/os/sb/host/compilers/GCC/sbhost.mk b/os/sb/host/compilers/GCC/sbhost.mk new file mode 100644 index 000000000..358cd9d6d --- /dev/null +++ b/os/sb/host/compilers/GCC/sbhost.mk @@ -0,0 +1,12 @@ +# List of the ChibiOS ARMv7-M sandbox host files. +SBHOSTSRC = $(CHIBIOS)/os/sb/host/sbhost.c \ + $(CHIBIOS)/os/sb/host/sbapi.c + +SBHOSTASM = $(CHIBIOS)/os/sb/host/compilers/GCC/sbexc.S + +SBHOSTINC = $(CHIBIOS)/os/sb/host + +# Shared variables +ALLXASMSRC += $(SBHOSTASM) +ALLCSRC += $(SBHOSTSRC) +ALLINC += $(SBHOSTINC) diff --git a/os/sb/host/sbapi.c b/os/sb/host/sbapi.c new file mode 100644 index 000000000..51a5d3e35 --- /dev/null +++ b/os/sb/host/sbapi.c @@ -0,0 +1,90 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbhost.c + * @brief ARMv7-M sandbox host API code. + * + * @addtogroup ARMV7M_SANDBOX_HOSTAPI + * @{ + */ + +#include "ch.h" +#include "sbhost.h" + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +uint32_t sb_api_exit(struct port_extctx *ctxp) { + + chThdExit((msg_t)ctxp->r0); + + return SB_ERR_NOT_IMPLEMENTED; +} + +uint32_t sb_api_get_systime(struct port_extctx *ctxp) { + + (void)ctxp; + + return (uint32_t)chVTGetSystemTimeX(); +} + +uint32_t sb_api_get_frequency(struct port_extctx *ctxp) { + + (void)ctxp; + + return (uint32_t)CH_CFG_ST_FREQUENCY; +} + +uint32_t sb_api_sleep(struct port_extctx *ctxp) { + + chThdSleepMilliseconds((sysinterval_t)ctxp->r0); + + return SB_ERR_NOERROR; +} + +uint32_t sb_api_sleep_until_windowed(struct port_extctx *ctxp) { + + chThdSleepUntilWindowed((systime_t)ctxp->r0, (systime_t)ctxp->r1); + + return SB_ERR_NOERROR; +} + +/** @} */ diff --git a/os/sb/host/sbapi.h b/os/sb/host/sbapi.h new file mode 100644 index 000000000..f485ba2e5 --- /dev/null +++ b/os/sb/host/sbapi.h @@ -0,0 +1,88 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbapi.h + * @brief ARMv7-M sandbox host API macros and structures. + * + * @addtogroup ARMV7M_SANDBOX_HOSTAPI + * @{ + */ + +#ifndef SBAPI_H +#define SBAPI_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +#define SB_SVC1_HANDLER sb_api_exit +#define SB_SVC2_HANDLER sb_api_get_systime +#define SB_SVC3_HANDLER sb_api_get_frequency +#define SB_SVC4_HANDLER sb_api_sleep +#define SB_SVC5_HANDLER sb_api_sleep_until_windowed + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if CH_CFG_ST_RESOLUTION != 32 +#error "SandBox requires CH_CFG_ST_RESOLUTION == 32" +#endif + +#if CH_CFG_INTERVALS_SIZE != 32 +#error "SandBox requires CH_CFG_INTERVALS_SIZE == 32" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + uint32_t sb_api_exit(struct port_extctx *ctxp); + uint32_t sb_api_get_systime(struct port_extctx *ctxp); + uint32_t sb_api_get_frequency(struct port_extctx *ctxp); + uint32_t sb_api_sleep(struct port_extctx *ctxp); + uint32_t sb_api_sleep_until_windowed(struct port_extctx *ctxp); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* SBAPI_H */ + +/** @} */ diff --git a/os/sb/host/sbhost.c b/os/sb/host/sbhost.c new file mode 100644 index 000000000..fcac669a0 --- /dev/null +++ b/os/sb/host/sbhost.c @@ -0,0 +1,183 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbhost.c + * @brief ARMv7-M sandbox code. + * + * @addtogroup ARMV7M_SANDBOX + * @{ + */ + +#include "ch.h" +#include "sbhost.h" + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +uint32_t sb_undef_handler(struct port_extctx *ectxp); + +const port_syscall_t sb_syscalls[256] = { + SB_SVC0_HANDLER, SB_SVC1_HANDLER, SB_SVC2_HANDLER, SB_SVC3_HANDLER, + SB_SVC4_HANDLER, SB_SVC5_HANDLER, SB_SVC6_HANDLER, SB_SVC7_HANDLER, + SB_SVC8_HANDLER, SB_SVC9_HANDLER, SB_SVC10_HANDLER, SB_SVC11_HANDLER, + SB_SVC12_HANDLER, SB_SVC13_HANDLER, SB_SVC14_HANDLER, SB_SVC15_HANDLER, + SB_SVC16_HANDLER, SB_SVC17_HANDLER, SB_SVC18_HANDLER, SB_SVC19_HANDLER, + SB_SVC20_HANDLER, SB_SVC21_HANDLER, SB_SVC22_HANDLER, SB_SVC23_HANDLER, + SB_SVC24_HANDLER, SB_SVC25_HANDLER, SB_SVC26_HANDLER, SB_SVC27_HANDLER, + SB_SVC28_HANDLER, SB_SVC29_HANDLER, SB_SVC30_HANDLER, SB_SVC31_HANDLER, + SB_SVC32_HANDLER, SB_SVC33_HANDLER, SB_SVC34_HANDLER, SB_SVC35_HANDLER, + SB_SVC36_HANDLER, SB_SVC37_HANDLER, SB_SVC38_HANDLER, SB_SVC39_HANDLER, + SB_SVC40_HANDLER, SB_SVC41_HANDLER, SB_SVC42_HANDLER, SB_SVC43_HANDLER, + SB_SVC44_HANDLER, SB_SVC45_HANDLER, SB_SVC46_HANDLER, SB_SVC47_HANDLER, + SB_SVC48_HANDLER, SB_SVC49_HANDLER, SB_SVC50_HANDLER, SB_SVC51_HANDLER, + SB_SVC52_HANDLER, SB_SVC53_HANDLER, SB_SVC54_HANDLER, SB_SVC55_HANDLER, + SB_SVC56_HANDLER, SB_SVC57_HANDLER, SB_SVC58_HANDLER, SB_SVC59_HANDLER, + SB_SVC60_HANDLER, SB_SVC61_HANDLER, SB_SVC62_HANDLER, SB_SVC63_HANDLER, + SB_SVC64_HANDLER, SB_SVC65_HANDLER, SB_SVC66_HANDLER, SB_SVC67_HANDLER, + SB_SVC68_HANDLER, SB_SVC69_HANDLER, SB_SVC70_HANDLER, SB_SVC71_HANDLER, + SB_SVC72_HANDLER, SB_SVC73_HANDLER, SB_SVC74_HANDLER, SB_SVC75_HANDLER, + SB_SVC76_HANDLER, SB_SVC77_HANDLER, SB_SVC78_HANDLER, SB_SVC79_HANDLER, + SB_SVC80_HANDLER, SB_SVC81_HANDLER, SB_SVC82_HANDLER, SB_SVC83_HANDLER, + SB_SVC84_HANDLER, SB_SVC85_HANDLER, SB_SVC86_HANDLER, SB_SVC87_HANDLER, + SB_SVC88_HANDLER, SB_SVC89_HANDLER, SB_SVC90_HANDLER, SB_SVC91_HANDLER, + SB_SVC92_HANDLER, SB_SVC93_HANDLER, SB_SVC94_HANDLER, SB_SVC95_HANDLER, + SB_SVC96_HANDLER, SB_SVC97_HANDLER, SB_SVC98_HANDLER, SB_SVC99_HANDLER, + SB_SVC100_HANDLER, SB_SVC101_HANDLER, SB_SVC102_HANDLER, SB_SVC103_HANDLER, + SB_SVC104_HANDLER, SB_SVC105_HANDLER, SB_SVC106_HANDLER, SB_SVC107_HANDLER, + SB_SVC108_HANDLER, SB_SVC109_HANDLER, SB_SVC110_HANDLER, SB_SVC111_HANDLER, + SB_SVC112_HANDLER, SB_SVC113_HANDLER, SB_SVC114_HANDLER, SB_SVC115_HANDLER, + SB_SVC116_HANDLER, SB_SVC117_HANDLER, SB_SVC118_HANDLER, SB_SVC119_HANDLER, + SB_SVC120_HANDLER, SB_SVC121_HANDLER, SB_SVC122_HANDLER, SB_SVC123_HANDLER, + SB_SVC124_HANDLER, SB_SVC125_HANDLER, SB_SVC126_HANDLER, SB_SVC127_HANDLER, + SB_SVC128_HANDLER, SB_SVC129_HANDLER, SB_SVC130_HANDLER, SB_SVC131_HANDLER, + SB_SVC132_HANDLER, SB_SVC133_HANDLER, SB_SVC134_HANDLER, SB_SVC135_HANDLER, + SB_SVC136_HANDLER, SB_SVC137_HANDLER, SB_SVC138_HANDLER, SB_SVC139_HANDLER, + SB_SVC140_HANDLER, SB_SVC141_HANDLER, SB_SVC142_HANDLER, SB_SVC143_HANDLER, + SB_SVC144_HANDLER, SB_SVC145_HANDLER, SB_SVC146_HANDLER, SB_SVC147_HANDLER, + SB_SVC148_HANDLER, SB_SVC149_HANDLER, SB_SVC150_HANDLER, SB_SVC151_HANDLER, + SB_SVC152_HANDLER, SB_SVC153_HANDLER, SB_SVC154_HANDLER, SB_SVC155_HANDLER, + SB_SVC156_HANDLER, SB_SVC157_HANDLER, SB_SVC158_HANDLER, SB_SVC159_HANDLER, + SB_SVC160_HANDLER, SB_SVC161_HANDLER, SB_SVC162_HANDLER, SB_SVC163_HANDLER, + SB_SVC164_HANDLER, SB_SVC165_HANDLER, SB_SVC166_HANDLER, SB_SVC167_HANDLER, + SB_SVC168_HANDLER, SB_SVC169_HANDLER, SB_SVC170_HANDLER, SB_SVC171_HANDLER, + SB_SVC172_HANDLER, SB_SVC173_HANDLER, SB_SVC174_HANDLER, SB_SVC175_HANDLER, + SB_SVC176_HANDLER, SB_SVC177_HANDLER, SB_SVC178_HANDLER, SB_SVC179_HANDLER, + SB_SVC180_HANDLER, SB_SVC181_HANDLER, SB_SVC182_HANDLER, SB_SVC183_HANDLER, + SB_SVC184_HANDLER, SB_SVC185_HANDLER, SB_SVC186_HANDLER, SB_SVC187_HANDLER, + SB_SVC188_HANDLER, SB_SVC189_HANDLER, SB_SVC190_HANDLER, SB_SVC191_HANDLER, + SB_SVC192_HANDLER, SB_SVC193_HANDLER, SB_SVC194_HANDLER, SB_SVC195_HANDLER, + SB_SVC196_HANDLER, SB_SVC197_HANDLER, SB_SVC198_HANDLER, SB_SVC199_HANDLER, + SB_SVC200_HANDLER, SB_SVC201_HANDLER, SB_SVC202_HANDLER, SB_SVC203_HANDLER, + SB_SVC204_HANDLER, SB_SVC205_HANDLER, SB_SVC206_HANDLER, SB_SVC207_HANDLER, + SB_SVC208_HANDLER, SB_SVC209_HANDLER, SB_SVC210_HANDLER, SB_SVC211_HANDLER, + SB_SVC212_HANDLER, SB_SVC213_HANDLER, SB_SVC214_HANDLER, SB_SVC215_HANDLER, + SB_SVC216_HANDLER, SB_SVC217_HANDLER, SB_SVC218_HANDLER, SB_SVC219_HANDLER, + SB_SVC220_HANDLER, SB_SVC221_HANDLER, SB_SVC222_HANDLER, SB_SVC223_HANDLER, + SB_SVC224_HANDLER, SB_SVC225_HANDLER, SB_SVC226_HANDLER, SB_SVC227_HANDLER, + SB_SVC228_HANDLER, SB_SVC229_HANDLER, SB_SVC230_HANDLER, SB_SVC231_HANDLER, + SB_SVC232_HANDLER, SB_SVC233_HANDLER, SB_SVC234_HANDLER, SB_SVC235_HANDLER, + SB_SVC236_HANDLER, SB_SVC237_HANDLER, SB_SVC238_HANDLER, SB_SVC239_HANDLER, + SB_SVC240_HANDLER, SB_SVC241_HANDLER, SB_SVC242_HANDLER, SB_SVC243_HANDLER, + SB_SVC244_HANDLER, SB_SVC245_HANDLER, SB_SVC246_HANDLER, SB_SVC247_HANDLER, + SB_SVC248_HANDLER, SB_SVC249_HANDLER, SB_SVC250_HANDLER, SB_SVC251_HANDLER, + SB_SVC252_HANDLER, SB_SVC253_HANDLER, SB_SVC254_HANDLER, SB_SVC255_HANDLER +}; + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +__attribute__((weak)) +uint32_t sb_undef_handler(struct port_extctx *ectxp) { + + (void)ectxp; + + return SB_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Starts a sandboxed thread. + * + * @param[in] sbhp pointer to the sandbox binary header + * @param[in] rp pointer to the regions descriptor + * @return The function returns only if the operation failed. + */ +void sbStart(const sb_header_t *sbhp, + const sb_regions_t *rp) { + uint32_t pc, psp; + + /* Checking header magic numbers.*/ + if ((sbhp->hdr_magic1 != SB_MAGIC1) || (sbhp->hdr_magic2 != SB_MAGIC2)) { + return; + } + + /* Checking header size and alignment.*/ + if (sbhp->hdr_size != sizeof (sb_header_t)) { + return; + } + + /* Checking regions, applet regions and sandbox regions must match.*/ + if ((sbhp->r0_base != rp->r0_base) || (sbhp->r0_end != rp->r0_end) || + (sbhp->r1_base != rp->r1_base) || (sbhp->r1_end != rp->r1_end)) { + return; + } + + /* PC initial address, by convention it is immediately after the header.*/ + pc = (sbhp->r0_base + sbhp->hdr_size) | 1U; + + /* PSP initial address, it is placed at end of the last region.*/ + if (rp->r1_base == 0U) { + /* Must be in region 1.*/ + psp = rp->r0_end; + } + else { + /* Must be in region 2.*/ + psp = rp->r1_end; + } + + /* Additional context information.*/ + chThdGetSelfX()->ctx.syscall.p = (const void *)rp; + chThdGetSelfX()->ctx.syscall.psp = (regarm_t)__get_PSP(); + + /* Jumping to the unprivileged code.*/ + port_unprivileged_jump((regarm_t)pc, (regarm_t)psp); + + /* Must never happen condition.*/ + chSysHalt("returned"); +} + +/** @} */ diff --git a/os/sb/host/sbhost.h b/os/sb/host/sbhost.h new file mode 100644 index 000000000..b8430eaf4 --- /dev/null +++ b/os/sb/host/sbhost.h @@ -0,0 +1,940 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbhost.h + * @brief ARMv7-M sandbox macros and structures. + * + * @addtogroup ARMV7M_SANDBOX + * @{ + */ + +#ifndef SBHOST_H +#define SBHOST_H + +#include "sbapi.h" +#if defined(SB_INCLUDE_USERAPI) +#include "sbuserapi.h" +#endif + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/** + * @brief Magic numbers + * @{ + */ +#define SB_MAGIC1 0xFE9154C0U +#define SB_MAGIC2 0x0C4519EFU +/** @} */ + +/** + * @brief Sandbox error codes + * @{ + */ +#define SB_ERR_NOERROR 0U +#define SB_ERR_NOT_IMPLEMENTED 0xFFFFFFFFU +#define SB_ERR_MEMORY_FAULT 0xFFFFFFFEU +/** @} */ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if PORT_USE_SYSCALL == FALSE +#error "sandbox requires PORT_USE_SYSCALL" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of a syscall handler. + */ +typedef uint32_t (*port_syscall_t)(struct port_extctx *ctx); + +/** + * @brief Type of a sandbox memory region. + */ +typedef struct { + /** + * @brief Region 0 start address. + */ + uint32_t r0_base; + /** + * @brief Region 0 size. + */ + uint32_t r0_end; + /** + * @brief Region 2 start address. + * @note Zero if not used. + */ + uint32_t r1_base; + /** + * @brief Region 2 end address. + * @note Zero if not used. + */ + uint32_t r1_end; +} sb_regions_t; + +/** + * @brief Type of a sandbox applet headers. + */ +typedef struct { + /** + * @brief Magic number 1. + */ + uint32_t hdr_magic1; + /** + * @brief Magic number 2. + */ + uint32_t hdr_magic2; + /** + * @brief Header size, inclusive of magic numbers. + */ + uint32_t hdr_size; + /** + * @brief Used-defined parameters, defaulted to zero. + */ + uint32_t user; + /** + * @brief Region 0 start address. + */ + uint32_t r0_base; + /** + * @brief Region 0 size. + */ + uint32_t r0_end; + /** + * @brief Region 2 start address. + * @note Zero if not used. + */ + uint32_t r1_base; + /** + * @brief Region 2 end address. + * @note Zero if not used. + */ + uint32_t r1_end; +} sb_header_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +#define __SVC(x) asm volatile ("svc " #x) + +/* + * All handlers defaulted to a common function. + */ +#if !defined(SB_SVC0_HANDLER) +#define SB_SVC0_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC1_HANDLER) +#define SB_SVC1_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC2_HANDLER) +#define SB_SVC2_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC3_HANDLER) +#define SB_SVC3_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC4_HANDLER) +#define SB_SVC4_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC5_HANDLER) +#define SB_SVC5_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC6_HANDLER) +#define SB_SVC6_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC7_HANDLER) +#define SB_SVC7_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC8_HANDLER) +#define SB_SVC8_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC9_HANDLER) +#define SB_SVC9_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC10_HANDLER) +#define SB_SVC10_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC11_HANDLER) +#define SB_SVC11_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC12_HANDLER) +#define SB_SVC12_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC13_HANDLER) +#define SB_SVC13_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC14_HANDLER) +#define SB_SVC14_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC15_HANDLER) +#define SB_SVC15_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC16_HANDLER) +#define SB_SVC16_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC17_HANDLER) +#define SB_SVC17_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC18_HANDLER) +#define SB_SVC18_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC19_HANDLER) +#define SB_SVC19_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC20_HANDLER) +#define SB_SVC20_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC21_HANDLER) +#define SB_SVC21_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC22_HANDLER) +#define SB_SVC22_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC23_HANDLER) +#define SB_SVC23_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC24_HANDLER) +#define SB_SVC24_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC25_HANDLER) +#define SB_SVC25_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC26_HANDLER) +#define SB_SVC26_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC27_HANDLER) +#define SB_SVC27_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC28_HANDLER) +#define SB_SVC28_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC29_HANDLER) +#define SB_SVC29_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC30_HANDLER) +#define SB_SVC30_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC31_HANDLER) +#define SB_SVC31_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC32_HANDLER) +#define SB_SVC32_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC33_HANDLER) +#define SB_SVC33_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC34_HANDLER) +#define SB_SVC34_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC35_HANDLER) +#define SB_SVC35_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC36_HANDLER) +#define SB_SVC36_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC37_HANDLER) +#define SB_SVC37_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC38_HANDLER) +#define SB_SVC38_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC39_HANDLER) +#define SB_SVC39_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC40_HANDLER) +#define SB_SVC40_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC41_HANDLER) +#define SB_SVC41_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC42_HANDLER) +#define SB_SVC42_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC43_HANDLER) +#define SB_SVC43_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC44_HANDLER) +#define SB_SVC44_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC45_HANDLER) +#define SB_SVC45_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC46_HANDLER) +#define SB_SVC46_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC47_HANDLER) +#define SB_SVC47_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC48_HANDLER) +#define SB_SVC48_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC49_HANDLER) +#define SB_SVC49_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC50_HANDLER) +#define SB_SVC50_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC51_HANDLER) +#define SB_SVC51_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC52_HANDLER) +#define SB_SVC52_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC53_HANDLER) +#define SB_SVC53_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC54_HANDLER) +#define SB_SVC54_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC55_HANDLER) +#define SB_SVC55_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC56_HANDLER) +#define SB_SVC56_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC57_HANDLER) +#define SB_SVC57_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC58_HANDLER) +#define SB_SVC58_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC59_HANDLER) +#define SB_SVC59_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC60_HANDLER) +#define SB_SVC60_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC61_HANDLER) +#define SB_SVC61_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC62_HANDLER) +#define SB_SVC62_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC63_HANDLER) +#define SB_SVC63_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC64_HANDLER) +#define SB_SVC64_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC65_HANDLER) +#define SB_SVC65_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC66_HANDLER) +#define SB_SVC66_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC67_HANDLER) +#define SB_SVC67_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC68_HANDLER) +#define SB_SVC68_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC69_HANDLER) +#define SB_SVC69_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC70_HANDLER) +#define SB_SVC70_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC71_HANDLER) +#define SB_SVC71_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC72_HANDLER) +#define SB_SVC72_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC73_HANDLER) +#define SB_SVC73_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC74_HANDLER) +#define SB_SVC74_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC75_HANDLER) +#define SB_SVC75_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC76_HANDLER) +#define SB_SVC76_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC77_HANDLER) +#define SB_SVC77_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC78_HANDLER) +#define SB_SVC78_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC79_HANDLER) +#define SB_SVC79_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC80_HANDLER) +#define SB_SVC80_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC81_HANDLER) +#define SB_SVC81_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC82_HANDLER) +#define SB_SVC82_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC83_HANDLER) +#define SB_SVC83_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC84_HANDLER) +#define SB_SVC84_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC85_HANDLER) +#define SB_SVC85_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC86_HANDLER) +#define SB_SVC86_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC87_HANDLER) +#define SB_SVC87_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC88_HANDLER) +#define SB_SVC88_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC89_HANDLER) +#define SB_SVC89_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC90_HANDLER) +#define SB_SVC90_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC91_HANDLER) +#define SB_SVC91_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC92_HANDLER) +#define SB_SVC92_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC93_HANDLER) +#define SB_SVC93_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC94_HANDLER) +#define SB_SVC94_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC95_HANDLER) +#define SB_SVC95_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC96_HANDLER) +#define SB_SVC96_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC97_HANDLER) +#define SB_SVC97_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC98_HANDLER) +#define SB_SVC98_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC99_HANDLER) +#define SB_SVC99_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC100_HANDLER) +#define SB_SVC100_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC101_HANDLER) +#define SB_SVC101_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC102_HANDLER) +#define SB_SVC102_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC103_HANDLER) +#define SB_SVC103_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC104_HANDLER) +#define SB_SVC104_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC105_HANDLER) +#define SB_SVC105_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC106_HANDLER) +#define SB_SVC106_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC107_HANDLER) +#define SB_SVC107_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC108_HANDLER) +#define SB_SVC108_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC109_HANDLER) +#define SB_SVC109_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC110_HANDLER) +#define SB_SVC110_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC111_HANDLER) +#define SB_SVC111_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC112_HANDLER) +#define SB_SVC112_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC113_HANDLER) +#define SB_SVC113_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC114_HANDLER) +#define SB_SVC114_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC115_HANDLER) +#define SB_SVC115_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC116_HANDLER) +#define SB_SVC116_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC117_HANDLER) +#define SB_SVC117_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC118_HANDLER) +#define SB_SVC118_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC119_HANDLER) +#define SB_SVC119_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC120_HANDLER) +#define SB_SVC120_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC121_HANDLER) +#define SB_SVC121_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC122_HANDLER) +#define SB_SVC122_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC123_HANDLER) +#define SB_SVC123_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC124_HANDLER) +#define SB_SVC124_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC125_HANDLER) +#define SB_SVC125_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC126_HANDLER) +#define SB_SVC126_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC127_HANDLER) +#define SB_SVC127_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC128_HANDLER) +#define SB_SVC128_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC129_HANDLER) +#define SB_SVC129_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC130_HANDLER) +#define SB_SVC130_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC131_HANDLER) +#define SB_SVC131_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC132_HANDLER) +#define SB_SVC132_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC133_HANDLER) +#define SB_SVC133_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC134_HANDLER) +#define SB_SVC134_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC135_HANDLER) +#define SB_SVC135_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC136_HANDLER) +#define SB_SVC136_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC137_HANDLER) +#define SB_SVC137_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC138_HANDLER) +#define SB_SVC138_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC139_HANDLER) +#define SB_SVC139_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC140_HANDLER) +#define SB_SVC140_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC141_HANDLER) +#define SB_SVC141_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC142_HANDLER) +#define SB_SVC142_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC143_HANDLER) +#define SB_SVC143_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC144_HANDLER) +#define SB_SVC144_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC145_HANDLER) +#define SB_SVC145_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC146_HANDLER) +#define SB_SVC146_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC147_HANDLER) +#define SB_SVC147_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC148_HANDLER) +#define SB_SVC148_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC149_HANDLER) +#define SB_SVC149_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC150_HANDLER) +#define SB_SVC150_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC151_HANDLER) +#define SB_SVC151_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC152_HANDLER) +#define SB_SVC152_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC153_HANDLER) +#define SB_SVC153_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC154_HANDLER) +#define SB_SVC154_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC155_HANDLER) +#define SB_SVC155_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC156_HANDLER) +#define SB_SVC156_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC157_HANDLER) +#define SB_SVC157_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC158_HANDLER) +#define SB_SVC158_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC159_HANDLER) +#define SB_SVC159_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC160_HANDLER) +#define SB_SVC160_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC161_HANDLER) +#define SB_SVC161_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC162_HANDLER) +#define SB_SVC162_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC163_HANDLER) +#define SB_SVC163_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC164_HANDLER) +#define SB_SVC164_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC165_HANDLER) +#define SB_SVC165_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC166_HANDLER) +#define SB_SVC166_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC167_HANDLER) +#define SB_SVC167_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC168_HANDLER) +#define SB_SVC168_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC169_HANDLER) +#define SB_SVC169_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC170_HANDLER) +#define SB_SVC170_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC171_HANDLER) +#define SB_SVC171_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC172_HANDLER) +#define SB_SVC172_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC173_HANDLER) +#define SB_SVC173_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC174_HANDLER) +#define SB_SVC174_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC175_HANDLER) +#define SB_SVC175_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC176_HANDLER) +#define SB_SVC176_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC177_HANDLER) +#define SB_SVC177_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC178_HANDLER) +#define SB_SVC178_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC179_HANDLER) +#define SB_SVC179_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC180_HANDLER) +#define SB_SVC180_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC181_HANDLER) +#define SB_SVC181_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC182_HANDLER) +#define SB_SVC182_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC183_HANDLER) +#define SB_SVC183_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC184_HANDLER) +#define SB_SVC184_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC185_HANDLER) +#define SB_SVC185_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC186_HANDLER) +#define SB_SVC186_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC187_HANDLER) +#define SB_SVC187_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC188_HANDLER) +#define SB_SVC188_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC189_HANDLER) +#define SB_SVC189_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC190_HANDLER) +#define SB_SVC190_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC191_HANDLER) +#define SB_SVC191_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC192_HANDLER) +#define SB_SVC192_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC193_HANDLER) +#define SB_SVC193_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC194_HANDLER) +#define SB_SVC194_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC195_HANDLER) +#define SB_SVC195_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC196_HANDLER) +#define SB_SVC196_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC197_HANDLER) +#define SB_SVC197_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC198_HANDLER) +#define SB_SVC198_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC199_HANDLER) +#define SB_SVC199_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC200_HANDLER) +#define SB_SVC200_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC201_HANDLER) +#define SB_SVC201_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC202_HANDLER) +#define SB_SVC202_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC203_HANDLER) +#define SB_SVC203_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC204_HANDLER) +#define SB_SVC204_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC205_HANDLER) +#define SB_SVC205_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC206_HANDLER) +#define SB_SVC206_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC207_HANDLER) +#define SB_SVC207_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC208_HANDLER) +#define SB_SVC208_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC209_HANDLER) +#define SB_SVC209_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC210_HANDLER) +#define SB_SVC210_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC211_HANDLER) +#define SB_SVC211_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC212_HANDLER) +#define SB_SVC212_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC213_HANDLER) +#define SB_SVC213_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC214_HANDLER) +#define SB_SVC214_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC215_HANDLER) +#define SB_SVC215_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC216_HANDLER) +#define SB_SVC216_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC217_HANDLER) +#define SB_SVC217_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC218_HANDLER) +#define SB_SVC218_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC219_HANDLER) +#define SB_SVC219_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC220_HANDLER) +#define SB_SVC220_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC221_HANDLER) +#define SB_SVC221_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC222_HANDLER) +#define SB_SVC222_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC223_HANDLER) +#define SB_SVC223_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC224_HANDLER) +#define SB_SVC224_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC225_HANDLER) +#define SB_SVC225_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC226_HANDLER) +#define SB_SVC226_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC227_HANDLER) +#define SB_SVC227_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC228_HANDLER) +#define SB_SVC228_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC229_HANDLER) +#define SB_SVC229_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC230_HANDLER) +#define SB_SVC230_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC231_HANDLER) +#define SB_SVC231_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC232_HANDLER) +#define SB_SVC232_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC233_HANDLER) +#define SB_SVC233_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC234_HANDLER) +#define SB_SVC234_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC235_HANDLER) +#define SB_SVC235_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC236_HANDLER) +#define SB_SVC236_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC237_HANDLER) +#define SB_SVC237_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC238_HANDLER) +#define SB_SVC238_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC239_HANDLER) +#define SB_SVC239_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC240_HANDLER) +#define SB_SVC240_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC241_HANDLER) +#define SB_SVC241_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC242_HANDLER) +#define SB_SVC242_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC243_HANDLER) +#define SB_SVC243_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC244_HANDLER) +#define SB_SVC244_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC245_HANDLER) +#define SB_SVC245_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC246_HANDLER) +#define SB_SVC246_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC247_HANDLER) +#define SB_SVC247_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC248_HANDLER) +#define SB_SVC248_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC249_HANDLER) +#define SB_SVC249_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC250_HANDLER) +#define SB_SVC250_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC251_HANDLER) +#define SB_SVC251_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC252_HANDLER) +#define SB_SVC252_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC253_HANDLER) +#define SB_SVC253_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC254_HANDLER) +#define SB_SVC254_HANDLER sb_undef_handler +#endif +#if !defined(SB_SVC255_HANDLER) +#define SB_SVC255_HANDLER sb_undef_handler +#endif + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void port_syscall(struct port_extctx *ctxp, uint32_t n); + void sbStart(const sb_header_t *sbhp, + const sb_regions_t *rp); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* SBHOST_H */ + +/** @} */ diff --git a/os/sb/user/sbuser.c b/os/sb/user/sbuser.c new file mode 100644 index 000000000..fc0dbc6de --- /dev/null +++ b/os/sb/user/sbuser.c @@ -0,0 +1,57 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbuser.c + * @brief ARMv7-M sandbox user API code. + * + * @addtogroup ARMV7M_SANDBOX_API + * @{ + */ + +#include +#include + +#include "sbuser.h" + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +/** @} */ diff --git a/os/sb/user/sbuser.h b/os/sb/user/sbuser.h new file mode 100644 index 000000000..b773fca25 --- /dev/null +++ b/os/sb/user/sbuser.h @@ -0,0 +1,143 @@ +/* + ChibiOS - Copyright (C) 2006..2019 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file sb/sbapi.h + * @brief ARMv7-M sandbox user API macros and structures. + * + * @addtogroup ARMV7M_SANDBOX_USERAPI + * @{ + */ + +#ifndef SBUSER_H +#define SBUSER_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of system time counter. + */ +typedef uint32_t sb_systime_t; + +/** + * @brief Type of a message. + */ +typedef uint32_t sb_msg_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/** + * @name SVC instruction wrappers. + * + * @{ + */ +#define __syscall0(x) \ + asm volatile ("svc " #x : : : "memory") + +#define __syscall0r(x) \ + register uint32_t r0 asm ("r0"); \ + asm volatile ("svc " #x : "=r" (r0) : : "memory") + +#define __syscall1r(x, p1) \ + register uint32_t r0 asm ("r0") = (uint32_t)(p1); \ + asm volatile ("svc " #x : "=r" (r0) : "r" (r0) : "memory") + +#define __syscall2r(x, p1, p2) \ + register uint32_t r0 asm ("r0") = (uint32_t)(p1); \ + register uint32_t r1 asm ("r1") = (uint32_t)(p2); \ + asm volatile ("svc " #x : "=r" (r0) : "r" (r0), "r" (r1) : "memory") + +#define __syscall3r(x, p1, p2, p3) \ + register uint32_t r0 asm ("r0") = (uint32_t)(p1); \ + register uint32_t r1 asm ("r1") = (uint32_t)(p2); \ + register uint32_t r2 asm ("r2") = (uint32_t)(p3); \ + asm volatile ("svc " #x : "=r" (r0) : "r" (r0), "r" (r1), \ + "r" (r2) : "memory") + +#define __syscall4r(x, p1, p2, p3, p4) \ + register uint32_t r0 asm ("r0") = (uint32_t)(p1); \ + register uint32_t r1 asm ("r1") = (uint32_t)(p2); \ + register uint32_t r2 asm ("r2") = (uint32_t)(p3); \ + register uint32_t r3 asm ("r3") = (uint32_t)(p4); \ + asm volatile ("svc " #x : "=r" (r0) : "r" (r0), "r" (r1), \ + "r" (r2), "r" (r3) : "memory") +/** @} */ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +static inline void sbExit(sb_msg_t msg) { + + __syscall1r(1, msg); +} + +static inline sb_systime_t sbGetSystemTime(void) { + + __syscall0r(2); + return (sb_systime_t)r0; +} + +static inline uint32_t sbGetFrequency(void) { + + __syscall0r(3); + return (uint32_t)r0; +} + +static inline void sbSleepMilliseconds(uint32_t milliseconds) { + + __syscall1r(4, milliseconds); +} + +static inline void sbSleepUntil(sb_systime_t start, sb_systime_t end) { + + __syscall2r(5, start, end); +} + +#endif /* SBUSER_H */ + +/** @} */ diff --git a/os/sb/user/sbuser.mk b/os/sb/user/sbuser.mk new file mode 100644 index 000000000..4ac88d8ec --- /dev/null +++ b/os/sb/user/sbuser.mk @@ -0,0 +1,11 @@ +# List of the ChibiOS ARMv7-M sandbox user files. +SBUSERSRC = $(CHIBIOS)/os/sb/user/sbuser.c + +SBUSERASM = + +SBUSERINC = $(CHIBIOS)/os/sb/user + +# Shared variables +ALLXASMSRC += $(SBUSERASM) +ALLCSRC += $(SBUSERSRC) +ALLINC += $(SBUSERINC)