# HG changeset patch # User Windel Bouwman # Date 1398974958 -7200 # Node ID 34ac19044b8a3a9360320e9858795977fca1f9ca # Parent 2a970e7270e29d514e2cbca15668b5f07cc90e19 Hello world with paging in emulator diff -r 2a970e7270e2 -r 34ac19044b8a experiments/qemu_vexpress_a9/layout.ld --- a/experiments/qemu_vexpress_a9/layout.ld Thu May 01 17:40:59 2014 +0200 +++ b/experiments/qemu_vexpress_a9/layout.ld Thu May 01 22:09:18 2014 +0200 @@ -3,7 +3,7 @@ SECTIONS { - . = 0x0010000; + . = 0x010000; .startup . : { startup.o(.init) } .text : {*(.text)} . = ALIGN(0x4000); diff -r 2a970e7270e2 -r 34ac19044b8a experiments/qemu_vexpress_a9/main.c --- a/experiments/qemu_vexpress_a9/main.c Thu May 01 17:40:59 2014 +0200 +++ b/experiments/qemu_vexpress_a9/main.c Thu May 01 22:09:18 2014 +0200 @@ -1,6 +1,6 @@ -volatile unsigned int * const UART0_DR = (unsigned int *)0x10009000; +volatile unsigned int * const UART0_DR = (unsigned int *)0x109000; void print_uart0(const char *s) diff -r 2a970e7270e2 -r 34ac19044b8a experiments/qemu_vexpress_a9/make.sh --- a/experiments/qemu_vexpress_a9/make.sh Thu May 01 17:40:59 2014 +0200 +++ b/experiments/qemu_vexpress_a9/make.sh Thu May 01 22:09:18 2014 +0200 @@ -9,5 +9,6 @@ $TARGET-ld -g -T layout.ld main.o startup.o -o test.elf $TARGET-objcopy -O binary test.elf test.bin $TARGET-nm test.elf +$TARGET-objdump -x test.elf diff -r 2a970e7270e2 -r 34ac19044b8a experiments/qemu_vexpress_a9/run.sh --- a/experiments/qemu_vexpress_a9/run.sh Thu May 01 17:40:59 2014 +0200 +++ b/experiments/qemu_vexpress_a9/run.sh Thu May 01 22:09:18 2014 +0200 @@ -1,5 +1,5 @@ #!/bin/bash -qemu-system-arm -M vexpress-a9 -m 128M -kernel test.bin \ +qemu-system-arm -M vexpress-a9 -m 128M -kernel test.bin \ -serial stdio # -nographic diff -r 2a970e7270e2 -r 34ac19044b8a experiments/qemu_vexpress_a9/startup.s --- a/experiments/qemu_vexpress_a9/startup.s Thu May 01 17:40:59 2014 +0200 +++ b/experiments/qemu_vexpress_a9/startup.s Thu May 01 22:09:18 2014 +0200 @@ -3,6 +3,8 @@ .global _Reset; _Reset: + +_start: LDR sp, =stack_top ldr r2, =0x10009000 @@ -10,44 +12,44 @@ mov r1, #'1' str r1, [r2] +// Load TTBR0 and TTBR1 ldr r0, =kernel_table0 mcr p15, 0, r0, c2, c0, 1 mcr p15, 0, r0, c2, c0, 0 - mov r1, #'2' - str r1, [r2] - - mov r1, #'3' - str r1, [r2] - + // Domain 0: mov r0, #3 mcr p15, 0, r0, c3, c0, 0 - mov r1, #'4' - str r1, [r2] - + # ; Enable paging: mrc p15, 0, r0, c1, c0, 0 orr r0, r0, #1 mcr p15, 0, r0, c1, c0, 0 - mov r1, #'5' +// Change uart DR pointer (now located at 0x109000: + ldr r2, =0x109000 + mov r1, #'2' str r1, [r2] - BL start B . - - .section .padata +/* + Maybe the kernel is loaded at 0x60000000, so we need to map that to first + megabyte also... +*/ + kernel_table0: - .long 0x0402 - .rept 0xFFF + .long 0x00000000 + 0x402 // 0x00000000 # ; Identity map first 1 MB + .long 0x10000000 + 0x402 // 0x00100000 # ; second mb mapping to peripherals + + .rept 0x600 - 2 + .long 0x0 + .endr + .long 0x00000402 // 0x60000000 maps 1 MB to first MB + .rept 0x1000 - 0x601 .long 0x0 .endr - .rept 0xFFF - .long 0x0 - .endr -