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