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:
parent
629e810f65
commit
0882a9fa97
|
@ -49,9 +49,18 @@
|
||||||
/* Module local functions. */
|
/* 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,
|
__STATIC_FORCEINLINE void vrq_makectx(sb_class_t *sbp,
|
||||||
struct port_extctx *newctxp,
|
struct port_extctx *newctxp,
|
||||||
uint32_t active_mask) {
|
sb_vrqmask_t active_mask) {
|
||||||
uint32_t irqn = __CLZ(__RBIT(active_mask));
|
uint32_t irqn = __CLZ(__RBIT(active_mask));
|
||||||
sbp->vrq_wtmask &= ~(1U << irqn);
|
sbp->vrq_wtmask &= ~(1U << irqn);
|
||||||
|
|
||||||
|
@ -67,36 +76,25 @@ __STATIC_FORCEINLINE void vrq_makectx(sb_class_t *sbp,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
static struct port_extctx * vrq_pushctx(sb_class_t *sbp,
|
||||||
static void vrq_check_trigger_s(sb_class_t *sbp, struct port_extctx *ectxp) {
|
struct port_extctx *ectxp,
|
||||||
sb_vrqmask_t active_mask = sbp->vrq_wtmask & sbp->vrq_enmask;
|
sb_vrqmask_t active_mask) {
|
||||||
|
|
||||||
if (active_mask != 0U) {
|
/* Checking if the new frame is within the sandbox else failure.*/
|
||||||
/* Creating a context for return.*/
|
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--;
|
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);
|
vrq_makectx(sbp, ectxp, active_mask);
|
||||||
__port_syscall_set_u_psp(sbp->tp, ectxp);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
return ectxp;
|
||||||
* @brief Used as a known privileged address.
|
|
||||||
*/
|
|
||||||
static void vrq_privileged_code(void) {
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delay_cb(virtual_timer_t *vtp, void *arg) {
|
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.*/
|
/* Getting the current PSP, it is U_PSP.*/
|
||||||
ectxp = (struct port_extctx *)__get_PSP();
|
ectxp = (struct port_extctx *)__get_PSP();
|
||||||
|
|
||||||
/* Checking if the new frame is within the sandbox else failure.*/
|
/* Creating a return context.*/
|
||||||
if (!sb_is_valid_write_range(sbp,
|
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
|
||||||
(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);
|
|
||||||
|
|
||||||
__set_PSP((uint32_t)ectxp);
|
__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.*/
|
/* Getting the current PSP, it is U_PSP.*/
|
||||||
ectxp = (struct port_extctx *)__get_PSP();
|
ectxp = (struct port_extctx *)__get_PSP();
|
||||||
|
|
||||||
/* Checking if the new frame is within the sandbox else failure.*/
|
/* Creating a return context.*/
|
||||||
if (!sb_is_valid_write_range(sbp,
|
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
|
||||||
(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);
|
|
||||||
|
|
||||||
|
/* Updating PSP position.*/
|
||||||
__set_PSP((uint32_t)ectxp);
|
__set_PSP((uint32_t)ectxp);
|
||||||
}
|
}
|
||||||
else {
|
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.*/
|
/* Getting the current PSP, it is stored in the thread context.*/
|
||||||
ectxp = (struct port_extctx *)sbp->tp->ctx.syscall.u_psp;
|
ectxp = (struct port_extctx *)sbp->tp->ctx.syscall.u_psp;
|
||||||
|
|
||||||
/* Checking if the new frame is within the sandbox else failure.*/
|
/* Creating a return context.*/
|
||||||
if (!sb_is_valid_write_range(sbp,
|
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
|
||||||
(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);
|
|
||||||
|
|
||||||
|
/* Updating stored PSP position.*/
|
||||||
sbp->tp->ctx.syscall.u_psp = (uint32_t)ectxp;
|
sbp->tp->ctx.syscall.u_psp = (uint32_t)ectxp;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -421,20 +384,8 @@ void __port_do_syscall_return(void) {
|
||||||
active_mask = sbp->vrq_wtmask & sbp->vrq_enmask;
|
active_mask = sbp->vrq_wtmask & sbp->vrq_enmask;
|
||||||
if (active_mask != 0U) {
|
if (active_mask != 0U) {
|
||||||
|
|
||||||
/* Checking if there is space in the sandbox for a new frame,
|
/* Creating a return context.*/
|
||||||
else enforcing a sandbox failure.*/
|
ectxp = vrq_pushctx(sbp, ectxp, active_mask);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue