diff --git a/demos/STM32/RT-STM32G474RE-NUCLEO64/Makefile b/demos/STM32/RT-STM32G474RE-NUCLEO64/Makefile index 642e65e68..5376c90d6 100644 --- a/demos/STM32/RT-STM32G474RE-NUCLEO64/Makefile +++ b/demos/STM32/RT-STM32G474RE-NUCLEO64/Makefile @@ -106,6 +106,7 @@ include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk # RTOS files (optional). include $(CHIBIOS)/os/rt/rt.mk include $(CHIBIOS)/os/common/ports/ARMv7-M-ALT/compilers/GCC/mk/port.mk +#include $(CHIBIOS)/os/common/ports/ARMv7-M/compilers/GCC/mk/port.mk # Auto-build files in ./source recursively. include $(CHIBIOS)/tools/mk/autobuild.mk # Other files (optional). diff --git a/os/common/ports/ARMv7-M/chcore.c b/os/common/ports/ARMv7-M/chcore.c index f248c5c63..e1c3ef8ca 100644 --- a/os/common/ports/ARMv7-M/chcore.c +++ b/os/common/ports/ARMv7-M/chcore.c @@ -53,65 +53,6 @@ /* Module interrupt handlers. */ /*===========================================================================*/ -#if (PORT_USE_SYSCALL == TRUE) || defined(__DOXYGEN__) -__attribute__((noinline)) -void port_syslock_noinline(void) { - - port_lock(); - __stats_start_measure_crit_thd(); - __dbg_check_lock(); -} - -uint32_t port_get_s_psp(void) { - - return (uint32_t)__sch_get_currthread()->ctx.syscall.psp; -} - -__attribute__((weak)) -void port_syscall(struct port_extctx *ctxp, uint32_t n) { - - (void)ctxp; - (void)n; - - chSysHalt("svc"); -} - -void port_unprivileged_jump(uint32_t pc, uint32_t psp) { - struct port_extctx *ectxp; - struct port_linkctx *lctxp; - uint32_t s_psp = __get_PSP(); - uint32_t control = __get_CONTROL(); - - /* Creating a port_extctx context for user mode entry.*/ - psp -= sizeof (struct port_extctx); - ectxp = (struct port_extctx *)psp; - - /* Initializing the user mode entry context.*/ - memset((void *)ectxp, 0, sizeof (struct port_extctx)); - ectxp->pc = pc; - ectxp->xpsr = 0x01000000U; -#if CORTEX_USE_FPU == TRUE - ectxp->fpscr = __get_FPSCR(); -#endif - - /* Creating a middle context for user mode entry.*/ - s_psp -= sizeof (struct port_linkctx); - lctxp = (struct port_linkctx *)s_psp; - - /* CONTROL and PSP values for user mode.*/ - lctxp->control = control | 1U; - lctxp->ectxp = ectxp; - - /* PSP now points to the port_linkctx structure, it will be removed - by SVC.*/ - __set_PSP(s_psp); - - asm volatile ("svc 0"); - - chSysHalt("svc"); -} -#endif - #if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) || defined(__DOXYGEN__) /** * @brief SVC vector. @@ -124,84 +65,20 @@ void SVC_Handler(void) { /*lint -restore*/ uint32_t psp = __get_PSP(); -#if PORT_USE_SYSCALL == TRUE - uint32_t control; - /* Caller context.*/ - struct port_extctx *ectxp = (struct port_extctx *)psp; - -#if defined(__GNUC__) - chDbgAssert(((uint32_t)__builtin_return_address(0) & 4U) != 0U, - "not process"); -#endif - - /* Checking if the SVC instruction has been used from privileged or - non-privileged mode.*/ - control = __get_CONTROL(); - if ((control & 1U) != 0) { - /* From non-privileged mode, it must be handled as a syscall.*/ - uint32_t n, s_psp; - struct port_linkctx *lctxp; - struct port_extctx *newctxp; - - /* Supervisor PSP from the thread context structure.*/ - s_psp = (uint32_t)__sch_get_currthread()->ctx.syscall.psp; - - /* Pushing the port_linkctx into the supervisor stack.*/ - s_psp -= sizeof (struct port_linkctx); - lctxp = (struct port_linkctx *)s_psp; - lctxp->control = control; - lctxp->ectxp = ectxp; - - /* Enforcing privileged mode before returning.*/ - __set_CONTROL(control & ~1U); - - /* Number of the SVC instruction.*/ - n = (uint32_t)*(((const uint16_t *)ectxp->pc) - 1U) & 255U; - - /* Building an artificial return context, we need to make this - return in the syscall dispatcher in privileged mode.*/ - s_psp -= sizeof (struct port_extctx); - __set_PSP(s_psp); - newctxp = (struct port_extctx *)s_psp; - 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 - } - else -#endif - { - /* From privileged mode, it is used for context discarding in the - preemption code.*/ - - /* Unstacking procedure, discarding the current exception context and - positioning the stack to point to the real one.*/ - psp += sizeof (struct port_extctx); + /* Unstacking procedure, discarding the current exception context and + positioning the stack to point to the real one.*/ + psp += sizeof (struct port_extctx); #if CORTEX_USE_FPU == TRUE - /* Enforcing unstacking of the FP part of the context.*/ - FPU->FPCCR &= ~FPU_FPCCR_LSPACT_Msk; + /* Enforcing unstacking of the FP part of the context.*/ + FPU->FPCCR &= ~FPU_FPCCR_LSPACT_Msk; #endif -#if PORT_USE_SYSCALL == TRUE - { - /* Restoring CONTROL and the original PSP position.*/ - struct port_linkctx *lctxp = (struct port_linkctx *)psp; - __set_CONTROL((uint32_t)lctxp->control); - __set_PSP((uint32_t)lctxp->ectxp); - } -#else + /* Restoring real position of the original stack frame.*/ + __set_PSP(psp); - /* Restoring real position of the original stack frame.*/ - __set_PSP(psp); -#endif - - /* Restoring the normal interrupts status.*/ - port_unlock_from_isr(); - } + /* Restoring the normal interrupts status.*/ + port_unlock_from_isr(); } #endif /* CORTEX_SIMPLIFIED_PRIORITY == FALSE */ @@ -226,15 +103,6 @@ void PendSV_Handler(void) { point to the real one.*/ psp += sizeof (struct port_extctx); -#if PORT_USE_SYSCALL == TRUE - { - /* Restoring previous privileges by restoring CONTROL.*/ - struct port_linkctx *lctxp = (struct port_linkctx *)psp; - __set_CONTROL((uint32_t)lctxp->control); - psp += sizeof (struct port_linkctx); - } -#endif - /* Restoring real position of the original stack frame.*/ __set_PSP(psp); } @@ -289,7 +157,7 @@ void port_init(os_instance_t *oip) { } #endif -#if (PORT_ENABLE_GUARD_PAGES == TRUE) || (PORT_USE_SYSCALL == TRUE) +#if PORT_ENABLE_GUARD_PAGES == TRUE /* MPU is enabled.*/ mpuEnable(MPU_CTRL_PRIVDEFENA); #endif @@ -314,55 +182,21 @@ void __port_irq_epilogue(void) { port_lock_from_isr(); if ((SCB->ICSR & SCB_ICSR_RETTOBASE_Msk) != 0U) { struct port_extctx *ectxp; - uint32_t s_psp; + uint32_t psp; #if CORTEX_USE_FPU == TRUE /* Enforcing a lazy FPU state save by accessing the FPCSR register.*/ (void) __get_FPSCR(); #endif -#if PORT_USE_SYSCALL == TRUE - { - struct port_linkctx *lctxp; - uint32_t control = __get_CONTROL(); - - /* Checking if the IRQ has been served in unprivileged mode.*/ - if ((control & 1U) != 0U) { - /* Unprivileged mode, switching to privileged mode.*/ - __set_CONTROL(control & ~1U); - - /* Switching to S-PSP taking it from the thread context.*/ - s_psp = (uint32_t)__sch_get_currthread()->ctx.syscall.psp; - - /* Pushing the middle context for returning to the original frame - and mode.*/ - s_psp = s_psp - sizeof (struct port_linkctx); - lctxp = (struct port_linkctx *)s_psp; - lctxp->control = control; - lctxp->ectxp = (struct port_extctx *)__get_PSP(); - } - else { - /* Privileged mode, we are already on S-PSP.*/ - uint32_t psp = __get_PSP(); - - /* Pushing the middle context for returning to the original frame - and mode.*/ - s_psp = psp - sizeof (struct port_linkctx); - lctxp = (struct port_linkctx *)s_psp; - lctxp->control = control; - lctxp->ectxp = (struct port_extctx *)psp; - } - } -#else - s_psp = __get_PSP(); -#endif /* Adding an artificial exception return context, there is no need to populate it fully.*/ - s_psp -= sizeof (struct port_extctx); + psp = __get_PSP(); + psp -= sizeof (struct port_extctx); /* The port_extctx structure is pointed by the S-PSP register.*/ - ectxp = (struct port_extctx *)s_psp; + ectxp = (struct port_extctx *)psp; /* Setting up a fake XPSR register value.*/ ectxp->xpsr = 0x01000000U; @@ -371,7 +205,7 @@ void __port_irq_epilogue(void) { #endif /* Writing back the modified S-PSP value.*/ - __set_PSP(s_psp); + __set_PSP(psp); /* The exit sequence is different depending on if a preemption is required or not.*/ diff --git a/os/common/ports/ARMv7-M/chcore.h b/os/common/ports/ARMv7-M/chcore.h index 5daf3d905..04588132a 100644 --- a/os/common/ports/ARMv7-M/chcore.h +++ b/os/common/ports/ARMv7-M/chcore.h @@ -111,24 +111,6 @@ /* Module pre-compile time settings. */ /*===========================================================================*/ -/** - * @brief Implements a syscall interface on SVC. - */ -#if !defined(PORT_USE_SYSCALL) || defined(__DOXYGEN__) -#define PORT_USE_SYSCALL FALSE -#endif - -/** - * @brief Number of MPU regions to be saved/restored during context switch. - * @note The first region is always region zero. - * @note The use of this option has an overhead of 8 bytes for each - * region for each thread. - * @note Allowed values are 0..4, zero means none. - */ -#if !defined(PORT_SWITCHED_REGIONS_NUMBER) || defined(__DOXYGEN__) -#define PORT_SWITCHED_REGIONS_NUMBER 0 -#endif - /** * @brief Enables stack overflow guard pages using MPU. * @note This option can only be enabled if also option @@ -142,8 +124,6 @@ /** * @brief MPU region to be used to stack guards. - * @note Make sure this region is not included in the - * @p PORT_SWITCHED_REGIONS_NUMBER regions range. */ #if !defined(PORT_USE_GUARD_MPU_REGION) || defined(__DOXYGEN__) #define PORT_USE_GUARD_MPU_REGION MPU_REGION_7 @@ -235,10 +215,6 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if (PORT_SWITCHED_REGIONS_NUMBER < 0) || (PORT_SWITCHED_REGIONS_NUMBER > 4) - #error "invalid PORT_SWITCHED_REGIONS_NUMBER value" -#endif - #if (CORTEX_FAST_PRIORITIES < 0) || \ (CORTEX_FAST_PRIORITIES > (CORTEX_PRIORITY_LEVELS / 4)) #error "invalid CORTEX_FAST_PRIORITIES value specified" @@ -459,31 +435,12 @@ struct port_extctx { #endif /* CORTEX_USE_FPU */ }; -#if (PORT_USE_SYSCALL == TRUE) || defined(__DOXYGEN__) -/** - * @brief Link context structure. - * @details This structure is used when there is the need to save extra - * context information that is not part of the registers stacked - * in HW. - */ -struct port_linkctx { - uint32_t control; - struct port_extctx *ectxp; -}; -#endif - /** * @brief System saved context. * @details This structure represents the inner stack frame during a context * switch. */ struct port_intctx { -#if (PORT_SWITCHED_REGIONS_NUMBER > 0) || defined(__DOXYGEN__) - struct { - uint32_t rbar; - uint32_t rasr; - } regions[PORT_SWITCHED_REGIONS_NUMBER]; -#endif #if CORTEX_USE_FPU uint32_t s16; uint32_t s17; @@ -521,12 +478,6 @@ struct port_intctx { */ struct port_context { struct port_intctx *sp; -#if (PORT_USE_SYSCALL == TRUE) || defined(__DOXYGEN__) - struct { - uint32_t psp; - const void *p; - } syscall; -#endif }; #endif /* !defined(_FROM_ASM_) */ @@ -552,55 +503,6 @@ struct port_context { */ #define PORT_THD_FUNCTION(tname, arg) void tname(void *arg) -/* By default threads have no syscall context information.*/ -#if (PORT_USE_SYSCALL == TRUE) || defined(__DOXYGEN__) - #define __PORT_SETUP_CONTEXT_SYSCALL(tp, wtop) \ - (tp)->ctx.syscall.psp = (uint32_t)(wtop); \ - (tp)->ctx.syscall.p = NULL; -#else - #define __PORT_SETUP_CONTEXT_SYSCALL(tp, wtop) -#endif - -/* By default threads have all regions disabled.*/ -#if (PORT_SWITCHED_REGIONS_NUMBER == 0) || defined(__DOXYGEN__) - #define __PORT_SETUP_CONTEXT_MPU(tp) - -#elif (PORT_SWITCHED_REGIONS_NUMBER == 1) || defined(__DOXYGEN__) - #define __PORT_SETUP_CONTEXT_MPU(tp) \ - (tp)->ctx.sp->regions[0].rbar = 0U; \ - (tp)->ctx.sp->regions[0].rasr = 0U - -#elif (PORT_SWITCHED_REGIONS_NUMBER == 2) || defined(__DOXYGEN__) - #define __PORT_SETUP_CONTEXT_MPU(tp) \ - (tp)->ctx.sp->regions[0].rbar = 0U; \ - (tp)->ctx.sp->regions[0].rasr = 0U; \ - (tp)->ctx.sp->regions[1].rbar = 0U; \ - (tp)->ctx.sp->regions[1].rasr = 0U - -#elif (PORT_SWITCHED_REGIONS_NUMBER == 3) || defined(__DOXYGEN__) - #define __PORT_SETUP_CONTEXT_MPU(tp) \ - (tp)->ctx.sp->regions[0].rbar = 0U; \ - (tp)->ctx.sp->regions[0].rasr = 0U; \ - (tp)->ctx.sp->regions[1].rbar = 0U; \ - (tp)->ctx.sp->regions[1].rasr = 0U; \ - (tp)->ctx.sp->regions[2].rbar = 0U; \ - (tp)->ctx.sp->regions[2].rasr = 0U - -#elif (PORT_SWITCHED_REGIONS_NUMBER == 4) || defined(__DOXYGEN__) - #define __PORT_SETUP_CONTEXT_MPU(tp) \ - (tp)->ctx.sp->regions[0].rbar = 0U; \ - (tp)->ctx.sp->regions[0].rasr = 0U; \ - (tp)->ctx.sp->regions[1].rbar = 0U; \ - (tp)->ctx.sp->regions[1].rasr = 0U; \ - (tp)->ctx.sp->regions[2].rbar = 0U; \ - (tp)->ctx.sp->regions[2].rasr = 0U; \ - (tp)->ctx.sp->regions[3].rbar = 0U; \ - (tp)->ctx.sp->regions[3].rasr = 0U - -#else - /* Note, checked above.*/ -#endif - /** * @brief Platform dependent part of the @p chThdCreateI() API. * @details This code usually setup the context switching frame represented @@ -612,8 +514,6 @@ struct port_context { (tp)->ctx.sp->r4 = (uint32_t)(pf); \ (tp)->ctx.sp->r5 = (uint32_t)(arg); \ (tp)->ctx.sp->lr = (uint32_t)__port_thread_start; \ - __PORT_SETUP_CONTEXT_MPU(tp); \ - __PORT_SETUP_CONTEXT_SYSCALL(tp, wtop); \ } while (false) /** @@ -741,9 +641,6 @@ extern "C" { void __port_thread_start(void); void __port_switch_from_isr(void); void __port_exit_from_isr(void); -#if PORT_USE_SYSCALL == TRUE - void port_unprivileged_jump(uint32_t pc, uint32_t psp); -#endif #ifdef __cplusplus } #endif diff --git a/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S b/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S index 4e7ec96e2..083e11658 100644 --- a/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S +++ b/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S @@ -83,43 +83,6 @@ __port_switch: vpush {s16-s31} #endif -#if PORT_SWITCHED_REGIONS_NUMBER > 0 - /* Saving MPU context.*/ - ldr r2, =MPU_RBAR -#if PORT_SWITCHED_REGIONS_NUMBER >= 1 - mov r3, #0 - str r3, [r2, #-4] /* RNR */ - ldm r2, {r4, r5} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 2 - add r3, #1 - str r3, [r2, #-4] /* RNR */ - ldm r2, {r6, r7} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 3 - add r3, #1 - str r3, [r2, #-4] /* RNR */ - ldm r2, {r8, r9} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 4 - add r3, #1 - str r3, [r2, #-4] /* RNR */ - ldm r2, {r10, r11} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 1 - push {r4, r5} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 2 - push {r4, r5, r6, r7} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 3 - push {r4, r5, r6, r7, r8, r9} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 4 - push {r4, r5, r6, r7, r8, r9, r10, r11} -#endif -#endif - str sp, [r1, #CONTEXT_OFFSET] #if (CORTEX_SIMPLIFIED_PRIORITY == FALSE) && \ ((CORTEX_MODEL == 3) || (CORTEX_MODEL == 4)) @@ -131,42 +94,6 @@ __port_switch: ldr sp, [r0, #CONTEXT_OFFSET] #endif -#if PORT_SWITCHED_REGIONS_NUMBER > 0 - /* Restoring MPU context.*/ -#if PORT_SWITCHED_REGIONS_NUMBER == 1 - pop {r4, r5} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 2 - pop {r4, r5, r6, r7} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 3 - pop {r4, r5, r6, r7, r8, r9} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER == 4 - pop {r4, r5, r6, r7, r8, r9, r10, r11} -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 1 - mov r3, #0 - str r3, [r2, #-4] /* RNR */ - stm r2, {r4, r5} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 2 - add r3, #1 - str r3, [r2, #-4] /* RNR */ - stm r2, {r6, r7} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 3 - add r3, #1 - str r3, [r2, #-4] /* RNR */ - stm r2, {r8, r9} /* RBAR, RASR */ -#endif -#if PORT_SWITCHED_REGIONS_NUMBER >= 4 - add r3, #1 - str r3, [r2, #-4] /* RNR */ - stm r2, {r10, r11} /* RBAR, RASR */ -#endif -#endif - #if CORTEX_USE_FPU /* Restoring FPU context.*/ vpop {s16-s31} diff --git a/readme.txt b/readme.txt index 0d2b13314..585e731bc 100644 --- a/readme.txt +++ b/readme.txt @@ -74,6 +74,8 @@ ***************************************************************************** *** Next *** +- NEW: Removed obsolete sandbox code from ARMv7-M port. Now ARMv7-M-ALT is + the official port for use with sandboxes. - NEW: Reworked HAL MAC driver, now with callback support. - NEW: Added a para-virtualized HAL port for use in sandboxes. - NEW: Added a VIO subsystem to sandboxes supporting drivers