SB fastcalls support enabled, much better performance for guest RTOSes.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15769 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-09-07 10:05:15 +00:00
parent c1d2a487bb
commit 940754b2cf
6 changed files with 41 additions and 39 deletions

View File

@ -224,14 +224,14 @@ SVC_Handler:
tst r12, #1
beq frompriv
/* SVC called from non-privileged mode for a syscall.*/
bic r12, #1
msr CONTROL, r12 /* Switching to privileged. */
/* Note, LR already contains the return address.*/
ldr r3, [r2, #24] /* PC position. */
ldrh r0, [r3, #-2] /* SVC opcode. */
and r0, #255
// cmp r0, #0xF0
// bge __port_do_fastcall_entry
cmp r0, #0xF0
bge __port_do_fastcall_entry
bic r12, #1
msr CONTROL, r12 /* Switching to privileged. */
b __port_do_syscall_entry
frompriv:

View File

@ -51,9 +51,9 @@
#define SB_SYSC_LOADELF 12
#define SB_SYSC_VHAL_VGPIO 200
#define SB_SYSC_VHAL_VUART 201
#define SB_SYSC_VRQ_SET_ALARM 245
#define SB_SYSC_VRQ_RESET_ALARM 246
#define SB_SYSC_VRQ_WAIT 247
#define SB_SYSC_VRQ_SET_ALARM 237
#define SB_SYSC_VRQ_RESET_ALARM 238
#define SB_SYSC_VRQ_WAIT 239
#define SB_SYSC_VRQ_SETWT 248
#define SB_SYSC_VRQ_CLRWT 249
#define SB_SYSC_VRQ_SETEN 250

View File

@ -76,9 +76,9 @@ static void sb_api_loadelf(struct port_extctx *ectxp);
* @{
*/
#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_SVC237_HANDLER sb_api_vrq_set_alarm
#define SB_SVC238_HANDLER sb_api_vrq_reset_alarm
#define SB_SVC239_HANDLER sb_api_vrq_wait
#define SB_SVC248_HANDLER sb_api_vrq_setwt
#define SB_SVC249_HANDLER sb_api_vrq_clrwt
#define SB_SVC250_HANDLER sb_api_vrq_seten
@ -870,7 +870,7 @@ static void sb_api_loadelf(struct port_extctx *ectxp);
static void sb_undef_handler(struct port_extctx *ectxp);
const port_syscall_t sb_syscalls[256] = {
const port_syscall_t sb_syscalls[240] = {
SB_SVC0_HANDLER, SB_SVC1_HANDLER, SB_SVC2_HANDLER, SB_SVC3_HANDLER,
SB_SVC4_HANDLER, SB_SVC5_HANDLER, SB_SVC6_HANDLER, SB_SVC7_HANDLER,
SB_SVC8_HANDLER, SB_SVC9_HANDLER, SB_SVC10_HANDLER, SB_SVC11_HANDLER,
@ -930,7 +930,10 @@ const port_syscall_t sb_syscalls[256] = {
SB_SVC224_HANDLER, SB_SVC225_HANDLER, SB_SVC226_HANDLER, SB_SVC227_HANDLER,
SB_SVC228_HANDLER, SB_SVC229_HANDLER, SB_SVC230_HANDLER, SB_SVC231_HANDLER,
SB_SVC232_HANDLER, SB_SVC233_HANDLER, SB_SVC234_HANDLER, SB_SVC235_HANDLER,
SB_SVC236_HANDLER, SB_SVC237_HANDLER, SB_SVC238_HANDLER, SB_SVC239_HANDLER,
SB_SVC236_HANDLER, SB_SVC237_HANDLER, SB_SVC238_HANDLER, SB_SVC239_HANDLER
};
const port_syscall_t sb_fastcalls[16] = {
SB_SVC240_HANDLER, SB_SVC241_HANDLER, SB_SVC242_HANDLER, SB_SVC243_HANDLER,
SB_SVC244_HANDLER, SB_SVC245_HANDLER, SB_SVC246_HANDLER, SB_SVC247_HANDLER,
SB_SVC248_HANDLER, SB_SVC249_HANDLER, SB_SVC250_HANDLER, SB_SVC251_HANDLER,
@ -1276,4 +1279,11 @@ void __port_do_syscall_return(void) {
#endif
}
void __port_do_fastcall_entry(uint32_t n) {
struct port_extctx *ectxp;
ectxp = (struct port_extctx *)__get_PSP();
sb_fastcalls[n - 240](ectxp);
}
/** @} */

View File

@ -272,97 +272,83 @@ void sb_api_vrq_setwt(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
uint32_t m;
chSysLock();
m = ectxp->r0;
ectxp->r0 = sbp->vrq_wtmask;
sbp->vrq_wtmask |= m;
chSysUnlock();
__sb_vrq_check_pending(sbp, ectxp);
}
void sb_api_vrq_clrwt(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
uint32_t m;
chSysLock();
m = ectxp->r0;
ectxp->r0 = sbp->vrq_wtmask;
sbp->vrq_wtmask &= ~m;
chSysUnlock();
/* No need to check for pending VRQs.*/
}
void sb_api_vrq_seten(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
uint32_t m;
chSysLock();
m = ectxp->r0;
ectxp->r0 = sbp->vrq_enmask;
sbp->vrq_enmask |= m;
chSysUnlock();
__sb_vrq_check_pending(sbp, ectxp);
}
void sb_api_vrq_clren(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
uint32_t m;
chSysLock();
m = ectxp->r0;
ectxp->r0 = sbp->vrq_enmask;
sbp->vrq_enmask &= ~m;
chSysUnlock();
/* No need to check for pending VRQs.*/
}
void sb_api_vrq_disable(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
chSysLock();
ectxp->r0 = sbp->vrq_isr;
sbp->vrq_isr |= SB_VRQ_ISR_DISABLED;
chSysUnlock();
/* No need to check for pending VRQs.*/
}
void sb_api_vrq_enable(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
chSysLock();
ectxp->r0 = sbp->vrq_isr;
sbp->vrq_isr &= ~SB_VRQ_ISR_DISABLED;
chSysUnlock();
__sb_vrq_check_pending(sbp, ectxp);
}
void sb_api_vrq_getisr(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
ectxp->r0 = sbp->vrq_isr;
/* No need to check for pending VRQs.*/
}
void sb_api_vrq_return(struct port_extctx *ectxp) {
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
chSysLock();
/* Returning from VRQ, enabling VRQs globally again.*/
sbp->vrq_isr &= ~SB_VRQ_ISR_DISABLED;
/* Discarding the return current context, returning on the previous one.
TODO: Check for overflows.*/
TODO: Check for overflows????*/
ectxp++;
__port_syscall_set_u_psp(sbp->tp, ectxp);
chSysUnlock();
__sb_vrq_check_pending(sbp, ectxp);
}
/**

View File

@ -895,7 +895,7 @@ static inline void sbSleepMicroseconds(time_usecs_t usecs) {
*/
static inline void sbSetAlarm(sysinterval_t interval, bool reload) {
__syscall2r(245, (uint32_t)interval, (uint32_t)reload);
__syscall2r(237, (uint32_t)interval, (uint32_t)reload);
}
/**
@ -905,7 +905,7 @@ static inline void sbSetAlarm(sysinterval_t interval, bool reload) {
*/
static inline void sbResetAlarm(void) {
__syscall0(246);
__syscall0(238);
}
/**
@ -915,7 +915,7 @@ static inline void sbResetAlarm(void) {
*/
static inline void __sb_vrq_wait(void) {
__syscall0(247);
__syscall0(239);
}
/**

View File

@ -74,6 +74,12 @@
*****************************************************************************
*** Next ***
- NEW: Added a para-virtualized HAL port for use in sandboxes.
- NEW: Added a VIO subsystem to sandboxes supporting drivers
para-virtualization, PAL and SIO supported so far.
- NEW: Added and RT port for use in virtualized sandboxes.
- NEW: Added full virtualization support to sandboxes with a virtual IRQ
mechanism.
- NEW: Fixed setting of SYSCLK when derived from divided HSI16
- NEW: Mass change: Source code convention changed from CRLF to just CR (Unix).
- NEW: Fixed some corned cases in ADC5, added ADC reset on start().