SB fastcalls support, not complete.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15766 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
de74d1f890
commit
629e810f65
|
@ -4,9 +4,10 @@ The launch configurations under:
|
||||||
|
|
||||||
Contain hardcoded paths prefixed like:
|
Contain hardcoded paths prefixed like:
|
||||||
|
|
||||||
/home/giovanni/Projects/ChibiStudio/chibios_trunk/demos/various/SB-CLIENT-32k-08070000-4k-2001E000/build/sb.elf
|
/home/giovanni/Projects/ChibiStudio/chibios_trunk/demos/various/SB-CLIENT-128k-08040000-4k-2001E000/build/sb.elf
|
||||||
|
|
||||||
Replace the initial part up to "chibios_trunk" with the path of your ChibiOS
|
Replace the initial part up to "chibios_trunk" with the path of your ChibiOS
|
||||||
directory before attempting a debug session using Eclipse. In addition, you
|
directory before attempting a debug session using Eclipse. In addition, you
|
||||||
need also to compile the "SB-CLIENT-32k-08070000-4k-2001E000" project, its
|
need also to compile the "SB-CLIENT-128k-08040000-16k-20018000" and
|
||||||
image (sb.elf) is loaded inside the demo sandbox.
|
"SB-CLIENT-128k-08060000-16k-2001C000" projects, their image (sb.elf) is
|
||||||
|
loaded inside the demo sandboxes.
|
||||||
|
|
|
@ -68,38 +68,18 @@ CC_NO_INLINE uint32_t port_get_s_psp(void) {
|
||||||
return (uint32_t)__port_syscall_get_s_psp(__sch_get_currthread());
|
return (uint32_t)__port_syscall_get_s_psp(__sch_get_currthread());
|
||||||
}
|
}
|
||||||
|
|
||||||
CC_WEAK void port_syscall(struct port_extctx *ctxp, uint32_t n) {
|
CC_WEAK void __port_do_fastcall_entry(uint32_t n) {
|
||||||
|
|
||||||
(void)ctxp;
|
|
||||||
(void)n;
|
(void)n;
|
||||||
|
|
||||||
chSysHalt("unimplemented syscall");
|
chSysHalt("unimplemented fastcall");
|
||||||
}
|
}
|
||||||
|
|
||||||
CC_WEAK void __port_do_syscall_entry(uint32_t n) {
|
CC_WEAK void __port_do_syscall_entry(uint32_t n) {
|
||||||
thread_t *tp = __sch_get_currthread();
|
|
||||||
struct port_extctx *ectxp, *newctxp;
|
|
||||||
uint32_t u_psp;
|
|
||||||
|
|
||||||
/* Caller context in unprivileged memory.*/
|
(void)n;
|
||||||
u_psp = __get_PSP();
|
|
||||||
ectxp = (struct port_extctx *)u_psp;
|
|
||||||
__port_syscall_set_u_psp(tp, u_psp);
|
|
||||||
|
|
||||||
/* Return context for change in privileged mode.*/
|
chSysHalt("unimplemented syscall");
|
||||||
newctxp = ((struct port_extctx *)__port_syscall_get_s_psp(tp)) - 1;
|
|
||||||
|
|
||||||
/* Creating context for return in privileged mode.*/
|
|
||||||
newctxp->r0 = (uint32_t)ectxp;
|
|
||||||
newctxp->r1 = n;
|
|
||||||
newctxp->pc = (uint32_t)port_syscall;
|
|
||||||
newctxp->xpsr = 0x01000000U;
|
|
||||||
#if CORTEX_USE_FPU == TRUE
|
|
||||||
newctxp->fpscr = FPU->FPDSCR;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Switching PSP to the privileged mode PSP.*/
|
|
||||||
__set_PSP((uint32_t)newctxp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CC_WEAK void __port_do_syscall_return(void) {
|
CC_WEAK void __port_do_syscall_return(void) {
|
||||||
|
|
|
@ -230,6 +230,8 @@ SVC_Handler:
|
||||||
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
|
||||||
|
// bge __port_do_fastcall_entry
|
||||||
b __port_do_syscall_entry
|
b __port_do_syscall_entry
|
||||||
|
|
||||||
frompriv:
|
frompriv:
|
||||||
|
|
|
@ -49,8 +49,8 @@
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.thumb_func
|
.thumb_func
|
||||||
.global port_syscall
|
.global __sb_dispatch_syscall
|
||||||
port_syscall:
|
__sb_dispatch_syscall:
|
||||||
ldr r3, =sb_syscalls
|
ldr r3, =sb_syscalls
|
||||||
ldr.w r3, [r3, r1, lsl #2]
|
ldr.w r3, [r3, r1, lsl #2]
|
||||||
blx r3
|
blx r3
|
||||||
|
|
|
@ -1232,4 +1232,31 @@ void __sb_abort(msg_t msg) {
|
||||||
chSysHalt("zombies");
|
chSysHalt("zombies");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __port_do_syscall_entry(uint32_t n) {
|
||||||
|
extern void __sb_dispatch_syscall(struct port_extctx *ctxp, uint32_t n);
|
||||||
|
thread_t *tp = __sch_get_currthread();
|
||||||
|
struct port_extctx *ectxp, *newctxp;
|
||||||
|
uint32_t u_psp;
|
||||||
|
|
||||||
|
/* Caller context in unprivileged memory.*/
|
||||||
|
u_psp = __get_PSP();
|
||||||
|
ectxp = (struct port_extctx *)u_psp;
|
||||||
|
__port_syscall_set_u_psp(tp, u_psp);
|
||||||
|
|
||||||
|
/* Return context for change in privileged mode.*/
|
||||||
|
newctxp = ((struct port_extctx *)__port_syscall_get_s_psp(tp)) - 1;
|
||||||
|
|
||||||
|
/* Creating context for return in privileged mode.*/
|
||||||
|
newctxp->r0 = (uint32_t)ectxp;
|
||||||
|
newctxp->r1 = n;
|
||||||
|
newctxp->pc = (uint32_t)__sb_dispatch_syscall;
|
||||||
|
newctxp->xpsr = 0x01000000U;
|
||||||
|
#if CORTEX_USE_FPU == TRUE
|
||||||
|
newctxp->fpscr = FPU->FPDSCR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Switching PSP to the privileged mode PSP.*/
|
||||||
|
__set_PSP((uint32_t)newctxp);
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -57,7 +57,6 @@ extern sb_t sb;
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
void port_syscall(struct port_extctx *ctxp, uint32_t n);
|
|
||||||
size_t sb_strv_getsize(const char *v[], int *np);
|
size_t sb_strv_getsize(const char *v[], int *np);
|
||||||
void sb_strv_copy(const char *sp[], void *dp, int n);
|
void sb_strv_copy(const char *sp[], void *dp, int n);
|
||||||
bool sb_is_valid_read_range(sb_class_t *sbp, const void *start, size_t size);
|
bool sb_is_valid_read_range(sb_class_t *sbp, const void *start, size_t size);
|
||||||
|
|
Loading…
Reference in New Issue