diff --git a/include/arm.h b/include/arm.h
new file mode 100644
index 0000000..699ccbc
--- /dev/null
+++ b/include/arm.h
@@ -0,0 +1,230 @@
+#pragma once
+
+/*
+ * This file is part of fastboot 3DS
+ * Copyright (C) 2017 derrek, profi200
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#if !__ASSEMBLER__
+ #include "types.h"
+#endif
+
+
+// Program status register (CPSR/SPSR)
+#define PSR_USER_MODE (16)
+#define PSR_FIQ_MODE (17)
+#define PSR_IRQ_MODE (18)
+#define PSR_SVC_MODE (19)
+#define PSR_ABORT_MODE (23)
+#define PSR_UNDEF_MODE (27)
+#define PSR_SYS_MODE (31)
+#define PSR_MODE_MASK (PSR_SYS_MODE)
+
+#define PSR_T (1<<5) // Thumb mode
+#define PSR_F (1<<6) // Interrupts (FIQ) disable flag
+#define PSR_I (1<<7) // Interrupts (IRQ) disable flag
+#define PSR_A (1<<8) // Imprecise aborts disable flag
+#define PSR_E (1<<9) // Big endian
+#define PSR_J (1<<24) // Jazelle mode
+#define PSR_Q (1<<27)
+#define PSR_V (1<<28) // Overflow flag
+#define PSR_C (1<<29) // Carry flag
+#define PSR_Z (1<<30) // Zero flag
+#define PSR_N (1<<31) // Negative flag
+#define PSR_INT_OFF (PSR_I | PSR_F) // IRQ and FIQ disabled flags
+
+
+
+#if !__ASSEMBLER__
+
+#ifdef ARM11
+
+#define __cpsid(flags) __asm__ volatile("cpsid " #flags : : : "memory");
+#define __cpsie(flags) __asm__ volatile("cpsie " #flags : : : "memory");
+
+static inline void __wfi(void)
+{
+ __asm__ volatile("wfi" : : : "memory");
+}
+
+static inline void __wfe(void)
+{
+ __asm__ volatile("wfe" : : : "memory");
+}
+
+static inline void __sev(void)
+{
+ __asm__ volatile("sev" : : : "memory");
+}
+
+static inline void __isb(void)
+{
+ // Flush Prefetch Buffer
+ __asm__ volatile("mcr p15, 0, %0, c7, c5, 4" : : "r" (0) : "memory");
+}
+
+static inline void __dsb(void)
+{
+ __asm__ volatile("mcr p15, 0, %0, c7, c10, 4" : : "r" (0) : "memory");
+}
+
+static inline void __dmb(void)
+{
+ __asm__ volatile("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory");
+}
+
+static inline u32 __getCpuId(void)
+{
+ u32 cpuId;
+ __asm__("mrc p15, 0, %0, c0, c0, 5" : "=r" (cpuId) : );
+ return cpuId & 3;
+}
+
+// Control Register
+static inline u32 __getCr(void)
+{
+ u32 cr;
+ __asm__("mrc p15, 0, %0, c1, c0, 0" : "=r" (cr) : );
+ return cr;
+}
+
+static inline void __setCr(u32 cr)
+{
+ __asm__ volatile("mcr p15, 0, %0, c1, c0, 0" : : "r" (cr) : "memory");
+}
+
+// Auxiliary Control Register
+static inline u32 __getAcr(void)
+{
+ u32 acr;
+ __asm__("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr) : );
+ return acr;
+}
+
+static inline void __setAcr(u32 acr)
+{
+ __asm__ volatile("mcr p15, 0, %0, c1, c0, 1" : : "r" (acr) : "memory");
+}
+
+// Translation Table Base Register 0
+static inline u32 __getTtbr0(void)
+{
+ u32 ttb0;
+ __asm__("mrc p15, 0, %0, c2, c0, 0" : "=r" (ttb0) : );
+ return ttb0;
+}
+
+static inline void __setTtbr0(u32 ttb0)
+{
+ __asm__ volatile("mcr p15, 0, %0, c2, c0, 0" : : "r" (ttb0) : "memory");
+}
+
+// Translation Table Base Register 1
+static inline u32 __getTtbr1(void)
+{
+ u32 ttb1;
+ __asm__("mrc p15, 0, %0, c2, c0, 1" : "=r" (ttb1) : );
+ return ttb1;
+}
+
+static inline void __setTtbr1(u32 ttb1)
+{
+ __asm__ volatile("mcr p15, 0, %0, c2, c0, 1" : : "r" (ttb1) : "memory");
+}
+
+// Translation Table Base Control Register
+static inline u32 __getTtbcr(void)
+{
+ u32 ttbcr;
+ __asm__("mrc p15, 0, %0, c2, c0, 2" : "=r" (ttbcr) : );
+ return ttbcr;
+}
+
+static inline void __setTtbcr(u32 ttbcr)
+{
+ __asm__ volatile("mcr p15, 0, %0, c2, c0, 2" : : "r" (ttbcr) : "memory");
+}
+
+// Domain Access Control Register
+static inline u32 __getDacr(void)
+{
+ u32 dacr;
+ __asm__("mrc p15, 0, %0, c3, c0, 0" : "=r" (dacr) : );
+ return dacr;
+}
+
+static inline void __setDacr(u32 dacr)
+{
+ __asm__ volatile("mcr p15, 0, %0, c3, c0, 0" : : "r" (dacr) : "memory");
+}
+
+// Context ID Register
+static inline u32 __getCidr(void)
+{
+ u32 cidr;
+ __asm__("mrc p15, 0, %0, c13, c0, 1" : "=r" (cidr) : );
+ return cidr;
+}
+
+static inline void __setCidr(u32 cidr)
+{
+ __asm__ volatile("mcr p15, 0, %0, c13, c0, 1" : : "r" (cidr) : "memory");
+}
+
+#elif ARM9
+
+static inline void __wfi(void)
+{
+ __asm__ volatile("mcr p15, 0, %0, c7, c0, 4" : : "r" (0) : "memory");
+}
+
+#endif // ifdef ARM11, elif ARM9
+
+static inline u32 __getCpsr(void)
+{
+ u32 cpsr;
+ __asm__("mrs %0, cpsr" : "=r" (cpsr) : );
+ return cpsr;
+}
+
+static inline void __setCpsr_c(u32 cpsr)
+{
+ __asm__ volatile("msr cpsr_c, %0" : : "r" (cpsr) : "memory");
+}
+
+static inline void __setCpsr(u32 cpsr)
+{
+ __asm__ volatile("msr cpsr_cxsf, %0" : : "r" (cpsr) : "memory");
+}
+
+static inline u32 __getSpsr(void)
+{
+ u32 spsr;
+ __asm__("mrs %0, spsr" : "=r" (spsr) : );
+ return spsr;
+}
+
+static inline void __setSpsr_c(u32 spsr)
+{
+ __asm__ volatile("msr spsr_c, %0" : : "r" (spsr) : "memory");
+}
+
+static inline void __setSpsr(u32 spsr)
+{
+ __asm__ volatile("msr spsr_cxsf, %0" : : "r" (spsr) : "memory");
+}
+
+#endif // if !__ASSEMBLER__
diff --git a/include/arm11/debug.h b/include/arm11/debug.h
index 96ba5ee..f5c7f70 100644
--- a/include/arm11/debug.h
+++ b/include/arm11/debug.h
@@ -30,23 +30,23 @@
// Exception tests
/*static inline regTest(void)
{
- __asm__ __volatile__("mov r0, #1\n\tmov r1, #2\n\tmov r2, #3\n\tmov r3, #4\n\tmov r4, #5\n\t"
- "mov r5, #6\n\tmov r6, #7\n\tmov r7, #8\n\tmov r8, #9\n\tmov r9, #10\n\t"
- "mov r10, #11\n\tmov r11, #12\n\tmov r12, #13\n\tmov r13, #14\n\t"
- "mov r14, #15\n\tmov r15, #16\n\t" : :);
+ __asm__ volatile("mov r0, #1\n\tmov r1, #2\n\tmov r2, #3\n\tmov r3, #4\n\tmov r4, #5\n\t"
+ "mov r5, #6\n\tmov r6, #7\n\tmov r7, #8\n\tmov r8, #9\n\tmov r9, #10\n\t"
+ "mov r10, #11\n\tmov r11, #12\n\tmov r12, #13\n\tmov r13, #14\n\t"
+ "mov r14, #15\n\tmov r15, #16\n\t" : :);
}
static inline breakpointTest(void)
{
- __asm__ __volatile__("bkpt #0xCAFE" : :);
+ __asm__ volatile("bkpt #0xCAFE" : :);
}
static inline dataAbortTest(void)
{
- __asm__ __volatile__("mov r0, #4\n\tmov r1, #0xEF\n\tstr r1, [r0]" : :);
+ __asm__ volatile("mov r0, #4\n\tmov r1, #0xEF\n\tstr r1, [r0]" : :);
}
static inline undefInstrTest(void)
{
- __asm__ __volatile__(".word 0xFFFFFFFF" : :);
+ __asm__ volatile(".word 0xFFFFFFFF" : :);
}*/
diff --git a/include/arm11/event.h b/include/arm11/event.h
deleted file mode 100644
index 19b40f2..0000000
--- a/include/arm11/event.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#pragma once
-
-/*
- * This file is part of fastboot 3DS
- * Copyright (C) 2017 derrek, profi200
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-
-
-static inline void __wfe(void)
-{
- __asm__ __volatile__("wfe" : : : "memory");
-}
-
-static inline void __sev(void)
-{
- __asm__ __volatile__("sev" : : : "memory");
-}
\ No newline at end of file
diff --git a/include/arm11/hardware/interrupt.h b/include/arm11/hardware/interrupt.h
index 78dd961..4373ac4 100644
--- a/include/arm11/hardware/interrupt.h
+++ b/include/arm11/hardware/interrupt.h
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
+#include "arm.h"
#include "types.h"
@@ -125,22 +126,14 @@
void IRQ_softwareInterrupt(Interrupt id, u8 cpuMask);
-static inline void __wfi(void)
-{
- __asm__ __volatile__("wfi" : : : "memory");
-}
-
static inline u32 enterCriticalSection(void)
{
- u32 tmp;
- __asm__("mrs %0, cpsr" : "=r" (tmp) : );
- __asm__ __volatile__("cpsid i" : : : "memory");
- return tmp & 0x80;
+ const u32 tmp = __getCpsr();
+ __cpsid(i);
+ return tmp & PSR_I;
}
static inline void leaveCriticalSection(u32 oldState)
{
- u32 tmp;
- __asm__ __volatile__("mrs %0, cpsr" : "=r" (tmp) : );
- __asm__ __volatile__("msr cpsr_c, %0" : : "r" ((tmp & ~0x80u) | oldState) : "memory");
+ __setCpsr_c((__getCpsr() & ~PSR_I) | oldState);
}
diff --git a/include/arm11/spinlock.h b/include/arm11/spinlock.h
index 3c52109..e430a27 100644
--- a/include/arm11/spinlock.h
+++ b/include/arm11/spinlock.h
@@ -25,21 +25,21 @@
static inline void spinlockLock(u32 *lock)
{
u32 tmp;
- __asm__ __volatile__("1: ldrex %0, [%1]\n"
- " teq %0, #0\n"
- " wfene\n"
- " strexeq %0, %2, [%1]\n"
- " teqeq %0, #0\n"
- " bne 1b\n"
- " mcr p15, 0, %0, c7, c10, 5" // DMB
- : "=&r" (tmp) : "r" (lock), "r" (1) : "cc", "memory");
+ __asm__ volatile("1: ldrex %0, [%1]\n"
+ " teq %0, #0\n"
+ " wfene\n"
+ " strexeq %0, %2, [%1]\n"
+ " teqeq %0, #0\n"
+ " bne 1b\n"
+ " mcr p15, 0, %0, c7, c10, 5" // DMB
+ : "=&r" (tmp) : "r" (lock), "r" (1) : "cc", "memory");
}
static inline void spinlockUnlock(u32 *lock)
{
- __asm__ __volatile__("mcr p15, 0, %0, c7, c10, 5\n" // DMB
- "str %0, [%1]\n"
- "mcr p15, 0, %0, c7, c10, 4\n" // DSB
- "sev"
- : : "r" (0), "r" (lock) : "memory");
+ __asm__ volatile("mcr p15, 0, %0, c7, c10, 5\n" // DMB
+ "str %0, [%1]\n"
+ "mcr p15, 0, %0, c7, c10, 4\n" // DSB
+ "sev"
+ : : "r" (0), "r" (lock) : "memory");
}
diff --git a/include/arm11/start.h b/include/arm11/start.h
index 064228b..53fab51 100644
--- a/include/arm11/start.h
+++ b/include/arm11/start.h
@@ -24,10 +24,3 @@
void clearMem(u32 *adr, u32 size);
void deinitCpu(void);
-
-static inline u32 getCpuId(void)
-{
- u32 cpuId;
- __asm__ __volatile__("mrc p15, 0, %0, c0, c0, 5" : "=r" (cpuId) : );
- return cpuId & 3;
-}
diff --git a/include/arm9/hardware/interrupt.h b/include/arm9/hardware/interrupt.h
index e0770e1..aa5fb43 100644
--- a/include/arm9/hardware/interrupt.h
+++ b/include/arm9/hardware/interrupt.h
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
+#include "arm.h"
#include "types.h"
@@ -83,22 +84,14 @@
void IRQ_unregisterHandler(Interrupt id);
-static inline void __wfi(void)
-{
- __asm__ __volatile__("mcr p15, 0, %0, c7, c0, 4" : : "r" (0) : "memory");
-}
-
static inline u32 enterCriticalSection(void)
{
u32 tmp;
- __asm__ __volatile__("mrs %0, cpsr" : "=r" (tmp) : );
- __asm__ __volatile__("msr cpsr_c, %0" : : "r" (tmp | 0x80) : "memory");
- return tmp & 0x80;
+ __setCpsr_c((tmp = __getCpsr()) | PSR_I);
+ return tmp & PSR_I;
}
static inline void leaveCriticalSection(u32 oldState)
{
- u32 tmp;
- __asm__ __volatile__("mrs %0, cpsr" : "=r" (tmp) : );
- __asm__ __volatile__("msr cpsr_c, %0" : : "r" ((tmp & ~0x80u) | oldState) : "memory");
+ __setCpsr_c((__getCpsr() & ~PSR_I) | oldState);
}
diff --git a/source/arm11/debug.c b/source/arm11/debug.c
index 858c20b..bae56d9 100644
--- a/source/arm11/debug.c
+++ b/source/arm11/debug.c
@@ -27,6 +27,7 @@
#include "ipc_handler.h"
#include "hardware/gfx.h"
#include "arm11/hardware/interrupt.h"
+#include "arm.h"
#include "arm11/hardware/mcu.h"
#include "arm11/hardware/hid.h"
diff --git a/source/arm11/firm.c b/source/arm11/firm.c
index a04a939..19f8f96 100644
--- a/source/arm11/firm.c
+++ b/source/arm11/firm.c
@@ -70,7 +70,7 @@
deinitCpu();
// Change sp to a safe location
- __asm__ __volatile__("mov sp, %0" : : "r" (A11_STUB_ENTRY) : "sp");
+ __asm__ volatile("mov sp, %0" : : "r" (A11_STUB_ENTRY) : "sp");
((void (*)(void))A11_STUB_ENTRY)();
while(1);
}
diff --git a/source/arm11/hardware/exception.s b/source/arm11/hardware/exception.s
index 50a9652..645eb98 100644
--- a/source/arm11/hardware/exception.s
+++ b/source/arm11/hardware/exception.s
@@ -16,7 +16,9 @@
* along with this program. If not, see .
*/
+#include "arm.h"
#include "asmfunc.h"
+#include "mem_map.h"
.arm
.cpu mpcore
@@ -29,21 +31,21 @@
ASM_FUNC undefInstrHandler
- msr cpsr_f, #(0<<29) @ Abuse conditional flags in cpsr for temporary exception type storage
+ msr cpsr_f, #0<<29 @ Abuse conditional flags in cpsr for temporary exception type storage
b exceptionHandler
ASM_FUNC prefetchAbortHandler
- msr cpsr_f, #(1<<29)
+ msr cpsr_f, #1<<29
b exceptionHandler
ASM_FUNC dataAbortHandler
- msr cpsr_f, #(2<<29)
+ msr cpsr_f, #2<<29
ASM_FUNC exceptionHandler
sub sp, #68
stmia sp, {r0-r14}^ @ Save all user/system mode regs except pc
mrs r2, spsr @ Get saved cpsr
mrs r3, cpsr
lsr r0, r3, #29 @ Get back the exception type from cpsr
- and r1, r2, #0x1F
- cmp r1, #0x10 @ User mode
+ and r1, r2, #PSR_MODE_MASK
+ cmp r1, #PSR_USER_MODE
beq exceptionHandler_skip_other_mode
add r4, sp, #32
msr cpsr_c, r2
@@ -63,10 +65,10 @@
ASM_FUNC irqHandler
sub lr, lr, #4
- srsfd sp!, #31 @ Store lr and spsr on system mode stack
- cps #31 @ Switch to system mode
+ srsfd sp!, #PSR_SYS_MODE @ Store lr and spsr on system mode stack
+ cps #PSR_SYS_MODE
stmfd sp!, {r0-r3, r12, lr}
- ldr r12, =0x17E00000
+ ldr r12, =MPCORE_PRIV_REG_BASE
ldr r0, [r12, #0x10C] @ REG_CPU_II_AKN
and r1, r0, #0x7F
cmp r1, #32
@@ -82,7 +84,7 @@
str r0, [sp, #-4]! @ A single ldr/str can't be interrupted
blx r3
ldr r0, [sp], #4
- ldr r12, =0x17E00000
+ ldr r12, =MPCORE_PRIV_REG_BASE
cpsid i
irqHandler_skip_processing:
str r0, [r12, #0x110] @ REG_CPU_II_EOI
diff --git a/source/arm11/hardware/gfx.c b/source/arm11/hardware/gfx.c
index 1cae2c6..b46d3a8 100644
--- a/source/arm11/hardware/gfx.c
+++ b/source/arm11/hardware/gfx.c
@@ -28,7 +28,7 @@
#include "hardware/gfx.h"
#include "arm11/hardware/mcu.h"
#include "arm11/hardware/interrupt.h"
-#include "arm11/event.h"
+#include "arm.h"
#define PDN_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x40000)
diff --git a/source/arm11/hardware/interrupt.c b/source/arm11/hardware/interrupt.c
index f3d2a03..22638db 100644
--- a/source/arm11/hardware/interrupt.c
+++ b/source/arm11/hardware/interrupt.c
@@ -20,6 +20,7 @@
#include "mem_map.h"
#include "arm11/hardware/interrupt.h"
#include "arm11/start.h"
+#include "arm.h"
#define REG_CFG11_FIQ_CNT *((vu8* )(IO_MEM_ARM9_ARM11 + 0x40000 + 0x0104))
@@ -67,7 +68,7 @@
REG_CPU_II_CNT = 0;
- if(!getCpuId())
+ if(!__getCpuId())
{
// Disable FIQs
REG_CFG11_FIQ_CNT = 1;
@@ -130,7 +131,7 @@
void IRQ_registerHandler(Interrupt id, u8 prio, u8 cpuMask, bool edgeTriggered, IrqHandler handler)
{
- const u32 cpuId = getCpuId();
+ const u32 cpuId = __getCpuId();
if(!cpuMask) cpuMask = 1u<>5] = 1u<<(id % 32);
- irqHandlerTable[(id < 32 ? 32 * getCpuId() + id : 96u + id)] = (IrqHandler)NULL;
+ irqHandlerTable[(id < 32 ? 32 * __getCpuId() + id : 96u + id)] = (IrqHandler)NULL;
leaveCriticalSection(oldState);
}
diff --git a/source/arm11/hardware/mmu.c b/source/arm11/hardware/mmu.c
index 45210c4..9a3c61e 100644
--- a/source/arm11/hardware/mmu.c
+++ b/source/arm11/hardware/mmu.c
@@ -19,7 +19,7 @@
#include "types.h"
#include "mem_map.h"
#include "arm11/start.h"
-#include "arm11/event.h"
+#include "arm.h"
#define SCU_REGS_BASE (MPCORE_PRIV_REG_BASE)
@@ -108,17 +108,17 @@
void setupMmu(void)
{
// TTBR0 address shared page table walk and outer cachable write-through, no allocate on write
- __asm__ __volatile__("mcr p15, 0, %0, c2, c0, 0" : : "r" (A11_MMU_TABLES_BASE | 0x12u));
+ __setTtbr0(A11_MMU_TABLES_BASE | 0x12);
// Use the 16 KB L1 table only
- __asm__ __volatile__("mcr p15, 0, %0, c2, c0, 2" : : "r" (0u));
+ __setTtbcr(0);
// Domain 1 = client, remaining domains all = no access
- __asm__ __volatile__("mcr p15, 0, %0, c3, c0, 0" : : "r" (4u));
+ __setDacr(4);
// Context ID Register (ASID = 0, PROCID = 0)
- __asm__ __volatile__("mcr p15, 0, %0, c13, c0, 1" : : "r" (0u));
+ __setCidr(0);
static volatile bool syncFlag = false;
- if(!getCpuId())
+ if(!__getCpuId())
{
// Clear L1 and L2 tables
clearMem((u32*)A11_MMU_TABLES_BASE, 0x4C00u);
@@ -174,28 +174,23 @@
else while(!syncFlag) __wfe();
- // Invalidate TLB (Unified TLB operation) + Data Synchronization Barrier
- __asm__ __volatile__("mcr p15, 0, %0, c8, c7, 0\n"
- "mcr p15, 0, %0, c7, c10, 4" : : "r" (0u));
+ // Invalidate TLB (Unified TLB operation)
+ __asm__ volatile("mcr p15, 0, %0, c8, c7, 0" : : "r" (0) : "memory");
+ __dsb();
- u32 tmp;
- // Modify Auxiliary Control Register
- __asm__ __volatile__("mrc p15, 0, %0, c1, c0, 1" : "=r" (tmp) : );
- tmp |= 0x6Fu; // Enable Return stack, Dynamic branch prediction, Static branch prediction,
- // Instruction folding, SMP mode: the CPU is taking part in coherency
- // and L1 parity checking
- __asm__ __volatile__("mcr p15, 0, %0, c1, c0, 1" : : "r" (tmp));
+ // Enable Return stack, Dynamic branch prediction, Static branch prediction,
+ // Instruction folding, SMP mode: the CPU is taking part in coherency
+ // and L1 parity checking
+ __setAcr(__getAcr() | 0x6F);
- // Modify Control Register
- __asm__ __volatile__("mrc p15, 0, %0, c1, c0, 0" : "=r" (tmp) : );
- tmp |= 0xC03805u; // Enable MMU, D-Cache, Program flow prediction,
- // I-Cache, high exception vectors, Unaligned data access,
- // subpage AP bits disabled
- __asm__ __volatile__("mcr p15, 0, %0, c1, c0, 0" : : "r" (tmp));
+ // Enable MMU, D-Cache, Program flow prediction,
+ // I-Cache, high exception vectors, Unaligned data access,
+ // subpage AP bits disabled
+ __setCr(__getCr() | 0xC03805);
- // Invalidate all caches + Data Synchronization Barrier
- __asm__ __volatile__("mcr p15, 0, %0, c7, c7, 0\n"
- "mcr p15, 0, %0, c7, c10, 4\n" // DSB
- "mcr p15, 0, %0, c7, c5, 4" : : "r" (0u));
+ // Invalidate Both Caches. Also flushes the branch target cache
+ __asm__ volatile("mcr p15, 0, %0, c7, c7, 0" : : "r" (0) : "memory");
+ __dsb();
+ __isb();
}
diff --git a/source/arm11/hardware/timer.c b/source/arm11/hardware/timer.c
index a31e69b..37a2343 100644
--- a/source/arm11/hardware/timer.c
+++ b/source/arm11/hardware/timer.c
@@ -21,7 +21,7 @@
#include "arm11/hardware/timer.h"
#include "arm11/hardware/interrupt.h"
#include "fb_assert.h"
-#include "arm11/event.h"
+#include "arm.h"
#define TIMER_REGS_BASE (MPCORE_PRIV_REG_BASE + 0x600)
diff --git a/source/arm11/menu/menu_util.c b/source/arm11/menu/menu_util.c
index 8fdad94..3081d6b 100644
--- a/source/arm11/menu/menu_util.c
+++ b/source/arm11/menu/menu_util.c
@@ -22,7 +22,7 @@
#include "hardware/gfx.h"
#include "arm11/hardware/hid.h"
#include "arm11/hardware/mcu.h"
-#include "arm11/hardware/interrupt.h"
+#include "arm.h"
#include "arm11/menu/menu_color.h"
#include "arm11/menu/menu_util.h"
#include "arm11/console.h"
diff --git a/source/arm11/power.c b/source/arm11/power.c
index 6e58242..6f709bf 100644
--- a/source/arm11/power.c
+++ b/source/arm11/power.c
@@ -25,6 +25,7 @@
#include "hardware/cache.h"
#include "hardware/gfx.h"
#include "hardware/pxi.h"
+#include "arm.h"
@@ -37,7 +38,7 @@
TIMER_sleepMs(400);
flushDCache();
- __asm__ __volatile__("cpsid aif" : : : "memory");
+ __cpsid(aif);
}
noreturn void power_off(void)
diff --git a/source/arm11/start.s b/source/arm11/start.s
index 304e310..b918581 100644
--- a/source/arm11/start.s
+++ b/source/arm11/start.s
@@ -16,6 +16,7 @@
* along with this program. If not, see .
*/
+#include "arm.h"
#include "mem_map.h"
.arm
@@ -74,7 +75,7 @@
_start:
- cpsid aif, #19 @ Disable all interrupts, SVC mode
+ cpsid aif, #PSR_SVC_MODE
@ Control register:
@ [29] Force AP functionality : disabled
@@ -105,15 +106,16 @@
bleq stubExceptionVectors @ Stub the vectors in AXIWRAM bootrom vectors jump to
mov sp, #0 @ unused SVC mode sp
- cps #23 @ Abort mode
- ldr sp, =A11_EXC_STACK_END
- cps #27 @ Undefined mode
- ldr sp, =A11_EXC_STACK_END
- cps #17 @ FIQ mode
+ cps #PSR_FIQ_MODE
mov sp, #0 @ Unused
- cps #18 @ IRQ mode
+ cps #PSR_IRQ_MODE
mov sp, #0 @ not needed
- cps #31 @ System mode
+ cps #PSR_ABORT_MODE
+ ldr r0, =A11_EXC_STACK_END
+ mov sp, r0
+ cps #PSR_UNDEF_MODE
+ mov sp, r0
+ cps #PSR_SYS_MODE
adr r2, _sysmode_stacks
ldr sp, [r2, r4, lsl #2]
@@ -216,7 +218,7 @@
deinitCpu:
mov r3, lr
- cpsid aif, #31 @ System mode
+ cpsid aif, #PSR_SYS_MODE
bl stubExceptionVectors
bl flushDCache
mov r2, #0
diff --git a/source/arm11/system.c b/source/arm11/system.c
index 32f45cc..6237ed3 100644
--- a/source/arm11/system.c
+++ b/source/arm11/system.c
@@ -24,6 +24,7 @@
#include "arm11/hardware/i2c.h"
#include "arm11/hardware/mcu.h"
#include "arm11/hardware/hid.h"
+#include "arm.h"
@@ -37,7 +38,7 @@
IRQ_init();
TIMER_init();
- if(!getCpuId())
+ if(!__getCpuId())
{
I2C_init();
hidInit();
@@ -52,5 +53,5 @@
((void (*)(void))0x0001004C)();
}
- __asm__ __volatile__("cpsie i" : : : "memory"); // Enables interrupts
+ __cpsie(i); // Enables interrupts
}
diff --git a/source/arm9/hardware/crypto.c b/source/arm9/hardware/crypto.c
index cdacd77..4f63c0e 100644
--- a/source/arm9/hardware/crypto.c
+++ b/source/arm9/hardware/crypto.c
@@ -23,6 +23,7 @@
#include "arm9/hardware/crypto.h"
#include "arm9/hardware/interrupt.h"
#include "arm9/hardware/ndma.h"
+#include "arm.h"
diff --git a/source/arm9/hardware/exception.s b/source/arm9/hardware/exception.s
index 02f9dda..fe74bf0 100644
--- a/source/arm9/hardware/exception.s
+++ b/source/arm9/hardware/exception.s
@@ -16,6 +16,7 @@
* along with this program. If not, see .
*/
+#include "arm.h"
#include "asmfunc.h"
#include "mem_map.h"
@@ -30,21 +31,21 @@
ASM_FUNC undefInstrHandler
- msr cpsr_f, #(0<<29) @ Abuse conditional flags in cpsr for temporary exception type storage
+ msr cpsr_f, #0<<29 @ Abuse conditional flags in cpsr for temporary exception type storage
b exceptionHandler
ASM_FUNC prefetchAbortHandler
- msr cpsr_f, #(1<<29)
+ msr cpsr_f, #1<<29
b exceptionHandler
ASM_FUNC dataAbortHandler
- msr cpsr_f, #(2<<29)
+ msr cpsr_f, #2<<29
ASM_FUNC exceptionHandler
sub sp, #68
stmia sp, {r0-r14}^ @ Save all user/system mode regs except pc
mrs r2, spsr @ Get saved cpsr
mrs r3, cpsr
lsr r0, r3, #29 @ Get back the exception type from cpsr
- and r1, r2, #0x1F
- cmp r1, #0x10 @ User mode
+ and r1, r2, #PSR_MODE_MASK
+ cmp r1, #PSR_USER_MODE
beq exceptionHandler_skip_other_mode
add r4, sp, #32
msr cpsr_c, r2
@@ -65,7 +66,7 @@
ASM_FUNC irqHandler
sub lr, lr, #4
stmfd sp!, {r0-r3, r12, lr}
- ldr r12, =0x10001000 @ REG_IRQ_IE
+ ldr r12, =IO_MEM_ARM9_ONLY + 0x1000 @ REG_IRQ_IE
ldrd r0, r1, [r12]
and r1, r0, r1
mov r3, #0x80000000
@@ -82,11 +83,11 @@
beq irqHandler_skip_processing
mrs r3, spsr
str r3, [sp, #-4]!
- msr cpsr_c, #0x5F @ System mode, IRQ enabled
+ msr cpsr_c, #PSR_F | PSR_SYS_MODE
str lr, [sp, #-4]! @ A single ldr/str can't be interrupted
blx r2
ldr lr, [sp], #4
- msr cpsr_c, #0xD2 @ IRQ mode, IRQ disabled
+ msr cpsr_c, #PSR_INT_OFF | PSR_IRQ_MODE
ldr r0, [sp], #4
msr spsr_cxsf, r0
irqHandler_skip_processing:
diff --git a/source/arm9/hardware/ndma.c b/source/arm9/hardware/ndma.c
index 9118747..3dd81da 100644
--- a/source/arm9/hardware/ndma.c
+++ b/source/arm9/hardware/ndma.c
@@ -20,6 +20,7 @@
#include "fb_assert.h"
#include "arm9/hardware/ndma.h"
#include "arm9/hardware/interrupt.h"
+#include "arm.h"
diff --git a/source/arm9/hardware/timer.c b/source/arm9/hardware/timer.c
index 2f140fd..1c9991c 100644
--- a/source/arm9/hardware/timer.c
+++ b/source/arm9/hardware/timer.c
@@ -20,6 +20,7 @@
#include "types.h"
#include "arm9/hardware/timer.h"
#include "arm9/hardware/interrupt.h"
+#include "arm.h"
#define TIMER_REGS_BASE (IO_MEM_ARM9_ONLY + 0x3000)
diff --git a/source/arm9/main.c b/source/arm9/main.c
index 5885cff..8e76da6 100644
--- a/source/arm9/main.c
+++ b/source/arm9/main.c
@@ -19,7 +19,7 @@
#include "types.h"
#include "mem_map.h"
#include "arm9/debug.h"
-#include "arm9/hardware/interrupt.h"
+#include "arm.h"
#include "arm9/firm.h"
diff --git a/source/arm9/start.s b/source/arm9/start.s
index e89e0db..6ae93f2 100644
--- a/source/arm9/start.s
+++ b/source/arm9/start.s
@@ -16,6 +16,7 @@
* along with this program. If not, see .
*/
+#include "arm.h"
#include "mem_map.h"
.arm
@@ -57,7 +58,7 @@
.word (VERS_MAJOR<<16 | VERS_MINOR)
_start:
- msr cpsr_cxsf, #0xD3 @ Disable all interrupts, SVC mode
+ msr cpsr_cxsf, #PSR_INT_OFF | PSR_SVC_MODE
@ Control register:
@ [19] ITCM load mode : disabled
@@ -82,13 +83,13 @@
bl setupTcms @ Setup and enable DTCM and ITCM
mov sp, #0 @ unused SVC mode sp
- msr cpsr_cxsf, #0xD7 @ Abort mode
- mov sp, #A9_EXC_STACK_END
- msr cpsr_cxsf, #0xDB @ Undefined mode
- mov sp, #A9_EXC_STACK_END
- msr cpsr_cxsf, #0xD2 @ IRQ mode
+ msr cpsr_cxsf, #PSR_INT_OFF | PSR_IRQ_MODE
ldr sp, =A9_IRQ_STACK_END
- msr cpsr_cxsf, #0xDF @ System mode
+ msr cpsr_cxsf, #PSR_INT_OFF | PSR_ABORT_MODE
+ mov sp, #A9_EXC_STACK_END
+ msr cpsr_cxsf, #PSR_INT_OFF | PSR_UNDEF_MODE
+ mov sp, #A9_EXC_STACK_END
+ msr cpsr_cxsf, #PSR_INT_OFF | PSR_SYS_MODE
ldr sp, =A9_STACK_END
bl setupMpu
@@ -283,7 +284,7 @@
deinitCpu:
mov r3, lr
- msr cpsr_cxsf, #0xDF @ System mode
+ msr cpsr_cxsf, #PSR_INT_OFF | PSR_SYS_MODE
@ Stub vectors to endless loops
mov r0, #A9_RAM_BASE
mov r1, #6
diff --git a/source/fb_assert.c b/source/fb_assert.c
index 392878f..e6c57f8 100644
--- a/source/fb_assert.c
+++ b/source/fb_assert.c
@@ -27,6 +27,7 @@
#include "arm11/hardware/interrupt.h"
#endif
#include "hardware/gfx.h"
+#include "arm.h"