From a7765e2a83a5e62b28afc409135018067c514691 Mon Sep 17 00:00:00 2001 From: LiteOS2021 Date: Tue, 28 Sep 2021 13:46:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8Dxtensa=E5=92=8Ccsky=20qemu?= =?UTF-8?q?=E7=89=88=E6=9C=AC=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=B7=B2=E7=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: LiteOS2021 --- kernel/BUILD.gn | 2 +- kernel/arch/csky/v2/gcc/los_context.c | 1 - kernel/arch/csky/v2/gcc/los_interrupt.c | 5 +- kernel/arch/xtensa/lx6/gcc/los_arch_context.h | 11 ++- .../arch/xtensa/lx6/gcc/los_arch_interrupt.h | 11 ++- kernel/arch/xtensa/lx6/gcc/los_arch_macro.h | 70 +++++++++++++++++-- kernel/arch/xtensa/lx6/gcc/los_arch_regs.h | 38 +++++++--- kernel/arch/xtensa/lx6/gcc/los_context.c | 31 +++++--- kernel/arch/xtensa/lx6/gcc/los_dispatch.S | 42 +++++------ kernel/arch/xtensa/lx6/gcc/los_exc.S | 18 +++-- kernel/arch/xtensa/lx6/gcc/los_interrupt.c | 2 +- kernel/arch/xtensa/lx6/gcc/los_timer.c | 38 +++++----- kernel/arch/xtensa/lx6/gcc/los_window.S | 8 +-- 13 files changed, 198 insertions(+), 79 deletions(-) diff --git a/kernel/BUILD.gn b/kernel/BUILD.gn index 0ea5d40c..81d8ea66 100644 --- a/kernel/BUILD.gn +++ b/kernel/BUILD.gn @@ -67,7 +67,7 @@ static_library("kernel") { } else { deps = [ "arch/arm/cortex-m33/gcc/NTZ:arch" ] } - } else if ("$board_cpu" == "ck802") { + } else if ("$board_cpu" == "ck802" || "$board_cpu" == "e802") { deps = [ "arch/csky/v2/gcc:arch" ] } else if ("$board_cpu" == "") { if ("$board_arch" == "rv32imac" || "$board_arch" == "rv32imafdc") { diff --git a/kernel/arch/csky/v2/gcc/los_context.c b/kernel/arch/csky/v2/gcc/los_context.c index 7bbd75ad..d79c498f 100644 --- a/kernel/arch/csky/v2/gcc/los_context.c +++ b/kernel/arch/csky/v2/gcc/los_context.c @@ -145,7 +145,6 @@ VOID HalTaskSchedule(VOID) BOOL isSwitch = OsSchedTaskSwitch(); if (isSwitch) { HalTaskContextSwitch(); - return; } LOS_IntRestore(intSave); return; diff --git a/kernel/arch/csky/v2/gcc/los_interrupt.c b/kernel/arch/csky/v2/gcc/los_interrupt.c index d0128c02..73c174b0 100644 --- a/kernel/arch/csky/v2/gcc/los_interrupt.c +++ b/kernel/arch/csky/v2/gcc/los_interrupt.c @@ -62,6 +62,7 @@ extern "C" { #define OS_USER_HWI_MIN 0 #define OS_USER_HWI_MAX (LOSCFG_PLATFORM_HWI_LIMIT - 1) +#define HWI_ALIGNSIZE 0x400 UINT32 g_intCount = 0; CHAR g_trapStackBase[OS_TRAP_STACK_SIZE]; @@ -98,7 +99,7 @@ UINT32 HalIntLock(VOID) return intSave; } -UINT32 HalIntUnlock(VOID) +UINT32 HalIntUnLock(VOID) { UINT32 intSave; __asm__ __volatile__( @@ -187,7 +188,7 @@ UINT32 HalIrqClear(UINT32 hwiNum) * @ingroup los_hwi * Hardware interrupt form mapping handling function array. */ -STATIC HWI_PROC_FUNC __attribute__((aligned(0x100))) g_hwiForm[OS_VECTOR_CNT] = {0}; +STATIC HWI_PROC_FUNC __attribute__((aligned(HWI_ALIGNSIZE))) g_hwiForm[OS_VECTOR_CNT] = {0}; #if (OS_HWI_WITH_ARG == 1) diff --git a/kernel/arch/xtensa/lx6/gcc/los_arch_context.h b/kernel/arch/xtensa/lx6/gcc/los_arch_context.h index c6814594..af67d878 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_arch_context.h +++ b/kernel/arch/xtensa/lx6/gcc/los_arch_context.h @@ -52,8 +52,15 @@ typedef struct { UINT32 lbeg; UINT32 lend; UINT32 lcount; - UINT32 temp[4]; - UINT32 res[8]; +#if (defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) + UINT32 temp; + UINT16 cpenable; + UINT16 cpstored; + UINT32 fcr; + UINT32 fsr; + UINT32 regF[16]; +#endif + UINT32 res[4]; } TaskContext; #ifdef __cplusplus diff --git a/kernel/arch/xtensa/lx6/gcc/los_arch_interrupt.h b/kernel/arch/xtensa/lx6/gcc/los_arch_interrupt.h index fb7f50be..9a2d79ed 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_arch_interrupt.h +++ b/kernel/arch/xtensa/lx6/gcc/los_arch_interrupt.h @@ -52,8 +52,15 @@ typedef struct { UINT32 lbeg; UINT32 lend; UINT32 lcount; - UINT32 temp[4]; - UINT32 res[8]; +#if (defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) + UINT32 temp; + UINT16 cpenable; + UINT16 cpstored; + UINT32 fcr; + UINT32 fsr; + UINT32 regF[16]; +#endif + UINT32 res[4]; } EXC_CONTEXT_S; #define VECTOR_START _init_start diff --git a/kernel/arch/xtensa/lx6/gcc/los_arch_macro.h b/kernel/arch/xtensa/lx6/gcc/los_arch_macro.h index e95b9a69..7e758aab 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_arch_macro.h +++ b/kernel/arch/xtensa/lx6/gcc/los_arch_macro.h @@ -38,7 +38,40 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -.macro POP_ALL_REG SP +.macro POP_ALL_REG SP PC PState +#if (defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) + l16ui a3, \SP, CONTEXT_OFF_CPENABLE + wsr a3, CPENABLE + rsync + l16ui a3, \SP, CONTEXT_OFF_CPSTORED + bbci.l a3, 0, 2f + + l32i a3, \SP, CONTEXT_OFF_FCR + wur.FCR a3 + l32i a3, \SP, CONTEXT_OFF_FSR + wur.FSR a3 + + lsi f0, \SP, CONTEXT_OFF_F0 + lsi f1, \SP, CONTEXT_OFF_F1 + lsi f2, \SP, CONTEXT_OFF_F2 + lsi f3, \SP, CONTEXT_OFF_F3 + lsi f4, \SP, CONTEXT_OFF_F4 + lsi f5, \SP, CONTEXT_OFF_F5 + lsi f6, \SP, CONTEXT_OFF_F6 + lsi f7, \SP, CONTEXT_OFF_F7 + lsi f8, \SP, CONTEXT_OFF_F8 + lsi f9, \SP, CONTEXT_OFF_F9 + lsi f10, \SP, CONTEXT_OFF_F10 + lsi f11, \SP, CONTEXT_OFF_F11 + lsi f12, \SP, CONTEXT_OFF_F12 + lsi f13, \SP, CONTEXT_OFF_F13 + lsi f14, \SP, CONTEXT_OFF_F14 + lsi f15, \SP, CONTEXT_OFF_F15 + +2: + movi a4, 0 + s16i a4, \SP, CONTEXT_OFF_CPSTORED +#endif l32i a3, \SP, CONTEXT_OFF_LBEG l32i a4, \SP, CONTEXT_OFF_LEND wsr a3, LBEG @@ -62,12 +95,11 @@ extern "C" { l32i a14, \SP, CONTEXT_OFF_A14 l32i a15, \SP, CONTEXT_OFF_A15 l32i a0, \SP, CONTEXT_OFF_PS - wsr a0, PS + wsr a0, \PState l32i a0, \SP, CONTEXT_OFF_PC - wsr a0, EPC1 + wsr a0, \PC l32i a0, \SP, CONTEXT_OFF_A0 l32i a2, \SP, CONTEXT_OFF_A2 - rsync .endm .macro PUSH_ALL_REG SP @@ -97,6 +129,36 @@ extern "C" { s32i a3, \SP, CONTEXT_OFF_LCOUNT rsr a3, PS s32i a3, \SP, CONTEXT_OFF_PS +#if (defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) + rsr a3, CPENABLE + beqz a3, 1f + s16i a3, \SP, CONTEXT_OFF_CPSTORED + s16i a3, \SP, CONTEXT_OFF_CPENABLE + + bbci.l a3, 0, 1f + rur.FCR a3 + s32i a3, \SP, CONTEXT_OFF_FCR + rur.FSR a3 + s32i a3, \SP, CONTEXT_OFF_FSR + + ssi f0, \SP, CONTEXT_OFF_F0 + ssi f1, \SP, CONTEXT_OFF_F1 + ssi f2, \SP, CONTEXT_OFF_F2 + ssi f3, \SP, CONTEXT_OFF_F3 + ssi f4, \SP, CONTEXT_OFF_F4 + ssi f5, \SP, CONTEXT_OFF_F5 + ssi f6, \SP, CONTEXT_OFF_F6 + ssi f7, \SP, CONTEXT_OFF_F7 + ssi f8, \SP, CONTEXT_OFF_F8 + ssi f9, \SP, CONTEXT_OFF_F9 + ssi f10, \SP, CONTEXT_OFF_F10 + ssi f11, \SP, CONTEXT_OFF_F11 + ssi f12, \SP, CONTEXT_OFF_F12 + ssi f13, \SP, CONTEXT_OFF_F13 + ssi f14, \SP, CONTEXT_OFF_F14 + ssi f15, \SP, CONTEXT_OFF_F15 +1: +#endif .endm #ifdef __cplusplus diff --git a/kernel/arch/xtensa/lx6/gcc/los_arch_regs.h b/kernel/arch/xtensa/lx6/gcc/los_arch_regs.h index 1b1350b4..1d730be5 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_arch_regs.h +++ b/kernel/arch/xtensa/lx6/gcc/los_arch_regs.h @@ -49,7 +49,7 @@ extern "C" { #define SPREG_PS_DEPC SPREG_PS_DEPC_MASK /* PS register -- interrupt part */ #define SPREG_PS_DI_SHIFT 3 -#define SPREG_PS_DI_MASK 0x00000008 +#define SPREG_PS_DI_MASK 0x0000000F #define SPREG_PS_DI SPREG_PS_DI_MASK #define SPREG_PS_DI_DEPC 0x0000000C /* PS register -- stack part */ @@ -115,19 +115,41 @@ extern "C" { #define CONTEXT_OFF_LBEG 84 #define CONTEXT_OFF_LEND 88 #define CONTEXT_OFF_LCOUNT 92 + +#if (defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) #define CONTEXT_OFF_TMP0 96 -#define CONTEXT_OFF_TMP1 100 -#define CONTEXT_OFF_TMP2 104 -#define CONTEXT_OFF_EXIT 108 -#define CONTEXT_SIZE 144 +#define CONTEXT_OFF_CPENABLE 100 +#define CONTEXT_OFF_CPSTORED 102 +#define CONTEXT_OFF_FCR 104 +#define CONTEXT_OFF_FSR 108 +#define CONTEXT_OFF_F0 112 +#define CONTEXT_OFF_F1 116 +#define CONTEXT_OFF_F2 120 +#define CONTEXT_OFF_F3 124 +#define CONTEXT_OFF_F4 128 +#define CONTEXT_OFF_F5 132 +#define CONTEXT_OFF_F6 136 +#define CONTEXT_OFF_F7 140 +#define CONTEXT_OFF_F8 144 +#define CONTEXT_OFF_F9 148 +#define CONTEXT_OFF_F10 152 +#define CONTEXT_OFF_F11 156 +#define CONTEXT_OFF_F12 160 +#define CONTEXT_OFF_F13 164 +#define CONTEXT_OFF_F14 168 +#define CONTEXT_OFF_F15 172 +#define CONTEXT_SIZE 192 +#else +#define CONTEXT_SIZE 112 +#endif #define EXCCAUSE_LEVEL1INTERRUPT 4 #define XTENSA_LOGREG_NUM 16 #define INDEX_OF_SP 1 #define INDEX_OF_ARGS0 6 -#define WINDOWSTARTBITS 16 -#define WINDOWBASEBITS 4 -#define WINDOWSTARTMASK ((1 << WINDOWSTARTBITS) - 1) +#define WINDOWSTARTBITS 16 +#define WINDOWBASEBITS 4 +#define WINDOWSTARTMASK ((1 << WINDOWSTARTBITS) - 1) #define WOE_ENABLE 0x40000 #define BIT_CALLINC 16 diff --git a/kernel/arch/xtensa/lx6/gcc/los_context.c b/kernel/arch/xtensa/lx6/gcc/los_context.c index c5764c4e..a2b906b5 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_context.c +++ b/kernel/arch/xtensa/lx6/gcc/los_context.c @@ -68,14 +68,28 @@ UINT32 g_stackDefault[] = { 0x00000000, /* REG_OFF_LCOUNT */ 0x00000000, /* REG_OFF_LEND */ 0x00000000, /* REG_OFF_LBEG */ - 0x00000000, /* REG_OFF_TMP */ - 0x00000000, /* REG_OFF_TMP */ - 0x00000000, /* REG_OFF_TMP */ - 0x00000000, /* REG_OFF_TMP */ - 0x00000000, /* REG_OFF_SPILL_RESERVED */ - 0x00000000, /* REG_OFF_SPILL_RESERVED */ - 0x00000000, /* REG_OFF_SPILL_RESERVED */ - 0x00000000, /* REG_OFF_SPILL_RESERVED */ +#if (defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) + 0x00000000, /* REG_OFF_TMP0 */ + 0x00000001, /* REG_OFF_CPENABLE | CONTEXT_OFF_CPSTORED */ + 0x00000000, /* REG_OFF_FCR */ + 0x00000000, /* REG_OFF_FSR */ + 0x00000000, /* REG_OFF_F0 */ + 0x00000000, /* REG_OFF_F1 */ + 0x00000000, /* REG_OFF_F2 */ + 0x00000000, /* REG_OFF_F3 */ + 0x00000000, /* REG_OFF_F4 */ + 0x00000000, /* REG_OFF_F5 */ + 0x00000000, /* REG_OFF_F6 */ + 0x00000000, /* REG_OFF_F7 */ + 0x00000000, /* REG_OFF_F8 */ + 0x00000000, /* REG_OFF_F9 */ + 0x00000000, /* REG_OFF_F10 */ + 0x00000000, /* REG_OFF_F11 */ + 0x00000000, /* REG_OFF_F12 */ + 0x00000000, /* REG_OFF_F13 */ + 0x00000000, /* REG_OFF_F14 */ + 0x00000000, /* REG_OFF_F15 */ +#endif 0x00000000, /* REG_OFF_SPILL_RESERVED */ 0x00000000, /* REG_OFF_SPILL_RESERVED */ 0x00000000, /* REG_OFF_SPILL_RESERVED */ @@ -157,7 +171,6 @@ VOID HalTaskSchedule(VOID) BOOL isSwitch = OsSchedTaskSwitch(); if (isSwitch) { HalTaskContextSwitch(); - return; } LOS_IntRestore(intSave); diff --git a/kernel/arch/xtensa/lx6/gcc/los_dispatch.S b/kernel/arch/xtensa/lx6/gcc/los_dispatch.S index c07adfcc..6711337c 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_dispatch.S +++ b/kernel/arch/xtensa/lx6/gcc/los_dispatch.S @@ -39,27 +39,27 @@ .global HalTaskContextSwitch HalTaskContextSwitch: - entry sp, 16 - addi a2, sp, -CONTEXT_SIZE - PUSH_ALL_REG a2 - call0 SaveRetAddr - beqi a3, 1, .switchdone + entry sp, 16 + addi a2, sp, -CONTEXT_SIZE + PUSH_ALL_REG a2 + call0 SaveRetAddr + beqi a3, 1, .switchdone movi a4, g_losTask l32i a5, a4, 0 /* get run task */ - s32i a2, a5, 0 /* store sp */ + s32i a2, a5, 0 /* store sp */ l32i a5, a4, 4 /* get new task */ s32i a5, a4, 0 /* run task = new task */ - l32i a4, a5, 0 /* get new sp */ + l32i a4, a5, 0 /* get new sp */ rsr a5, PS movi a3, ~(WOE_ENABLE | LEVEL_MASK) - and a2, a5, a3 + and a2, a5, a3 addi a2, a2, 3 wsr a2, PS rsync call0 SpillWindow mov a2, a4 - POP_ALL_REG a2 - rfe + POP_ALL_REG a2 EPC5 EPS5 + rfi 5 .switchdone: retw @@ -68,14 +68,14 @@ HalTaskContextSwitch: .global HakSpillWindow HakSpillWindow: - entry sp, 16 + entry sp, 32 addi a2, sp, -CONTEXT_SIZE PUSH_ALL_REG a2 rsr a5, PS movi a3, ~(WOE_ENABLE | LEVEL_MASK) /* disable woe and int */ - and a3, a5, a3 + and a3, a5, a3 addi a3, a3, LEVEL3 wsr a3, PS rsync @@ -84,10 +84,10 @@ HakSpillWindow: call0 SpillWindow l32i a5, a4, CONTEXT_OFF_PS /* restroe PS */ - wsr a5, PS + wsr a5, PS rsync - l32i a0, a4, CONTEXT_OFF_A0 - l32i a1, a4, CONTEXT_OFF_A1 + l32i a0, a4, CONTEXT_OFF_A0 + l32i a1, a4, CONTEXT_OFF_A1 retw @@ -101,7 +101,7 @@ OsStartToRun: rsr a4, PS movi a3, ~(WOE_ENABLE | LEVEL_MASK) - and a2, a4, a3 + and a2, a4, a3 addi a2, a2, LEVEL3 wsr a2, PS rsync @@ -111,8 +111,8 @@ OsStartToRun: call0 SpillWindow mov a2, a5 - POP_ALL_REG a2 - rfe + POP_ALL_REG a2 EPC5 EPS5 + rfi 5 .global SaveRetAddr .type SaveRetAddr, @function @@ -121,8 +121,8 @@ OsStartToRun: SaveRetAddr: - movi a3, 1 - s32i a3, a2, CONTEXT_OFF_A3 - s32i a0, a2, CONTEXT_OFF_PC /* save pc */ + movi a3, 1 + s32i a3, a2, CONTEXT_OFF_A3 + s32i a0, a2, CONTEXT_OFF_PC /* save pc */ movi a3, 0 ret diff --git a/kernel/arch/xtensa/lx6/gcc/los_exc.S b/kernel/arch/xtensa/lx6/gcc/los_exc.S index e9e61510..79b5ca6e 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_exc.S +++ b/kernel/arch/xtensa/lx6/gcc/los_exc.S @@ -177,7 +177,7 @@ InterruptEntry1: call4 HalInterrupt mov a2, a1 - POP_ALL_REG a2 + POP_ALL_REG a2 EPC1 PS rfe .begin literal_prefix .InterruptEntry2 @@ -294,7 +294,7 @@ UnderFlowGroup2: l32i a3, a9, 12 l32i a2, a9, 8 l32i a1, a9, 4 - l32i a0, a9, 0 + l32i a0, a9, 0 addi a9, a9, 16 addi a1, a1, -12 @@ -329,7 +329,7 @@ OverFlowGroup3: s32i a10, a0, 24 s32i a9, a0, 20 s32i a8, a0, 16 - s32i a7, a0, 12 + s32i a7, a0, 12 s32i a6, a0, 8 s32i a5, a0, 4 s32i a4, a0, 0 @@ -343,7 +343,7 @@ UnderFlowGroup3: l32i a3, a13, 12 l32i a2, a13, 8 l32i a1, a13, 4 - l32i a0, a13, 0 + l32i a0, a13, 0 addi a13, a13, 16 addi a1, a1, -12 @@ -355,8 +355,16 @@ UnderFlowGroup3: l32i a10, a0, 24 l32i a9, a0, 20 l32i a8, a0, 16 - l32i a7, a4, 12 + l32i a7, a4, 12 l32i a6, a4, 8 l32i a5, a4, 4 l32i a4, a4, 0 rfwu + +.global EnableExceptionInterface +.section .iram,"ax" +.type EnableExceptionInterface,@function +.align 4 +EnableExceptionInterface: + entry a1,16 + retw diff --git a/kernel/arch/xtensa/lx6/gcc/los_interrupt.c b/kernel/arch/xtensa/lx6/gcc/los_interrupt.c index 493e64fa..842d5428 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_interrupt.c +++ b/kernel/arch/xtensa/lx6/gcc/los_interrupt.c @@ -544,6 +544,7 @@ WEAK VOID __stack_chk_fail(VOID) **************************************************************************** */ VOID HalHwiInit(VOID) { + EnableExceptionInterface(); for (UINT32 i = 0; i < OS_HWI_MAX_NUM; i++) { g_hwiForm[i + OS_SYS_VECTOR_CNT] = HalHwiDefaultHandler; HalIrqMask(i); @@ -551,4 +552,3 @@ VOID HalHwiInit(VOID) asm volatile ("wsr %0, vecbase" : : "r"(INIT_VECTOR_START)); return; } - diff --git a/kernel/arch/xtensa/lx6/gcc/los_timer.c b/kernel/arch/xtensa/lx6/gcc/los_timer.c index dd623bb1..d7d6c642 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_timer.c +++ b/kernel/arch/xtensa/lx6/gcc/los_timer.c @@ -38,14 +38,10 @@ #include "los_sched.h" #include "los_debug.h" -#define OVERFLOW_MAX 0xFFFFFFFF - UINT32 GetCcount(VOID) { UINT32 intSave; - __asm__ __volatile__("rsr %0, ccount" : "=a"(intSave) :); - return intSave; } @@ -57,9 +53,7 @@ VOID ResetCcount(VOID) UINT32 GetCcompare(VOID) { UINT32 intSave; - __asm__ __volatile__("rsr %0, ccompare0" : "=a"(intSave) :); - return intSave; } @@ -68,12 +62,6 @@ VOID SetCcompare(UINT32 newCompareVal) __asm__ __volatile__("wsr %0, ccompare0; rsync" : : "a"(newCompareVal)); } -VOID HalUpdateTimerCmpVal(UINT32 newCompareVal) -{ - SetCcompare(newCompareVal); - ResetCcount(); -} - /* **************************************************************************** Function : HalTickStart Description : Configure Tick Interrupt Start @@ -104,8 +92,8 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER handler) g_sysClock = OS_SYS_CLOCK; g_cyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND; - SetCcompare(g_cyclesPerTick); ResetCcount(); + SetCcompare(LOSCFG_BASE_CORE_TICK_RESPONSE_MAX); __asm__ __volatile__("wsr %0, ccompare1; rsync" : : "a"(0)); __asm__ __volatile__("wsr %0, ccompare2; rsync" : : "a"(0)); @@ -116,20 +104,32 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER handler) WEAK VOID HalSysTickReload(UINT64 nextResponseTime) { - HalUpdateTimerCmpVal(nextResponseTime); + UINT32 timerL; + timerL = GetCcount(); + timerL += nextResponseTime; + SetCcompare(timerL); } WEAK UINT64 HalGetTickCycle(UINT32 *period) { - UINT32 ccount; - UINT32 intSave = LOS_IntLock(); + UINT32 tickCycleH; + UINT32 tickCycleL; + UINT32 temp; + static UINT64 tickCycle = 0; - ccount = GetCcount(); - *period = g_cyclesPerTick; + (VOID)period; + UINT32 intSave = LOS_IntLock(); + temp = tickCycle & 0xFFFFFFFF; + tickCycleH = tickCycle >> SHIFT_32_BIT; + tickCycleL = GetCcount(); + if (tickCycleL < temp) { + tickCycleH++; + } + tickCycle = (((UINT64)tickCycleH) << SHIFT_32_BIT) | tickCycleL; LOS_IntRestore(intSave); - return ccount; + return tickCycle; } WEAK VOID HalTickLock(VOID) diff --git a/kernel/arch/xtensa/lx6/gcc/los_window.S b/kernel/arch/xtensa/lx6/gcc/los_window.S index 6a94dfca..ff8309dc 100644 --- a/kernel/arch/xtensa/lx6/gcc/los_window.S +++ b/kernel/arch/xtensa/lx6/gcc/los_window.S @@ -158,13 +158,13 @@ SpillWindow: or a2, a2, a3 rsr a3, WINDOWBASE -1: - bbsi.l a2, WINDOWSTARTBITS-1, 2f +.RestoreWindowBase: + bbsi.l a2, WINDOWSTARTBITS - 1, .RestoreWindow slli a2, a2, 1 addi a3, a3, -1 - j 1b + j .RestoreWindowBase -2: +.RestoreWindow: extui a3, a3, 0, WINDOWSTARTBITS /* the original bit */ addi a3, a3, 1