socsvn commit: r287673 - soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm
mihai at FreeBSD.org
mihai at FreeBSD.org
Sat Jun 27 22:20:13 UTC 2015
Author: mihai
Date: Sat Jun 27 22:20:11 2015
New Revision: 287673
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287673
Log:
soc2015: mihai: bhyve-on-arm: panic in HOST when entering critical exceptions in HYP-Mode
Modified:
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h
Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S Sat Jun 27 20:39:13 2015 (r287672)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S Sat Jun 27 22:20:11 2015 (r287673)
@@ -17,11 +17,6 @@
.p2align 12
hyp_code_start:
-
-__semi_call:
- svc 0x123456
- mov pc, lr
-
ENTRY(vmm_call_hyp)
hvc #0
bx lr
@@ -120,7 +115,6 @@
orr r0, r0, r1
isb
mcr p15, 4, r0, c1, c0, 0 @ Set the new HSCTLR
-
eret
.align 5
@@ -140,50 +134,35 @@
.align
hyp_undef:
- mov r0, #SYS_WRITE0
- adr r1, und_die_str
- bl __semi_call
- mrs r0, ELR_hyp
- b loop
+ ldr r0, =und_die_str
+ mov r1, #EXCEPTION_UNDEF
+ bl handle_bad_exception
und_die_str:
- .ascii "unexpected undefined exception in Hyp mode at r0: %#08x\n"
+ .ascii "unexpected undefined exception in Hyp mode at: %#08x\n"
.align
hyp_svc:
- mov r0, #SYS_WRITE0
- adr r1, svc_die_str
- bl __semi_call
- mrs r0, ELR_hyp
- b loop
+ ldr r0, =svc_die_str
+ mov r1, #EXCEPTION_SVC
+ bl handle_bad_exception
svc_die_str:
- .ascii "unexpected HVC/SVC trap in Hyp mode at r0: %#08x\n"
-
+ .ascii "unexpected HVC/SVC trap in Hyp mode at: %#08x\n"
.align
hyp_pabt:
- mov r0, #SYS_WRITE0
- adr r1, pabt_die_str
- mov r2, lr
- bl __semi_call
-// mrs r0, ELR_hyp
-// mrc p15, 4, r1, c5, c2, 0 @ HSR (syndrome register)
-// mrc p15, 4, r2, c6, c0, 2 @ HIFAR (hyp instruction fault address)
- mov pc, r2
-# b loop
+ ldr r0, =pabt_die_str
+ mov r1, #EXCEPTION_PABT
+ bl handle_bad_exception
pabt_die_str:
- .ascii "unexpected prefetch abort in Hyp mode at r0: %#08x\n"
+ .ascii "unexpected prefetch abort in Hyp mode at: %#08x\n"
.align
hyp_dabt:
- mov r0, #SYS_WRITE0
- adr r1, dabt_die_str
- bl __semi_call
- mrs r0, ELR_hyp
- mrc p15, 4, r1, c5, c2, 0 @ HSR (syndrome register)
- mrc p15, 4, r2, c6, c0, 0 @ HDFAR (hyp data fault address)
- b loop
+ ldr r0, =dabt_die_str
+ mov r1, #EXCEPTION_DABT
+ bl handle_bad_exception
dabt_die_str:
- .ascii "unexpected data abort in Hyp mode at r0: %#08x\n"
+ .ascii "unexpected data abort in Hyp mode at: %#08x\n"
.align
hyp_hvc:
@@ -224,6 +203,27 @@
hyp_irq:
b loop
.align
+
+ENTRY(handle_bad_exception)
+ /* We have in r0 pointer to the panic string and in r1 the exception code */
+ mrrc p15, 6, r3, r2, c2 @ Read VTTBR
+ lsr r2, r2, #16
+ ands r2, r2, #0xff
+ bne guest_bad_exception
+
+ mrs r2, cpsr
+ bic r2, r2, #PSR_MODE
+ orr r2, r2, #PSR_SVC32_MODE
+ msr spsr_cxsf, r2
+ mrs r1, ELR_hyp @ We don't need anymore the exception code, we store 2nd param for panic */
+ ldr r3, =panic
+ msr ELR_hyp, r3
+ eret
+
+guest_bad_exception:
+ b loop
+END(handle_bad_exception)
+
loop:
b loop
Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h Sat Jun 27 20:39:13 2015 (r287672)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h Sat Jun 27 22:20:11 2015 (r287673)
@@ -1,5 +1,15 @@
+#ifndef _VMM_HYP_H_
+#define _VMM_HYP_H_
-#define SYS_WRITE0 4
+/* Hyp Exceptions */
+#define EXCEPTION_RESET 0
+#define EXCEPTION_UNDEF 1
+#define EXCEPTION_SVC 2
+#define EXCEPTION_PABT 3
+#define EXCEPTION_DABT 4
+#define EXCEPTION_HVC 5
+#define EXCEPTION_FIQ 6
+#define EXCEPTION_IRQ 7
#define HSR_EC_SHIFT 26
#define HSR_EC_HVC 0x12
@@ -69,5 +79,4 @@
#define HMAIR0 MAIR0
#define HMAIR1 MAIR1
-
-
+#endif
More information about the svn-soc-all
mailing list