VRQ optimization, better benchmarks, more to do.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15767 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-09-06 14:22:56 +00:00
parent 629e810f65
commit 0882a9fa97
1 changed files with 34 additions and 83 deletions

View File

@ -49,9 +49,18 @@
/* Module local functions. */
/*===========================================================================*/
/**
* @brief Used as a known privileged address.
*/
static void vrq_privileged_code(void) {
while (true) {
}
}
__STATIC_FORCEINLINE void vrq_makectx(sb_class_t *sbp,
struct port_extctx *newctxp,
uint32_t active_mask) {
sb_vrqmask_t active_mask) {
uint32_t irqn = __CLZ(__RBIT(active_mask));
sbp->vrq_wtmask &= ~(1U << irqn);
@ -67,36 +76,25 @@ __STATIC_FORCEINLINE void vrq_makectx(sb_class_t *sbp,
#endif
}
#if 0
static void vrq_check_trigger_s(sb_class_t *sbp, struct port_extctx *ectxp) {
sb_vrqmask_t active_mask = sbp->vrq_wtmask & sbp->vrq_enmask;
static struct port_extctx * vrq_pushctx(sb_class_t *sbp,
struct port_extctx *ectxp,
sb_vrqmask_t active_mask) {
if (active_mask != 0U) {
/* Creating a context for return.*/
/* Checking if the new frame is within the sandbox else failure.*/
if (!sb_is_valid_write_range(sbp,
(void *)(ectxp - 1),
sizeof (struct port_extctx))) {
/* Making the sandbox return on a privileged address, this
will cause a fault and sandbox termination.*/
ectxp->pc = (uint32_t)vrq_privileged_code;
}
else {
/* Creating a new context for return the VRQ handler.*/
ectxp--;
/* Checking if the new frame is within the sandbox else failure.*/
if (!sb_is_valid_write_range(sbp,
(void *)ectxp,
sizeof (struct port_extctx))) {
chSysUnlock();
__sb_abort(CH_RET_EFAULT);
}
/* Building the return context.*/
vrq_makectx(sbp, ectxp, active_mask);
__port_syscall_set_u_psp(sbp->tp, ectxp);
}
}
#endif
/**
* @brief Used as a known privileged address.
*/
static void vrq_privileged_code(void) {
while (true) {
}
return ectxp;
}
static void delay_cb(virtual_timer_t *vtp, void *arg) {
@ -142,23 +140,10 @@ void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask) {
/* Getting the current PSP, it is U_PSP.*/
ectxp = (struct port_extctx *)__get_PSP();
/* Checking if the new frame is within the sandbox else failure.*/
if (!sb_is_valid_write_range(sbp,
(void *)(ectxp - 1),
sizeof (struct port_extctx))) {
/* Making the sandbox return on a privileged address, this
will cause a fault and sandbox termination.*/
chSysUnlockFromISR();
ectxp->pc = (uint32_t)vrq_privileged_code;
return;
}
/* Creating a new context for return the VRQ handler.*/
ectxp--;
vrq_makectx(sbp, ectxp, active_mask);
/* Creating a return context.*/
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
__set_PSP((uint32_t)ectxp);
}
}
}
@ -204,21 +189,10 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
/* Getting the current PSP, it is U_PSP.*/
ectxp = (struct port_extctx *)__get_PSP();
/* Checking if the new frame is within the sandbox else failure.*/
if (!sb_is_valid_write_range(sbp,
(void *)(ectxp - 1),
sizeof (struct port_extctx))) {
/* Making the sandbox return on a privileged address, this
will cause a fault and sandbox termination.*/
chSysUnlockFromISR();
ectxp->pc = (uint32_t)vrq_privileged_code;
return;
}
/* Creating a new context for return the VRQ handler.*/
ectxp--;
vrq_makectx(sbp, ectxp, active_mask);
/* Creating a return context.*/
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
/* Updating PSP position.*/
__set_PSP((uint32_t)ectxp);
}
else {
@ -238,21 +212,10 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
/* Getting the current PSP, it is stored in the thread context.*/
ectxp = (struct port_extctx *)sbp->tp->ctx.syscall.u_psp;
/* Checking if the new frame is within the sandbox else failure.*/
if (!sb_is_valid_write_range(sbp,
(void *)(ectxp - 1),
sizeof (struct port_extctx))) {
/* Making the sandbox return on a privileged address, this
will cause a fault and sandbox termination.*/
chSysUnlockFromISR();
ectxp->pc = (uint32_t)vrq_privileged_code;
return;
}
/* Creating a new context for return the VRQ handler.*/
ectxp--;
vrq_makectx(sbp, ectxp, active_mask);
/* Creating a return context.*/
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
/* Updating stored PSP position.*/
sbp->tp->ctx.syscall.u_psp = (uint32_t)ectxp;
}
else {
@ -421,20 +384,8 @@ void __port_do_syscall_return(void) {
active_mask = sbp->vrq_wtmask & sbp->vrq_enmask;
if (active_mask != 0U) {
/* Checking if there is space in the sandbox for a new frame,
else enforcing a sandbox failure.*/
if (!sb_is_valid_write_range(sbp,
(void *)(ectxp - 1),
sizeof (struct port_extctx))) {
/* Making the sandbox return on a privileged address, this
will cause a fault and sandbox termination.*/
ectxp->pc = (uint32_t)vrq_privileged_code;
}
else {
/* Creating a new context for return the VRQ handler.*/
ectxp--;
vrq_makectx(sbp, ectxp, active_mask);
}
/* Creating a return context.*/
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
}
}