diff options
author | Jack Rosenthal <jrosenth@chromium.org> | 2019-06-17 15:37:55 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-19 00:51:23 +0000 |
commit | 7e80ddc5177af46cc8defc2741f4e9590b97cbbb (patch) | |
tree | 811bd2fb95e3190c956bae2e8ff7dd0a2181fa8e /core/minute-ia/interrupts.c | |
parent | 247b6099f910c3e1685b9185371177ac61a32617 (diff) | |
download | chrome-ec-7e80ddc5177af46cc8defc2741f4e9590b97cbbb.tar.gz |
minute-ia: load eip value from top of stack
For interrupt vectors (as opposed to exception handlers), the eip
value is on top of the stack (referentially the return address by C
calling convention). Use separate code for WDT vector.
BUG=b:129983997
BRANCH=none
TEST='crash watchdog' showing correct EIP, CS values
Change-Id: I7efb2c71aba63eefd89fc71af089bc14034b7d08
Signed-off-by: Jack Rosenthal <jrosenth@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1663188
Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-by: Yuval Peress <peress@chromium.org>
Diffstat (limited to 'core/minute-ia/interrupts.c')
-rw-r--r-- | core/minute-ia/interrupts.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/core/minute-ia/interrupts.c b/core/minute-ia/interrupts.c index 275dba1e9d..1d87dba77a 100644 --- a/core/minute-ia/interrupts.c +++ b/core/minute-ia/interrupts.c @@ -12,6 +12,7 @@ #include "interrupts.h" #include "irq_handler.h" #include "link_defs.h" +#include "mia_panic_internal.h" #include "registers.h" #include "task.h" #include "task_defs.h" @@ -176,11 +177,9 @@ static const irq_desc_t system_irqs[] = { */ #define DEFINE_EXN_HANDLER(vector) \ _DEFINE_EXN_HANDLER(vector, exception_panic_##vector) -#define _DEFINE_EXN_HANDLER(vector, name) \ - __DEFINE_EXN_HANDLER(vector, name) -#define __DEFINE_EXN_HANDLER(vector, name) \ +#define _DEFINE_EXN_HANDLER(vector, name) \ void __keep name(void); \ - __attribute__ ((noreturn)) void name(void) \ + __attribute__((noreturn)) void name(void) \ { \ __asm__ ( \ "push $" #vector "\n" \ @@ -209,7 +208,22 @@ DEFINE_EXN_HANDLER(17); DEFINE_EXN_HANDLER(18); DEFINE_EXN_HANDLER(19); DEFINE_EXN_HANDLER(20); -_DEFINE_EXN_HANDLER(ISH_WDT_VEC, exception_panic_wdt); + +/** + * Use a similar approach for defining an optional handler for + * watchdog timer expiration. However, this time, hardware does not + * push errorcode, and we must account for that by pushing zero. + */ +__attribute__((noreturn)) __keep +void exception_panic_wdt(uint32_t cs) +{ + exception_panic( + CONFIG_MIA_WDT_VEC, + 0, + (uint32_t)__builtin_return_address(0), + cs, + 0); +} void set_interrupt_gate(uint8_t num, isr_handler_t func, uint8_t flags) { @@ -475,8 +489,8 @@ void init_interrupts(void) * retrieve EIP. */ if (IS_ENABLED(CONFIG_WATCHDOG)) - set_interrupt_gate(ISH_WDT_VEC, - exception_panic_wdt, + set_interrupt_gate(CONFIG_MIA_WDT_VEC, + (isr_handler_t)exception_panic_wdt, IDT_DESC_FLAGS); /* Note: At reset, ID field is already set to 0 in APIC ID register */ |