armv6 introduced dedicated instructions for enabling/disabling
interrupts. And while those don't easily map to to mask based
enable_interrupts/disable_interrupts macros, the following switches
some of the v7 only codepaths to use them.
The pmap_activate splhigh followed by disable_interrupts looks wrong,
but that is really another diff.
Index: arm/cpuswitch7.S
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/cpuswitch7.S,v
retrieving revision 1.3
diff -u -p -r1.3 cpuswitch7.S
--- arm/cpuswitch7.S 12 Sep 2013 11:43:51 -0000 1.3
+++ arm/cpuswitch7.S 28 Jan 2015 05:54:31 -0000
@@ -94,14 +94,10 @@
* XXX: This is not necessary if the vector table is relocated.
*/
#define IRQdisableALL \
- mrs r14, cpsr ; \
- orr r14, r14, #(I32_bit | F32_bit) ; \
- msr cpsr_c, r14
+ cpsid if
#define IRQenableALL \
- mrs r14, cpsr ; \
- bic r14, r14, #(I32_bit | F32_bit) ; \
- msr cpsr_c, r14
+ cpsie if
.text
Index: arm/pmap7.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/pmap7.c,v
retrieving revision 1.18
diff -u -p -r1.18 pmap7.c
--- arm/pmap7.c 16 Nov 2014 12:30:56 -0000 1.18
+++ arm/pmap7.c 28 Jan 2015 05:54:33 -0000
@@ -2258,7 +2258,7 @@ pmap_activate(struct proc *p)
s = splhigh();
pmap_acquire_pmap_lock(pm);
- disable_interrupts(I32_bit | F32_bit);
+ __asm volatile("cpsid if");
/*
* We MUST, I repeat, MUST fix up the L1 entry corresponding
@@ -2278,7 +2278,7 @@ pmap_activate(struct proc *p)
cpu_domains(pcb->pcb_dacr);
cpu_setttb(pcb->pcb_pagedir);
- enable_interrupts(I32_bit | F32_bit);
+ __asm volatile("cpsie if");
pmap_release_pmap_lock(pm);
splx(s);