13d8536b4Sopenharmony_ci/* 23d8536b4Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 33d8536b4Sopenharmony_ci * Copyright (c) 2020-2023 Huawei Device Co., Ltd. All rights reserved. 43d8536b4Sopenharmony_ci * 53d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 63d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met: 73d8536b4Sopenharmony_ci * 83d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 93d8536b4Sopenharmony_ci * conditions and the following disclaimer. 103d8536b4Sopenharmony_ci * 113d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 123d8536b4Sopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 133d8536b4Sopenharmony_ci * provided with the distribution. 143d8536b4Sopenharmony_ci * 153d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 163d8536b4Sopenharmony_ci * to endorse or promote products derived from this software without specific prior written 173d8536b4Sopenharmony_ci * permission. 183d8536b4Sopenharmony_ci * 193d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 203d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 213d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 223d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 233d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 243d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 253d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 263d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 273d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 283d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 293d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 303d8536b4Sopenharmony_ci */ 313d8536b4Sopenharmony_ci 323d8536b4Sopenharmony_ci#include <stdarg.h> 333d8536b4Sopenharmony_ci#include "securec.h" 343d8536b4Sopenharmony_ci#include "los_context.h" 353d8536b4Sopenharmony_ci#include "los_arch_context.h" 363d8536b4Sopenharmony_ci#include "los_arch_interrupt.h" 373d8536b4Sopenharmony_ci#include "los_debug.h" 383d8536b4Sopenharmony_ci#include "los_hook.h" 393d8536b4Sopenharmony_ci#include "los_task.h" 403d8536b4Sopenharmony_ci#include "los_sched.h" 413d8536b4Sopenharmony_ci#include "los_memory.h" 423d8536b4Sopenharmony_ci#include "los_membox.h" 433d8536b4Sopenharmony_ci 443d8536b4Sopenharmony_ci#define INT_OFFSET 6 453d8536b4Sopenharmony_ci#define PRI_OFF_PER_INT 8 463d8536b4Sopenharmony_ci#define PRI_PER_REG 4 473d8536b4Sopenharmony_ci#define PRI_OFF_IN_REG 6 483d8536b4Sopenharmony_ci#define PRI_BITS 2 493d8536b4Sopenharmony_ci#define PRI_HI 0 503d8536b4Sopenharmony_ci#define PRI_LOW 7 513d8536b4Sopenharmony_ci#define MASK_8_BITS 0xFF 523d8536b4Sopenharmony_ci#define MASK_32_BITS 0xFFFFFFFF 533d8536b4Sopenharmony_ci#define BYTES_OF_128_INT 4 543d8536b4Sopenharmony_ci 553d8536b4Sopenharmony_ciCHAR g_trapStackBase[OS_TRAP_STACK_SIZE]; 563d8536b4Sopenharmony_ci 573d8536b4Sopenharmony_ciVIC_TYPE *VIC_REG = (VIC_TYPE *)VIC_REG_BASE; 583d8536b4Sopenharmony_ci 593d8536b4Sopenharmony_ciUINT32 HalGetPsr(VOID) 603d8536b4Sopenharmony_ci{ 613d8536b4Sopenharmony_ci UINT32 intSave; 623d8536b4Sopenharmony_ci __asm__ volatile("mfcr %0, psr" : "=r" (intSave) : : "memory"); 633d8536b4Sopenharmony_ci return intSave; 643d8536b4Sopenharmony_ci} 653d8536b4Sopenharmony_ci 663d8536b4Sopenharmony_ciUINT32 HalSetVbr(UINT32 intSave) 673d8536b4Sopenharmony_ci{ 683d8536b4Sopenharmony_ci __asm__ volatile("mtcr %0, vbr" : : "r"(intSave) : "memory"); 693d8536b4Sopenharmony_ci return intSave; 703d8536b4Sopenharmony_ci} 713d8536b4Sopenharmony_ci 723d8536b4Sopenharmony_ciUINT32 ArchIntLock(VOID) 733d8536b4Sopenharmony_ci{ 743d8536b4Sopenharmony_ci UINT32 intSave; 753d8536b4Sopenharmony_ci __asm__ __volatile__( 763d8536b4Sopenharmony_ci "mfcr %0, psr \n" 773d8536b4Sopenharmony_ci "psrclr ie" 783d8536b4Sopenharmony_ci : "=r"(intSave) 793d8536b4Sopenharmony_ci : 803d8536b4Sopenharmony_ci : "memory"); 813d8536b4Sopenharmony_ci return intSave; 823d8536b4Sopenharmony_ci} 833d8536b4Sopenharmony_ci 843d8536b4Sopenharmony_ciUINT32 ArchIntUnLock(VOID) 853d8536b4Sopenharmony_ci{ 863d8536b4Sopenharmony_ci UINT32 intSave; 873d8536b4Sopenharmony_ci __asm__ __volatile__( 883d8536b4Sopenharmony_ci "mfcr %0, psr \n" 893d8536b4Sopenharmony_ci "psrset ie" 903d8536b4Sopenharmony_ci : "=r"(intSave) 913d8536b4Sopenharmony_ci : 923d8536b4Sopenharmony_ci : "memory"); 933d8536b4Sopenharmony_ci return intSave; 943d8536b4Sopenharmony_ci} 953d8536b4Sopenharmony_ci 963d8536b4Sopenharmony_ciVOID ArchIntRestore(UINT32 intSave) 973d8536b4Sopenharmony_ci{ 983d8536b4Sopenharmony_ci __asm__ __volatile__("mtcr %0, psr" : : "r"(intSave)); 993d8536b4Sopenharmony_ci} 1003d8536b4Sopenharmony_ci 1013d8536b4Sopenharmony_ciUINT32 ArchIntLocked(VOID) 1023d8536b4Sopenharmony_ci{ 1033d8536b4Sopenharmony_ci UINT32 intSave; 1043d8536b4Sopenharmony_ci __asm__ volatile("mfcr %0, psr" : "=r" (intSave) : : "memory"); 1053d8536b4Sopenharmony_ci return !(intSave & (1 << INT_OFFSET)); 1063d8536b4Sopenharmony_ci} 1073d8536b4Sopenharmony_ci 1083d8536b4Sopenharmony_ciSTATIC UINT32 HwiUnmask(HWI_HANDLE_T hwiNum) 1093d8536b4Sopenharmony_ci{ 1103d8536b4Sopenharmony_ci UINT32 intSave; 1113d8536b4Sopenharmony_ci 1123d8536b4Sopenharmony_ci intSave = LOS_IntLock(); 1133d8536b4Sopenharmony_ci VIC_REG->ISER[hwiNum / OS_SYS_VECTOR_CNT] = (UINT32)(1UL << (hwiNum % OS_SYS_VECTOR_CNT)); 1143d8536b4Sopenharmony_ci VIC_REG->ISSR[hwiNum / OS_SYS_VECTOR_CNT] = (UINT32)(1UL << (hwiNum % OS_SYS_VECTOR_CNT)); 1153d8536b4Sopenharmony_ci LOS_IntRestore(intSave); 1163d8536b4Sopenharmony_ci 1173d8536b4Sopenharmony_ci return LOS_OK; 1183d8536b4Sopenharmony_ci} 1193d8536b4Sopenharmony_ci 1203d8536b4Sopenharmony_ciSTATIC UINT32 HwiSetPriority(HWI_HANDLE_T hwiNum, UINT8 priority) 1213d8536b4Sopenharmony_ci{ 1223d8536b4Sopenharmony_ci UINT32 intSave; 1233d8536b4Sopenharmony_ci 1243d8536b4Sopenharmony_ci intSave = LOS_IntLock(); 1253d8536b4Sopenharmony_ci VIC_REG->IPR[hwiNum / PRI_PER_REG] |= (((priority << PRI_OFF_IN_REG) << (hwiNum % PRI_PER_REG)) * PRI_OFF_PER_INT); 1263d8536b4Sopenharmony_ci LOS_IntRestore(intSave); 1273d8536b4Sopenharmony_ci 1283d8536b4Sopenharmony_ci return LOS_OK; 1293d8536b4Sopenharmony_ci} 1303d8536b4Sopenharmony_ci 1313d8536b4Sopenharmony_ciSTATIC UINT32 HwiMask(HWI_HANDLE_T hwiNum) 1323d8536b4Sopenharmony_ci{ 1333d8536b4Sopenharmony_ci UINT32 intSave; 1343d8536b4Sopenharmony_ci 1353d8536b4Sopenharmony_ci intSave = LOS_IntLock(); 1363d8536b4Sopenharmony_ci VIC_REG->ICER[hwiNum / OS_SYS_VECTOR_CNT] = (UINT32)(1UL << (hwiNum % OS_SYS_VECTOR_CNT)); 1373d8536b4Sopenharmony_ci LOS_IntRestore(intSave); 1383d8536b4Sopenharmony_ci 1393d8536b4Sopenharmony_ci return LOS_OK; 1403d8536b4Sopenharmony_ci} 1413d8536b4Sopenharmony_ci 1423d8536b4Sopenharmony_ciSTATIC UINT32 HwiPending(HWI_HANDLE_T hwiNum) 1433d8536b4Sopenharmony_ci{ 1443d8536b4Sopenharmony_ci UINT32 intSave; 1453d8536b4Sopenharmony_ci 1463d8536b4Sopenharmony_ci intSave = LOS_IntLock(); 1473d8536b4Sopenharmony_ci VIC_REG->ISPR[hwiNum / OS_SYS_VECTOR_CNT] = (UINT32)(1UL << (hwiNum % OS_SYS_VECTOR_CNT)); 1483d8536b4Sopenharmony_ci LOS_IntRestore(intSave); 1493d8536b4Sopenharmony_ci 1503d8536b4Sopenharmony_ci return LOS_OK; 1513d8536b4Sopenharmony_ci} 1523d8536b4Sopenharmony_ci 1533d8536b4Sopenharmony_ciSTATIC UINT32 HwiClear(HWI_HANDLE_T hwiNum) 1543d8536b4Sopenharmony_ci{ 1553d8536b4Sopenharmony_ci VIC_REG->ICPR[hwiNum / OS_SYS_VECTOR_CNT] = (UINT32)(1UL << (hwiNum % OS_SYS_VECTOR_CNT)); 1563d8536b4Sopenharmony_ci 1573d8536b4Sopenharmony_ci return LOS_OK; 1583d8536b4Sopenharmony_ci} 1593d8536b4Sopenharmony_ci 1603d8536b4Sopenharmony_ci/* **************************************************************************** 1613d8536b4Sopenharmony_ci Function : HwiNumGet 1623d8536b4Sopenharmony_ci Description : Get an interrupt number 1633d8536b4Sopenharmony_ci Input : None 1643d8536b4Sopenharmony_ci Output : None 1653d8536b4Sopenharmony_ci Return : Interrupt Indexes number 1663d8536b4Sopenharmony_ci **************************************************************************** */ 1673d8536b4Sopenharmony_ciSTATIC UINT32 HwiNumGet(VOID) 1683d8536b4Sopenharmony_ci{ 1693d8536b4Sopenharmony_ci return (HalGetPsr() >> PSR_VEC_OFFSET) & MASK_8_BITS; 1703d8536b4Sopenharmony_ci} 1713d8536b4Sopenharmony_ci 1723d8536b4Sopenharmony_ciSTATIC UINT32 HwiCreate(HWI_HANDLE_T hwiNum, HWI_PRIOR_T hwiPrio) 1733d8536b4Sopenharmony_ci{ 1743d8536b4Sopenharmony_ci HwiSetPriority(hwiNum, (UINT8)hwiPrio); 1753d8536b4Sopenharmony_ci HwiUnmask(hwiNum); 1763d8536b4Sopenharmony_ci return LOS_OK; 1773d8536b4Sopenharmony_ci} 1783d8536b4Sopenharmony_ci 1793d8536b4Sopenharmony_ciSTATIC HwiControllerOps g_archHwiOps = { 1803d8536b4Sopenharmony_ci .enableIrq = HwiUnmask, 1813d8536b4Sopenharmony_ci .disableIrq = HwiMask, 1823d8536b4Sopenharmony_ci .setIrqPriority = HwiSetPriority, 1833d8536b4Sopenharmony_ci .getCurIrqNum = HwiNumGet, 1843d8536b4Sopenharmony_ci .triggerIrq = HwiPending, 1853d8536b4Sopenharmony_ci .clearIrq = HwiClear, 1863d8536b4Sopenharmony_ci .createIrq = HwiCreate, 1873d8536b4Sopenharmony_ci}; 1883d8536b4Sopenharmony_ci 1893d8536b4Sopenharmony_ciHwiControllerOps *ArchIntOpsGet(VOID) 1903d8536b4Sopenharmony_ci{ 1913d8536b4Sopenharmony_ci return &g_archHwiOps; 1923d8536b4Sopenharmony_ci} 1933d8536b4Sopenharmony_ci 1943d8536b4Sopenharmony_ci/* **************************************************************************** 1953d8536b4Sopenharmony_ci Function : HalInterrupt 1963d8536b4Sopenharmony_ci Description : Hardware interrupt entry function 1973d8536b4Sopenharmony_ci Input : None 1983d8536b4Sopenharmony_ci Output : None 1993d8536b4Sopenharmony_ci Return : None 2003d8536b4Sopenharmony_ci **************************************************************************** */ 2013d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT VOID HalInterrupt(VOID) 2023d8536b4Sopenharmony_ci{ 2033d8536b4Sopenharmony_ci UINT32 hwiIndex; 2043d8536b4Sopenharmony_ci UINT32 intSave; 2053d8536b4Sopenharmony_ci 2063d8536b4Sopenharmony_ci intSave = LOS_IntLock(); 2073d8536b4Sopenharmony_ci g_intCount++; 2083d8536b4Sopenharmony_ci LOS_IntRestore(intSave); 2093d8536b4Sopenharmony_ci 2103d8536b4Sopenharmony_ci hwiIndex = HwiNumGet(); 2113d8536b4Sopenharmony_ci OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex); 2123d8536b4Sopenharmony_ci 2133d8536b4Sopenharmony_ci HalPreInterruptHandler(hwiIndex); 2143d8536b4Sopenharmony_ci#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) 2153d8536b4Sopenharmony_ci if (g_hwiHandlerForm[hwiIndex].pfnHandler != 0) { 2163d8536b4Sopenharmony_ci g_hwiHandlerForm[hwiIndex].pfnHandler((VOID *)g_hwiHandlerForm[hwiIndex].pParm); 2173d8536b4Sopenharmony_ci } 2183d8536b4Sopenharmony_ci#else 2193d8536b4Sopenharmony_ci if (g_hwiHandlerForm[hwiIndex] != 0) { 2203d8536b4Sopenharmony_ci g_hwiHandlerForm[hwiIndex](); 2213d8536b4Sopenharmony_ci } 2223d8536b4Sopenharmony_ci#endif 2233d8536b4Sopenharmony_ci 2243d8536b4Sopenharmony_ci HalAftInterruptHandler(hwiIndex); 2253d8536b4Sopenharmony_ci 2263d8536b4Sopenharmony_ci OsHookCall(LOS_HOOK_TYPE_ISR_EXIT, hwiIndex); 2273d8536b4Sopenharmony_ci 2283d8536b4Sopenharmony_ci intSave = LOS_IntLock(); 2293d8536b4Sopenharmony_ci g_intCount--; 2303d8536b4Sopenharmony_ci#ifndef CPU_CK804 2313d8536b4Sopenharmony_ci HalIrqEndCheckNeedSched(); 2323d8536b4Sopenharmony_ci#endif 2333d8536b4Sopenharmony_ci LOS_IntRestore(intSave); 2343d8536b4Sopenharmony_ci} 2353d8536b4Sopenharmony_ci 2363d8536b4Sopenharmony_ciExcInfo g_excInfo = {0}; 2373d8536b4Sopenharmony_ci 2383d8536b4Sopenharmony_ci#if (LOSCFG_KERNEL_PRINTF != 0) 2393d8536b4Sopenharmony_ciSTATIC VOID OsExcTypeInfo(const ExcInfo *excInfo) 2403d8536b4Sopenharmony_ci{ 2413d8536b4Sopenharmony_ci CHAR *phaseStr[] = {"exc in init", "exc in task", "exc in hwi"}; 2423d8536b4Sopenharmony_ci 2433d8536b4Sopenharmony_ci PRINTK("Type = %d\n", excInfo->type); 2443d8536b4Sopenharmony_ci PRINTK("ThrdPid = %d\n", excInfo->thrdPid); 2453d8536b4Sopenharmony_ci PRINTK("Phase = %s\n", phaseStr[excInfo->phase]); 2463d8536b4Sopenharmony_ci PRINTK("FaultAddr = 0x%x\n", excInfo->faultAddr); 2473d8536b4Sopenharmony_ci} 2483d8536b4Sopenharmony_ci 2493d8536b4Sopenharmony_ciSTATIC VOID OsExcCurTaskInfo(const ExcInfo *excInfo) 2503d8536b4Sopenharmony_ci{ 2513d8536b4Sopenharmony_ci PRINTK("Current task info:\n"); 2523d8536b4Sopenharmony_ci if (excInfo->phase == OS_EXC_IN_TASK) { 2533d8536b4Sopenharmony_ci LosTaskCB *taskCB = OS_TCB_FROM_TID(LOS_CurTaskIDGet()); 2543d8536b4Sopenharmony_ci PRINTK("Task name = %s\n", taskCB->taskName); 2553d8536b4Sopenharmony_ci PRINTK("Task ID = %d\n", taskCB->taskID); 2563d8536b4Sopenharmony_ci PRINTK("Task SP = 0x%x\n", (UINTPTR)taskCB->stackPointer); 2573d8536b4Sopenharmony_ci PRINTK("Task ST = 0x%x\n", taskCB->topOfStack); 2583d8536b4Sopenharmony_ci PRINTK("Task SS = 0x%x\n", taskCB->stackSize); 2593d8536b4Sopenharmony_ci } else if (excInfo->phase == OS_EXC_IN_HWI) { 2603d8536b4Sopenharmony_ci PRINTK("Exception occur in interrupt phase!\n"); 2613d8536b4Sopenharmony_ci } else { 2623d8536b4Sopenharmony_ci PRINTK("Exception occur in system init phase!\n"); 2633d8536b4Sopenharmony_ci } 2643d8536b4Sopenharmony_ci} 2653d8536b4Sopenharmony_ci 2663d8536b4Sopenharmony_ciSTATIC VOID OsExcRegInfo(const ExcInfo *excInfo) 2673d8536b4Sopenharmony_ci{ 2683d8536b4Sopenharmony_ci EXC_CONTEXT_S *excContext = excInfo->context; 2693d8536b4Sopenharmony_ci PRINTK("Exception reg dump:\n"); 2703d8536b4Sopenharmony_ci PRINTK("R0 = 0x%x\n" 2713d8536b4Sopenharmony_ci "R1 = 0x%x\n" 2723d8536b4Sopenharmony_ci "R2 = 0x%x\n" 2733d8536b4Sopenharmony_ci "R3 = 0x%x\n" 2743d8536b4Sopenharmony_ci "R4 = 0x%x\n" 2753d8536b4Sopenharmony_ci "R5 = 0x%x\n" 2763d8536b4Sopenharmony_ci "R6 = 0x%x\n" 2773d8536b4Sopenharmony_ci "R7 = 0x%x\n" 2783d8536b4Sopenharmony_ci "R8 = 0x%x\n" 2793d8536b4Sopenharmony_ci "R9 = 0x%x\n" 2803d8536b4Sopenharmony_ci "R10 = 0x%x\n" 2813d8536b4Sopenharmony_ci "R11 = 0x%x\n" 2823d8536b4Sopenharmony_ci "R12 = 0x%x\n" 2833d8536b4Sopenharmony_ci "R13 = 0x%x\n" 2843d8536b4Sopenharmony_ci "R14 = 0x%x\n" 2853d8536b4Sopenharmony_ci "R15 = 0x%x\n" 2863d8536b4Sopenharmony_ci "EPSR = 0x%x\n" 2873d8536b4Sopenharmony_ci "EPC = 0x%x\n", 2883d8536b4Sopenharmony_ci excContext->R0, excContext->R1, excContext->R2, excContext->R3, excContext->R4, excContext->R5, 2893d8536b4Sopenharmony_ci excContext->R6, excContext->R7, excContext->R8, excContext->R9, excContext->R10, excContext->R11, 2903d8536b4Sopenharmony_ci excContext->R12, excContext->R13, excContext->R14, excContext->R15, excContext->EPSR, 2913d8536b4Sopenharmony_ci excContext->EPC); 2923d8536b4Sopenharmony_ci} 2933d8536b4Sopenharmony_ci 2943d8536b4Sopenharmony_ci#if (LOSCFG_KERNEL_BACKTRACE == 1) 2953d8536b4Sopenharmony_ciSTATIC VOID OsExcBackTraceInfo(const ExcInfo *excInfo) 2963d8536b4Sopenharmony_ci{ 2973d8536b4Sopenharmony_ci UINTPTR LR[LOSCFG_BACKTRACE_DEPTH] = {0}; 2983d8536b4Sopenharmony_ci UINT32 index; 2993d8536b4Sopenharmony_ci 3003d8536b4Sopenharmony_ci OsBackTraceHookCall(LR, LOSCFG_BACKTRACE_DEPTH, 0, excInfo->context->R14); 3013d8536b4Sopenharmony_ci 3023d8536b4Sopenharmony_ci PRINTK("----- backtrace start -----\n"); 3033d8536b4Sopenharmony_ci for (index = 0; index < LOSCFG_BACKTRACE_DEPTH; index++) { 3043d8536b4Sopenharmony_ci if (LR[index] == 0) { 3053d8536b4Sopenharmony_ci break; 3063d8536b4Sopenharmony_ci } 3073d8536b4Sopenharmony_ci PRINTK("backtrace %d -- lr = 0x%x\n", index, LR[index]); 3083d8536b4Sopenharmony_ci } 3093d8536b4Sopenharmony_ci PRINTK("----- backtrace end -----\n"); 3103d8536b4Sopenharmony_ci} 3113d8536b4Sopenharmony_ci#endif 3123d8536b4Sopenharmony_ci 3133d8536b4Sopenharmony_ciSTATIC VOID OsExcMemPoolCheckInfo(VOID) 3143d8536b4Sopenharmony_ci{ 3153d8536b4Sopenharmony_ci PRINTK("\r\nmemory pools check:\n"); 3163d8536b4Sopenharmony_ci#if (LOSCFG_PLATFORM_EXC == 1) 3173d8536b4Sopenharmony_ci MemInfoCB memExcInfo[OS_SYS_MEM_NUM]; 3183d8536b4Sopenharmony_ci UINT32 errCnt; 3193d8536b4Sopenharmony_ci UINT32 i; 3203d8536b4Sopenharmony_ci 3213d8536b4Sopenharmony_ci (VOID)memset_s(memExcInfo, sizeof(memExcInfo), 0, sizeof(memExcInfo)); 3223d8536b4Sopenharmony_ci 3233d8536b4Sopenharmony_ci errCnt = OsMemExcInfoGet(OS_SYS_MEM_NUM, memExcInfo); 3243d8536b4Sopenharmony_ci if (errCnt < OS_SYS_MEM_NUM) { 3253d8536b4Sopenharmony_ci errCnt += OsMemboxExcInfoGet(OS_SYS_MEM_NUM - errCnt, memExcInfo + errCnt); 3263d8536b4Sopenharmony_ci } 3273d8536b4Sopenharmony_ci 3283d8536b4Sopenharmony_ci if (errCnt == 0) { 3293d8536b4Sopenharmony_ci PRINTK("all memory pool check passed!\n"); 3303d8536b4Sopenharmony_ci return; 3313d8536b4Sopenharmony_ci } 3323d8536b4Sopenharmony_ci 3333d8536b4Sopenharmony_ci for (i = 0; i < errCnt; i++) { 3343d8536b4Sopenharmony_ci PRINTK("pool num = %d\n", i); 3353d8536b4Sopenharmony_ci PRINTK("pool type = %d\n", memExcInfo[i].type); 3363d8536b4Sopenharmony_ci PRINTK("pool addr = 0x%x\n", memExcInfo[i].startAddr); 3373d8536b4Sopenharmony_ci PRINTK("pool size = 0x%x\n", memExcInfo[i].size); 3383d8536b4Sopenharmony_ci PRINTK("pool free = 0x%x\n", memExcInfo[i].free); 3393d8536b4Sopenharmony_ci PRINTK("pool blkNum = %d\n", memExcInfo[i].blockSize); 3403d8536b4Sopenharmony_ci PRINTK("pool error node addr = 0x%x\n", memExcInfo[i].errorAddr); 3413d8536b4Sopenharmony_ci PRINTK("pool error node len = 0x%x\n", memExcInfo[i].errorLen); 3423d8536b4Sopenharmony_ci PRINTK("pool error node owner = %d\n", memExcInfo[i].errorOwner); 3433d8536b4Sopenharmony_ci } 3443d8536b4Sopenharmony_ci#endif 3453d8536b4Sopenharmony_ci UINT32 ret = LOS_MemIntegrityCheck(LOSCFG_SYS_HEAP_ADDR); 3463d8536b4Sopenharmony_ci if (ret == LOS_OK) { 3473d8536b4Sopenharmony_ci PRINTK("system heap memcheck over, all passed!\n"); 3483d8536b4Sopenharmony_ci } 3493d8536b4Sopenharmony_ci 3503d8536b4Sopenharmony_ci PRINTK("memory pool check end!\n"); 3513d8536b4Sopenharmony_ci} 3523d8536b4Sopenharmony_ci#endif 3533d8536b4Sopenharmony_ci 3543d8536b4Sopenharmony_ciSTATIC VOID OsExcInfoDisplay(const ExcInfo *excInfo) 3553d8536b4Sopenharmony_ci{ 3563d8536b4Sopenharmony_ci#if (LOSCFG_KERNEL_PRINTF != 0) 3573d8536b4Sopenharmony_ci PRINTK("*************Exception Information**************\n"); 3583d8536b4Sopenharmony_ci OsExcTypeInfo(excInfo); 3593d8536b4Sopenharmony_ci OsExcCurTaskInfo(excInfo); 3603d8536b4Sopenharmony_ci OsExcRegInfo(excInfo); 3613d8536b4Sopenharmony_ci#if (LOSCFG_KERNEL_BACKTRACE == 1) 3623d8536b4Sopenharmony_ci OsExcBackTraceInfo(excInfo); 3633d8536b4Sopenharmony_ci#endif 3643d8536b4Sopenharmony_ci OsGetAllTskInfo(); 3653d8536b4Sopenharmony_ci OsExcMemPoolCheckInfo(); 3663d8536b4Sopenharmony_ci#endif 3673d8536b4Sopenharmony_ci} 3683d8536b4Sopenharmony_ci 3693d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT VOID HalExcHandleEntry(EXC_CONTEXT_S *excBufAddr, UINT32 faultAddr) 3703d8536b4Sopenharmony_ci{ 3713d8536b4Sopenharmony_ci UINT16 tmpFlag = ((excBufAddr->EPSR >> PSR_VEC_OFFSET) & MASK_8_BITS); 3723d8536b4Sopenharmony_ci g_excInfo.nestCnt++; 3733d8536b4Sopenharmony_ci UINT32 excType = (HalGetPsr() >> PSR_VEC_OFFSET) & MASK_8_BITS; 3743d8536b4Sopenharmony_ci g_excInfo.type = excType; 3753d8536b4Sopenharmony_ci 3763d8536b4Sopenharmony_ci g_excInfo.faultAddr = faultAddr; 3773d8536b4Sopenharmony_ci 3783d8536b4Sopenharmony_ci if (g_losTask.runTask != NULL) { 3793d8536b4Sopenharmony_ci if (tmpFlag > 0) { 3803d8536b4Sopenharmony_ci g_excInfo.phase = OS_EXC_IN_HWI; 3813d8536b4Sopenharmony_ci g_excInfo.thrdPid = tmpFlag; 3823d8536b4Sopenharmony_ci } else { 3833d8536b4Sopenharmony_ci g_excInfo.phase = OS_EXC_IN_TASK; 3843d8536b4Sopenharmony_ci g_excInfo.thrdPid = g_losTask.runTask->taskID; 3853d8536b4Sopenharmony_ci } 3863d8536b4Sopenharmony_ci } else { 3873d8536b4Sopenharmony_ci g_excInfo.phase = OS_EXC_IN_INIT; 3883d8536b4Sopenharmony_ci g_excInfo.thrdPid = OS_NULL_INT; 3893d8536b4Sopenharmony_ci } 3903d8536b4Sopenharmony_ci g_excInfo.context = excBufAddr; 3913d8536b4Sopenharmony_ci 3923d8536b4Sopenharmony_ci OsDoExcHook(EXC_INTERRUPT); 3933d8536b4Sopenharmony_ci OsExcInfoDisplay(&g_excInfo); 3943d8536b4Sopenharmony_ci ArchSysExit(); 3953d8536b4Sopenharmony_ci} 3963d8536b4Sopenharmony_ci 3973d8536b4Sopenharmony_ci/* stack protector */ 3983d8536b4Sopenharmony_ciWEAK UINT32 __stack_chk_guard = 0xd00a0dff; 3993d8536b4Sopenharmony_ci 4003d8536b4Sopenharmony_ciWEAK VOID __stack_chk_fail(VOID) 4013d8536b4Sopenharmony_ci{ 4023d8536b4Sopenharmony_ci /* __builtin_return_address is a builtin function, building in gcc */ 4033d8536b4Sopenharmony_ci LOS_Panic("stack-protector: Kernel stack is corrupted in: %x\n", 4043d8536b4Sopenharmony_ci __builtin_return_address(0)); 4053d8536b4Sopenharmony_ci} 4063d8536b4Sopenharmony_ci 4073d8536b4Sopenharmony_ciWEAK void HalHwiHandleReInit(UINT32 hwiFormAddr) 4083d8536b4Sopenharmony_ci{ 4093d8536b4Sopenharmony_ci} 4103d8536b4Sopenharmony_ci 4113d8536b4Sopenharmony_ci/* **************************************************************************** 4123d8536b4Sopenharmony_ci Function : HalHwiInit 4133d8536b4Sopenharmony_ci Description : initialization of the hardware interrupt 4143d8536b4Sopenharmony_ci Input : None 4153d8536b4Sopenharmony_ci Output : None 4163d8536b4Sopenharmony_ci Return : None 4173d8536b4Sopenharmony_ci **************************************************************************** */ 4183d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT VOID HalHwiInit(VOID) 4193d8536b4Sopenharmony_ci{ 4203d8536b4Sopenharmony_ci UINT32 i; 4213d8536b4Sopenharmony_ci 4223d8536b4Sopenharmony_ci HWI_PROC_FUNC *hwiForm = (HWI_PROC_FUNC *)ArchGetHwiFrom(); 4233d8536b4Sopenharmony_ci for (i = 1; i < OS_SYS_VECTOR_CNT; i++) { 4243d8536b4Sopenharmony_ci hwiForm[i] = (HWI_PROC_FUNC)HandleEntry; 4253d8536b4Sopenharmony_ci } 4263d8536b4Sopenharmony_ci 4273d8536b4Sopenharmony_ci for (i = OS_SYS_VECTOR_CNT; i < (LOSCFG_PLATFORM_HWI_LIMIT + OS_SYS_VECTOR_CNT); i++) { 4283d8536b4Sopenharmony_ci hwiForm[i] = (HWI_PROC_FUNC)IrqEntry; 4293d8536b4Sopenharmony_ci } 4303d8536b4Sopenharmony_ci HalHwiHandleReInit((UINT32)hwiForm); 4313d8536b4Sopenharmony_ci 4323d8536b4Sopenharmony_ci HalSetVbr((UINT32)hwiForm); 4333d8536b4Sopenharmony_ci for (i = 0; i < BYTES_OF_128_INT; i++) { 4343d8536b4Sopenharmony_ci VIC_REG->IABR[i] = 0x0; 4353d8536b4Sopenharmony_ci VIC_REG->ICPR[i] = MASK_32_BITS; 4363d8536b4Sopenharmony_ci } 4373d8536b4Sopenharmony_ci return; 4383d8536b4Sopenharmony_ci} 4393d8536b4Sopenharmony_ci 440