ldr r4, =SyscallHandler
blx r4
- ldr r0, =csSyscallPrintRetAddr
- ldr r1, [sp,#9*4+5*4]
- ldr r4, =Log
- blx r4
+@ ldr r0, =csSyscallPrintRetAddr
+@ ldr r1, [sp,#9*4+5*4]
+@ ldr r4, =Log
+@ blx r4
pop {r2} @ errno
pop {r0,r1} @ Ret/RetHi
PUSH_GPRS
- ldr r0, =csIRQ_Tag
- ldr r1, =csIRQ_Fmt
- ldr r4, =Log_Debug
- blx r4
+@ ldr r0, =csIRQ_Tag
+@ ldr r1, =csIRQ_Fmt
+@ ldr r4, =Log_Debug
+@ blx r4
@ Call the registered handler
ldr r0, gpIRQHandler
.globl DataAbort
DataAbort:
sub lr, #8 @ Adjust LR to the correct value
-@ srsdb sp!, #19 @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD)
+ srsdb sp!, #23 @ Switch to supervisor mode (DDI0406B D1.6.5) (actually SRSFD)
@ cpsid ifa, #19
-@ PUSH_GPRS
+ PUSH_GPRS
- mrc p15, 0, r4, c5, c0, 0 @ Read DFSR (Data Fault Address Register) to stack
- push {r4}
- mrc p15, 0, r3, c6, c0, 0 @ Read DFAR (Data Fault Address Register) into R3
- mov r2, lr
- ldr r1, =csDataAbort_Fmt
- ldr r0, =csAbort_Tag
- ldr r4, =Log_Error
+ mov r3, #0 @ not a prefetch abort
+ mrc p15, 0, r2, c5, c0, 0 @ Read DFSR (Data Fault Status Register) to R2
+ mrc p15, 0, r1, c6, c0, 0 @ Read DFAR (Data Fault Address Register) into R1
+ mov r0, lr @ PC
+ ldr r4, =MM_PageFault
blx r4
- b .
-@ POP_GPRS
-@ rfeia sp! @ Pop state (actually RFEFD)
+ POP_GPRS
+ rfeia sp! @ Pop state (actually RFEFD)
.globl PrefetchAbort
PrefetchAbort:
.long PCI_PADDR + 12*(1 << 20) + 0x402
.long PCI_PADDR + 13*(1 << 20) + 0x402
.long PCI_PADDR + 14*(1 << 20) + 0x402
- .long PCI_PADDR + 15*(1 << 20) + 0x042
+ .long PCI_PADDR + 15*(1 << 20) + 0x402
#else
.rept 16
.long 0
@ PID0 user table
.globl user_table1_map
@ User table1 data table (only the first half is needed)
-@ - Abused to provide kernel stacks in upper half
+@ - Abused to provide kernel stacks in the unused half of the table
user_table1_map: @ Size = 4KiB (only 2KiB used)
.rept 0x800/4-1
.long 0
.rept (0xF00+16)/4
.long 0
.endr
- .long hwmap_table_0 - KERNEL_BASE + (1 << 4) + 3
+ .long hwmap_table_0 - KERNEL_BASE + 0x13
.rept 0xFF8/4 - (0xF00+16)/4 - 1
.long 0
.endr
- .long kernel_table1_map - KERNEL_BASE + (1 << 4) + 3
+ .long kernel_table1_map - KERNEL_BASE + 0x13
.long kernel_exception_map - KERNEL_BASE + 0x13
@ Hardware mappings
.globl hwmap_table_0
hwmap_table_0:
- .long UART0_PADDR + (1 << 4) + 0x13 @ UART0
+ .long UART0_PADDR + 0x13 @ UART0
.rept 1024 - 1
.long 0
.endr
.rept 256-16
.long 0
.endr
- .long 0x213 @ Map first page for exceptions (Kernel RO)
- .rept 15
+ .long 0x212 @ Map first page for exceptions (Kernel RO, Execute)
+ .rept 16-1-2
.long 0
.endr
+ .long gUsertextPhysStart + 0x22 @ User .text (User RO, Kernel RW, because both is COW)
+ .long 0
.section .padata
stack: