|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH RFCv4 33/35] plat/kvm/arm: Fix x19 corruption by interrupt handler
There is a crashing when testing nginx on arm64:
[0x401015bc] trap_el1_sync+0x50/0x58
[0x4010209c] el1_sync+0x9c/0x100
[0x401169c0] _vprint+0x158/0x318
[0x40116ce0] _uk_vprintk+0x64/0x74
[0x40116d74] _uk_printk+0x84/0x90
[0x4017f2e8] netif_alloc_rxpkts+0xd0/0x1f8
[0x4010e5d0] virtio_netdev_rx_fillup+0x78/0x2a4
[0x4010f298] virtio_netdev_recv+0x20c/0x400
[0x4017eddc] uk_netdev_rx_one+0x2c8/0x2d0
[0x4017f8a4] uknetdev_input+0x158/0x348
[0x4013e5fc] _dispatcher+0x110/0x114
[0x4011d478] uk_sched_thread_exit+0/0xbc
[0x40218f44] uk_free+0x1c/0x28
[0x40219030] free+0x18/0x20
[0x4012a300] sys_write+0x17c/0x188
[0x4012dcfc] pwritev+0x6c/0xd0
[...]
Previously, x18,x19 are incorrectly restored by old _sp_. x18 can be
used/restore freely, but x19 is callee save register which can't be
corrupted.
Signed-off-by: Jia He <justin.he@xxxxxxx>
---
plat/kvm/arm/exceptions.S | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/plat/kvm/arm/exceptions.S b/plat/kvm/arm/exceptions.S
index 929d900..e0f4cb2 100644
--- a/plat/kvm/arm/exceptions.S
+++ b/plat/kvm/arm/exceptions.S
@@ -111,6 +111,7 @@
.macro LEAVE_TRAP, el
/* Mask IRQ to make sure restore would not be interrupted by IRQ */
msr daifset, #2
+
/* Restore pstate and exception status register */
ldp x22, x23, [sp, #16 * 16]
msr spsr_el1, x22
@@ -126,6 +127,7 @@
ldp x24, x25, [sp, #16 * 12]
ldp x22, x23, [sp, #16 * 11]
ldp x20, x21, [sp, #16 * 10]
+ ldp x18, x19, [sp, #16 * 9]
ldp x16, x17, [sp, #16 * 8]
ldp x14, x15, [sp, #16 * 7]
ldp x12, x13, [sp, #16 * 6]
@@ -136,6 +138,7 @@
ldp x2, x3, [sp, #16 * 1]
ldp x0, x1, [sp, #16 * 0]
+ /* x18 can be used freely */
.if \el == 0
/* Restore stack pointer for exception from EL0 */
ldr x18, [sp, #__SP_EL0_OFFSET]
@@ -147,9 +150,6 @@
.endif
add sp, sp, #__TRAP_STACK_SIZE
- /* Restore x18,x19 */
- ldp x18, x19, [sp, #16 * 9]
-
eret
.endm
--
2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |