diff options
Diffstat (limited to 'src/usr/testcore/rtloader')
-rw-r--r-- | src/usr/testcore/rtloader/loader.H | 1016 |
1 files changed, 723 insertions, 293 deletions
diff --git a/src/usr/testcore/rtloader/loader.H b/src/usr/testcore/rtloader/loader.H index c7f1193ef..d9d1448a2 100644 --- a/src/usr/testcore/rtloader/loader.H +++ b/src/usr/testcore/rtloader/loader.H @@ -25,6 +25,7 @@ #ifndef __TESTCORE_RTLOADER_LOADER_H #define __TESTCORE_RTLOADER_LOADER_H + #include <util/align.H> #include <sys/mm.h> #include <targeting/common/targetservice.H> @@ -44,7 +45,6 @@ #include <pnor/ecc.H> #include <ipmi/ipmiif.H> #include <targeting/common/attributeTank.H> -#include <config.h> #include <util/utilrsvdmem.H> #include <sys/misc.h> #include <errno.h> @@ -57,7 +57,10 @@ TRAC_INIT(&g_trac_hbrt, "HBRT_TEST", 12*KILOBYTE); class RuntimeLoaderTest : public CxxTest::TestSuite { - public: +public: + // ===================================================================== + // testLoader + // ===================================================================== void testLoader() { static const uint64_t HEADER_OFFSET = 0x2000; @@ -188,9 +191,12 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } #endif - } + } // end testLoader private: + // ===================================================================== + // tearDown + // ===================================================================== void tearDown() { if (cv_hb_data_addr != 0) @@ -218,8 +224,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite TRACFCOMP( g_trac_hbrt, "tearDown(): skipping unmap hb_data virt addr"); } - } + } // end tearDown + // ===================================================================== + // callViaCtr + // ===================================================================== uint64_t callViaCtr(uint64_t entry, void* param0, void* param1) { register uint64_t result = 0; @@ -232,23 +241,35 @@ class RuntimeLoaderTest : public CxxTest::TestSuite "r10","r11"); // TODO: Need to double check the ABI here. return result; - } + } // end callViaCtr + // ===================================================================== + // rt_puts + // ===================================================================== static void rt_puts(const char* str) { TRACFCOMP(g_trac_hbrt, "HBRT TRACE: %s", str); } + // ===================================================================== + // rt_setPageExecute + // ===================================================================== static int rt_setPageExecute(void* addr) { return mm_set_permission(addr, PAGESIZE, EXECUTABLE); } + // ===================================================================== + // rt_assert + // ===================================================================== static void rt_assert() { assert(false); } + // ===================================================================== + // rt_scom_read + // ===================================================================== static int rt_scom_read(uint64_t chipid, uint64_t addr, void* data) @@ -284,8 +305,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } return rc; - } + } // end rt_scom_read + // ===================================================================== + // rt_scom_write + // ===================================================================== static int rt_scom_write(uint64_t chipid, uint64_t addr, void* data) @@ -313,12 +337,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } return rc; - } - - typedef std::pair<uint64_t,uint64_t> SCOM_KEY; - typedef std::map<SCOM_KEY,uint64_t> SCOM_MAP; - static SCOM_MAP cv_scomMap; + } // end rt_scom_write + // ===================================================================== + // rt_logErr + // ===================================================================== static int rt_logErr(uint32_t plid, uint32_t data_len, void * data) @@ -340,10 +363,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite errlCommit(err,CXXTEST_COMP_ID); return rc; - } - - static std::map<void*, UtilLidMgr*> cv_loadedLids; + } // end rt_logErr + // ===================================================================== + // rt_lid_load + // ===================================================================== static int rt_lid_load(uint32_t lid, void** buffer, size_t* size) { errlHndl_t l_errl = NULL; @@ -375,9 +399,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite cv_loadedLids[*buffer] = lidmgr; return 0; } + } // end rt_lid_load - } - + // ===================================================================== + // rt_lid_unload + // ===================================================================== static int rt_lid_unload(void* buffer) { UtilLidMgr* lidmgr = cv_loadedLids[buffer]; @@ -389,7 +415,9 @@ class RuntimeLoaderTest : public CxxTest::TestSuite return 0; } - //-------------------------------------------------------------------- + // ===================================================================== + // rt_get_reserved_mem + // ===================================================================== static uint64_t rt_get_reserved_mem(const char* i_region, uint32_t i_instance) { @@ -401,6 +429,9 @@ class RuntimeLoaderTest : public CxxTest::TestSuite return 0; } + // ===================================================================== + // rt_get_hb_data + // ===================================================================== static uint64_t rt_get_hb_data(uint32_t i_instance) { TRACFCOMP( g_trac_hbrt, @@ -416,7 +447,6 @@ class RuntimeLoaderTest : public CxxTest::TestSuite return cv_hb_data_addr; } - uint64_t l_physical_addr = cpu_spr_value(CPU_SPR_HRMOR) + VMM_HB_DATA_TOC_START_OFFSET; @@ -469,9 +499,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite i_instance, cv_hb_data_addr); return cv_hb_data_addr; - } - + } // end rt_get_hb_data + // ===================================================================== + // find_sectionId + // ===================================================================== static PNOR::SectionId find_sectionId (const char* i_partitionName) { PNOR::SectionId l_id = PNOR::INVALID_SECTION; @@ -485,8 +517,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } } return l_id; - } + } // end find_sectionId + // ===================================================================== + // rt_pnor_read + // ===================================================================== static int rt_pnor_read (uint32_t i_proc, const char* i_partitionName, uint64_t i_offset, void* o_data, size_t i_sizeBytes) { @@ -559,9 +594,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_pnor_read"); return rc; - } - + } // end rt_pnor_read + // ===================================================================== + // rt_pnor_write + // ===================================================================== static int rt_pnor_write(uint32_t i_proc, const char* i_partitionName, uint64_t i_offset, void* i_data, size_t i_sizeBytes) { @@ -624,9 +661,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_pnor_write"); return rc; - } + } // end rt_pnor_write - //-------------------------------------------------------------------- + // ===================================================================== + // rt_get_comm + // ===================================================================== static uint64_t rt_get_comm(uint32_t i_instance) { if (cv_comm_addr != 0) @@ -677,9 +716,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite "calculated cv_comm_addr:%lld", cv_comm_addr); return cv_comm_addr; - } + } // end rt_get_comm - //-------------------------------------------------------------------- + // ===================================================================== + // rt_ipmi_msg + // ===================================================================== static int rt_ipmi_msg(uint8_t netfn, uint8_t cmd, void *tx_buf, size_t tx_size, void *rx_buf, size_t *rx_size) @@ -704,9 +745,11 @@ class RuntimeLoaderTest : public CxxTest::TestSuite } TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_ipmi_msg"); return l_plid; - } + } // end rt_ipmi_msg - //-------------------------------------------------------------------- + // ===================================================================== + // rt_hcode_update + // ===================================================================== static int rt_hcode_update( uint64_t i_chipId, uint32_t i_section, uint32_t i_operation, @@ -721,291 +764,677 @@ class RuntimeLoaderTest : public CxxTest::TestSuite return 0; } - //-------------------------------------------------------------------- - static int rt_firmware_request(uint64_t i_reqLen, void *i_req, - uint64_t* o_respLen, void *o_resp ) + // ===================================================================== + // rt_firmware_request + // ===================================================================== + static int rt_firmware_request(uint64_t i_reqLen, void *i_req, + uint64_t* o_respLen, void *o_resp ) { + TRACFCOMP(g_trac_hbrt, ENTER_MRK"rt_firmware_request: " + "request length:%d, request ptr:%p, " + "response length:%d, response ptr:%p", + i_reqLen, i_req, *o_respLen, o_resp ); + + if ( (i_req == nullptr) || + (o_respLen == nullptr) || + (o_resp == nullptr) ) + { + TS_FAIL("rt_firmware_request: FAILED: Received bad input - " + "either request message, response length " + "or response message is NULL") + + return -EINVAL; + } + + if ( (*o_respLen != i_reqLen) && + (*o_respLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(hostInterfaces::hbrt_fw_msg))) ) + { + TS_FAIL("rt_firmware_request: FAILED: Response length(%d) " + "needs to be at a minimum(%d), or equal to " + "request length(%d)", + *o_respLen, + (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(hostInterfaces::hbrt_fw_msg)), + i_reqLen); + + return -EINVAL; + } + size_t retVal = 0; + do { - if (i_req == nullptr || - o_respLen == nullptr || - o_resp == nullptr) - { - retVal = -EINVAL; - break; - } + // Cast the input to the type of data that it is + hostInterfaces::hbrt_fw_msg* l_req_fw_msg = + reinterpret_cast<hostInterfaces::hbrt_fw_msg*>(i_req); + hostInterfaces::hbrt_fw_msg* l_resp_fw_msg = + reinterpret_cast<hostInterfaces::hbrt_fw_msg*>(o_resp); - hostInterfaces::hbrt_fw_msg* l_req_fw_msg = - (hostInterfaces::hbrt_fw_msg*) i_req; - hostInterfaces::hbrt_fw_msg* l_resp_fw_msg = - (hostInterfaces::hbrt_fw_msg*) o_resp; - - if (hostInterfaces::HBRT_FW_MSG_TYPE_REQ_HCODE_UPDATE + if (hostInterfaces::HBRT_FW_MSG_TYPE_REQ_HCODE_UPDATE == l_req_fw_msg->io_type) - { - if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_req_fw_msg->req_hcode_update))) - { - retVal = -EINVAL; - break; - } - - if (*o_respLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_resp_fw_msg->resp_generic))) - { - retVal = -EINVAL; - break; - } - - TRACFCOMP(g_trac_hbrt, - "rt_firmware_request for HCODE SCOM update: " - "type:%d, chipId:0x%X, section:%d, " - "operation:%d, scomAddr:0x%X scomData:0x%X", - l_req_fw_msg->io_type, - l_req_fw_msg->req_hcode_update.i_chipId, - l_req_fw_msg->req_hcode_update.i_section, - l_req_fw_msg->req_hcode_update.i_operation, - l_req_fw_msg->req_hcode_update.i_scomAddr, - l_req_fw_msg->req_hcode_update.i_scomData); - - l_resp_fw_msg->io_type = - hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; - - // dummy return value for testing - l_resp_fw_msg->resp_generic.o_status = 264; - - retVal = 1; // just return 1 for testing - } - else if (hostInterfaces::HBRT_FW_MSG_TYPE_ERROR_LOG + { + retVal = testFirmwareRequestHcodeUpdate(i_reqLen, + l_req_fw_msg, + *o_respLen, + l_resp_fw_msg ); + } + else if (hostInterfaces::HBRT_FW_MSG_TYPE_ERROR_LOG == l_req_fw_msg->io_type) - { - if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_req_fw_msg->error_log))) - { - retVal = -EINVAL; - break; - } - - if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_req_fw_msg->error_log) + - l_req_fw_msg->error_log.i_errlSize - 1)) - { - retVal = -EINVAL; - break; - } - - if (*o_respLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_resp_fw_msg->resp_generic))) - { - retVal = -EINVAL; - break; - } - - TRACFCOMP(g_trac_hbrt, - "rt_firmware_request for error log: " - "type:%d, plid:0x%08x, size:%d, data:0x%02x", - l_req_fw_msg->io_type, - l_req_fw_msg->error_log.i_plid, - l_req_fw_msg->error_log.i_errlSize, - l_req_fw_msg->error_log.i_data); - - l_resp_fw_msg->io_type = - hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; - - // dummy return value for testing - l_resp_fw_msg->resp_generic.o_status = 20; - - retVal = 0; // just return 0 for testing - } - else if (hostInterfaces::HBRT_FW_MSG_HBRT_FSP_REQ + { + retVal = testFirmwareRequestErrLogToFsp(i_reqLen, + l_req_fw_msg, + *o_respLen, + l_resp_fw_msg ); + } + else if (hostInterfaces::HBRT_FW_MSG_HBRT_FSP_REQ == l_req_fw_msg->io_type) - { - if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_req_fw_msg->generic_msg))) - { - retVal = -EINVAL; - break; - } - - if (*o_respLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + - sizeof(l_resp_fw_msg->generic_msg))) - { - retVal = -EINVAL; - break; - } - - if (i_reqLen != *o_respLen) - { - retVal = -EINVAL; - break; - } - - uint32_t* l_data = - (uint32_t*) &(l_req_fw_msg->generic_msg.data); - TRACFCOMP(g_trac_hbrt, - "rt_firmware_request request: " - "type:%d, magic:0x%.8X, dataSize:%d, " - "structVer:0x%.8X, seqnum:%d, msgq:0x%.8X, " - "msgType:0x%.8X, __req:%d, __onlyError:%d, " - "data:0x%.8X, plid:0x%.8X, huid:0x%.8X", - l_req_fw_msg->io_type, - l_req_fw_msg->generic_msg.magic, - l_req_fw_msg->generic_msg.dataSize, - l_req_fw_msg->generic_msg.structVer, - l_req_fw_msg->generic_msg.seqnum, - l_req_fw_msg->generic_msg.msgq, - l_req_fw_msg->generic_msg.msgType, - l_req_fw_msg->generic_msg.__req, - l_req_fw_msg->generic_msg.__onlyError, - l_req_fw_msg->generic_msg.data, - l_data[0], - l_data[1]); - - // Simple map of SCOM addresses to values, this ignores - // the target (or huid). - static std::map<uint64_t, uint64_t> l_scomCache; - - // Used to give unique, spoofed SCOM values - static uint64_t l_fakeVal = 0x11; - - // Simulate response message from FSP - l_resp_fw_msg->io_type = + { + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(l_req_fw_msg->generic_msg))) + { + TS_FAIL("rt_firmware_request: FAILED: Generic FSP " + "Message' response length(%d) needs to be " + "at a minimum(%d)", + *o_respLen, + (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(l_req_fw_msg->generic_msg)) ); + + retVal = -EINVAL; + break; + } + + TRACDCOMP(g_trac_hbrt, + "rt_firmware_request: Generic FSP Message' " + "Request data set 1/2: " + "type:%d, magic:0x%.8X, dataSize:%d, " + "structVer:0x%.8X, seqnum:%d, msgq:0x%.8X", + l_req_fw_msg->io_type, + l_req_fw_msg->generic_msg.magic, + l_req_fw_msg->generic_msg.dataSize, + l_req_fw_msg->generic_msg.structVer, + l_req_fw_msg->generic_msg.seqnum, + l_req_fw_msg->generic_msg.msgq); + + TRACDCOMP(g_trac_hbrt, + "rt_firmware_request: Generic FSP Message' " + "Request data set 2/2: " + "msgType:0x%.8X, __req:%d, " + "__onlyError:%d, data:0x%.8X", + l_req_fw_msg->generic_msg.msgType, + l_req_fw_msg->generic_msg.__req, + l_req_fw_msg->generic_msg.__onlyError, + l_req_fw_msg->generic_msg.data); + + // Simulate response message from FSP + l_resp_fw_msg->io_type = hostInterfaces::HBRT_FW_MSG_HBRT_FSP_RESP; - l_resp_fw_msg->generic_msg.magic = + l_resp_fw_msg->generic_msg.magic = GenericFspMboxMessage_t::MAGIC_NUMBER; - l_resp_fw_msg->generic_msg.structVer = + l_resp_fw_msg->generic_msg.structVer = l_req_fw_msg->generic_msg.structVer; - l_resp_fw_msg->generic_msg.seqnum = + l_resp_fw_msg->generic_msg.seqnum = l_req_fw_msg->generic_msg.seqnum + 1; - l_resp_fw_msg->generic_msg.msgq = + l_resp_fw_msg->generic_msg.msgq = l_req_fw_msg->generic_msg.msgq; - l_resp_fw_msg->generic_msg.msgType = + l_resp_fw_msg->generic_msg.msgType = l_req_fw_msg->generic_msg.msgType; - l_resp_fw_msg->generic_msg.__req = + l_resp_fw_msg->generic_msg.__req = GenericFspMboxMessage_t::RESPONSE; - l_resp_fw_msg->generic_msg.__onlyError = + l_resp_fw_msg->generic_msg.__onlyError = GenericFspMboxMessage_t::NOT_ERROR_ONLY; - switch (l_req_fw_msg->generic_msg.msgType) - { - case GenericFspMboxMessage_t::MSG_SINGLE_SCOM_OP: - { - SingleScomOpHbrtFspData_t* l_req_fspData = - reinterpret_cast<SingleScomOpHbrtFspData_t*> - (&(l_req_fw_msg->generic_msg.data)); - SingleScomOpHbrtFspData_t* l_resp_fspData = - reinterpret_cast<SingleScomOpHbrtFspData_t*> - (&(l_resp_fw_msg->generic_msg.data)); - - l_resp_fw_msg->generic_msg.dataSize = - GENERIC_FSP_MBOX_MESSAGE_BASE_SIZE + - sizeof(SingleScomOpHbrtFspData_t); - - auto l_scomAddr = l_req_fspData->scom_addr; - auto targ = l_scomCache.find(l_scomAddr); - if (targ == l_scomCache.end()) // need to create - { // a cache entry - l_scomCache[l_scomAddr] = l_fakeVal++; - } - - l_resp_fspData->scom_op = l_req_fspData->scom_op; - l_resp_fspData->huid = l_req_fspData->huid; - l_resp_fspData->scom_addr = l_req_fspData->scom_addr; - if (l_resp_fspData->scom_op == DeviceFW::WRITE) - { - l_scomCache[l_scomAddr] = - l_req_fspData->scom_data; - } - l_resp_fspData->scom_data = l_scomCache[l_scomAddr]; - retVal = 0; - break; - } - case GenericFspMboxMessage_t::MSG_MULTI_SCOM_OP: - { - MultiScomReadHbrtFspData_t* l_req_fspData = - reinterpret_cast<MultiScomReadHbrtFspData_t*> - (&(l_req_fw_msg->generic_msg.data)); - MultiScomReadHbrtFspData_t* l_resp_fspData = - reinterpret_cast<MultiScomReadHbrtFspData_t*> - (&(l_resp_fw_msg->generic_msg.data)); - - l_resp_fw_msg->generic_msg.dataSize = - GENERIC_FSP_MBOX_MESSAGE_BASE_SIZE + - sizeof(MultiScomReadHbrtFspData_t) + - ((l_req_fspData->scom_num - 1) * sizeof(uint64_t)); - - auto l_scomAddrs = - static_cast<uint64_t *> - (&l_req_fspData->scom_data); - auto l_scomData = - static_cast<uint64_t *> - (&l_resp_fspData->scom_data); - - l_resp_fspData->huid = l_req_fspData->huid; - l_resp_fspData->scom_num = l_req_fspData->scom_num; - for (int i = 0;i < l_resp_fspData->scom_num;++i) - { - auto targ = l_scomCache.find(l_scomAddrs[i]); - if (targ == l_scomCache.end()) // need to create - { // a cache entry - l_scomCache[l_scomAddrs[i]] = l_fakeVal++; - } - l_scomData[i] = l_scomCache[l_scomAddrs[i]]; - } - retVal = 0; - break; - } - default: - // random testing data - struct - { - uint32_t plid; - uint32_t huid; - } l_resp_data; - - l_resp_fw_msg->generic_msg.dataSize = - sizeof(l_resp_fw_msg->generic_msg); - - l_resp_data.plid = 0x60; - l_resp_data.huid = 0x70; - memcpy(&(l_resp_fw_msg->generic_msg.data), - &(l_resp_data), - sizeof(l_resp_fw_msg->generic_msg.data)); - retVal = 5; - break; - } - - TRACFCOMP(g_trac_hbrt, - "rt_firmware_request response: " - "type:%d, magic:0x%.8X, dataSize:%d, structVer:0x%.8X, " - "seqnum:%d, msgq:0x%.8X, msgType:0x%.8X, __req:%d, " - "__onlyError:%d, data:0x%.8X, plid:0x%.8X, huid:0x%.8X, " - "retVal=%d", - l_resp_fw_msg->io_type, - l_resp_fw_msg->generic_msg.magic, - l_resp_fw_msg->generic_msg.dataSize, - l_resp_fw_msg->generic_msg.structVer, - l_resp_fw_msg->generic_msg.seqnum, - l_resp_fw_msg->generic_msg.msgq, - l_resp_fw_msg->generic_msg.msgType, - l_resp_fw_msg->generic_msg.__req, - l_resp_fw_msg->generic_msg.__onlyError, - l_resp_fw_msg->generic_msg.data, - l_resp_fw_msg->generic_msg.data >> 32, - 0x0000FFFF & l_resp_fw_msg->generic_msg.data, - retVal); - } - else - { - TRACFCOMP(g_trac_hbrt, - "rt_firmware_request: unrecognized request, type=%d", - l_req_fw_msg->io_type); + + // Check the individual message types + switch (l_req_fw_msg->generic_msg.msgType) + { + case GenericFspMboxMessage_t::MSG_SINGLE_SCOM_OP: + { + testFirmwareRequestSingleScomOperation(i_reqLen, + l_req_fw_msg, + *o_respLen, + l_resp_fw_msg); + break; + } + case GenericFspMboxMessage_t::MSG_MULTI_SCOM_OP: + { + testFirmwareRequestMultipleScomOperation(i_reqLen, + l_req_fw_msg, + *o_respLen, + l_resp_fw_msg); + break; + } + case GenericFspMboxMessage_t::MSG_ATTR_WRITE_OP: + { + testFirmwareRequestSendAttributes(i_reqLen, + l_req_fw_msg, + *o_respLen, + l_resp_fw_msg); + break; + } + case GenericFspMboxMessage_t::MSG_SBE_ERROR: + { + retVal = testFirmwareRequestSbeRetry(i_reqLen, + l_req_fw_msg, + *o_respLen, + l_resp_fw_msg); + break; + } + + default: + { + TS_FAIL("rt_firmware_request: FAILED: Generic FSP " + "unrecognized test request, type(0x%X). " + "Need to add a test case for this " + "generic FSP firmware request type", + l_req_fw_msg->generic_msg.msgType); + break; + } + } // end switch (l_req_fw_msg->generic_msg.msgType) + + TRACDCOMP(g_trac_hbrt, + "rt_firmware_request: Generic FSP Message' " + "Response data set 1/2: " + "type:%d, magic:0x%.8X, dataSize:%d, " + "structVer:0x%.8X, seqnum:%d, msgq:0x%.8X", + l_resp_fw_msg->io_type, + l_resp_fw_msg->generic_msg.magic, + l_resp_fw_msg->generic_msg.dataSize, + l_resp_fw_msg->generic_msg.structVer, + l_resp_fw_msg->generic_msg.seqnum, + l_resp_fw_msg->generic_msg.msgq); + + TRACDCOMP(g_trac_hbrt, + "rt_firmware_request: Generic FSP Message' " + "Response data set 2/2: " + "msgType:0x%.8X, __req:%d, __onlyError:%d, " + "data:0x%.8X", + l_resp_fw_msg->generic_msg.msgType, + l_resp_fw_msg->generic_msg.__req, + l_resp_fw_msg->generic_msg.__onlyError, + l_resp_fw_msg->generic_msg.data); + + } // end else if (hostInterfaces::HBRT_FW_MSG_HBRT_FSP_REQ + else + { + TS_FAIL("rt_firmware_request: FAILED: " + "unrecognized test request, type(0x%X). Need to " + "add a test case for this firmware request type", + l_req_fw_msg->io_type); } } while (0) ; + TRACFCOMP(g_trac_hbrt, EXIT_MRK"rt_firmware_request: returning %d", + retVal ); + return retVal; - } + } // end static int rt_firmware_request ... + + /// Firmware Request Test Helper Functions + // ===================================================================== + // testFirmwareRequestSbeRetry + // ===================================================================== + static size_t testFirmwareRequestSbeRetry( + uint64_t i_reqLen, + hostInterfaces::hbrt_fw_msg* i_req_fw_msg, + uint64_t i_respLen, + hostInterfaces::hbrt_fw_msg* i_resp_fw_msg ) + { + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request::testFirmwareRequestSbeRetry"); + + struct + { + uint32_t plid; + uint32_t huid; + } l_resp_data; + + i_resp_fw_msg->generic_msg.dataSize = + sizeof(i_resp_fw_msg->generic_msg); + + l_resp_data.plid = 0x60; + l_resp_data.huid = 0x70; + memcpy(&(i_resp_fw_msg->generic_msg.data), + &(l_resp_data), + sizeof(i_resp_fw_msg->generic_msg.data)); + + TRACFCOMP(g_trac_hbrt, EXIT_MRK + "rt_firmware_request::testFirmwareRequestSbeRetry"); + + return 5; + } // end testFirmwareRequestSbeRetry + + // ===================================================================== + // testFirmwareRequestSingleScomOperation + // ===================================================================== + static void testFirmwareRequestSingleScomOperation( + uint64_t i_reqLen, + hostInterfaces::hbrt_fw_msg* i_req_fw_msg, + uint64_t i_respLen, + hostInterfaces::hbrt_fw_msg* i_resp_fw_msg ) + { + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request::testFirmwareRequestSingleScomOperation"); + + // Simple map of SCOM addresses to values, this ignores + // the target (or huid). + static std::map<uint64_t, uint64_t> l_scomCache; + + // Used to give unique, spoofed SCOM values + static uint64_t l_fakeVal = 0x11; + + SingleScomOpHbrtFspData_t* l_req_fspData = + reinterpret_cast<SingleScomOpHbrtFspData_t*> + (&(i_req_fw_msg->generic_msg.data)); + + SingleScomOpHbrtFspData_t* l_resp_fspData = + reinterpret_cast<SingleScomOpHbrtFspData_t*> + (&(i_resp_fw_msg->generic_msg.data)); + + i_resp_fw_msg->generic_msg.dataSize = + GENERIC_FSP_MBOX_MESSAGE_BASE_SIZE + + sizeof(SingleScomOpHbrtFspData_t); + + auto l_scomAddr = l_req_fspData->scom_addr; + auto targ = l_scomCache.find(l_scomAddr); + if (targ == l_scomCache.end()) // need to create + { // a cache entry + l_scomCache[l_scomAddr] = l_fakeVal++; + } + + l_resp_fspData->scom_op = l_req_fspData->scom_op; + l_resp_fspData->huid = l_req_fspData->huid; + l_resp_fspData->scom_addr = l_req_fspData->scom_addr; + + if (l_resp_fspData->scom_op == DeviceFW::WRITE) + { + l_scomCache[l_scomAddr] = + l_req_fspData->scom_data; + } + l_resp_fspData->scom_data = l_scomCache[l_scomAddr]; + + TRACFCOMP(g_trac_hbrt, EXIT_MRK + "rt_firmware_request::testFirmwareRequestSingleScomOperation"); + } // end testFirmwareRequestSingleScomOperation + + // ===================================================================== + // testFirmwareRequestMultipleScomOperation + // ===================================================================== + static void testFirmwareRequestMultipleScomOperation( + uint64_t i_reqLen, + hostInterfaces::hbrt_fw_msg* i_req_fw_msg, + uint64_t i_respLen, + hostInterfaces::hbrt_fw_msg* i_resp_fw_msg ) + { + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request::testFirmwareRequestMultipleScomOperation"); + + // Simple map of SCOM addresses to values, this ignores + // the target (or huid). + static std::map<uint64_t, uint64_t> l_scomCache; + + // Used to give unique, spoofed SCOM values + static uint64_t l_fakeVal = 0x11; + + MultiScomReadHbrtFspData_t* l_req_fspData = + reinterpret_cast<MultiScomReadHbrtFspData_t*> + (&(i_req_fw_msg->generic_msg.data)); + MultiScomReadHbrtFspData_t* l_resp_fspData = + reinterpret_cast<MultiScomReadHbrtFspData_t*> + (&(i_resp_fw_msg->generic_msg.data)); + + i_resp_fw_msg->generic_msg.dataSize = + GENERIC_FSP_MBOX_MESSAGE_BASE_SIZE + + sizeof(MultiScomReadHbrtFspData_t) + + ((l_req_fspData->scom_num - 1) * sizeof(uint64_t)); + + auto l_scomAddrs = + static_cast<uint64_t *> + (&l_req_fspData->scom_data); + auto l_scomData = + static_cast<uint64_t *> + (&l_resp_fspData->scom_data); + + l_resp_fspData->huid = l_req_fspData->huid; + l_resp_fspData->scom_num = l_req_fspData->scom_num; + for (int i = 0;i < l_resp_fspData->scom_num;++i) + { + auto targ = l_scomCache.find(l_scomAddrs[i]); + if (targ == l_scomCache.end()) // need to create + { // a cache entry + l_scomCache[l_scomAddrs[i]] = l_fakeVal++; + } + l_scomData[i] = l_scomCache[l_scomAddrs[i]]; + } + + TRACFCOMP(g_trac_hbrt, EXIT_MRK + "rt_firmware_request::testFirmwareRequestMultipleScomOperation"); + } // end testFirmwareRequestMultipleScomOperation + + // ===================================================================== + // testFirmwareRequestSendAttributes + // ===================================================================== + static void testFirmwareRequestSendAttributes( + uint64_t i_reqLen, + hostInterfaces::hbrt_fw_msg* i_req_fw_msg, + uint64_t i_respLen, + hostInterfaces::hbrt_fw_msg* i_resp_fw_msg ) + { + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request::testFirmwareRequestSendAttributes"); + + uint32_t l_dataSize = i_reqLen - + ( hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->generic_msg.data) + + sizeof(AttributeSetter_t) ); + + if (l_dataSize < 0) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: FAILED: " + "Size of the AttributeSetter_t data is " + "negative(%d)", l_dataSize); + return; + } + + // Get a handle to the AttributeSetter_t + AttributeSetter_t* l_attributeSetter = + reinterpret_cast<AttributeSetter_t*> + (&(i_req_fw_msg->generic_msg.data)); + // Get a handle to the Attributes Data + uint8_t* l_attributeData = reinterpret_cast<uint8_t*> + (l_attributeSetter->iv_attrData); + + // Create some Attributes to populate with serialized data and + // compare to expected values + TARGETING::AttributeTank::Attribute l_sentAttribute, + l_expectedAttribute; + uint32_t l_deserializedDataSize(0); + + // Create a buffer to be used to test against + uint32_t l_bufferSize(3); + uint8_t l_buffer[l_bufferSize]; + + // Populate buffer with known values + l_buffer[0] = 0xAA; + l_buffer[1] = 0xBB; + l_buffer[2] = 0xCC; + + // Iterate thru the attributes and compare to expected values + for (uint16_t i = 0; i < l_attributeSetter->iv_numAttributes; ++i) + { + // Deserialize the data, if possible + l_deserializedDataSize = l_sentAttribute.deserialize + (l_attributeData, l_dataSize); + + if (!l_deserializedDataSize) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: FAILED: " + "deserialization of attribute failed") + return; + } + + if (0 == i) + { + // Verify first deserialized Attribute + if (!compareAttributeHeader(&l_sentAttribute, + &l_expectedAttribute)) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: " + "Test 1 FAILED: sent Attribute does not match " + "expected Values"); + } + + // Prep for next test + l_expectedAttribute.setId(0x1001); + l_expectedAttribute.setTargetType(0x2002); + l_expectedAttribute.setPosition(0x3003); + l_expectedAttribute.setUnitPosition(0x4); + l_expectedAttribute.setNode(0x5); + l_expectedAttribute.setFlags(0x6); + } // end if (0 == i) + else if (1 == i) + { + // Verify second deserialized Attribute + if (!compareAttributeHeader(&l_sentAttribute, + &l_expectedAttribute)) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: " + "Test 2 FAILED: sent Attribute does not match " + "expected Values"); + } + + // Prep for next test + l_expectedAttribute.setValue(l_buffer, 1); + } // end else if (1 == i) + else if (2 == i) + { + // Verify third deserialized Attribute + if (!compareAttributeHeader(&l_sentAttribute, + &l_expectedAttribute)) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: " + "Test 3 FAILED: sent Attribute does not match " + "expected Values"); + } + + if (!compareAttributeValues(&l_sentAttribute, + &l_expectedAttribute)) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: " + "Test 3 FAILED: sent Attribute Values does not " + "match expected Values"); + } + + // Prep for next test + l_buffer[0] = 0xDD; + l_expectedAttribute.setValue(l_buffer, l_bufferSize); + } // end else if (2 == i) + else if (3 == i) + { + // Verify fourth deserialized Attribute + if (!compareAttributeHeader(&l_sentAttribute, + &l_expectedAttribute)) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: " + "Test 4 FAILED: sent Attribute does not match " + "expected Values"); + } + + if (!compareAttributeValues(&l_sentAttribute, + &l_expectedAttribute)) + { + TS_FAIL("rt_firmware_request::" + "testFirmwareRequestSendAttributes: " + "Test 4 FAILED: sent Attribute Values does not " + "match expected Values"); + } + } // end else if (3 == i) + + // Decrement/increment our counters/pointers + l_dataSize -= l_deserializedDataSize; + l_attributeData += l_deserializedDataSize; + + } // end for (uint16_t i = 0; ... + + TRACFCOMP(g_trac_hbrt, EXIT_MRK + "rt_firmware_request::testFirmwareRequestSendAttributes"); + } // end testFirmwareRequestSendAttributes + + // ===================================================================== + // testFirmwareRequestErrLogToFsp + // ===================================================================== + static size_t testFirmwareRequestErrLogToFsp( + uint64_t i_reqLen, + hostInterfaces::hbrt_fw_msg* i_req_fw_msg, + uint64_t i_respLen, + hostInterfaces::hbrt_fw_msg* i_resp_fw_msg ) + + { + + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request::testFirmwareRequestErrLogToFsp"); + + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->error_log))) + { + TS_FAIL("rt_firmware_request::testFirmwareRequestErrLogToFsp: " + "FAILED: Request length(%d) needs to be at a " + "minimum(%d)", + i_reqLen, + (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->error_log)) ); + return -EINVAL; + } + + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->error_log) + + i_req_fw_msg->error_log.i_errlSize - 1)) + { + TS_FAIL("rt_firmware_request::testFirmwareRequestErrLogToFsp: " + "FAILED: Request length(%d) needs to be at a " + "minimum(%d)", + i_reqLen, + (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->error_log) + + i_req_fw_msg->error_log.i_errlSize - 1) ); + return -EINVAL; + } + + if ( (0x300 != i_req_fw_msg->error_log.i_plid) || + ( 1 != i_req_fw_msg->error_log.i_errlSize) || + ( 0xAA != i_req_fw_msg->error_log.i_data) ) + { + TS_FAIL("rt_firmware_request::testFirmwareRequestErrLogToFsp: " + "FAILED: Loader received incorrect data: type:%d, " + "plid:0x%08x, size:%d, data:0x%02x", + i_req_fw_msg->io_type, + i_req_fw_msg->error_log.i_plid, + i_req_fw_msg->error_log.i_errlSize, + i_req_fw_msg->error_log.i_data); + } + + i_resp_fw_msg->io_type = + hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; + + // dummy return value for testing + i_resp_fw_msg->resp_generic.o_status = 20; + + TRACFCOMP(g_trac_hbrt, EXIT_MRK + "rt_firmware_request::testFirmwareRequestErrLogToFsp"); + + // just return 0 for testing + return 0; + } // end testFirmwareRequestErrLogToFsp + + // ===================================================================== + // testFirmwareRequestHcodeUpdate + // ===================================================================== + static size_t testFirmwareRequestHcodeUpdate( + uint64_t i_reqLen, + hostInterfaces::hbrt_fw_msg* i_req_fw_msg, + uint64_t i_respLen, + hostInterfaces::hbrt_fw_msg* i_resp_fw_msg ) + { + TRACFCOMP(g_trac_hbrt, ENTER_MRK + "rt_firmware_request::testFirmwareRequestHcodeUpdate"); + + if (i_reqLen < (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->req_hcode_update))) + { + TRACFCOMP(g_trac_hbrt, ENTER_MRK"rt_firmware_request::" + "testFirmwareRequestHcodeUpdate: FAILED: Request " + "length(%d) needs to be at a minimum(%d)", + i_reqLen, + (hostInterfaces::HBRT_FW_MSG_BASE_SIZE + + sizeof(i_req_fw_msg->req_hcode_update)) ); + return -EINVAL; + } + + if ( (0x100 != i_req_fw_msg->req_hcode_update.i_chipId) || + ( 20 != i_req_fw_msg->req_hcode_update.i_section) || + ( 30 != i_req_fw_msg->req_hcode_update.i_operation) || + (0x400 != i_req_fw_msg->req_hcode_update.i_scomAddr) || + (0x500 != i_req_fw_msg->req_hcode_update.i_scomData) ) + { + TS_FAIL("rt_firmware_request::testFirmwareRequestHcodeUpdate: " + "FAILED: Loader received incorrect data: chipId:0x%X, " + "section:%d, operation:%d, scomAddr:0x%X, scomData:0x%X", + i_req_fw_msg->req_hcode_update.i_chipId, + i_req_fw_msg->req_hcode_update.i_section, + i_req_fw_msg->req_hcode_update.i_operation, + i_req_fw_msg->req_hcode_update.i_scomAddr, + i_req_fw_msg->req_hcode_update.i_scomData); + } + + i_resp_fw_msg->io_type = + hostInterfaces::HBRT_FW_MSG_TYPE_RESP_GENERIC; + + // dummy return value for testing + i_resp_fw_msg->resp_generic.o_status = 264; + + + TRACFCOMP(g_trac_hbrt, EXIT_MRK + "rt_firmware_request::testFirmwareRequestHcodeUpdate"); + + // just return 1 for testing + return 1; + } // end firmwareRequestHcodeUpdateTest + + // ===================================================================== + // compareAttributeHeader + // ===================================================================== + static bool compareAttributeHeader( + const TARGETING::AttributeTank::Attribute* const l_attribute1, + const TARGETING::AttributeTank::Attribute* const l_attribute2) + { + bool retVal(true); + + // Make sure the Attribute Header matches original data + if (0 != memcmp(&(l_attribute1->getHeader()), + &(l_attribute2->getHeader()), + sizeof(TARGETING::AttributeTank::AttributeHeader))) + { + retVal = false; + } + + return retVal; + } // end compareAttributeHeader + + // ===================================================================== + // compareAttributeValues + // ===================================================================== + static bool compareAttributeValues( + const TARGETING::AttributeTank::Attribute* const l_attribute1, + const TARGETING::AttributeTank::Attribute* const l_attribute2) + { + bool retVal(true); + + // Compare the Attribute Values for a match + if (0 != memcmp(l_attribute1->getValue(), + l_attribute2->getValue(), + l_attribute2->getHeader().iv_valSize)) + { + retVal = false; + } + + return retVal; + } // end compareAttributeValues + /// end Firmware Request Test Helper Functions + + // ===================================================================== + // Some needed definitions + // ===================================================================== + typedef std::pair<uint64_t,uint64_t> SCOM_KEY; + typedef std::map<SCOM_KEY,uint64_t> SCOM_MAP; + static SCOM_MAP cv_scomMap; + static std::map<void*, UtilLidMgr*> cv_loadedLids; static uint64_t cv_hb_data_addr; static uint64_t cv_comm_addr; static uint64_t cv_comm_phys_addr; @@ -1015,6 +1444,7 @@ class RuntimeLoaderTest : public CxxTest::TestSuite RuntimeLoaderTest::SCOM_MAP RuntimeLoaderTest::cv_scomMap; std::map<void*, UtilLidMgr*> RuntimeLoaderTest::cv_loadedLids; +// Initialize static member variables uint64_t RuntimeLoaderTest::cv_hb_data_addr = 0; uint64_t RuntimeLoaderTest::cv_comm_addr = 0; uint64_t RuntimeLoaderTest::cv_comm_phys_addr = 0; |