diff options
author | Julius Werner <jwerner@chromium.org> | 2013-11-13 12:49:45 -0800 |
---|---|---|
committer | Isaac Christensen <isaac.christensen@se-eng.com> | 2014-09-13 02:02:04 +0200 |
commit | 813f305e26755aba6826c0f5baf60a65cafbefd6 (patch) | |
tree | 31bb54658c4a1bf5d505f09a9a9262320c95ed4c | |
parent | edf6b57f73e3cafaecd67a71fdf7313e75c1b3e8 (diff) |
arm: Put exception_stack into BSS
"Hey guys, I have this awesome idea! How about we put a huge array
filled with 0xa5 into the data segment of our uncompressed romstage
for no particular reason? Give our SPI driver something to do so it
doesn't get too bored, you know?"
Guess it pays off to just hexdump our image and sanity-check it top to
bottom every once in a while...
Also reduces the size because 8K is crazy just to print a bunch of
registers (256 bytes ought to be enough for anybody).
Old-Change-Id: Icec0a711a1b5140d2ebcd98338ec638a4b6262fa
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/176762
Reviewed-by: Gabe Black <gabeblack@chromium.org>
Reviewed-by: Ronald Minnich <rminnich@chromium.org>
Reviewed-by: David Hendricks <dhendrix@chromium.org>
(cherry picked from commit 61c360a1c3f445535c9ff383a389e643cfe4527c)
arm: Remove exception_test()
The exception_test() mechanism might have been useful when exceptions
were first implemented, but now that they are pretty stable it's really
not necessary anymore (especially not on every single boot in production
Chromebooks). It forces a simple unaligned access, and as we start
having exceptions in stages that might not have paging turned on yet,
it's better to remove that completely.
Also removed the duplicated implementations of SCTLR-stuff and switched
to the existing ones in cache.h.
Old-Change-Id: I85e66269f5e2f2dfd3e8aaaa18441493514b62f8
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/177101
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Reviewed-by: Gabe Black <gabeblack@chromium.org>
(cherry picked from commit d0706b848572fbea26e0e432ec5827503b9603c9)
Squashed 2 exception related commits.
Change-Id: Id2c115ee39a0732c375472afc0194436e2f5e069
Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com>
Reviewed-on: http://review.coreboot.org/6885
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r-- | payloads/libpayload/arch/arm/exception.c | 51 | ||||
-rw-r--r-- | payloads/libpayload/arch/arm/exception_asm.S | 15 | ||||
-rw-r--r-- | src/arch/arm/armv7/exception.c | 52 | ||||
-rw-r--r-- | src/arch/arm/armv7/exception_asm.S | 15 |
4 files changed, 27 insertions, 106 deletions
diff --git a/payloads/libpayload/arch/arm/exception.c b/payloads/libpayload/arch/arm/exception.c index 8d8b50b175..099d2a46fa 100644 --- a/payloads/libpayload/arch/arm/exception.c +++ b/payloads/libpayload/arch/arm/exception.c @@ -27,13 +27,13 @@ * SUCH DAMAGE. */ +#include <arch/cache.h> #include <arch/exception.h> #include <libpayload.h> #include <stdint.h> -void exception_test(void); - -static int test_abort; +uint8_t exception_stack[0x100] __attribute__((aligned(8))); +extern void *exception_stack_end; void exception_undefined_instruction(uint32_t *); void exception_software_interrupt(uint32_t *); @@ -103,14 +103,9 @@ void exception_prefetch_abort(uint32_t *regs) void exception_data_abort(uint32_t *regs) { - if (test_abort) { - regs[15] = regs[0]; - return; - } else { - printf("exception _data_abort\n"); - print_regs(regs); - dump_stack(regs[13], 512); - } + printf("exception _data_abort\n"); + print_regs(regs); + dump_stack(regs[13], 512); halt(); } @@ -138,40 +133,16 @@ void exception_fiq(uint32_t *regs) halt(); } -static inline uint32_t get_sctlr(void) -{ - uint32_t val; - asm("mrc p15, 0, %0, c1, c0, 0" : "=r" (val)); - return val; -} - -static inline void set_sctlr(uint32_t val) -{ - asm volatile("mcr p15, 0, %0, c1, c0, 0" :: "r" (val)); - asm volatile("" ::: "memory"); -} - void exception_init(void) { - static const uint32_t sctlr_te = (0x1 << 30); - static const uint32_t sctlr_v = (0x1 << 13); - static const uint32_t sctlr_a = (0x1 << 1); - - uint32_t sctlr = get_sctlr(); + uint32_t sctlr = read_sctlr(); /* Handle exceptions in ARM mode. */ - sctlr &= ~sctlr_te; + sctlr &= ~SCTLR_TE; /* Set V=0 in SCTLR so VBAR points to the exception vector table. */ - sctlr &= ~sctlr_v; - /* Enforce alignment temporarily. */ - set_sctlr(sctlr | sctlr_a); + sctlr &= ~SCTLR_V; + write_sctlr(sctlr); extern uint32_t exception_table[]; set_vbar((uintptr_t)exception_table); - - test_abort = 1; - exception_test(); - test_abort = 0; - - /* Restore alignment settings. */ - set_sctlr(sctlr); + exception_stack_end = exception_stack + sizeof(exception_stack); } diff --git a/payloads/libpayload/arch/arm/exception_asm.S b/payloads/libpayload/arch/arm/exception_asm.S index 163fdbd52a..31d759335f 100644 --- a/payloads/libpayload/arch/arm/exception_asm.S +++ b/payloads/libpayload/arch/arm/exception_asm.S @@ -27,11 +27,9 @@ * SUCH DAMAGE. */ -exception_stack: - .align 5 - .skip 0x2000, 0xa5 + .global exception_stack_end exception_stack_end: - .word exception_stack_end + .word 0 exception_handler: .word 0 @@ -105,12 +103,3 @@ set_vbar: mcr p15, 0, r0, c12, c0, 0 bx lr - .global exception_test - .thumb_func -exception_test: - mov r1, $1 - mov r0, pc - add r0, $3 - ldr r1, [r1] - bx lr - diff --git a/src/arch/arm/armv7/exception.c b/src/arch/arm/armv7/exception.c index 3b32e8bbb1..b02e5c1892 100644 --- a/src/arch/arm/armv7/exception.c +++ b/src/arch/arm/armv7/exception.c @@ -29,12 +29,12 @@ #include <stdint.h> #include <types.h> +#include <arch/cache.h> #include <arch/exception.h> #include <console/console.h> -void exception_test(void); - -static int test_abort; +uint8_t exception_stack[0x100] __attribute__((aligned(8))); +extern void *exception_stack_end; void exception_undefined_instruction(uint32_t *); void exception_software_interrupt(uint32_t *); @@ -104,14 +104,9 @@ void exception_prefetch_abort(uint32_t *regs) void exception_data_abort(uint32_t *regs) { - if (test_abort) { - regs[15] = regs[0]; - return; - } else { - printk(BIOS_ERR, "exception _data_abort\n"); - print_regs(regs); - dump_stack(regs[13], 512); - } + printk(BIOS_ERR, "exception _data_abort\n"); + print_regs(regs); + dump_stack(regs[13], 512); die("exception"); } @@ -139,42 +134,19 @@ void exception_fiq(uint32_t *regs) die("exception"); } -static inline uint32_t get_sctlr(void) -{ - uint32_t val; - asm("mrc p15, 0, %0, c1, c0, 0" : "=r" (val)); - return val; -} - -static inline void set_sctlr(uint32_t val) -{ - asm volatile("mcr p15, 0, %0, c1, c0, 0" :: "r" (val)); - asm volatile("" ::: "memory"); -} - void exception_init(void) { - static const uint32_t sctlr_te = (0x1 << 30); - static const uint32_t sctlr_v = (0x1 << 13); - static const uint32_t sctlr_a = (0x1 << 1); - - uint32_t sctlr = get_sctlr(); + uint32_t sctlr = read_sctlr(); /* Handle exceptions in ARM mode. */ - sctlr &= ~sctlr_te; + sctlr &= ~SCTLR_TE; /* Set V=0 in SCTLR so VBAR points to the exception vector table. */ - sctlr &= ~sctlr_v; + sctlr &= ~SCTLR_V; /* Enforce alignment temporarily. */ - set_sctlr(sctlr | sctlr_a); + write_sctlr(sctlr); extern uint32_t exception_table[]; set_vbar((uintptr_t)exception_table); + exception_stack_end = exception_stack + sizeof(exception_stack); - test_abort = 1; - printk(BIOS_ERR, "Testing exceptions\n"); - exception_test(); - test_abort = 0; - printk(BIOS_ERR, "Testing exceptions: DONE\n"); - - /* Restore original alignment settings. */ - set_sctlr(sctlr); + printk(BIOS_DEBUG, "Exception handlers installed.\n"); } diff --git a/src/arch/arm/armv7/exception_asm.S b/src/arch/arm/armv7/exception_asm.S index 163fdbd52a..dd456363e9 100644 --- a/src/arch/arm/armv7/exception_asm.S +++ b/src/arch/arm/armv7/exception_asm.S @@ -27,11 +27,9 @@ * SUCH DAMAGE. */ -exception_stack: - .align 5 - .skip 0x2000, 0xa5 + .global exception_stack_end exception_stack_end: - .word exception_stack_end + .word 0 exception_handler: .word 0 @@ -105,12 +103,3 @@ set_vbar: mcr p15, 0, r0, c12, c0, 0 bx lr - .global exception_test - .thumb_func -exception_test: - mov r1, $1 - mov r0, pc - add r0, $3 - ldr r1, [r1] - bx lr - |