Added sandbox alarms API.
@@ -46,6 +46,13 @@ | ||
46 | 46 | #endif |
47 | 47 | |
48 | 48 | /** |
49 | + * @brief Virtual IRQ to be used for alarm. | |
50 | + */ | |
51 | +#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__) | |
52 | +#define SB_CFG_ALARM_VRQ 0 | |
53 | +#endif | |
54 | + | |
55 | +/** | |
49 | 56 | * @brief Enables Posix API in sandboxes using VFS. |
50 | 57 | */ |
51 | 58 | #if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__) |
@@ -46,6 +46,13 @@ | ||
46 | 46 | #endif |
47 | 47 | |
48 | 48 | /** |
49 | + * @brief Virtual IRQ to be used for alarm. | |
50 | + */ | |
51 | +#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__) | |
52 | +#define SB_CFG_ALARM_VRQ 0 | |
53 | +#endif | |
54 | + | |
55 | +/** | |
49 | 56 | * @brief Enables Posix API in sandboxes using VFS. |
50 | 57 | */ |
51 | 58 | #if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__) |
@@ -46,6 +46,13 @@ | ||
46 | 46 | #endif |
47 | 47 | |
48 | 48 | /** |
49 | + * @brief Virtual IRQ to be used for alarm. | |
50 | + */ | |
51 | +#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__) | |
52 | +#define SB_CFG_ALARM_VRQ 0 | |
53 | +#endif | |
54 | + | |
55 | +/** | |
49 | 56 | * @brief Enables Posix API in sandboxes using VFS. |
50 | 57 | */ |
51 | 58 | #if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__) |
@@ -46,6 +46,13 @@ | ||
46 | 46 | #endif |
47 | 47 | |
48 | 48 | /** |
49 | + * @brief Virtual IRQ to be used for alarm. | |
50 | + */ | |
51 | +#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__) | |
52 | +#define SB_CFG_ALARM_VRQ 0 | |
53 | +#endif | |
54 | + | |
55 | +/** | |
49 | 56 | * @brief Enables Posix API in sandboxes using VFS. |
50 | 57 | */ |
51 | 58 | #if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__) |
@@ -49,6 +49,8 @@ | ||
49 | 49 | #define SB_SYSC_EVENT_WAIT_ALL 10 |
50 | 50 | #define SB_SYSC_EVENT_BROADCAST 11 |
51 | 51 | #define SB_SYSC_LOADELF 12 |
52 | +#define SB_SYSC_VRQ_SET_ALARM 245 | |
53 | +#define SB_SYSC_VRQ_RESET_ALARM 246 | |
52 | 54 | #define SB_SYSC_VRQ_WAIT 247 |
53 | 55 | #define SB_SYSC_VRQ_SETWT 248 |
54 | 56 | #define SB_SYSC_VRQ_CLRWT 249 |
@@ -100,6 +100,10 @@ | ||
100 | 100 | #error "SB_CFG_ENABLE_VRQ not defined in sbconf.h" |
101 | 101 | #endif |
102 | 102 | |
103 | +#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__) | |
104 | +#error "SB_CFG_ALARM_VRQ not defined in sbconf.h" | |
105 | +#endif | |
106 | + | |
103 | 107 | #if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__) |
104 | 108 | #error "SB_CFG_ENABLE_VFS not defined in sbconf.h" |
105 | 109 | #endif |
@@ -152,6 +156,10 @@ | ||
152 | 156 | #error "SB_CFG_NUM_REGIONS not matching PORT_SWITCHED_REGIONS_NUMBER" |
153 | 157 | #endif |
154 | 158 | |
159 | +#if (SB_CFG_ALARM_VRQ < 0) || (SB_CFG_ALARM_VRQ > 31) | |
160 | +#error "invalid SB_CFG_ALARM_VRQ value" | |
161 | +#endif | |
162 | + | |
155 | 163 | /*===========================================================================*/ |
156 | 164 | /* Module data structures and types. */ |
157 | 165 | /*===========================================================================*/ |
@@ -255,6 +263,10 @@ | ||
255 | 263 | * @brief Pointer to the image header. |
256 | 264 | */ |
257 | 265 | const sb_header_t *sbhp; |
266 | + /** | |
267 | + * @brief Virtual timer used for alarms. | |
268 | + */ | |
269 | + virtual_timer_t alarm_vt; | |
258 | 270 | #if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__) |
259 | 271 | /** |
260 | 272 | * @brief Thread sending a message to the sandbox. |
@@ -76,6 +76,8 @@ | ||
76 | 76 | * @{ |
77 | 77 | */ |
78 | 78 | #if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__) |
79 | +#define SB_SVC245_HANDLER sb_api_vrq_set_alarm | |
80 | +#define SB_SVC246_HANDLER sb_api_vrq_reset_alarm | |
79 | 81 | #define SB_SVC247_HANDLER sb_api_vrq_wait |
80 | 82 | #define SB_SVC248_HANDLER sb_api_vrq_setwt |
81 | 83 | #define SB_SVC249_HANDLER sb_api_vrq_clrwt |
@@ -101,6 +101,14 @@ | ||
101 | 101 | } |
102 | 102 | } |
103 | 103 | |
104 | +static void delay_cb(virtual_timer_t *vtp, void *arg) { | |
105 | + sb_class_t *sbp = (sb_class_t *)arg; | |
106 | + | |
107 | + (void)vtp; | |
108 | + | |
109 | + sbVRQTriggerFromISR(sbp, 1U << SB_CFG_ALARM_VRQ); | |
110 | +} | |
111 | + | |
104 | 112 | /*===========================================================================*/ |
105 | 113 | /* Module exported functions. */ |
106 | 114 | /*===========================================================================*/ |
@@ -235,6 +243,31 @@ | ||
235 | 243 | return; |
236 | 244 | } |
237 | 245 | |
246 | +void sb_api_vrq_set_alarm(struct port_extctx *ectxp) { | |
247 | + sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; | |
248 | + sysinterval_t interval = (sysinterval_t )ectxp->r0; | |
249 | + bool continuous = (bool)ectxp->r1; | |
250 | + | |
251 | + if (continuous) { | |
252 | + chVTSetContinuous(&sbp->alarm_vt, interval, delay_cb, (void *)sbp); | |
253 | + } | |
254 | + else { | |
255 | + chVTSet(&sbp->alarm_vt, interval, delay_cb, (void *)sbp); | |
256 | + } | |
257 | + | |
258 | + ectxp->r0 = CH_RET_SUCCESS; | |
259 | +} | |
260 | + | |
261 | +void sb_api_vrq_reset_alarm(struct port_extctx *ectxp) { | |
262 | + sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; | |
263 | + | |
264 | + (void)ectxp; | |
265 | + | |
266 | + chVTReset(&sbp->alarm_vt); | |
267 | + | |
268 | + ectxp->r0 = CH_RET_SUCCESS; | |
269 | +} | |
270 | + | |
238 | 271 | void sb_api_vrq_wait(struct port_extctx *ectxp) { |
239 | 272 | sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; |
240 | 273 | sb_vrqmask_t active_mask; |
@@ -249,6 +282,8 @@ | ||
249 | 282 | } |
250 | 283 | |
251 | 284 | chSysUnlock(); |
285 | + | |
286 | + ectxp->r0 = CH_RET_SUCCESS; | |
252 | 287 | } |
253 | 288 | |
254 | 289 | void sb_api_vrq_setwt(struct port_extctx *ectxp) { |
@@ -66,6 +66,8 @@ | ||
66 | 66 | #endif |
67 | 67 | void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask); |
68 | 68 | void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask); |
69 | + void sb_api_vrq_set_alarm(struct port_extctx *ectxp); | |
70 | + void sb_api_vrq_reset_alarm(struct port_extctx *ectxp); | |
69 | 71 | void sb_api_vrq_wait(struct port_extctx *ectxp); |
70 | 72 | void sb_api_vrq_setwt(struct port_extctx *ectxp); |
71 | 73 | void sb_api_vrq_clrwt(struct port_extctx *ectxp); |