From 940754b2cfae6ae9bbfb1ca5d71c6843ee1a98f0 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Wed, 7 Sep 2022 10:05:15 +0000 Subject: [PATCH] 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 --- .../ARMv7-M-ALT/compilers/GCC/chcoreasm.S | 8 ++--- os/sb/common/sbsysc.h | 6 ++-- os/sb/host/sbapi.c | 20 ++++++++--- os/sb/host/sbvrq.c | 34 ++++++------------- os/sb/user/sbuser.h | 6 ++-- readme.txt | 6 ++++ 6 files changed, 41 insertions(+), 39 deletions(-) diff --git a/os/common/ports/ARMv7-M-ALT/compilers/GCC/chcoreasm.S b/os/common/ports/ARMv7-M-ALT/compilers/GCC/chcoreasm.S index 0d325b6eb..72a135fe8 100644 --- a/os/common/ports/ARMv7-M-ALT/compilers/GCC/chcoreasm.S +++ b/os/common/ports/ARMv7-M-ALT/compilers/GCC/chcoreasm.S @@ -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: diff --git a/os/sb/common/sbsysc.h b/os/sb/common/sbsysc.h index 3b90c0686..156b9aebd 100644 --- a/os/sb/common/sbsysc.h +++ b/os/sb/common/sbsysc.h @@ -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 diff --git a/os/sb/host/sbapi.c b/os/sb/host/sbapi.c index dc9dbb57c..6466973e0 100644 --- a/os/sb/host/sbapi.c +++ b/os/sb/host/sbapi.c @@ -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); +} + /** @} */ diff --git a/os/sb/host/sbvrq.c b/os/sb/host/sbvrq.c index a9b78b61e..41af2b157 100644 --- a/os/sb/host/sbvrq.c +++ b/os/sb/host/sbvrq.c @@ -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); } /** diff --git a/os/sb/user/sbuser.h b/os/sb/user/sbuser.h index 2c1466c95..47bc0c3d7 100644 --- a/os/sb/user/sbuser.h +++ b/os/sb/user/sbuser.h @@ -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); } /** diff --git a/readme.txt b/readme.txt index 3f0c6fdd5..8f56aed4f 100644 --- a/readme.txt +++ b/readme.txt @@ -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().