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

View File

@ -51,9 +51,9 @@
#define SB_SYSC_LOADELF 12 #define SB_SYSC_LOADELF 12
#define SB_SYSC_VHAL_VGPIO 200 #define SB_SYSC_VHAL_VGPIO 200
#define SB_SYSC_VHAL_VUART 201 #define SB_SYSC_VHAL_VUART 201
#define SB_SYSC_VRQ_SET_ALARM 245 #define SB_SYSC_VRQ_SET_ALARM 237
#define SB_SYSC_VRQ_RESET_ALARM 246 #define SB_SYSC_VRQ_RESET_ALARM 238
#define SB_SYSC_VRQ_WAIT 247 #define SB_SYSC_VRQ_WAIT 239
#define SB_SYSC_VRQ_SETWT 248 #define SB_SYSC_VRQ_SETWT 248
#define SB_SYSC_VRQ_CLRWT 249 #define SB_SYSC_VRQ_CLRWT 249
#define SB_SYSC_VRQ_SETEN 250 #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__) #if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__)
#define SB_SVC245_HANDLER sb_api_vrq_set_alarm #define SB_SVC237_HANDLER sb_api_vrq_set_alarm
#define SB_SVC246_HANDLER sb_api_vrq_reset_alarm #define SB_SVC238_HANDLER sb_api_vrq_reset_alarm
#define SB_SVC247_HANDLER sb_api_vrq_wait #define SB_SVC239_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
#define SB_SVC250_HANDLER sb_api_vrq_seten #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); 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_SVC0_HANDLER, SB_SVC1_HANDLER, SB_SVC2_HANDLER, SB_SVC3_HANDLER,
SB_SVC4_HANDLER, SB_SVC5_HANDLER, SB_SVC6_HANDLER, SB_SVC7_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, 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_SVC224_HANDLER, SB_SVC225_HANDLER, SB_SVC226_HANDLER, SB_SVC227_HANDLER,
SB_SVC228_HANDLER, SB_SVC229_HANDLER, SB_SVC230_HANDLER, SB_SVC231_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_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_SVC240_HANDLER, SB_SVC241_HANDLER, SB_SVC242_HANDLER, SB_SVC243_HANDLER,
SB_SVC244_HANDLER, SB_SVC245_HANDLER, SB_SVC246_HANDLER, SB_SVC247_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, SB_SVC248_HANDLER, SB_SVC249_HANDLER, SB_SVC250_HANDLER, SB_SVC251_HANDLER,
@ -1276,4 +1279,11 @@ void __port_do_syscall_return(void) {
#endif #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; sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
uint32_t m; uint32_t m;
chSysLock();
m = ectxp->r0; m = ectxp->r0;
ectxp->r0 = sbp->vrq_wtmask; ectxp->r0 = sbp->vrq_wtmask;
sbp->vrq_wtmask |= m; sbp->vrq_wtmask |= m;
chSysUnlock(); __sb_vrq_check_pending(sbp, ectxp);
} }
void sb_api_vrq_clrwt(struct port_extctx *ectxp) { void sb_api_vrq_clrwt(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;
uint32_t m; uint32_t m;
chSysLock();
m = ectxp->r0; m = ectxp->r0;
ectxp->r0 = sbp->vrq_wtmask; ectxp->r0 = sbp->vrq_wtmask;
sbp->vrq_wtmask &= ~m; sbp->vrq_wtmask &= ~m;
chSysUnlock(); /* No need to check for pending VRQs.*/
} }
void sb_api_vrq_seten(struct port_extctx *ectxp) { void sb_api_vrq_seten(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;
uint32_t m; uint32_t m;
chSysLock();
m = ectxp->r0; m = ectxp->r0;
ectxp->r0 = sbp->vrq_enmask; ectxp->r0 = sbp->vrq_enmask;
sbp->vrq_enmask |= m; sbp->vrq_enmask |= m;
chSysUnlock(); __sb_vrq_check_pending(sbp, ectxp);
} }
void sb_api_vrq_clren(struct port_extctx *ectxp) { void sb_api_vrq_clren(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;
uint32_t m; uint32_t m;
chSysLock();
m = ectxp->r0; m = ectxp->r0;
ectxp->r0 = sbp->vrq_enmask; ectxp->r0 = sbp->vrq_enmask;
sbp->vrq_enmask &= ~m; sbp->vrq_enmask &= ~m;
chSysUnlock(); /* No need to check for pending VRQs.*/
} }
void sb_api_vrq_disable(struct port_extctx *ectxp) { void sb_api_vrq_disable(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;
chSysLock();
ectxp->r0 = sbp->vrq_isr; ectxp->r0 = sbp->vrq_isr;
sbp->vrq_isr |= SB_VRQ_ISR_DISABLED; sbp->vrq_isr |= SB_VRQ_ISR_DISABLED;
chSysUnlock(); /* No need to check for pending VRQs.*/
} }
void sb_api_vrq_enable(struct port_extctx *ectxp) { void sb_api_vrq_enable(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;
chSysLock();
ectxp->r0 = sbp->vrq_isr; ectxp->r0 = sbp->vrq_isr;
sbp->vrq_isr &= ~SB_VRQ_ISR_DISABLED; sbp->vrq_isr &= ~SB_VRQ_ISR_DISABLED;
chSysUnlock(); __sb_vrq_check_pending(sbp, ectxp);
} }
void sb_api_vrq_getisr(struct port_extctx *ectxp) { void sb_api_vrq_getisr(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;
ectxp->r0 = sbp->vrq_isr; ectxp->r0 = sbp->vrq_isr;
/* No need to check for pending VRQs.*/
} }
void sb_api_vrq_return(struct port_extctx *ectxp) { void sb_api_vrq_return(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;
chSysLock();
/* Returning from VRQ, enabling VRQs globally again.*/ /* Returning from VRQ, enabling VRQs globally again.*/
sbp->vrq_isr &= ~SB_VRQ_ISR_DISABLED; sbp->vrq_isr &= ~SB_VRQ_ISR_DISABLED;
/* Discarding the return current context, returning on the previous one. /* Discarding the return current context, returning on the previous one.
TODO: Check for overflows.*/ TODO: Check for overflows????*/
ectxp++; ectxp++;
__port_syscall_set_u_psp(sbp->tp, ectxp); __sb_vrq_check_pending(sbp, ectxp);
chSysUnlock();
} }
/** /**

View File

@ -895,7 +895,7 @@ static inline void sbSleepMicroseconds(time_usecs_t usecs) {
*/ */
static inline void sbSetAlarm(sysinterval_t interval, bool reload) { 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) { 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) { static inline void __sb_vrq_wait(void) {
__syscall0(247); __syscall0(239);
} }
/** /**

View File

@ -74,6 +74,12 @@
***************************************************************************** *****************************************************************************
*** Next *** *** 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: Fixed setting of SYSCLK when derived from divided HSI16
- NEW: Mass change: Source code convention changed from CRLF to just CR (Unix). - 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(). - NEW: Fixed some corned cases in ADC5, added ADC reset on start().