Isaac Christensen (isaac.christensen@se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/6885
-gerrit
commit 3609be4152dd07c401041c3315d7b2284c4b51e4 Author: Julius Werner jwerner@chromium.org Date: Wed Nov 13 12:49:45 2013 -0800
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 --- payloads/libpayload/arch/arm/exception.c | 51 ++++++--------------------- payloads/libpayload/arch/arm/exception_asm.S | 15 ++------ src/arch/arm/armv7/exception.c | 52 +++++++--------------------- 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 8d8b50b..099d2a4 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 163fdbd..31d7593 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 3b32e8b..b02e5c1 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 163fdbd..dd45636 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 -