Commit 7933523d authored by Russell King's avatar Russell King

[PATCH] ARM: remove some entry initialisation asm code

Convert the trivial vector entry initialisation code to C code.
Signed-off-by: default avatarRussell King <rmk@arm.linux.org.uk>
parent 2fac6f3f
...@@ -522,8 +522,9 @@ ENTRY(__switch_to) ...@@ -522,8 +522,9 @@ ENTRY(__switch_to)
/* /*
* Vector stubs. * Vector stubs.
* *
* This code is copied to 0x200 or 0xffff0200 so we can use branches in the * This code is copied to 0xffff0200 so we can use branches in the
* vectors, rather than ldr's. * vectors, rather than ldr's. Note that this code must not
* exceed 0x300 bytes.
* *
* Common stub entry macro: * Common stub entry macro:
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC * Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
...@@ -552,6 +553,7 @@ vector_\name: ...@@ -552,6 +553,7 @@ vector_\name:
movs pc, lr @ Changes mode and branches movs pc, lr @ Changes mode and branches
.endm .endm
.globl __stubs_start
__stubs_start: __stubs_start:
/* /*
* Interrupt dispatcher * Interrupt dispatcher
...@@ -686,37 +688,24 @@ vector_addrexcptn: ...@@ -686,37 +688,24 @@ vector_addrexcptn:
.LCsabt: .LCsabt:
.word __temp_abt .word __temp_abt
.globl __stubs_end
__stubs_end: __stubs_end:
.equ __real_stubs_start, .LCvectors + 0x200 .equ stubs_offset, __vectors_start + 0x200 - __stubs_start
.LCvectors: .globl __vectors_start
__vectors_start:
swi SYS_ERROR0 swi SYS_ERROR0
b __real_stubs_start + (vector_und - __stubs_start) b vector_und + stubs_offset
ldr pc, __real_stubs_start + (.LCvswi - __stubs_start) ldr pc, .LCvswi + stubs_offset
b __real_stubs_start + (vector_pabt - __stubs_start) b vector_pabt + stubs_offset
b __real_stubs_start + (vector_dabt - __stubs_start) b vector_dabt + stubs_offset
b __real_stubs_start + (vector_addrexcptn - __stubs_start) b vector_addrexcptn + stubs_offset
b __real_stubs_start + (vector_irq - __stubs_start) b vector_irq + stubs_offset
b __real_stubs_start + (vector_fiq - __stubs_start) b vector_fiq + stubs_offset
ENTRY(__trap_init) .globl __vectors_end
stmfd sp!, {r4 - r6, lr} __vectors_end:
mov r0, #0xff000000
orr r0, r0, #0x00ff0000 @ high vectors position
adr r1, .LCvectors @ set up the vectors
ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}
stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr}
add r2, r0, #0x200
adr r0, __stubs_start @ copy stubs to 0x200
adr r1, __stubs_end
1: ldr r3, [r0], #4
str r3, [r2], #4
cmp r0, r1
blt 1b
LOADREGS(fd, sp!, {r4 - r6, pc})
.data .data
......
...@@ -578,9 +578,16 @@ EXPORT_SYMBOL(abort); ...@@ -578,9 +578,16 @@ EXPORT_SYMBOL(abort);
void __init trap_init(void) void __init trap_init(void)
{ {
extern void __trap_init(void); extern char __stubs_start[], __stubs_end[];
extern char __vectors_start[], __vectors_end[];
__trap_init(); /*
* Copy the vectors and stubs (in entry-armv.S) into the
* vector page, mapped at 0xffff0000, and ensure these are
* visible to the instruction stream.
*/
memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
modify_domain(DOMAIN_USER, DOMAIN_CLIENT); modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment