From 240f26001382001974fff7d62367e58df3f7b1db Mon Sep 17 00:00:00 2001 From: Bill Hoffa Date: Mon, 10 Apr 2017 14:43:51 -0500 Subject: 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 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Reviewed-by: Prachi Gupta Reviewed-by: Daniel M. Crowell --- src/include/bootloader/bootloader.H | 69 ++++++++++++++------------- src/include/kernel/cpumgr.H | 4 +- src/include/kernel/hbterminatetypes.H | 9 ++-- src/include/kernel/misc.H | 2 + src/include/kernel/terminate.H | 6 ++- src/include/sys/misc.h | 4 +- src/include/usr/initservice/initserviceif.H | 19 +++++++- src/kernel/cpumgr.C | 4 +- src/kernel/misc.C | 5 +- src/kernel/syscall.C | 5 +- src/kernel/terminate.C | 7 ++- src/lib/syscall_misc.C | 10 ++-- src/usr/initservice/baseinitsvc/initservice.C | 28 ++++++++--- src/usr/initservice/baseinitsvc/initservice.H | 6 ++- src/usr/sbeio/sbe_fifodd.C | 3 +- src/usr/sbeio/sbe_psudd.C | 3 +- 16 files changed, 119 insertions(+), 65 deletions(-) (limited to 'src') 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::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(TASK_GETARG2(t)); KernelMisc::g_payload_data = static_cast(TASK_GETARG3(t)); KernelMisc::g_masterHBInstance= static_cast(TASK_GETARG4(t)); - CpuManager::requestShutdown(status); + KernelMisc::g_error_data= static_cast(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(i_status), reinterpret_cast(i_payload_base), reinterpret_cast(i_payload_entry), reinterpret_cast(i_payload_data), - reinterpret_cast(i_masterHBInstance)); + reinterpret_cast(i_masterHBInstance), + reinterpret_cast(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(), 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"); -- cgit v1.2.1