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:
parent
c1d2a487bb
commit
940754b2cf
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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().
|
||||||
|
|
Loading…
Reference in New Issue