diff options
author | Denis Brockus <dbrockus@chromium.org> | 2019-06-20 13:57:14 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-21 16:35:49 +0000 |
commit | 71601aaaaf592225cb0834ce2b287c2fede02f16 (patch) | |
tree | 55137a5271bdda7878b4713131317c372e405015 | |
parent | 37e37749de6a969275bd9453204a01b494bfd854 (diff) | |
download | chrome-ec-71601aaaaf592225cb0834ce2b287c2fede02f16.tar.gz |
minute-ia: add 0 error code for exceptions that do not pass one
The errorcode is pushed to the stack by hardware for vectors
8, 10-14 and 17. The others will be missing that parameter
when exception_panic is called. So make sure to push a 0 for
these other exceptions to line up parameter values.
BUG=b:135671664
BRANCH=none
TEST=make buildall -j
TEST=verify errorcode 0 on exceptions that hw does not push a value
Change-Id: I7aad96278408a5e38cf973c868e05d92b52469dd
Signed-off-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1669884
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Commit-Queue: Jack Rosenthal <jrosenth@chromium.org>
-rw-r--r-- | core/minute-ia/interrupts.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/core/minute-ia/interrupts.c b/core/minute-ia/interrupts.c index 1d87dba77a..07c4c71ef0 100644 --- a/core/minute-ia/interrupts.c +++ b/core/minute-ia/interrupts.c @@ -169,23 +169,34 @@ static const irq_desc_t system_irqs[] = { * of which will push their corresponding interrupt vector number to * the stack, and then call exception_panic. The remaining arguments to * exception_panic were pushed by the hardware when the exception was - * called. + * called. The errorcode is pushed to the stack by hardware for vectors + * 8, 10-14 and 17. Make sure to push 0 for the other vectors * * This is done since interrupt vectors 0-31 bypass the APIC ISR register * and go directly to the CPU core, so get_current_interrupt_vector * cannot be used. */ -#define DEFINE_EXN_HANDLER(vector) \ +#define DEFINE_EXN_HANDLER(vector) \ _DEFINE_EXN_HANDLER(vector, exception_panic_##vector) #define _DEFINE_EXN_HANDLER(vector, name) \ - void __keep name(void); \ + void __keep name(void); \ __attribute__((noreturn)) void name(void) \ { \ - __asm__ ( \ - "push $" #vector "\n" \ - "call exception_panic\n"); \ - while (1) \ - continue; \ + __asm__ ("push $0\n" \ + "push $" #vector "\n" \ + "call exception_panic\n"); \ + __builtin_unreachable(); \ + } + +#define DEFINE_EXN_HANDLER_W_ERRORCODE(vector) \ + _DEFINE_EXN_HANDLER_W_ERRORCODE(vector, exception_panic_##vector) +#define _DEFINE_EXN_HANDLER_W_ERRORCODE(vector, name) \ + void __keep name(void); \ + __attribute__((noreturn)) void name(void) \ + { \ + __asm__ ("push $" #vector "\n" \ + "call exception_panic\n"); \ + __builtin_unreachable(); \ } DEFINE_EXN_HANDLER(0); @@ -196,15 +207,15 @@ DEFINE_EXN_HANDLER(4); DEFINE_EXN_HANDLER(5); DEFINE_EXN_HANDLER(6); DEFINE_EXN_HANDLER(7); -DEFINE_EXN_HANDLER(8); +DEFINE_EXN_HANDLER_W_ERRORCODE(8); DEFINE_EXN_HANDLER(9); -DEFINE_EXN_HANDLER(10); -DEFINE_EXN_HANDLER(11); -DEFINE_EXN_HANDLER(12); -DEFINE_EXN_HANDLER(13); -DEFINE_EXN_HANDLER(14); +DEFINE_EXN_HANDLER_W_ERRORCODE(10); +DEFINE_EXN_HANDLER_W_ERRORCODE(11); +DEFINE_EXN_HANDLER_W_ERRORCODE(12); +DEFINE_EXN_HANDLER_W_ERRORCODE(13); +DEFINE_EXN_HANDLER_W_ERRORCODE(14); DEFINE_EXN_HANDLER(16); -DEFINE_EXN_HANDLER(17); +DEFINE_EXN_HANDLER_W_ERRORCODE(17); DEFINE_EXN_HANDLER(18); DEFINE_EXN_HANDLER(19); DEFINE_EXN_HANDLER(20); |