summaryrefslogtreecommitdiff
path: root/payloads/libpayload/include
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2013-12-11 00:23:15 -0800
committerMarc Jones <marc.jones@se-eng.com>2014-12-09 18:39:06 +0100
commit20cdb2439f7e76f78d2618220fc1a0061afd57cd (patch)
treeb5b21e423a0ed6c3138074bc6d8655d70443aba2 /payloads/libpayload/include
parentc09cf0b7e17cc48576d09d3c48df8625ea5c990b (diff)
libpayload: Make it possible to install callbacks for particular exceptions.
To support a GDB stub, it will be necessary to trap various exceptions which will be used to implement breakpoints, single stepping, etc. BUG=None TEST=Built and booted on Link with hooks installed and saw that they triggered when exceptions occurred. Built and booted on nyan. BRANCH=None Original-Change-Id: Iab659365864a3055159a50b8f6e5c44290d3ba2b Original-Signed-off-by: Gabe Black <gabeblack@google.com> Original-Reviewed-on: https://chromium-review.googlesource.com/179602 Original-Reviewed-by: Gabe Black <gabeblack@chromium.org> Original-Tested-by: Gabe Black <gabeblack@chromium.org> Original-Commit-Queue: Gabe Black <gabeblack@chromium.org> (cherry picked from commit 8db0897b1ddad600e247cb4df147c757a8187626) Signed-off-by: Marc Jones <marc.jones@se-eng.com> Change-Id: I5e7f724b99988cd259909dd3bd01166fa52317ec Reviewed-on: http://review.coreboot.org/7656 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'payloads/libpayload/include')
-rw-r--r--payloads/libpayload/include/arm/arch/exception.h16
-rw-r--r--payloads/libpayload/include/exception.h5
-rw-r--r--payloads/libpayload/include/x86/arch/exception.h81
3 files changed, 100 insertions, 2 deletions
diff --git a/payloads/libpayload/include/arm/arch/exception.h b/payloads/libpayload/include/arm/arch/exception.h
index a0d9413f1c..13fda57aa7 100644
--- a/payloads/libpayload/include/arm/arch/exception.h
+++ b/payloads/libpayload/include/arm/arch/exception.h
@@ -30,9 +30,23 @@
#ifndef _ARCH_EXCEPTION_H
#define _ARCH_EXCEPTION_H
-#include <exception.h>
#include <stdint.h>
void set_vbar(uint32_t vbar);
+struct exception_state
+{
+ uint32_t regs[16];
+} __attribute__((packed));
+
+enum {
+ EXC_UNDEF = 1,
+ EXC_SWI = 2,
+ EXC_PABORT = 3,
+ EXC_DABORT = 4,
+ EXC_IRQ = 6,
+ EXC_FIQ = 7,
+ EXC_COUNT
+};
+
#endif
diff --git a/payloads/libpayload/include/exception.h b/payloads/libpayload/include/exception.h
index 6d118e7ba6..1d9b832c07 100644
--- a/payloads/libpayload/include/exception.h
+++ b/payloads/libpayload/include/exception.h
@@ -30,8 +30,11 @@
#ifndef _EXCEPTION_H
#define _EXCEPTION_H
-#include <stdint.h>
+#include <arch/exception.h>
+
+typedef void (*exception_hook)(int type, struct exception_state *state);
void exception_init(void);
+void exception_install_hook(int type, exception_hook hook);
#endif
diff --git a/payloads/libpayload/include/x86/arch/exception.h b/payloads/libpayload/include/x86/arch/exception.h
new file mode 100644
index 0000000000..82f2ca0a32
--- /dev/null
+++ b/payloads/libpayload/include/x86/arch/exception.h
@@ -0,0 +1,81 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright 2013 Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARCH_EXCEPTION_H
+#define _ARCH_EXCEPTION_H
+
+#include <stdint.h>
+
+void exception_dispatch(void);
+void exception_init_asm(void);
+
+struct exception_state
+{
+ uint32_t eax;
+ uint32_t ecx;
+ uint32_t edx;
+ uint32_t ebx;
+ uint32_t esp;
+ uint32_t ebp;
+ uint32_t esi;
+ uint32_t edi;
+ uint32_t eip;
+ uint32_t eflags;
+ uint32_t cs;
+ uint32_t ss;
+ uint32_t ds;
+ uint32_t es;
+ uint32_t fs;
+ uint32_t gs;
+} __attribute__((packed));
+
+enum {
+ EXC_DE = 0, /* Divide by zero */
+ EXC_DB = 1, /* Debug */
+ EXC_NMI = 2, /* Non maskable interrupt */
+ EXC_BP = 3, /* Breakpoint */
+ EXC_OF = 4, /* Overflow */
+ EXC_BR = 5, /* Bound range */
+ EXC_UD = 6, /* Invalid opcode */
+ EXC_NM = 7, /* Device not available */
+ EXC_DF = 8, /* Double fault */
+ EXC_TS = 10, /* Invalid TSS */
+ EXC_NP = 11, /* Segment not present */
+ EXC_SS = 12, /* Stack */
+ EXC_GP = 13, /* General protection */
+ EXC_PF = 14, /* Page fault */
+ EXC_MF = 16, /* x87 floating point */
+ EXC_AC = 17, /* Alignment check */
+ EXC_MC = 18, /* Machine check */
+ EXC_XF = 19, /* SIMD floating point */
+ EXC_SX = 30, /* Security */
+ EXC_COUNT
+};
+
+#endif