From 70f3aa1c112e949d9af8e0245af5879140adefba Mon Sep 17 00:00:00 2001 From: zhushengle Date: Tue, 27 Jul 2021 21:38:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20risc-v=20=E9=94=81=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=E5=9C=A8=E8=B0=83=E5=BA=A6=E5=90=8E=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit risc-v架构中,由于执行完mret指令之后,未将mstatus.mpie位清除, 导致锁中断后调度保存上下文信息后, 恢复上下文时误将中断打开。 Close #I42OLJ Signed-off-by: zhushengle Change-Id: Ib97b8bd0fc56bd4b2a7e5c474cb240db4e9c2419 --- kernel/arch/risc-v/riscv32/gcc/los_dispatch.S | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S b/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S index 7c4292e9..4843fa90 100644 --- a/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S +++ b/kernel/arch/risc-v/riscv32/gcc/los_dispatch.S @@ -107,14 +107,25 @@ HalTaskContextSwitch: PUSH_ALL_REG + + // clear mpie + li a2, RISCV_MSTATUS_MPIE + not a2, a2 + and a0, a0, a2 + + // get mie andi a1, a0, RISCV_MSTATUS_MIE // must be in machine mode ori a1, a1, 0x180 slli a1, a1, 0x4 or a0, a0, a1 - li a1, ~RISCV_MSTATUS_MIE - and a0, a0, a1 + + // clear mie + li a2, RISCV_MSTATUS_MIE + not a2, a2 + and a0, a0, a2 + SREG a0, 16 * REGBYTES(sp) SREG ra, 17 * REGBYTES(sp)