diff --git a/arch/arm/arm/src/include/los_exc_pri.h b/arch/arm/arm/src/include/los_exc_pri.h index e1e9c4873a37e5fab943fb77ed694fe41642e7b2..84e37d0ac5a2b7ba6b533ee00643b18b6645a41f 100644 --- a/arch/arm/arm/src/include/los_exc_pri.h +++ b/arch/arm/arm/src/include/los_exc_pri.h @@ -40,11 +40,6 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -STATIC INLINE VOID OsSetCurrCpuSp(UINTPTR regSp) -{ - __asm__ __volatile__("mov sp, %0" :: "r"(regSp)); -} - #define OS_SYSTEM_NORMAL 0 #define OS_SYSTEM_EXC_CURR_CPU 1 #define OS_SYSTEM_EXC_OTHER_CPU 2 diff --git a/arch/arm/arm/src/los_exc.c b/arch/arm/arm/src/los_exc.c index e7a1a87c8cf97698658da5c9a12e702040baed10..873b8e1ab88a56ab82dd110f898a828afac2476d 100644 --- a/arch/arm/arm/src/los_exc.c +++ b/arch/arm/arm/src/los_exc.c @@ -525,7 +525,7 @@ VOID OsDumpContextMem(const ExcContext *excBufAddr) } } -STATIC VOID OsExcRestore(UINTPTR taskStackPointer) +STATIC VOID OsExcRestore(VOID) { UINT32 currCpuID = ArchCurrCpuid(); @@ -536,8 +536,6 @@ STATIC VOID OsExcRestore(UINTPTR taskStackPointer) OsPercpuGet()->excFlag = CPU_RUNNING; #endif OsPercpuGet()->taskLockCnt = 0; - - OsSetCurrCpuSp(taskStackPointer); } STATIC VOID OsUserExcHandle(ExcContext *excBufAddr) @@ -564,8 +562,6 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr) #endif runProcess->processStatus &= ~OS_PROCESS_FLAG_EXIT; - OsExcRestore(excBufAddr->SP); - #if (LOSCFG_KERNEL_SMP == YES) #ifdef LOSCFG_FS_VFS OsWakeConsoleSendTask(); @@ -577,6 +573,9 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr) #endif OsProcessExitCodeSignalSet(runProcess, SIGUSR2); + /* Exception handling All operations should be kept prior to that operation */ + OsExcRestore(); + /* kill user exc process */ LOS_Exit(OS_PRO_EXIT_OK); @@ -962,7 +961,7 @@ STATIC VOID OsWaitOtherCoresHandleExcEnd(UINT32 currCpuID) } } -STATIC VOID OsCheckAllCpuStatus(UINTPTR taskStackPointer) +STATIC VOID OsCheckAllCpuStatus(VOID) { UINT32 currCpuID = ArchCurrCpuid(); UINT32 ret, target; @@ -982,7 +981,7 @@ STATIC VOID OsCheckAllCpuStatus(UINTPTR taskStackPointer) } else if (g_excFromUserMode[currCpuID] == TRUE) { if (OsCurrProcessGet()->processID == g_currHandleExcPID) { LOS_SpinUnlock(&g_excSerializerSpin); - OsExcRestore(taskStackPointer); + OsExcRestore(); while (1) { ret = LOS_TaskSuspend(OsCurrTaskGet()->taskID); PrintExcInfo("%s supend task :%u failed: 0x%x\n", __FUNCTION__, OsCurrTaskGet()->taskID, ret); @@ -1010,12 +1009,11 @@ STATIC VOID OsCheckAllCpuStatus(UINTPTR taskStackPointer) } #endif -STATIC VOID OsCheckCpuStatus(UINTPTR taskStackPointer) +STATIC VOID OsCheckCpuStatus(VOID) { #if (LOSCFG_KERNEL_SMP == YES) - OsCheckAllCpuStatus(taskStackPointer); + OsCheckAllCpuStatus(); #else - (VOID)taskStackPointer; g_currHandleExcCpuID = ArchCurrCpuid(); #endif } @@ -1036,7 +1034,7 @@ LITE_OS_SEC_TEXT VOID STATIC OsExcPriorDisposal(ExcContext *excBufAddr) g_excFromUserMode[ArchCurrCpuid()] = FALSE; } - OsCheckCpuStatus(excBufAddr->SP); + OsCheckCpuStatus(); if (g_excFromUserMode[ArchCurrCpuid()] == TRUE) { while (1) { diff --git a/arch/arm/arm/src/los_hw_exc.S b/arch/arm/arm/src/los_hw_exc.S index 82dad4f8e0bff1df7a66869b782b72d26b865c30..98ebba86792c7bb2d9571ab275ed912c017ee32c 100644 --- a/arch/arm/arm/src/los_hw_exc.S +++ b/arch/arm/arm/src/los_hw_exc.S @@ -371,6 +371,13 @@ _osExceptDispatch: MOV R1, SP +#ifdef LOSCFG_KERNEL_VM + LDR R2, [SP, #(19 * 4)] @ Get CPSR + AND R2, R2, #CPSR_MASK_MODE @ Interrupted mode + CMP R2, #CPSR_USER_MODE @ User mode + BEQ _osExceptionGetSP +#endif + EXC_SP_SET __exc_stack_top, OS_EXC_STACK_SIZE, R6, R7 MRC P15, 0, R4, C0, C0, 5