summaryrefslogtreecommitdiff
path: root/tb/sim/paging.S
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-12-11 14:48:08 -0600
committerAlejandro Soto <alejandro@34project.org>2022-12-16 16:27:20 -0600
commitff71bcd0c5425c168f111b8f4a92d0a90a6c9c31 (patch)
tree41190239b9220db09d8849afb6d6f6dbbc03f59b /tb/sim/paging.S
parent6fee344b754464b1fd17f7c0429e6597e51dc74d (diff)
Implement data aborts
Diffstat (limited to 'tb/sim/paging.S')
-rw-r--r--tb/sim/paging.S57
1 files changed, 34 insertions, 23 deletions
diff --git a/tb/sim/paging.S b/tb/sim/paging.S
index a2c1d14..b1dee0e 100644
--- a/tb/sim/paging.S
+++ b/tb/sim/paging.S
@@ -1,7 +1,13 @@
+.global data_abort
+data_abort:
+ mrc p15, 0, r2, c6, c0, 0
+ mrc p15, 0, r3, c5, c0, 0
+ mov pc, r4
+
.global reset
reset:
# Copy code to page 3
- ldr r0, =virtual_start
+ ldr r0, =.virtual_start
ldr r1, =0x3000
ldr r2, =256
.copy_virtual:
@@ -11,32 +17,37 @@ reset:
bne .copy_virtual
# Translation tables
- mov r0, #0x4000
- ldr r1, =0x00005001
- str r1, [r0]
+ mov r0, #0x4000
+ ldr r1, =0x00005001
+ str r1, [r0]
- mov r1, #0x5000
- ldr r2, =0x00000002
- str r2, [r1], #4
- str r2, [r1], #4
- str r2, [r1], #4
- str r2, [r1], #4
- ldr r2, =0x00003002
- str r2, [r1], #4
+ mov r1, #0x5000
+ ldr r2, =0x00000002
+ str r2, [r1], #4
+ str r2, [r1], #4
+ str r2, [r1], #4
+ str r2, [r1], #4
+ ldr r2, =0x00003002
+ str r2, [r1], #4
# Set translation base and enable MMU
- mov r1, #(1 << 0)
- mcr p15, 0, r0, c2, c0, 0
- mcr p15, 0, r1, c1, c0, 0
+ mov r1, #(1 << 0)
+ mcr p15, 0, r0, c2, c0, 0
+ mcr p15, 0, r1, c1, c0, 0
# Self-relocate to 0x2000 (mirror of 0x0000)
- ldr r1, =#(0x2000 - 4)
- add pc, pc, r1
+ ldr r1, =#(0x2000 - 4)
+ add pc, pc, r1
- # Jump to virtual_start (phys: 0x3000, virt: 0x4000)
- ldr r0, =0x01234567
- ldr pc, =0x4000
+ # Jump to .virtual_start (phys: 0x3000, virt: 0x4000)
+ ldr r0, =0x01234567
+ ldr pc, =0x4000
+ b .
-virtual_start:
- ldr r1, =0x89abcdef
- mov pc, lr
+ .virtual_start:
+ ldr r1, =0x89abcdef
+ and r6, r1, #~0xf
+ mov r4, lr
+ mov r5, lr
+ # This triggers a page fault
+ ldr r4, [r6]