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