summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBill Hoffa <wghoffa@us.ibm.com>2017-04-10 14:43:51 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-05-10 15:33:40 -0400
commit240f26001382001974fff7d62367e58df3f7b1db (patch)
tree482556bd955971c05b942b6a89639f8f187360a0 /src
parentb947a1a4119b06ee50287854e5ea974c0926226e (diff)
downloadtalos-hostboot-240f26001382001974fff7d62367e58df3f7b1db.tar.gz
talos-hostboot-240f26001382001974fff7d62367e58df3f7b1db.zip
Include HUID of failed Proc in TI data for certain SBE errors
- Include a generic error pipleline for other future error scenarios to leverage this functionality Change-Id: Icc1399ee93157c7106d394944a3355285a8cd830 RTC: 171865 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/39072 Reviewed-by: Martin Gloff <mgloff@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/bootloader/bootloader.H69
-rw-r--r--src/include/kernel/cpumgr.H4
-rw-r--r--src/include/kernel/hbterminatetypes.H9
-rw-r--r--src/include/kernel/misc.H2
-rw-r--r--src/include/kernel/terminate.H6
-rw-r--r--src/include/sys/misc.h4
-rw-r--r--src/include/usr/initservice/initserviceif.H19
-rw-r--r--src/kernel/cpumgr.C4
-rw-r--r--src/kernel/misc.C5
-rw-r--r--src/kernel/syscall.C5
-rw-r--r--src/kernel/terminate.C7
-rw-r--r--src/lib/syscall_misc.C10
-rw-r--r--src/usr/initservice/baseinitsvc/initservice.C28
-rw-r--r--src/usr/initservice/baseinitsvc/initservice.H6
-rw-r--r--src/usr/sbeio/sbe_fifodd.C3
-rw-r--r--src/usr/sbeio/sbe_psudd.C3
16 files changed, 119 insertions, 65 deletions
diff --git a/src/include/bootloader/bootloader.H b/src/include/bootloader/bootloader.H
index ddd39bb0b..afe2acc71 100644
--- a/src/include/bootloader/bootloader.H
+++ b/src/include/bootloader/bootloader.H
@@ -48,41 +48,46 @@ extern "C" void enterHBB(uint64_t i_hbb_hrmor, uint64_t i_hbb_offset);
#define printk(format...)
-/**
- * @brief Handle setting up to terminate Bootloader
- *
- * @param[in] i_moduleID ID for module where terminate is occurring
- * @param[in] i_reasoncode Reason code for why terminating
- * @param[in] i_word7 Data for SRC word 7 / @userdata2[0:31]
- * (optional, default is 0)
- * @param[in] i_word8 Data for SRC word 8 / @userdata2[32:63]
- * (optional, default is 0)
- * @param[in] i_executeTI Flag for calling terminateExecuteTI
- * (optional, default is true)
- * @param[in] i_failAddr Address associated with termination
- * (SRC word 6 / @userdata1[32:63],
- * optional, default is 0)
- */
+ /**
+ * @brief Handle setting up to terminate Bootloader
+ *
+ * @param[in] i_moduleID ID for module where terminate is occurring
+ * @param[in] i_reasoncode Reason code for why terminating
+ * @param[in] i_word7 Data for SRC word 7 / @userdata2[0:31]
+ * (optional, default is 0)
+ * @param[in] i_word8 Data for SRC word 8 / @userdata2[32:63]
+ * (optional, default is 0)
+ * @param[in] i_executeTI Flag for calling terminateExecuteTI
+ * (optional, default is true)
+ * @param[in] i_failAddr Address associated with termination
+ * (SRC word 6 / @userdata1[32:63],
+ * optional, default is 0)
+ * @param[in] i_error_info Optional error data to go in the TI
+ * data area
+ * */
inline void bl_terminate(uint8_t i_moduleID,
- uint16_t i_reasoncode,
- uint32_t i_word7 = 0,
- uint32_t i_word8 = 0,
- bool i_executeTI = true,
- uint64_t i_failAddr = 0)
-{
- termWriteSRC(TI_BOOTLOADER,
- i_reasoncode,
- i_failAddr);
-
- termModifySRC(i_moduleID,
- i_word7,
- i_word8);
-
- if(i_executeTI)
+ uint16_t i_reasoncode,
+ uint32_t i_word7 = 0,
+ uint32_t i_word8 = 0,
+ bool i_executeTI = true,
+ uint64_t i_failAddr = 0,
+ uint32_t i_error_info = 0)
{
- terminateExecuteTI();
+ termWriteSRC(TI_BOOTLOADER,
+ i_reasoncode,
+ i_failAddr,
+ i_error_info);
+
+ termModifySRC(i_moduleID,
+ i_word7,
+ i_word8);
+
+ if(i_executeTI)
+ {
+ terminateExecuteTI();
+ }
}
-}
+
/**
* @brief Macro to assert using bl_terminate
diff --git a/src/include/kernel/cpumgr.H b/src/include/kernel/cpumgr.H
index fc562521d..c3c8387d9 100644
--- a/src/include/kernel/cpumgr.H
+++ b/src/include/kernel/cpumgr.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2010,2016 */
+/* Contributors Listed Below - COPYRIGHT 2010,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -78,7 +78,7 @@ class CpuManager
/** @fn requestShutdown
* Requests that all CPUs shutdown
*/
- static void requestShutdown(uint64_t i_status);
+ static void requestShutdown(uint64_t i_status, uint32_t i_error_data=0);
/** @fn isShutdownRequested
* Returns if a shutdown of all CPUs was requested
diff --git a/src/include/kernel/hbterminatetypes.H b/src/include/kernel/hbterminatetypes.H
index 42bb16788..6aa97e023 100644
--- a/src/include/kernel/hbterminatetypes.H
+++ b/src/include/kernel/hbterminatetypes.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2016 */
+/* Contributors Listed Below - COPYRIGHT 2012,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -78,7 +78,6 @@ struct HB_T_SRC_DataArea
*/
struct HB_TI_DataArea
{
-
union{
struct {
uint64_t type:16; /**< indicates either plid or src */
@@ -88,7 +87,11 @@ struct HB_TI_DataArea
};
uint64_t flag; /**< Full word - flag */
};
- uint32_t reserved0;
+
+ union{
+ uint32_t error_data; /**< Error Data */
+ uint32_t reserved0;
+ };
uint32_t plid; /**< Plid */
HB_T_SRC_DataArea src; /**< SRC */
};
diff --git a/src/include/kernel/misc.H b/src/include/kernel/misc.H
index b1415089f..f08af361f 100644
--- a/src/include/kernel/misc.H
+++ b/src/include/kernel/misc.H
@@ -51,6 +51,8 @@ namespace KernelMisc
extern uint64_t g_payload_data;
/** @brief master host boot instance number (node) */
extern uint64_t g_masterHBInstance;
+ /** @brief master host boot additional error data (node) */
+ extern uint32_t g_error_data;
/** @brief Indicate whether HB is running or not */
enum HbRunning
diff --git a/src/include/kernel/terminate.H b/src/include/kernel/terminate.H
index 9d80f988d..c80304d93 100644
--- a/src/include/kernel/terminate.H
+++ b/src/include/kernel/terminate.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2016 */
+/* Contributors Listed Below - COPYRIGHT 2012,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -49,11 +49,13 @@ void termWritePlid(uint16_t i_source, uint32_t plid);
* @param[in] i_source: indicates what type of fail forced the TI
* @param[in] i_reasoncode: reasoncode for the failure(assert or shutdown)
* @param[in] i_failAddr: i_linkRegister() value (address of failure)
+ * @param[in] i_error_info: addt'l error info to add to TI data
* @param[out] NONE:
*/
void termWriteSRC(uint16_t i_source,
uint16_t i_reasoncode,
- uint64_t i_failAddr = 0);
+ uint64_t i_failAddr = 0,
+ uint32_t i_error_info = 0);
/** @fn termModifySRC
* Modify an SRC and the TI data area for Bootloader
diff --git a/src/include/sys/misc.h b/src/include/sys/misc.h
index 8100805be..cfe62c7d3 100644
--- a/src/include/sys/misc.h
+++ b/src/include/sys/misc.h
@@ -109,12 +109,14 @@ extern "C"
* entry-point.
* @param[in] i_payload_data Data pointer fo the payload.
* @param[in[ i_masterHBInstance Hostboot instance number. for multinode
+ * @param[in] i_error_info Additional error data to be added to TI data
*/
extern "C" void shutdown(uint64_t i_status,
uint64_t i_payload_base,
uint64_t i_payload_entry,
uint64_t i_payload_data,
- uint64_t i_masterHBInstance);
+ uint64_t i_masterHBInstance,
+ uint32_t i_error_info);
#endif
/** @enum ProcessorCoreType
diff --git a/src/include/usr/initservice/initserviceif.H b/src/include/usr/initservice/initserviceif.H
index c8d98ce35..d469167b6 100644
--- a/src/include/usr/initservice/initserviceif.H
+++ b/src/include/usr/initservice/initserviceif.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2015 */
+/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* [+] Google Inc. */
/* [+] International Business Machines Corp. */
/* */
@@ -123,6 +123,8 @@ bool unregisterShutdownEvent(msg_q_t i_msgQ);
* Needed when starting payload
* on multi-node system.
*
+ * @param[in] i_error_info - Add'tl error data to be included in TI data area
+ *
* @return Nothing
*
* @note If inBackground = true, the shutdown call will spawn a child task
@@ -135,7 +137,20 @@ void doShutdown ( uint64_t i_status,
uint64_t i_payload_base = 0,
uint64_t i_payload_entry = 0,
uint64_t i_payload_data = 0,
- uint64_t i_masterHBInstance = THIS_NODE_NO_PAYLOAD);
+ uint64_t i_masterHBInstance = THIS_NODE_NO_PAYLOAD,
+ uint32_t i_error_info =0);
+
+/**
+ * @brief Wrapper function to perform shutdown including error data
+ * provided in the TI area. This function calls doShutdown() with
+ * the appropriate default parms.
+ *
+ * @param[in] i_status - Shutdown status to be passed along on shutdown
+ * @param[in] i_error_info - Add'tl error data to be included in TI data area
+ *
+ * @return Nothing
+ */
+void doShutdownWithError ( uint64_t i_status, uint32_t i_error_info);
/**
* @brief Returns if Service Processor Base Services are available
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index f7cb25961..e6c8348f5 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -109,7 +109,7 @@ void CpuManager::init_slave_smp(cpu_t* cpu)
Singleton<CpuManager>::instance().startSlaveCPU(cpu);
}
-void CpuManager::requestShutdown(uint64_t i_status)
+void CpuManager::requestShutdown(uint64_t i_status, uint32_t i_error_data)
{
cv_shutdown_status = i_status;
__sync_synchronize();
@@ -129,7 +129,7 @@ void CpuManager::requestShutdown(uint64_t i_status)
}
else
{
- termWriteSRC(TI_SHUTDOWN,i_status, 0);
+ termWriteSRC(TI_SHUTDOWN,i_status, 0, i_error_data);
}
printk("TI initiated on all threads (shutdown)\n");
diff --git a/src/kernel/misc.C b/src/kernel/misc.C
index 9c7ec7883..963c0a75c 100644
--- a/src/kernel/misc.C
+++ b/src/kernel/misc.C
@@ -54,10 +54,11 @@ KernelIpc::start_payload_data_area_t KernelIpc::start_payload_data_area;
namespace KernelMisc
{
- uint64_t g_payload_base = 0;
+ uint64_t g_payload_base = 0;
uint64_t g_payload_entry = 0;
- uint64_t g_payload_data = 0;
+ uint64_t g_payload_data = 0;
uint64_t g_masterHBInstance = 0xfffffffffffffffful;
+ uint32_t g_error_data = 0;
void shutdown()
{
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C
index 44edff61a..adef18afe 100644
--- a/src/kernel/syscall.C
+++ b/src/kernel/syscall.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2010,2016 */
+/* Contributors Listed Below - COPYRIGHT 2010,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -690,7 +690,8 @@ namespace Systemcalls
KernelMisc::g_payload_entry = static_cast<uint64_t>(TASK_GETARG2(t));
KernelMisc::g_payload_data = static_cast<uint64_t>(TASK_GETARG3(t));
KernelMisc::g_masterHBInstance= static_cast<uint64_t>(TASK_GETARG4(t));
- CpuManager::requestShutdown(status);
+ KernelMisc::g_error_data= static_cast<uint32_t>(TASK_GETARG5(t));
+ CpuManager::requestShutdown(status, KernelMisc::g_error_data);
TASK_SETRTN(t, 0);
}
diff --git a/src/kernel/terminate.C b/src/kernel/terminate.C
index 9b3fb7278..c39f2924c 100644
--- a/src/kernel/terminate.C
+++ b/src/kernel/terminate.C
@@ -66,11 +66,14 @@ void termWritePlid(uint16_t i_source, uint32_t plid)
kernel_TIDataArea.plid = plid;
}
-void termWriteSRC(uint16_t i_source, uint16_t i_reasoncode,uint64_t i_failAddr)
+void termWriteSRC(uint16_t i_source, uint16_t i_reasoncode,uint64_t i_failAddr,
+ uint32_t i_error_data)
{
- // Update the TI structure with the type of TI and who called.
+ // Update the TI structure with the type of TI, who called,
+ // and extra error data (if applicable, otherwise 0)
kernel_TIDataArea.type = TI_WITH_SRC;
kernel_TIDataArea.source = i_source;
+ kernel_TIDataArea.error_data = i_error_data;
// Update TID data area with the SRC info we have avail
kernel_TIDataArea.src.ID = 0xBC;
diff --git a/src/lib/syscall_misc.C b/src/lib/syscall_misc.C
index 22ead7a9a..fd8d76b62 100644
--- a/src/lib/syscall_misc.C
+++ b/src/lib/syscall_misc.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2015 */
+/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -34,14 +34,16 @@ void shutdown(uint64_t i_status,
uint64_t i_payload_base,
uint64_t i_payload_entry,
uint64_t i_payload_data,
- uint64_t i_masterHBInstance)
+ uint64_t i_masterHBInstance,
+ uint32_t i_error_data)
{
- _syscall5(MISC_SHUTDOWN,
+ _syscall6(MISC_SHUTDOWN,
reinterpret_cast<void*>(i_status),
reinterpret_cast<void*>(i_payload_base),
reinterpret_cast<void*>(i_payload_entry),
reinterpret_cast<void*>(i_payload_data),
- reinterpret_cast<void*>(i_masterHBInstance));
+ reinterpret_cast<void*>(i_masterHBInstance),
+ reinterpret_cast<void*>(i_error_data));
}
ProcessorCoreType cpu_core_type()
diff --git a/src/usr/initservice/baseinitsvc/initservice.C b/src/usr/initservice/baseinitsvc/initservice.C
index c3512b080..49a5dccc0 100644
--- a/src/usr/initservice/baseinitsvc/initservice.C
+++ b/src/usr/initservice/baseinitsvc/initservice.C
@@ -657,7 +657,8 @@ void doShutdown(uint64_t i_status,
uint64_t i_payload_base,
uint64_t i_payload_entry,
uint64_t i_payload_data,
- uint64_t i_masterHBInstance)
+ uint64_t i_masterHBInstance,
+ uint32_t i_error_info)
{
class ShutdownExecute
{
@@ -666,12 +667,14 @@ void doShutdown(uint64_t i_status,
uint64_t i_payload_base,
uint64_t i_payload_entry,
uint64_t i_payload_data,
- uint64_t i_masterHBInstance)
+ uint64_t i_masterHBInstance,
+ uint32_t i_error_info)
: status(i_status),
payload_base(i_payload_base),
payload_entry(i_payload_entry),
payload_data(i_payload_data),
- masterHBInstance(i_masterHBInstance)
+ masterHBInstance(i_masterHBInstance),
+ error_info(i_error_info)
{ }
void execute()
@@ -680,7 +683,8 @@ void doShutdown(uint64_t i_status,
payload_base,
payload_entry,
payload_data,
- masterHBInstance);
+ masterHBInstance,
+ error_info);
}
void startThread()
{
@@ -693,6 +697,7 @@ void doShutdown(uint64_t i_status,
uint64_t payload_entry;
uint64_t payload_data;
uint64_t masterHBInstance;
+ uint32_t error_info;
static void* run(void* _self)
{
@@ -709,7 +714,7 @@ void doShutdown(uint64_t i_status,
ShutdownExecute* s = new ShutdownExecute(i_status, i_payload_base,
i_payload_entry, i_payload_data,
- i_masterHBInstance);
+ i_masterHBInstance, i_error_info);
if (i_inBackground)
{
@@ -744,7 +749,8 @@ void InitService::doShutdown(uint64_t i_status,
uint64_t i_payload_base,
uint64_t i_payload_entry,
uint64_t i_payload_data,
- uint64_t i_masterHBInstance)
+ uint64_t i_masterHBInstance,
+ uint32_t i_error_info)
{
int l_rc = 0;
errlHndl_t l_err = NULL;
@@ -871,9 +877,17 @@ void InitService::doShutdown(uint64_t i_status,
i_payload_base,
i_payload_entry,
i_payload_data,
- i_masterHBInstance);
+ i_masterHBInstance,
+ i_error_info);
}
+void doShutdownWithError ( uint64_t i_status, uint32_t i_error_info)
+{
+ INITSERVICE::doShutdown( i_status,
+ false,
+ 0, 0, 0, THIS_NODE_NO_PAYLOAD,
+ i_error_info);
+}
bool InitService::registerShutdownEvent(msg_q_t i_msgQ,
diff --git a/src/usr/initservice/baseinitsvc/initservice.H b/src/usr/initservice/baseinitsvc/initservice.H
index e4be26603..70b1f8427 100644
--- a/src/usr/initservice/baseinitsvc/initservice.H
+++ b/src/usr/initservice/baseinitsvc/initservice.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2015 */
+/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -227,6 +227,7 @@ public:
* @param[in] i_masterHBInstance - master hostboot instance number (node)
* Needed when starting payload on a
* multi-node system.
+ * @param[in] i_error_info - Additional error data to be included in TI data
*
* @return Nothing
* @note This calls registered services to notify them of shutdown and it
@@ -236,7 +237,8 @@ public:
uint64_t i_payload_base = 0,
uint64_t i_payload_entry = 0,
uint64_t i_payload_data = 0,
- uint64_t i_masterHBInstance = 0xffffffffffffffffull);
+ uint64_t i_masterHBInstance = 0xffffffffffffffffull,
+ uint32_t i_error_info = 0);
protected:
diff --git a/src/usr/sbeio/sbe_fifodd.C b/src/usr/sbeio/sbe_fifodd.C
index 722457653..32f2326b8 100644
--- a/src/usr/sbeio/sbe_fifodd.C
+++ b/src/usr/sbeio/sbe_fifodd.C
@@ -149,7 +149,8 @@ errlHndl_t SbeFifo::performFifoChipOp(TARGETING::Target * i_target,
SBEIO_HWSV_COLLECT_SBE_RC,
orig_plid,
TWO_UINT32_TO_UINT64(orig_rc,orig_mod));
- INITSERVICE::doShutdown( SBEIO_HWSV_COLLECT_SBE_RC );
+ INITSERVICE::doShutdownWithError( SBEIO_HWSV_COLLECT_SBE_RC,
+ TARGETING::get_huid(i_target) );
}
SBE_TRACD(EXIT_MRK "performFifoChipOp");
diff --git a/src/usr/sbeio/sbe_psudd.C b/src/usr/sbeio/sbe_psudd.C
index 16695cc0a..90534deed 100644
--- a/src/usr/sbeio/sbe_psudd.C
+++ b/src/usr/sbeio/sbe_psudd.C
@@ -195,7 +195,8 @@ errlHndl_t SbePsu::performPsuChipOp(TARGETING::Target * i_target,
MAGIC_INST_GET_SBE_TRACES(
i_target->getAttr<TARGETING::ATTR_POSITION>(),
SBEIO_HWSV_COLLECT_SBE_RC);
- INITSERVICE::doShutdown( SBEIO_HWSV_COLLECT_SBE_RC );
+ INITSERVICE::doShutdownWithError( SBEIO_HWSV_COLLECT_SBE_RC,
+ TARGETING::get_huid(i_target) );
}
SBE_TRACD(EXIT_MRK "performPsuChipOp");
OpenPOWER on IntegriCloud