Preparation for SB Virtual IRQs. Removed some obsolete code from SBs.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15618 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-04-30 09:57:04 +00:00
parent 37b30694bf
commit 9484875fef
10 changed files with 216 additions and 86 deletions

View File

@ -38,6 +38,13 @@
#define SB_CFG_NUM_REGIONS 2
#endif
/**
* @brief Enables support for sandbox Virtual IRQs.
*/
#if !defined(SB_CFG_ENABLE_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ENABLE_VRQ TRUE
#endif
/**
* @brief Enables Posix API in sandboxes using VFS.
*/

View File

@ -38,6 +38,13 @@
#define SB_CFG_NUM_REGIONS 2
#endif
/**
* @brief Enables support for sandbox Virtual IRQs.
*/
#if !defined(SB_CFG_ENABLE_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ENABLE_VRQ TRUE
#endif
/**
* @brief Enables Posix API in sandboxes using VFS.
*/

View File

@ -38,6 +38,13 @@
#define SB_CFG_NUM_REGIONS 2
#endif
/**
* @brief Enables support for sandbox Virtual IRQs.
*/
#if !defined(SB_CFG_ENABLE_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ENABLE_VRQ TRUE
#endif
/**
* @brief Enables Posix API in sandboxes using VFS.
*/

View File

@ -38,6 +38,13 @@
#define SB_CFG_NUM_REGIONS 2
#endif
/**
* @brief Enables support for sandbox Virtual IRQs.
*/
#if !defined(SB_CFG_ENABLE_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ENABLE_VRQ TRUE
#endif
/**
* @brief Enables Posix API in sandboxes using VFS.
*/

View File

@ -1,6 +1,7 @@
# List of the ChibiOS ARMv7-M sandbox host files.
SBHOSTSRC = $(CHIBIOS)/os/sb/host/sbhost.c \
$(CHIBIOS)/os/sb/host/sbapi.c \
$(CHIBIOS)/os/sb/host/sbvrq.c \
$(CHIBIOS)/os/sb/host/sbelf.c \
$(CHIBIOS)/os/sb/host/sbposix.c

View File

@ -94,6 +94,10 @@
#error "SB_CFG_NUM_REGIONS not defined in sbconf.h"
#endif
#if !defined(SB_CFG_ENABLE_VRQ) || defined(__DOXYGEN__)
#error "SB_CFG_ENABLE_VRQ not defined in sbconf.h"
#endif
#if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__)
#error "SB_CFG_ENABLE_VFS not defined in sbconf.h"
#endif
@ -281,6 +285,7 @@ extern "C" {
/*===========================================================================*/
#include "sbsysc.h"
#include "sbvrq.h"
#include "sbelf.h"
#include "sbposix.h"
#include "sbapi.h"

View File

@ -36,6 +36,20 @@
/* Module local definitions. */
/*===========================================================================*/
static void sb_api_stdio(struct port_extctx *ectxp);
static void sb_api_exit(struct port_extctx *ctxp);
static void sb_api_get_systime(struct port_extctx *ctxp);
static void sb_api_get_frequency(struct port_extctx *ctxp);
static void sb_api_sleep(struct port_extctx *ctxp);
static void sb_api_sleep_until_windowed(struct port_extctx *ctxp);
static void sb_api_wait_message(struct port_extctx *ctxp);
static void sb_api_reply_message(struct port_extctx *ctxp);
static void sb_api_wait_one_timeout(struct port_extctx *ctxp);
static void sb_api_wait_any_timeout(struct port_extctx *ctxp);
static void sb_api_wait_all_timeout(struct port_extctx *ctxp);
static void sb_api_broadcast_flags(struct port_extctx *ctxp);
static void sb_api_loadelf(struct port_extctx *ectxp);
/**
* @name Standard API handlers
* @{
@ -960,26 +974,8 @@ static void sb_cleanup(void) {
#endif
}
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
void __sb_abort(msg_t msg) {
chSysUnlock();
sb_cleanup();
chSysLock();
#if CH_CFG_USE_EVENTS == TRUE
chEvtBroadcastI(&sb.termination_es);
#endif
chThdExitS(msg);
chSysHalt("zombies");
}
#if (SB_CFG_ENABLE_VFS == TRUE) || defined(__DOXYGEN__)
void sb_api_stdio(struct port_extctx *ectxp) {
static void sb_api_stdio(struct port_extctx *ectxp) {
switch (ectxp->r0) {
case SB_POSIX_OPEN:
@ -1052,7 +1048,7 @@ void sb_api_stdio(struct port_extctx *ectxp) {
}
#endif /* SB_CFG_ENABLE_VFS == TRUE */
void sb_api_exit(struct port_extctx *ectxp) {
static void sb_api_exit(struct port_extctx *ectxp) {
sb_cleanup();
@ -1067,17 +1063,17 @@ void sb_api_exit(struct port_extctx *ectxp) {
ectxp->r0 = CH_RET_ENOSYS;
}
void sb_api_get_systime(struct port_extctx *ectxp) {
static void sb_api_get_systime(struct port_extctx *ectxp) {
ectxp->r0 = (uint32_t)chVTGetSystemTimeX();
}
void sb_api_get_frequency(struct port_extctx *ectxp) {
static void sb_api_get_frequency(struct port_extctx *ectxp) {
ectxp->r0 = (uint32_t)CH_CFG_ST_FREQUENCY;
}
void sb_api_sleep(struct port_extctx *ectxp) {
static void sb_api_sleep(struct port_extctx *ectxp) {
sysinterval_t interval = (sysinterval_t )ectxp->r0;
if (interval != TIME_IMMEDIATE) {
@ -1087,14 +1083,14 @@ void sb_api_sleep(struct port_extctx *ectxp) {
ectxp->r0 = CH_RET_SUCCESS;
}
void sb_api_sleep_until_windowed(struct port_extctx *ectxp) {
static void sb_api_sleep_until_windowed(struct port_extctx *ectxp) {
chThdSleepUntilWindowed((systime_t )ectxp->r0, (systime_t )ectxp->r1);
ectxp->r0 = CH_RET_SUCCESS;
}
void sb_api_wait_message(struct port_extctx *ectxp) {
static void sb_api_wait_message(struct port_extctx *ectxp) {
#if CH_CFG_USE_MESSAGES == TRUE
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
@ -1117,7 +1113,7 @@ void sb_api_wait_message(struct port_extctx *ectxp) {
#endif
}
void sb_api_reply_message(struct port_extctx *ectxp) {
static void sb_api_reply_message(struct port_extctx *ectxp) {
#if CH_CFG_USE_MESSAGES == TRUE
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
@ -1139,7 +1135,7 @@ void sb_api_reply_message(struct port_extctx *ectxp) {
#endif
}
void sb_api_wait_one_timeout(struct port_extctx *ectxp) {
static void sb_api_wait_one_timeout(struct port_extctx *ectxp) {
#if CH_CFG_USE_EVENTS == TRUE
ectxp->r0 = (uint32_t)chEvtWaitOneTimeout((eventmask_t )ectxp->r0,
@ -1149,7 +1145,7 @@ void sb_api_wait_one_timeout(struct port_extctx *ectxp) {
#endif
}
void sb_api_wait_any_timeout(struct port_extctx *ectxp) {
static void sb_api_wait_any_timeout(struct port_extctx *ectxp) {
#if CH_CFG_USE_EVENTS == TRUE
ectxp->r0 = (uint32_t)chEvtWaitAnyTimeout((eventmask_t )ectxp->r0,
@ -1159,7 +1155,7 @@ void sb_api_wait_any_timeout(struct port_extctx *ectxp) {
#endif
}
void sb_api_wait_all_timeout(struct port_extctx *ectxp) {
static void sb_api_wait_all_timeout(struct port_extctx *ectxp) {
#if CH_CFG_USE_EVENTS == TRUE
ectxp->r0 = (uint32_t)chEvtWaitAllTimeout((eventmask_t )ectxp->r0,
@ -1169,7 +1165,7 @@ void sb_api_wait_all_timeout(struct port_extctx *ectxp) {
#endif
}
void sb_api_broadcast_flags(struct port_extctx *ectxp) {
static void sb_api_broadcast_flags(struct port_extctx *ectxp) {
#if CH_CFG_USE_EVENTS == TRUE
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
@ -1180,7 +1176,7 @@ void sb_api_broadcast_flags(struct port_extctx *ectxp) {
#endif
}
void sb_api_loadelf(struct port_extctx *ectxp) {
static void sb_api_loadelf(struct port_extctx *ectxp) {
#if (SB_CFG_ENABLE_VFS == TRUE) || defined(__DOXYGEN__)
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
const char *fname = (const char *)ectxp->r0;
@ -1202,4 +1198,22 @@ void sb_api_loadelf(struct port_extctx *ectxp) {
#endif
}
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
void __sb_abort(msg_t msg) {
chSysUnlock();
sb_cleanup();
chSysLock();
#if CH_CFG_USE_EVENTS == TRUE
chEvtBroadcastI(&sb.termination_es);
#endif
chThdExitS(msg);
chSysHalt("zombies");
}
/** @} */

View File

@ -49,48 +49,6 @@
*/
typedef void (*port_syscall_t)(struct port_extctx *ectx);
/**
* @brief Sandbox Stream interface methods.
* @note Is intentionally compatible with HAL streams but we have to
* duplicate is because we don't want dependencies with HAL in
* this subsystem.
*/
struct SandboxStreamVMT {
/**
* @brief Object instance offset.
*/
size_t instance_offset;
/**
* @brief Stream write buffer method.
*/
size_t (*write)(void *instance, const uint8_t *bp, size_t n);
/**
* @brief Stream read buffer method.
*/
size_t (*read)(void *instance, uint8_t *bp, size_t n);
/**
* @brief Channel put method, blocking.
*/
msg_t (*put)(void *instance, uint8_t b);
/**
* @brief Channel get method, blocking.
*/
msg_t (*get)(void *instance);
};
/**
* @brief Sandbox Stream class.
* @note Is intentionally compatible with HAL streams but we have to
* duplicate is because we don't want dependencies with HAL in
* this subsystem.
*/
typedef struct {
/**
* @brief Virtual Methods Table.
*/
const struct SandboxStreamVMT *vmt;
} SandboxStream;
/*===========================================================================*/
/* Module macros. */
/*===========================================================================*/
@ -102,19 +60,7 @@ typedef struct {
#ifdef __cplusplus
extern "C" {
#endif
void sb_api_stdio(struct port_extctx *ectxp);
void sb_api_exit(struct port_extctx *ctxp);
void sb_api_get_systime(struct port_extctx *ctxp);
void sb_api_get_frequency(struct port_extctx *ctxp);
void sb_api_sleep(struct port_extctx *ctxp);
void sb_api_sleep_until_windowed(struct port_extctx *ctxp);
void sb_api_wait_message(struct port_extctx *ctxp);
void sb_api_reply_message(struct port_extctx *ctxp);
void sb_api_wait_one_timeout(struct port_extctx *ctxp);
void sb_api_wait_any_timeout(struct port_extctx *ctxp);
void sb_api_wait_all_timeout(struct port_extctx *ctxp);
void sb_api_broadcast_flags(struct port_extctx *ctxp);
void sb_api_loadelf(struct port_extctx *ectxp);
#ifdef __cplusplus
}
#endif

58
os/sb/host/sbvrq.c Normal file
View File

@ -0,0 +1,58 @@
/*
ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
2015,2016,2017,2018,2019,2020,2021 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 version 3 of the License.
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 <http://www.gnu.org/licenses/>.
*/
/**
* @file sb/host/sbvrq.c
* @brief ARM SandBox host Virtual IRQs code.
*
* @addtogroup ARM_SANDBOX_VRQ
* @{
*/
#include "sb.h"
#if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Module local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local types. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
#endif /* SB_CFG_ENABLE_VRQ == TRUE */
/** @} */

78
os/sb/host/sbvrq.h Normal file
View File

@ -0,0 +1,78 @@
/*
ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
2015,2016,2017,2018,2019,2020,2021 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 version 3 of the License.
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 <http://www.gnu.org/licenses/>.
*/
/**
* @file sb/host/sbvrq.h
* @brief ARM SandBox host Virtual IRQs macros and structures.
*
* @addtogroup ARM_SANDBOX_HOSTAPI
* @{
*/
#ifndef SBVRQ_H
#define SBVRQ_H
#if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Module constants. */
/*===========================================================================*/
/*===========================================================================*/
/* Module pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Module data structures and types. */
/*===========================================================================*/
/**
* @brief Type of a mask of Virtual IRQs.
*/
typedef uint32_t sb_vrqmask_t;
/*===========================================================================*/
/* Module macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void sbVRQPendI(sb_class_t *sbp, sb_vrqmask_t vmask);
#ifdef __cplusplus
}
#endif
/*===========================================================================*/
/* Module inline functions. */
/*===========================================================================*/
#endif /* SB_CFG_ENABLE_VRQ == TRUE */
#endif /* SBVRQ_H */
/** @} */