Hi,
this diff does seem bigger than it is, because this does move the exception handler entrys from arm/exceptions.S to arm/vectors.S, while removing a round of useless indirection that was needed more before VBAR, which can be found supported even on some V6ses w/extensions(ARM11), so this is nothing new or anything that anyone should be afraid of, imo. i +Before anyone goes liek "you just broke FIQs!", no, i didn't, and depending on defines to it, the FIQs might try to get ran on .data section, which is not OK, imo., and i have some doubt that no-one has ever enabled that FIQ-support on OpenBSD/armv7, so no use-case = no fiq fix in this diff, which would likely be less than 10lines of code w/some thought. shortly; i added these +++++ to locore0.S: mcr CP15_DACR(r0) + /* set VBAR */ + ldr r0, =vectors + mcr CP15_VBAR(r0) + /* Enable MMU */ mrc CP15_SCTLR(r0) + bic r0, r0, #CPU_CONTROL_VECRELOC /* our vectors are at VBAR */ orr r0, r0, #CPU_CONTROL_MMU_ENABLE mcr CP15_SCTLR(r0) CPWAIT(r0) and removed the initialization/indirection/special-casing that did still exist for the exception handlers/vector_page/systempage. Works for me on cubieb2&wandb. -Artturi diff --git a/sys/arch/arm/arm/arm32_machdep.c b/sys/arch/arm/arm/arm32_machdep.c index 44ae69fa7f9..09b171373aa 100644 --- a/sys/arch/arm/arm/arm32_machdep.c +++ b/sys/arch/arm/arm/arm32_machdep.c @@ -115,62 +115,6 @@ void prefetch_abort_handler (trapframe_t *frame); extern void configure (void); /* - * arm32_vector_init: - * - * Initialize the vector page, and select whether or not to - * relocate the vectors. - * - * NOTE: We expect the vector page to be mapped at its expected - * destination. - */ -void -arm32_vector_init(vaddr_t va, int which) -{ - extern unsigned int page0[], page0_data[]; - unsigned int *vectors = (unsigned int *) va; - unsigned int *vectors_data = vectors + (page0_data - page0); - int vec; - - /* - * Loop through the vectors we're taking over, and copy the - * vector's insn and data word. - */ - for (vec = 0; vec < ARM_NVEC; vec++) { - if ((which & (1 << vec)) == 0) { - /* Don't want to take over this vector. */ - continue; - } - vectors[vec] = page0[vec]; - vectors_data[vec] = page0_data[vec]; - } - - /* Now sync the vectors. */ - cpu_icache_sync_range(va, (ARM_NVEC * 2) * sizeof(u_int)); - - vector_page = va; - - if (va == ARM_VECTORS_HIGH) { - /* - * Assume the MD caller knows what it's doing here, and - * really does want the vector page relocated. - * - * Note: This has to be done here (and not just in - * cpu_setup()) because the vector page needs to be - * accessible *before* main() is called. - * Think ddb(9) ... - * - * NOTE: If the CPU control register is not readable, - * this will totally fail! We'll just assume that - * any system that has high vector support has a - * readable CPU control register, for now. If we - * ever encounter one that does not, we'll have to - * rethink this. - */ - cpu_control(CPU_CONTROL_VECRELOC, CPU_CONTROL_VECRELOC); - } -} - -/* * Debug function just to park the CPU */ @@ -228,9 +172,6 @@ cpu_startup() paddr_t minaddr; paddr_t maxaddr; - /* Lock down zero page */ - vector_page_setprot(PROT_READ | PROT_EXEC); - /* * Give pmap a chance to set up a few more things now the vm * is initialised diff --git a/sys/arch/arm/arm/arm_machdep.c b/sys/arch/arm/arm/arm_machdep.c index f5871f3afb5..041507714cd 100644 --- a/sys/arch/arm/arm/arm_machdep.c +++ b/sys/arch/arm/arm/arm_machdep.c @@ -87,18 +87,6 @@ #include <machine/bus.h> /* - * The ARM architecture places the vector page at address 0. - * Later ARM architecture versions, however, allow it to be - * relocated to a high address (0xffff0000). This is primarily - * to support the Fast Context Switch Extension. - * - * This variable contains the address of the vector page. It - * defaults to 0; it only needs to be initialized if we enable - * relocated vectors. - */ -vaddr_t vector_page; - -/* * Clear registers on exec */ diff --git a/sys/arch/arm/arm/cpufunc.c b/sys/arch/arm/arm/cpufunc.c index c91108e7066..7f77d89045b 100644 --- a/sys/arch/arm/arm/cpufunc.c +++ b/sys/arch/arm/arm/cpufunc.c @@ -402,9 +402,6 @@ armv7_setup() | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_AFE; - if (vector_page == ARM_VECTORS_HIGH) - cpuctrl |= CPU_CONTROL_VECRELOC; - /* * Check for the Virtualization Extensions and enable UWXN of * those are included. diff --git a/sys/arch/arm/arm/cpufunc_asm_armv7.S b/sys/arch/arm/arm/cpufunc_asm_armv7.S index 05679df15fa..7b71652c4dc 100644 --- a/sys/arch/arm/arm/cpufunc_asm_armv7.S +++ b/sys/arch/arm/arm/cpufunc_asm_armv7.S @@ -234,10 +234,6 @@ ENTRY(armv7_context_switch) isb sy mov pc, lr -/* XXX The following macros should probably be moved to asm.h */ -#define _DATA_OBJECT(x) .globl x; .type x,_ASM_TYPE_OBJECT; x: -#define C_OBJECT(x) _DATA_OBJECT(_C_LABEL(x)) - .align 2 C_OBJECT(armv7_dcache_sets_max) .word 0 diff --git a/sys/arch/arm/arm/exception.S b/sys/arch/arm/arm/exception.S deleted file mode 100644 index f1bceac6864..00000000000 --- a/sys/arch/arm/arm/exception.S +++ /dev/null @@ -1,248 +0,0 @@ -/* $OpenBSD: exception.S,v 1.6 2016/09/21 11:33:05 kettenis Exp $ */ -/* $NetBSD: exception.S,v 1.13 2003/10/31 16:30:15 scw Exp $ */ - -/* - * Copyright (c) 1994-1997 Mark Brinicombe. - * Copyright (c) 1994 Brini. - * All rights reserved. - * - * This code is derived from software written for Brini by Mark Brinicombe - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Brini. - * 4. The name of the company nor the name of the author may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * RiscBSD kernel project - * - * exception.S - * - * Low level handlers for exception vectors - * - * Created : 24/09/94 - * - * Based on kate/display/abort.s - */ - -#include <machine/asm.h> -#include <machine/cpu.h> -#include <machine/frame.h> -#include "assym.h" - - .text - .align 2 - -AST_LOCALS - -/* - * reset_entry: - * - * Handler for Reset exception. - */ -ASENTRY_NP(reset_entry) - adr r0, Lreset_panicmsg - mov r1, lr - bl _C_LABEL(panic) - /* NOTREACHED */ -Lreset_panicmsg: - .asciz "Reset vector called, LR = 0x%08x" - .balign 4 - -/* - * swi_entry - * - * Handler for the Software Interrupt exception. - */ -ASENTRY_NP(swi_entry) - PUSHFRAME - - mov r0, sp /* Pass the frame to any function */ - bl _C_LABEL(swi_handler) /* It's a SWI ! */ - - DO_AST - PULLFRAME - movs pc, lr /* Exit */ - -/* - * prefetch_abort_entry: - * - * Handler for the Prefetch Abort exception. - */ -ASENTRY_NP(prefetch_abort_entry) -#ifdef __XSCALE__ - nop /* Make absolutely sure any pending */ - nop /* imprecise aborts have occurred. */ -#endif - sub lr, lr, #0x00000004 /* Adjust the lr */ - - PUSHFRAMEINSVC - - ldr r1, Lprefetch_abort_handler_address - adr lr, exception_exit - mov r0, sp /* pass the stack pointer as r0 */ - ldr pc, [r1] - -Lprefetch_abort_handler_address: - .word _C_LABEL(prefetch_abort_handler_address) - - .data - .global _C_LABEL(prefetch_abort_handler_address) - -_C_LABEL(prefetch_abort_handler_address): - .word abortprefetch - - .text -abortprefetch: - adr r0, abortprefetchmsg - b _C_LABEL(panic) - -abortprefetchmsg: - .asciz "abortprefetch" - .align 2 - -/* - * data_abort_entry: - * - * Handler for the Data Abort exception. - */ -ASENTRY_NP(data_abort_entry) -#ifdef __XSCALE__ - nop /* Make absolutely sure any pending */ - nop /* imprecise aborts have occurred. */ -#endif - sub lr, lr, #0x00000008 /* Adjust the lr */ - - PUSHFRAMEINSVC /* Push trap frame and switch */ - /* to SVC32 mode */ - - ldr r1, Ldata_abort_handler_address - adr lr, exception_exit - mov r0, sp /* pass the stack pointer as r0 */ - ldr pc, [r1] - -Ldata_abort_handler_address: - .word _C_LABEL(data_abort_handler_address) - - .data - .global _C_LABEL(data_abort_handler_address) -_C_LABEL(data_abort_handler_address): - .word abortdata - - .text -abortdata: - adr r0, abortdatamsg - b _C_LABEL(panic) - -abortdatamsg: - .asciz "abortdata" - .align 2 - -/* - * address_exception_entry: - * - * Handler for the Address Exception exception. - * - * NOTE: This exception isn't really used on arm32. We - * print a warning message to the console and then treat - * it like a Data Abort. - */ -ASENTRY_NP(address_exception_entry) - mrs r1, cpsr - mrs r2, spsr - mov r3, lr - adr r0, Laddress_exception_msg - bl _C_LABEL(printf) /* XXX CLOBBERS LR!! */ - b data_abort_entry -Laddress_exception_msg: - .asciz "Address Exception CPSR=0x%08x SPSR=0x%08x LR=0x%08x\n" - .balign 4 - -/* - * General exception exit handler - * (Placed here to be within range of all the references to it) - * - * It exits straight away if not returning to USR mode. - * This loops around delivering any pending ASTs. - * Interrupts are disabled at suitable points to avoid ASTs - * being posted between testing and exit to user mode. - * - * This function uses PULLFRAMEFROMSVCANDEXIT and DO_AST thus should - * only be called if the exception handler used PUSHFRAMEINSVC. - */ - -exception_exit: - DO_AST - PULLFRAMEFROMSVCANDEXIT - -/* - * undefined_entry: - * - * Handler for the Undefined Instruction exception. - * - * We indirect the undefined vector via the handler address - * in the data area. Entry to the undefined handler must - * look like direct entry from the vector. - */ -ASENTRY_NP(undefined_entry) - stmfd sp!, {r0, r1} - ldr r0, Lundefined_handler_indirection - ldr r1, [sp], #0x0004 - str r1, [r0, #0x0000] - ldr r1, [sp], #0x0004 - str r1, [r0, #0x0004] - ldmia r0, {r0, r1, pc} - -Lundefined_handler_indirection: - .word Lundefined_handler_indirection_data - -/* - * assembly bounce code for calling the kernel - * undefined instruction handler. This uses - * a standard trap frame and is called in SVC mode. - */ - -ENTRY_NP(undefinedinstruction_bounce) - PUSHFRAMEINSVC - - mov r0, sp - adr lr, exception_exit - b _C_LABEL(undefinedinstruction) - - .data - .align 2 - -/* - * Indirection data - * 2 words use for preserving r0 and r1 - * 3rd word contains the undefined handler address. - */ - -Lundefined_handler_indirection_data: - .word 0 - .word 0 - - .global _C_LABEL(undefined_handler_address) -_C_LABEL(undefined_handler_address): - .word _C_LABEL(undefinedinstruction_bounce) diff --git a/sys/arch/arm/arm/fault.c b/sys/arch/arm/arm/fault.c index 7ed4ce466b3..749119d5087 100644 --- a/sys/arch/arm/arm/fault.c +++ b/sys/arch/arm/arm/fault.c @@ -261,13 +261,15 @@ data_abort_handler(trapframe_t *tf) va = trunc_page((vaddr_t)far); /* - * It is only a kernel address space fault iff: - * 1. user == 0 and - * 2. pcb_onfault not set or - * 3. pcb_onfault set and not LDRT/LDRBT/STRT/STRBT instruction. + * It is only a kernel address space fault if: + * 1. user == 0 && + * 2. va >= VM_MIN_KERNEL_ADDRESS && ( + * 3. pcb_onfault == NULL || + * 4. *(tf->tf_pc) != LDR{B}T/STR{B}T instruction ) + * (T-suffix = load/store with privileges as unprivileged) */ - if (user == 0 && (va >= VM_MIN_KERNEL_ADDRESS || - (va < VM_MIN_ADDRESS && vector_page == ARM_VECTORS_LOW)) && + if (user == 0 && + va >= VM_MIN_KERNEL_ADDRESS && __predict_true((pcb->pcb_onfault == NULL || ((*(u_int *)tf->tf_pc) & 0x05200000) != 0x04200000))) { map = kernel_map; @@ -590,8 +592,7 @@ prefetch_abort_handler(trapframe_t *tf) p->p_addr->u_pcb.pcb_tf = tf; /* Ok validate the address, can only execute in USER space */ - if (__predict_false(far >= VM_MAXUSER_ADDRESS || - (far < VM_MIN_ADDRESS && vector_page == ARM_VECTORS_LOW))) { + if (__predict_false(far >= VM_MAXUSER_ADDRESS)) { sv.sival_ptr = (u_int32_t *)far; trapsignal(p, SIGSEGV, 0, SEGV_ACCERR, sv); goto out; diff --git a/sys/arch/arm/arm/pmap7.c b/sys/arch/arm/arm/pmap7.c index f99ee582e00..a3eb2046fa2 100644 --- a/sys/arch/arm/arm/pmap7.c +++ b/sys/arch/arm/arm/pmap7.c @@ -421,8 +421,6 @@ vaddr_t virtual_avail; vaddr_t virtual_end; vaddr_t pmap_curmaxkvaddr; -extern pv_addr_t systempage; - static __inline boolean_t pmap_is_current(pmap_t pm) { @@ -2149,6 +2147,10 @@ vector_page_setprot(int prot) { struct l2_bucket *l2b; pt_entry_t *ptep; + vaddr_t vbar, vector_page; + + __asm volatile("mrc p15, 0, %0, c12, c0, 0\n" : "=r"(vbar)); + vector_page = trunc_page(vbar); l2b = pmap_get_l2_bucket(pmap_kernel(), vector_page); KDASSERT(l2b != NULL); diff --git a/sys/arch/arm/arm/vectors.S b/sys/arch/arm/arm/vectors.S index 608335d719d..fd9f66b4066 100644 --- a/sys/arch/arm/arm/vectors.S +++ b/sys/arch/arm/arm/vectors.S @@ -34,71 +34,112 @@ #include "assym.h" #include <machine/asm.h> +#include <machine/frame.h> + + .text + .p2align 5 /* VBAR(=vector base address) has to be 32bit aligned */ /* - * These are the exception vectors copied down to page 0. - * - * Note that FIQs are special; rather than using a level of - * indirection, we actually copy the FIQ code down into the - * vector page. + * These are the exception vectors. */ +C_OBJECT(vectors) + b reset_entry + b undefined_entry + b swi_entry + b prefetch_abort_entry + b data_abort_entry + b address_exception_entry + b irq_entry + b fiqvector .text .align 2 - .global _C_LABEL(page0), _C_LABEL(page0_data), _C_LABEL(page0_end) - .global _C_LABEL(fiqvector) - -_C_LABEL(page0): - ldr pc, .Lreset_target - ldr pc, .Lundefined_target - ldr pc, .Lswi_target - ldr pc, .Lprefetch_abort_target - ldr pc, .Ldata_abort_target - ldr pc, .Laddress_exception_target - ldr pc, .Lirq_target -#ifdef __ARM_FIQ_INDIRECT - ldr pc, .Lfiq_target -#else -.Lfiqvector: - .set _C_LABEL(fiqvector), . - _C_LABEL(page0) - subs pc, lr, #4 - .org .Lfiqvector + 0x100 -#endif -_C_LABEL(page0_data): -.Lreset_target: - .word reset_entry +AST_LOCALS -.Lundefined_target: - .word undefined_entry +/* + * reset_entry in armv7/armv7/armv7_machdep.c + */ -.Lswi_target: - .word swi_entry +/* + * Handler for the Undefined Instruction exception. + */ +ASENTRY_NP(undefined_entry) + sub lr, lr, #0x00000004 /* Adjust the lr */ + PUSHFRAMEINSVC + adr lr, exception_exit + mov r0, sp /* pass the stack pointer as r0 */ + b undefinedinstruction -.Lprefetch_abort_target: - .word prefetch_abort_entry +/* + * Handler for the Software Interrupt exception. + */ +ASENTRY_NP(swi_entry) + PUSHFRAME -.Ldata_abort_target: - .word data_abort_entry + mov r0, sp /* Pass the frame to any function */ + bl swi_handler /* It's a SWI ! */ -.Laddress_exception_target: - .word address_exception_entry + DO_AST + PULLFRAME + movs pc, lr /* Exit */ -.Lirq_target: - .word irq_entry +/* + * Handler for the Prefetch Abort exception. + */ +ASENTRY_NP(prefetch_abort_entry) + sub lr, lr, #0x00000004 /* Adjust the lr */ + PUSHFRAMEINSVC -#ifdef __ARM_FIQ_INDIRECT -.Lfiq_target: - .word _C_LABEL(fiqvector) -#else - .word 0 /* pad it out */ -#endif -_C_LABEL(page0_end): + adr lr, exception_exit + mov r0, sp /* pass the stack pointer as r0 */ + b prefetch_abort_handler -#ifdef __ARM_FIQ_INDIRECT - .data - .align 2 -_C_LABEL(fiqvector): +/* + * Handler for the Data Abort exception. + */ +ASENTRY_NP(data_abort_entry) + sub lr, lr, #0x00000008 /* Adjust the lr */ + PUSHFRAMEINSVC /* Push trap frame and switch */ + /* to SVC32 mode */ + + adr lr, exception_exit + mov r0, sp /* pass the stack pointer as r0 */ + b data_abort_handler + +/* + * address_exception_entry in armv7/armv7/armv7_machdep.c + */ + +/* + * General exception exit handler + * (Placed here to be within range of all the references to it) + * + * It exits straight away if not returning to USR mode. + * This loops around delivering any pending ASTs. + * Interrupts are disabled at suitable points to avoid ASTs + * being posted between testing and exit to user mode. + * + * This function uses PULLFRAMEFROMSVCANDEXIT and DO_AST thus should + * only be called if the exception handler used PUSHFRAMEINSVC. + */ + +exception_exit: + DO_AST + PULLFRAMEFROMSVCANDEXIT + +/* + * irq_entry in arm/arm/irq_dispatch.S + */ + +/* + * Null handler copied down to the FIQ vector when the last + * FIQ handler is removed. + */ +C_OBJECT(fiq_nullhandler) + subs pc, lr, #4 +C_OBJECT(fiq_nullhandler_end) + +C_OBJECT(fiqvector) subs pc, lr, #4 - .org _C_LABEL(fiqvector) + 0x100 -#endif + .org fiqvector + 0x100 diff --git a/sys/arch/arm/arm/vm_machdep.c b/sys/arch/arm/arm/vm_machdep.c index 9b2a00a92f5..44f7c9e36c5 100644 --- a/sys/arch/arm/arm/vm_machdep.c +++ b/sys/arch/arm/arm/vm_machdep.c @@ -62,8 +62,6 @@ #include <machine/reg.h> #include <machine/vmparam.h> -extern pv_addr_t systempage; - int process_read_regs (struct proc *p, struct reg *regs); int process_read_fpregs (struct proc *p, struct fpreg *regs); diff --git a/sys/arch/arm/conf/files.arm b/sys/arch/arm/conf/files.arm index 9dae5a17689..2470f1806fc 100644 --- a/sys/arch/arm/conf/files.arm +++ b/sys/arch/arm/conf/files.arm @@ -59,7 +59,6 @@ file arch/arm/arm/arm32_machdep.c file arch/arm/arm/bus_dma.c file arch/arm/arm/cpu.c file arch/arm/arm/cpuswitch7.S cpu_armv7 -file arch/arm/arm/exception.S file arch/arm/arm/fault.c file arch/arm/arm/mem.c file arch/arm/arm/pmap7.c cpu_armv7 diff --git a/sys/arch/arm/include/asm.h b/sys/arch/arm/include/asm.h index e1e5bbc4dd2..9fea402e821 100644 --- a/sys/arch/arm/include/asm.h +++ b/sys/arch/arm/include/asm.h @@ -64,6 +64,9 @@ #define _ENTRY(x) \ .text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x: +#define _DATA_OBJECT(x) .globl x; .type x,_ASM_TYPE_OBJECT; x: +#define C_OBJECT(x) _DATA_OBJECT(x) + #if defined(PROF) || defined(GPROF) # define _PROF_PROLOGUE \ mov ip, lr; bl __mcount diff --git a/sys/arch/arm/include/cpu.h b/sys/arch/arm/include/cpu.h index 312c2f6c9c9..be52c69b035 100644 --- a/sys/arch/arm/include/cpu.h +++ b/sys/arch/arm/include/cpu.h @@ -157,10 +157,6 @@ extern int cpu_do_powersave; #define PROC_PC(p) ((p)->p_addr->u_pcb.pcb_tf->tf_pc) #define PROC_STACK(p) ((p)->p_addr->u_pcb.pcb_tf->tf_usr_sp) -/* The address of the vector page. */ -extern vaddr_t vector_page; -void arm32_vector_init(vaddr_t, int); - #define ARM_VEC_RESET (1 << 0) #define ARM_VEC_UNDEFINED (1 << 1) #define ARM_VEC_SWI (1 << 2) diff --git a/sys/arch/arm/include/frame.h b/sys/arch/arm/include/frame.h index 97382ef521c..4533fcf7481 100644 --- a/sys/arch/arm/include/frame.h +++ b/sys/arch/arm/include/frame.h @@ -171,6 +171,8 @@ struct frame { #else /* _LOCORE */ +#include <arm/armreg.h> + #define AST_LOCALS \ .Laflt_astpending: ;\ .word _C_LABEL(astpending) diff --git a/sys/arch/armv7/armv7/armv7_machdep.c b/sys/arch/armv7/armv7/armv7_machdep.c index aa1c549b29b..22c235a0d2a 100644 --- a/sys/arch/armv7/armv7/armv7_machdep.c +++ b/sys/arch/armv7/armv7/armv7_machdep.c @@ -164,7 +164,6 @@ int max_processes = 64; /* Default number */ #endif /* !PMAP_STATIC_L1S */ /* Physical and virtual addresses for some global pages */ -pv_addr_t systempage; pv_addr_t irqstack; pv_addr_t undstack; pv_addr_t abtstack; @@ -178,8 +177,7 @@ extern u_int undefined_handler_address; uint32_t board_id; -#define KERNEL_PT_SYS 0 /* Page table for mapping proc0 zero page */ -#define KERNEL_PT_KERNEL 1 /* Page table for mapping kernel */ +#define KERNEL_PT_KERNEL 0 /* Page table for mapping kernel */ #define KERNEL_PT_KERNEL_NUM 32 #define KERNEL_PT_VMDATA (KERNEL_PT_KERNEL+KERNEL_PT_KERNEL_NUM) /* Page tables for mapping kernel VM */ @@ -543,15 +541,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t loadaddr) if (!kernel_l1pt.pv_pa || (kernel_l1pt.pv_pa & (L1_TABLE_SIZE-1)) != 0) panic("initarm: Failed to align the kernel page directory"); - /* - * Allocate a page for the system page mapped to V0x00000000 - * This page will just contain the system vectors and can be - * shared by all processes. - */ - vector_page = ARM_VECTORS_HIGH; - alloc_pages(systempage.pv_pa, 1); - systempage.pv_va = vector_page; - /* Allocate stacks for all modes */ valloc_pages(irqstack, IRQ_STACK_SIZE); valloc_pages(abtstack, ABT_STACK_SIZE); @@ -600,9 +589,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t loadaddr) l1pagetable = kernel_l1pt.pv_pa; /* Map the L2 pages tables in the L1 page table */ - pmap_link_l2pt(l1pagetable, vector_page & ~(0x00400000 - 1), - &kernel_pt_table[KERNEL_PT_SYS]); - for (loop = 0; loop < KERNEL_PT_KERNEL_NUM; loop++) pmap_link_l2pt(l1pagetable, KERNEL_BASE + loop * 0x00400000, &kernel_pt_table[KERNEL_PT_KERNEL + loop]); @@ -664,10 +650,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t loadaddr) /* Map the Mini-Data cache clean area. */ - /* Map the vector page. */ - pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa, - PROT_READ | PROT_WRITE, PTE_CACHE); - /* Map the FDT. */ pmap_map_chunk(l1pagetable, fdt.pv_va, fdt.pv_pa, round_page(fdt_get_size((void *)fdt.pv_pa)), @@ -694,8 +676,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t loadaddr) proc0paddr = (struct user *)kernelstack.pv_va; proc0.p_addr = proc0paddr; - arm32_vector_init(vector_page, ARM_VEC_ALL); - /* * Pages were allocated during the secondary bootstrap for the * stacks for different CPU modes. @@ -712,20 +692,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t loadaddr) set_stackptr(PSR_UND32_MODE, undstack.pv_va + UND_STACK_SIZE * PAGE_SIZE); - /* - * Well we should set a data abort handler. - * Once things get going this will change as we will need a proper - * handler. - * Until then we will use a handler that just panics but tells us - * why. - * Initialisation of the vectors will just panic on a data abort. - * This just fills in a slighly better one. - */ - - data_abort_handler_address = (u_int)data_abort_handler; - prefetch_abort_handler_address = (u_int)prefetch_abort_handler; - undefined_handler_address = (u_int)undefinedinstruction_bounce; - /* Now we can reinit the FDT, using the virtual address. */ fdt_init((void *)fdt.pv_va); @@ -770,8 +736,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t loadaddr) pmap_bootstrap((pd_entry_t *)kernel_l1pt.pv_va, KERNEL_VM_BASE, KERNEL_VM_BASE + KERNEL_VM_SIZE); - vector_page_setprot(PROT_READ | PROT_EXEC); - /* * Restore proper bus_space operation, now that pmap is initialized. */ @@ -929,3 +893,33 @@ board_startup(void) #endif } } + +void address_exception_entry(void); +void reset_entry(void); + +void +address_exception_entry(void) +{ + u_int _cpsr, _spsr, _lr; + + __asm volatile( + "mrs %0, cpsr\n" + "mrs %1, spsr\n" + "mov %2, lr\n" + : "=&r"(_cpsr), "=&r"(_spsr), "=&r"(_lr)); + + printf("Address Exception\ncpsr=%#8x spsr=%#8x lr=%#8x\n", + _cpsr, _spsr, _lr); + + __asm volatile( + "mov lr, %0\n" + "b data_abort_entry\n" :: "r"(_lr)); +} + +void +reset_entry(void) +{ + u_int _lr; + __asm volatile("mov %0, lr\n" : "=&r"(_lr)); + panic("Reset Exception\nlr=%#8x", _lr); +} diff --git a/sys/arch/armv7/armv7/locore0.S b/sys/arch/armv7/armv7/locore0.S index 2a4e98cbe8c..85cd961f3b8 100644 --- a/sys/arch/armv7/armv7/locore0.S +++ b/sys/arch/armv7/armv7/locore0.S @@ -160,8 +160,13 @@ _C_LABEL(bootstrap_start): mov r0, #DOMAIN_CLIENT /* We only use domain 0 */ mcr CP15_DACR(r0) + /* set VBAR */ + ldr r0, =vectors + mcr CP15_VBAR(r0) + /* Enable MMU */ mrc CP15_SCTLR(r0) + bic r0, r0, #CPU_CONTROL_VECRELOC /* our vectors are at VBAR */ orr r0, r0, #CPU_CONTROL_MMU_ENABLE mcr CP15_SCTLR(r0) CPWAIT(r0)