aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasant Hegde <hegdevasant@linux.vnet.ibm.com>2015-09-04 16:55:11 +0530
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-09-09 15:43:50 +1000
commita1db4ec5b9741eaf237481aff92ef2afa61bda48 (patch)
treecff0258a36cae19f80246297f1da8f94722feac0
parent960bd711b2381f4a31048884955b9715d51ea6ea (diff)
downloadskiboot-a1db4ec5b9741eaf237481aff92ef2afa61bda48.zip
skiboot-a1db4ec5b9741eaf237481aff92ef2afa61bda48.tar.gz
skiboot-a1db4ec5b9741eaf237481aff92ef2afa61bda48.tar.bz2
Move FSP specific abort() code to platform layer
Presently abort() call sets up HID0, triggers attention and finally calls infinite for loop. FSP takes care of collecting required logs and reboots the system. This sequence is specific to FSP machine and it will not work on BMC based machine. Hence move FSP specific code to hw/fsp/fsp-attn.c. Note that this patch adds new parameter to abort call. Hence replaced _abort() by abort() in exception.c so that we can capture file info as well. Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--core/exceptions.c2
-rw-r--r--core/utils.c18
-rw-r--r--hw/fsp/fsp-attn.c26
-rw-r--r--include/fsp.h3
-rw-r--r--libc/include/assert.h5
-rw-r--r--libc/include/stdlib.h9
6 files changed, 36 insertions, 27 deletions
diff --git a/core/exceptions.c b/core/exceptions.c
index aa472a6..c4acf85 100644
--- a/core/exceptions.c
+++ b/core/exceptions.c
@@ -45,7 +45,7 @@ void exception_entry(struct stack_frame *stack)
prerror("***********************************************\n");
prerror("Unexpected exception %llx !\n", stack->type);
dump_regs(stack);
- _abort();
+ abort();
}
static int64_t opal_register_exc_handler(uint64_t opal_exception __unused,
diff --git a/core/utils.c b/core/utils.c
index f340b4f..df9a815 100644
--- a/core/utils.c
+++ b/core/utils.c
@@ -26,34 +26,22 @@ unsigned long __stack_chk_guard = 0xdeadf00dbaad300d;
void __noreturn assert_fail(const char *msg)
{
prlog(PR_EMERG, "Assert fail: %s\n", msg);
- _abort();
+ _abort(msg);
}
-void __noreturn _abort(void)
+void __noreturn _abort(const char *msg)
{
static bool in_abort = false;
- unsigned long hid0;
if (in_abort)
for (;;) ;
in_abort = true;
- op_display(OP_FATAL, OP_MOD_CORE, 0x6666);
-
prlog(PR_EMERG, "Aborting!\n");
backtrace();
- /* XXX FIXME: We should fsp_poll for a while to ensure any pending
- * console writes have made it out, but until we have decent PSI
- * link handling we must not do it forever. Polling can prevent the
- * FSP from bringing the PSI link up and it can get stuck in a
- * reboot loop.
- */
+ ibm_fsp_terminate(msg);
- hid0 = mfspr(SPR_HID0);
- hid0 |= SPR_HID0_ENABLE_ATTN;
- set_hid0(hid0);
- trigger_attn();
for (;;) ;
}
diff --git a/hw/fsp/fsp-attn.c b/hw/fsp/fsp-attn.c
index 71de780..8a2ec92 100644
--- a/hw/fsp/fsp-attn.c
+++ b/hw/fsp/fsp-attn.c
@@ -88,7 +88,7 @@ static void init_sp_attn_area(void)
/* Updates src in sp attention area
*/
-void update_sp_attn_area(const char *msg)
+static void update_sp_attn_area(const char *msg)
{
#define STACK_BUF_ENTRIES 20
struct bt_entry bt_buf[STACK_BUF_ENTRIES];
@@ -116,6 +116,30 @@ void update_sp_attn_area(const char *msg)
strlen(ti_attn->msg.file_info);
}
+void __attribute__((noreturn)) ibm_fsp_terminate(const char *msg)
+{
+ unsigned long hid0;
+
+ /* Update SP attention area */
+ update_sp_attn_area(msg);
+
+ /* Update op panel op_display */
+ op_display(OP_FATAL, OP_MOD_CORE, 0x6666);
+
+ /* XXX FIXME: We should fsp_poll for a while to ensure any pending
+ * console writes have made it out, but until we have decent PSI
+ * link handling we must not do it forever. Polling can prevent the
+ * FSP from bringing the PSI link up and it can get stuck in a
+ * reboot loop.
+ */
+
+ hid0 = mfspr(SPR_HID0);
+ hid0 |= SPR_HID0_ENABLE_ATTN;
+ set_hid0(hid0);
+ trigger_attn();
+ for (;;) ;
+}
+
/* Intialises SP attention area */
void fsp_attn_init(void)
{
diff --git a/include/fsp.h b/include/fsp.h
index 0291084..4e247cc 100644
--- a/include/fsp.h
+++ b/include/fsp.h
@@ -827,4 +827,7 @@ extern void fsp_dpo_init(void);
/* Chiptod */
extern void fsp_chiptod_init(void);
+/* Terminate immediate */
+extern void __attribute__((noreturn)) ibm_fsp_terminate(const char *msg);
+
#endif /* __FSP_H */
diff --git a/libc/include/assert.h b/libc/include/assert.h
index 68f01ab..2c49fd7 100644
--- a/libc/include/assert.h
+++ b/libc/include/assert.h
@@ -13,13 +13,8 @@
#ifndef _ASSERT_H
#define _ASSERT_H
-extern void update_sp_attn_area(const char *msg);
-
#define assert(cond) \
do { if (!(cond)) { \
- update_sp_attn_area(__FILE__ \
- ":" stringify(__LINE__) \
- ":" stringify(cond)); \
assert_fail(__FILE__ \
":" stringify(__LINE__) \
":" stringify(cond)); } \
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 68ca386..b4f1c38 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -25,11 +25,10 @@ unsigned long int strtoul(const char *nptr, char **endptr, int base);
long int strtol(const char *nptr, char **endptr, int base);
int rand(void);
-void __attribute__((noreturn)) _abort(void);
-#define abort() do { \
- update_sp_attn_area("abort():" __FILE__ \
- ":" stringify(__LINE__)); \
- _abort(); \
+void __attribute__((noreturn)) _abort(const char *msg);
+#define abort() do { \
+ _abort("abort():" __FILE__ \
+ ":" stringify(__LINE__)); \
} while(0)