Module Name:    src
Committed By:   skrll
Date:           Thu Dec 17 08:02:42 UTC 2015

Modified Files:
        src/sys/arch/arm/cortex: a9_mpsubr.S
        src/sys/arch/evbarm/rpi: rpi2_start.S

Log Message:
Check for hypervisor mode in cortex_init and exit if the cpu started
there.

Needed by latest RPI firmware.


To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/arch/arm/cortex/a9_mpsubr.S
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbarm/rpi/rpi2_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/cortex/a9_mpsubr.S
diff -u src/sys/arch/arm/cortex/a9_mpsubr.S:1.44 src/sys/arch/arm/cortex/a9_mpsubr.S:1.45
--- src/sys/arch/arm/cortex/a9_mpsubr.S:1.44	Wed Nov 25 08:39:45 2015
+++ src/sys/arch/arm/cortex/a9_mpsubr.S	Thu Dec 17 08:02:42 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: a9_mpsubr.S,v 1.44 2015/11/25 08:39:45 skrll Exp $	*/
+/*	$NetBSD: a9_mpsubr.S,v 1.45 2015/12/17 08:02:42 skrll Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -347,9 +347,26 @@ xputc:
 cortex_init:
 	mov	r10, lr				// save lr
 
-	cpsid	if, #PSR_SVC32_MODE		// SVC32 with no interrupts
-        mov	r0, #0
-        msr	spsr_sxc, r0			// set SPSR[23:8] to known value
+	/* Leave HYP mode and move into supervisor mode with IRQs/FIQs disabled. */
+	mrs	r0, cpsr
+	and	r0, r0, #(PSR_MODE)	/* Mode is in the low 5 bits of CPSR */
+	teq	r0, #(PSR_HYP32_MODE)	/* Hyp Mode? */
+	bne	1f
+
+	/* Ensure that IRQ, and FIQ will be disabled after eret */
+	mrs	r0, cpsr
+	bic	r0, r0, #(PSR_MODE)
+	orr	r0, r0, #(PSR_SVC32_MODE)
+	orr	r0, r0, #(I32_bit | F32_bit)
+	msr	spsr_cxsf, r0
+	/* Exit hypervisor mode */
+	adr	lr, 1f
+	msr	elr_hyp, lr
+	eret
+1:
+
+	mov	r0, #0
+	msr	spsr_sxc, r0			// set SPSR[23:8] to known value
 
 #if 0
 	mrc	p14, 0, r0, c0, c0, 0		// MIDR read

Index: src/sys/arch/evbarm/rpi/rpi2_start.S
diff -u src/sys/arch/evbarm/rpi/rpi2_start.S:1.2 src/sys/arch/evbarm/rpi/rpi2_start.S:1.3
--- src/sys/arch/evbarm/rpi/rpi2_start.S:1.2	Sat Apr 18 11:03:31 2015
+++ src/sys/arch/evbarm/rpi/rpi2_start.S	Thu Dec 17 08:02:42 2015
@@ -38,7 +38,7 @@
 
 #include "assym.h"
 
-RCSID("$NetBSD: rpi2_start.S,v 1.2 2015/04/18 11:03:31 skrll Exp $")
+RCSID("$NetBSD: rpi2_start.S,v 1.3 2015/12/17 08:02:42 skrll Exp $")
 
 #if defined(VERBOSE_INIT_ARM)
 #define	XPUTC(n)	mov r0, n; bl plputc
@@ -78,11 +78,6 @@ _C_LABEL(rpi_start):
 #ifdef __ARMEB__
 	setend	be			/* force big endian */
 #endif
-	mov	r9, #0
-
-	/* Move into supervisor mode and disable IRQs/FIQs. */
-	cpsid	if, #PSR_SVC32_MODE
-
 	/*
 	 * Save any arguments passed to us.
 	 */
@@ -101,7 +96,7 @@ _C_LABEL(rpi_start):
 	stmia	r4, {r0-r3}		// Save the arguments
 
 	/*
-	 * Turn on the SMP bit
+	 * Setup the CPU
 	 */
 	bl	cortex_init
 

Reply via email to