diff --git a/arch/arm/arm/src/los_exc.c b/arch/arm/arm/src/los_exc.c index 1b087d24f15104537fdf865583d364c10b988d65..3c0897bf1dd401f1a086efcaaf404173a03ab5d3 100644 --- a/arch/arm/arm/src/los_exc.c +++ b/arch/arm/arm/src/los_exc.c @@ -995,10 +995,12 @@ STATIC VOID OsCheckAllCpuStatus(VOID) g_currHandleExcCpuID = currCpuID; g_currHandleExcPID = OsCurrProcessGet()->processID; LOS_SpinUnlock(&g_excSerializerSpin); +#ifndef LOSCFG_SAVE_EXCINFO if (g_excFromUserMode[currCpuID] == FALSE) { target = (UINT32)(OS_MP_CPU_ALL & ~CPUID_TO_AFFI_MASK(currCpuID)); HalIrqSendIpi(target, LOS_MP_IPI_HALT); } +#endif } else if (g_excFromUserMode[currCpuID] == TRUE) { /* Both cores raise exceptions, and the current core is a user-mode exception. * Both cores are abnormal and come from the same process @@ -1023,11 +1025,12 @@ STATIC VOID OsCheckAllCpuStatus(VOID) while (1) {} } } - +#ifndef LOSCFG_SAVE_EXCINFO /* use halt ipi to stop other active cores */ if (g_excFromUserMode[ArchCurrCpuid()] == FALSE) { WaitAllCpuStop(currCpuID); } +#endif } #endif diff --git a/platform/los_excinfo.c b/platform/los_excinfo.c index 7bf0123613a06a852df4a5e0b6c09f73d558e237..3edcb7bcd4a3f1cc79334f8be160d44136931314 100644 --- a/platform/los_excinfo.c +++ b/platform/los_excinfo.c @@ -170,16 +170,17 @@ VOID OsRecordExcInfoTime(VOID) #ifdef LOSCFG_SHELL INT32 OsShellCmdReadExcInfo(INT32 argc, CHAR **argv) { +#define EXCINFO_ALIGN_SIZE 64 UINT32 recordSpace = GetRecordSpace(); (VOID)argc; (VOID)argv; - CHAR *buf = (CHAR*)LOS_MemAlloc((void *)OS_SYS_MEM_ADDR, recordSpace + 1); + CHAR *buf = (CHAR*)LOS_MemAllocAlign((void *)OS_SYS_MEM_ADDR, recordSpace + 1, EXCINFO_ALIGN_SIZE); if (buf == NULL) { return LOS_NOK; } - (void)memset_s(buf, recordSpace + 1, 0, recordSpace + 1); + (VOID)memset_s(buf, recordSpace + 1, 0, recordSpace + 1); log_read_write_fn hook = GetExcInfoRW(); if (hook != NULL) { diff --git a/platform/los_printf.c b/platform/los_printf.c index 98d0eb260abb8f03dff207e971189b6fe421f426..d71c395407ca83a1f80f8348dee5fa29691e76ce 100644 --- a/platform/los_printf.c +++ b/platform/los_printf.c @@ -202,12 +202,22 @@ __attribute__ ((noinline)) VOID dprintf(const CHAR *fmt, ...) va_list ap; va_start(ap, fmt); OsVprintf(fmt, ap, CONSOLE_OUTPUT); +#ifdef LOSCFG_SAVE_EXCINFO + if (OsGetSystemStatus() == OS_SYSTEM_EXC_CURR_CPU) { + WriteExcBufVa(fmt, ap); + } +#endif va_end(ap); } VOID LkDprintf(const CHAR *fmt, va_list ap) { OsVprintf(fmt, ap, CONSOLE_OUTPUT); +#ifdef LOSCFG_SAVE_EXCINFO + if (OsGetSystemStatus() == OS_SYSTEM_EXC_CURR_CPU) { + WriteExcBufVa(fmt, ap); + } +#endif } #ifdef LOSCFG_SHELL_DMESG @@ -273,6 +283,11 @@ VOID LOS_LkPrint(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt, ... va_start(ap, fmt); OsVprintf(fmt, ap, CONSOLE_OUTPUT); +#ifdef LOSCFG_SAVE_EXCINFO + if (OsGetSystemStatus() == OS_SYSTEM_EXC_CURR_CPU) { + WriteExcBufVa(fmt, ap); + } +#endif va_end(ap); } #endif