X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farmv7%2Fstart.S;h=3f53cc2cd997a5d55af1682d07e1c35412896bea;hb=72e1657f992d917aee5c0b5ca17bf730537629d1;hp=5a8e4eb4acd331c23bf4cb70148b2e893902b694;hpb=7852cb728c839810f4de80b60ba29f29a1fcfa10;p=tpg%2Facess2.git diff --git a/Kernel/arch/armv7/start.S b/Kernel/arch/armv7/start.S index 5a8e4eb4..3f53cc2c 100644 --- a/Kernel/arch/armv7/start.S +++ b/Kernel/arch/armv7/start.S @@ -7,33 +7,57 @@ @ .section .init interrupt_vector_table: -ivt_reset: b _start @ Reset -ivt_undef: b . @ #UD -ivt_svc: b SVC_Handler @ SVC (used to be called SWI) -ivt_prefetch: b PrefetchAbort @ Prefetch abort -ivt_data: b DataAbort @ Data abort -ivt_unused: b . @ Not Used -ivt_irq: b IRQHandler @ IRQ -ivt_fiq: b . @ FIQ (Fast interrupt) +ivt_reset: b _start @ 0x00 Reset +ivt_undef: b . @ 0x04 #UD +ivt_svc: b SVC_Handler @ 0x08 SVC (used to be called SWI) +ivt_prefetch: b PrefetchAbort @ 0x0C Prefetch abort +ivt_data: b DataAbort @ 0x10 Data abort +ivt_unused: b . @ 0x14 Not Used +ivt_irq: b IRQHandler @ 0x18 IRQ +ivt_fiq: b . @ 0x1C FIQ (Fast interrupt) .globl _start _start: + ldr r2, =UART0_PADDR + mov r1, #'A' + str r1, [r2] + ldr r0, =kernel_table0-KERNEL_BASE mcr p15, 0, r0, c2, c0, 1 @ Set TTBR1 to r0 mcr p15, 0, r0, c2, c0, 0 @ Set TTBR0 to r0 too (for identity) + mov r1, #'c' + str r1, [r2] + mov r0, #1 mcr p15, 0, r0, c2, c0, 2 @ Set TTCR to 1 (50/50 split) + + mov r1, #'e' + str r1, [r2] mov r0, #3 mcr p15, 0, r0, c3, c0, 0 @ Set Domain 0 to Manager + mov r1, #'s' + str r1, [r2] + @ Enable VMSA mrc p15, 0, r0, c1, c0, 0 orr r0, r0, #1 orr r0, r0, #1 << 23 mcr p15, 0, r0, c1, c0, 0 + ldr r2, =0xF1000000 + mov r1, #'s' + str r1, [r2] + + @ Enable access faults on domains 0 & 1 + mov r0, #0x55 @ 01010101b + mcr p15, 0, r0, c3, c0, 0 + + mov r1, #'2' + str r1, [r2] + @ @ Check for security extensions @ @@ -47,6 +71,8 @@ _start: orreq r0, #0x2000 mcreq p15, 0, r0, c1, c0, 0 + mov r1, #'-' + str r1, [r2] @ Prepare for interrupts cps #18 @ IRQ Mode @@ -55,12 +81,33 @@ _start: ldr sp, =abortstack+0x1000 cps #19 - ldr sp, =0x80000000-4 @ Set up stack (top of user range) + mov r1, #'a' + str r1, [r2] + mov r1, #'r' + str r1, [r2] + mov r1, #'m' + str r1, [r2] + mov r1, #13 + str r1, [r2] + mov r1, #10 + str r1, [r2] + +.extern bss_start +.extern bss_size_div_4 +.zero_bss: + ldr r0, =bss_start + ldr r1, =bss_end + mov r3, #0 +.zero_bss_loop: + str r3, [r0],#4 + cmp r0, r1 + bls .zero_bss_loop + +.goto_c: + ldr sp, =0x80000000-8 @ Set up stack (top of user range) ldr r0, =kmain mov pc, r0 1: b 1b @ Infinite loop -_ptr_kmain: - .long kmain .comm irqstack, 0x1000 @ ; 4KiB Stack .comm abortstack, 0x1000 @ ; 4KiB Stack @@ -85,48 +132,25 @@ SVC_Handler: ldr r4, =SyscallHandler 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 add sp, #2*4 @ Saved r2/r3 - + pop {r4-r12} rfeia sp! @ Pop state (actually RFEFD) .arm_specifics: and r4, #0xFF + mov r0, r4 @ Number + mov r1, sp @ Arguments + + ldr r4, =ARMv7_int_HandleSyscalls + blx r4 -@ -@ Cache invalidation - cmp r4, #0x001 - bne 1f - @ Page align - mov r2, #0x1000 - sub r2, #1 - add r1, r2 - mvn r2, r2 - and r0, r2 - and r1, r2 - cmp r0, #0x78000000 - cmpls r1, #0x78000000 - movge r0, #-1 - movge r1, #0 - movge r2, #1 - bge .ret - -2: - cmp r0, r1 - mcrlt p15, 0, r0, c7, c5, 1 - mcrlt p15, 0, r0, c7, c6, 1 - addlt r0, #0x1000 - blt 2b - mov r0, #0 - mov r1, #0 - mov r2, #0 - b .ret -1: - mov r0, #-1 - mov r1, #0 - mov r2, #-1 -.ret: add sp, #4*4 pop {r4-r12} rfeia sp! @@ -162,22 +186,19 @@ IRQHandler: .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: @@ -194,6 +215,7 @@ PrefetchAbort: blx r4 b . +.section .rodata csIRQ_Tag: csAbort_Tag: .asciz "ARMv7" @@ -203,12 +225,14 @@ csDataAbort_Fmt: .asciz "Data Abort - %p accessed %p, DFSR=%x Unk:%x Unk:%x" csPrefetchAbort_Fmt: .asciz "Prefetch Abort at %p, IFSR=%x" +csSyscallPrintRetAddr: + .asciz "Syscall ret to %p" .section .padata .globl kernel_table0 kernel_table0: - .long 0x00000002 @ Identity map the first 1 MiB + .long 0x00000402 @ Identity map the first 1 MiB .rept 0x7FC - 1 .long 0 .endr @@ -217,30 +241,30 @@ kernel_table0: .long user_table1_map + 0x800 - KERNEL_BASE + 1 @ KStacks .long user_table1_map + 0xC00 - KERNEL_BASE + 1 @ 0x80000000 - User/Kernel split - .long 0x00000002 @ Map first 4 MiB to 2GiB - .long 0x00100002 @ - .long 0x00200002 @ - .long 0x00300002 @ + .long 0x00000402 @ Map first 4 MiB to 2GiB (KRW only) + .long 0x00100402 @ + .long 0x00200402 @ + .long 0x00300402 @ .rept 0xF00 - 0x800 - 4 .long 0 .endr #if PCI_PADDR - .long PCI_PADDR + 0*(1 << 20) + 2 @ Map PCI config space - .long PCI_PADDR + 1*(1 << 20) + 2 - .long PCI_PADDR + 2*(1 << 20) + 2 - .long PCI_PADDR + 3*(1 << 20) + 2 - .long PCI_PADDR + 4*(1 << 20) + 2 - .long PCI_PADDR + 5*(1 << 20) + 2 - .long PCI_PADDR + 6*(1 << 20) + 2 - .long PCI_PADDR + 7*(1 << 20) + 2 - .long PCI_PADDR + 8*(1 << 20) + 2 - .long PCI_PADDR + 9*(1 << 20) + 2 - .long PCI_PADDR + 10*(1 << 20) + 2 - .long PCI_PADDR + 11*(1 << 20) + 2 - .long PCI_PADDR + 12*(1 << 20) + 2 - .long PCI_PADDR + 13*(1 << 20) + 2 - .long PCI_PADDR + 14*(1 << 20) + 2 - .long PCI_PADDR + 15*(1 << 20) + 2 + .long PCI_PADDR + 0*(1 << 20) + 0x402 @ Map PCI config space + .long PCI_PADDR + 1*(1 << 20) + 0x402 + .long PCI_PADDR + 2*(1 << 20) + 0x402 + .long PCI_PADDR + 3*(1 << 20) + 0x402 + .long PCI_PADDR + 4*(1 << 20) + 0x402 + .long PCI_PADDR + 5*(1 << 20) + 0x402 + .long PCI_PADDR + 6*(1 << 20) + 0x402 + .long PCI_PADDR + 7*(1 << 20) + 0x402 + .long PCI_PADDR + 8*(1 << 20) + 0x402 + .long PCI_PADDR + 9*(1 << 20) + 0x402 + .long PCI_PADDR + 10*(1 << 20) + 0x402 + .long PCI_PADDR + 11*(1 << 20) + 0x402 + .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) + 0x402 #else .rept 16 .long 0 @@ -266,40 +290,40 @@ kernel_table0: @ 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 .endr - .long user_table1_map - KERNEL_BASE + 0x10 + 3 @ ...1FF000 = 0x7FDFF000 + .long user_table1_map - KERNEL_BASE + 0x13 @ ...1FF000 = 0x7FDFF000 @ Kernel stack zone - .long kernel_table0 + 0x0000 - KERNEL_BASE + 0x10 + 3 @ ...200000 = 0x7FE00000 - .long kernel_table0 + 0x1000 - KERNEL_BASE + 0x10 + 3 @ ...201000 = 0x7FE01000 + .long kernel_table0 + 0x0000 - KERNEL_BASE + 0x13 @ ...200000 = 0x7FE00000 + .long kernel_table0 + 0x1000 - KERNEL_BASE + 0x13 @ ...201000 = 0x7FE01000 .rept (0x800/4)-(MM_KSTACK_SIZE/0x1000)-2 .long 0 .endr #if MM_KSTACK_SIZE != 0x2000 #error Kernel stack size not changed in start.S #endif - .long stack + 0x0000 - KERNEL_BASE + 0x10 + 3 @ Kernel Stack - .long stack + 0x1000 - KERNEL_BASE + 0x10 + 3 @ + .long stack + 0x0000 - KERNEL_BASE + 0x13 @ Kernel Stack + .long stack + 0x1000 - KERNEL_BASE + 0x13 @ .globl kernel_table1_map kernel_table1_map: @ Size = 4KiB .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) + 3 @ UART0 + .long UART0_PADDR + 0x13 @ UART0 .rept 1024 - 1 .long 0 .endr @@ -313,12 +337,16 @@ kernel_exception_map: .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: .space MM_KSTACK_SIZE, 0 @ Original kernel stack +// vim: ts=8, ft=armv7 +