Added sandbox alarms API.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15634 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-05-24 09:44:53 +00:00
parent 7c95ab1e9e
commit 3e910146e9
9 changed files with 81 additions and 0 deletions

View File

@ -45,6 +45,13 @@
#define SB_CFG_ENABLE_VRQ TRUE #define SB_CFG_ENABLE_VRQ TRUE
#endif #endif
/**
* @brief Virtual IRQ to be used for alarm.
*/
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ALARM_VRQ 0
#endif
/** /**
* @brief Enables Posix API in sandboxes using VFS. * @brief Enables Posix API in sandboxes using VFS.
*/ */

View File

@ -45,6 +45,13 @@
#define SB_CFG_ENABLE_VRQ TRUE #define SB_CFG_ENABLE_VRQ TRUE
#endif #endif
/**
* @brief Virtual IRQ to be used for alarm.
*/
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ALARM_VRQ 0
#endif
/** /**
* @brief Enables Posix API in sandboxes using VFS. * @brief Enables Posix API in sandboxes using VFS.
*/ */

View File

@ -45,6 +45,13 @@
#define SB_CFG_ENABLE_VRQ TRUE #define SB_CFG_ENABLE_VRQ TRUE
#endif #endif
/**
* @brief Virtual IRQ to be used for alarm.
*/
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ALARM_VRQ 0
#endif
/** /**
* @brief Enables Posix API in sandboxes using VFS. * @brief Enables Posix API in sandboxes using VFS.
*/ */

View File

@ -45,6 +45,13 @@
#define SB_CFG_ENABLE_VRQ TRUE #define SB_CFG_ENABLE_VRQ TRUE
#endif #endif
/**
* @brief Virtual IRQ to be used for alarm.
*/
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
#define SB_CFG_ALARM_VRQ 0
#endif
/** /**
* @brief Enables Posix API in sandboxes using VFS. * @brief Enables Posix API in sandboxes using VFS.
*/ */

View File

@ -49,6 +49,8 @@
#define SB_SYSC_EVENT_WAIT_ALL 10 #define SB_SYSC_EVENT_WAIT_ALL 10
#define SB_SYSC_EVENT_BROADCAST 11 #define SB_SYSC_EVENT_BROADCAST 11
#define SB_SYSC_LOADELF 12 #define SB_SYSC_LOADELF 12
#define SB_SYSC_VRQ_SET_ALARM 245
#define SB_SYSC_VRQ_RESET_ALARM 246
#define SB_SYSC_VRQ_WAIT 247 #define SB_SYSC_VRQ_WAIT 247
#define SB_SYSC_VRQ_SETWT 248 #define SB_SYSC_VRQ_SETWT 248
#define SB_SYSC_VRQ_CLRWT 249 #define SB_SYSC_VRQ_CLRWT 249

View File

@ -100,6 +100,10 @@
#error "SB_CFG_ENABLE_VRQ not defined in sbconf.h" #error "SB_CFG_ENABLE_VRQ not defined in sbconf.h"
#endif #endif
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
#error "SB_CFG_ALARM_VRQ not defined in sbconf.h"
#endif
#if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__) #if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__)
#error "SB_CFG_ENABLE_VFS not defined in sbconf.h" #error "SB_CFG_ENABLE_VFS not defined in sbconf.h"
#endif #endif
@ -152,6 +156,10 @@
#error "SB_CFG_NUM_REGIONS not matching PORT_SWITCHED_REGIONS_NUMBER" #error "SB_CFG_NUM_REGIONS not matching PORT_SWITCHED_REGIONS_NUMBER"
#endif #endif
#if (SB_CFG_ALARM_VRQ < 0) || (SB_CFG_ALARM_VRQ > 31)
#error "invalid SB_CFG_ALARM_VRQ value"
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Module data structures and types. */ /* Module data structures and types. */
/*===========================================================================*/ /*===========================================================================*/
@ -255,6 +263,10 @@ typedef struct {
* @brief Pointer to the image header. * @brief Pointer to the image header.
*/ */
const sb_header_t *sbhp; const sb_header_t *sbhp;
/**
* @brief Virtual timer used for alarms.
*/
virtual_timer_t alarm_vt;
#if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__) #if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__)
/** /**
* @brief Thread sending a message to the sandbox. * @brief Thread sending a message to the sandbox.

View File

@ -76,6 +76,8 @@ static void sb_api_loadelf(struct port_extctx *ectxp);
* @{ * @{
*/ */
#if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__) #if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__)
#define SB_SVC245_HANDLER sb_api_vrq_set_alarm
#define SB_SVC246_HANDLER sb_api_vrq_reset_alarm
#define SB_SVC247_HANDLER sb_api_vrq_wait #define SB_SVC247_HANDLER sb_api_vrq_wait
#define SB_SVC248_HANDLER sb_api_vrq_setwt #define SB_SVC248_HANDLER sb_api_vrq_setwt
#define SB_SVC249_HANDLER sb_api_vrq_clrwt #define SB_SVC249_HANDLER sb_api_vrq_clrwt

View File

@ -101,6 +101,14 @@ static void vrq_privileged_code(void) {
} }
} }
static void delay_cb(virtual_timer_t *vtp, void *arg) {
sb_class_t *sbp = (sb_class_t *)arg;
(void)vtp;
sbVRQTriggerFromISR(sbp, 1U << SB_CFG_ALARM_VRQ);
}
/*===========================================================================*/ /*===========================================================================*/
/* Module exported functions. */ /* Module exported functions. */
/*===========================================================================*/ /*===========================================================================*/
@ -235,6 +243,31 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
return; return;
} }
void sb_api_vrq_set_alarm(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
sysinterval_t interval = (sysinterval_t )ectxp->r0;
bool continuous = (bool)ectxp->r1;
if (continuous) {
chVTSetContinuous(&sbp->alarm_vt, interval, delay_cb, (void *)sbp);
}
else {
chVTSet(&sbp->alarm_vt, interval, delay_cb, (void *)sbp);
}
ectxp->r0 = CH_RET_SUCCESS;
}
void sb_api_vrq_reset_alarm(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
(void)ectxp;
chVTReset(&sbp->alarm_vt);
ectxp->r0 = CH_RET_SUCCESS;
}
void sb_api_vrq_wait(struct port_extctx *ectxp) { void sb_api_vrq_wait(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
sb_vrqmask_t active_mask; sb_vrqmask_t active_mask;
@ -249,6 +282,8 @@ void sb_api_vrq_wait(struct port_extctx *ectxp) {
} }
chSysUnlock(); chSysUnlock();
ectxp->r0 = CH_RET_SUCCESS;
} }
void sb_api_vrq_setwt(struct port_extctx *ectxp) { void sb_api_vrq_setwt(struct port_extctx *ectxp) {

View File

@ -66,6 +66,8 @@ extern "C" {
#endif #endif
void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask); void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask);
void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask); void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask);
void sb_api_vrq_set_alarm(struct port_extctx *ectxp);
void sb_api_vrq_reset_alarm(struct port_extctx *ectxp);
void sb_api_vrq_wait(struct port_extctx *ectxp); void sb_api_vrq_wait(struct port_extctx *ectxp);
void sb_api_vrq_setwt(struct port_extctx *ectxp); void sb_api_vrq_setwt(struct port_extctx *ectxp);
void sb_api_vrq_clrwt(struct port_extctx *ectxp); void sb_api_vrq_clrwt(struct port_extctx *ectxp);