fix: risc-v 锁中断在调度后失效
risc-v架构中,由于执行完mret指令之后,未将mstatus.mpie位清除, 导致锁中断后调度保存上下文信息后, 恢复上下文时误将中断打开。 Close #I42OLJ Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: Ib97b8bd0fc56bd4b2a7e5c474cb240db4e9c2419
This commit is contained in:
parent
403d6dc428
commit
70f3aa1c11
|
@ -107,14 +107,25 @@
|
||||||
|
|
||||||
HalTaskContextSwitch:
|
HalTaskContextSwitch:
|
||||||
PUSH_ALL_REG
|
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
|
andi a1, a0, RISCV_MSTATUS_MIE
|
||||||
|
|
||||||
// must be in machine mode
|
// must be in machine mode
|
||||||
ori a1, a1, 0x180
|
ori a1, a1, 0x180
|
||||||
slli a1, a1, 0x4
|
slli a1, a1, 0x4
|
||||||
or a0, a0, a1
|
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 a0, 16 * REGBYTES(sp)
|
||||||
SREG ra, 17 * REGBYTES(sp)
|
SREG ra, 17 * REGBYTES(sp)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue