diff options
author | Richard J. Knight <rjknight@us.ibm.com> | 2016-12-11 08:50:55 -0600 |
---|---|---|
committer | Sachin Gupta <sgupta2m@in.ibm.com> | 2017-02-05 22:25:45 -0500 |
commit | bee199d2de64328e7e634ad1e8fac985b8aa3472 (patch) | |
tree | f1aa3761d45d37e297e38e9df890b3d38de7b79b /src/import/chips/p9/xip/p9_xip_tool.C | |
parent | b63692979c318015b6132a26d94de5ab51d5ac83 (diff) | |
download | talos-sbe-bee199d2de64328e7e634ad1e8fac985b8aa3472.tar.gz talos-sbe-bee199d2de64328e7e634ad1e8fac985b8aa3472.zip |
Add check to verify SBE .ring section size
-Add option to p9_xip_tool to verify the size of the
DD specific .rings section intended for the SBE image
-Update makefiles to correctly run p9_ring_apply to insert
and extract the DD level specific rings.
-Update tor_access_ring to correctly advance the pointer
to the next DD level in the HW image so the size can
be extracted correctlty.
Change-Id: I21a53b5d11341a14a4e9cc88388c9c2050394095
RTC:165558
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33873
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com>
Reviewed-by: Thi N. Tran <thi@us.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33878
Reviewed-by: Hostboot Team <hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/xip/p9_xip_tool.C')
-rw-r--r-- | src/import/chips/p9/xip/p9_xip_tool.C | 111 |
1 files changed, 109 insertions, 2 deletions
diff --git a/src/import/chips/p9/xip/p9_xip_tool.C b/src/import/chips/p9/xip/p9_xip_tool.C index bfa40cd6..534c3a82 100644 --- a/src/import/chips/p9/xip/p9_xip_tool.C +++ b/src/import/chips/p9/xip/p9_xip_tool.C @@ -41,8 +41,6 @@ #include <string.h> #include <unistd.h> -#define __PPE__ - #include "p9_xip_image.h" #ifdef XIP_TOOL_ENABLE_DISSECT // Needed on ppe side to avoid TOR API #include "p9_tor.H" @@ -167,6 +165,7 @@ const char* g_usage = " p9_xip_tool <image> [-i<flag> ...] dis <section>\n" " p9_xip_tool <image> [-i<flag> ...] dissect <ring section> [short,normal(default),long]\n" " p9_xip_tool <image> [-i<flag> ...] disasm <text section>\n" + " p9_xip_tool <image> [-i<flag> ...] check-sbe-ring-section <dd level> <maximum size>\n" "\n" "This simple application uses the P9-XIP image APIs to normalize, search\n" "update and edit P9-XIP images. This program encapsulates several commands\n" @@ -2271,6 +2270,93 @@ openAndMapReadOnly(const char* i_imageFile, int* o_fd, void** o_image, const uin openAndMap(i_imageFile, 0, o_fd, o_image, i_maskIgnores); } +/// +/// @brief Checks .rings section created for SBE image to +/// see if it is less than the passed in size. +/// +/// @param[in] i_hwImage - pointer to an unsigned hw image. +/// @param[in] i_ddLevel - DD level .rings section to check +/// @param[in] i_maxSize - Maximum allowable section size +/// +/// @return IMGBUILD_SUCCESS if section is less than i_maxSize +/// +static +int check_sbe_ring_section_size( void* i_hwImage, + uint32_t i_ddLevel, + uint32_t i_maxSize ) +{ + int rc = 0; +#ifndef __PPE__ + + P9XipSection l_ringsSection; + + RingType_t l_ringType = ALLRING; + + uint8_t unused_parm = 0; + void** l_blockPtr = NULL; + uint32_t l_blockSize = 0; + + // Get the full .rings section from the HW image + rc = p9_xip_get_section(i_hwImage, P9_XIP_SECTION_HW_RINGS, &l_ringsSection); + + if (!rc) + { + // verify the .rings section is populated + if (l_ringsSection.iv_size == 0) + { + fprintf(stderr, "Ring section size in HW image is zero.\n"); + rc = P9_XIP_DATA_NOT_PRESENT; + return rc; + } + + // Make a pointer to the start of the rings section + void* ringsSection = (uint8_t*)i_hwImage + l_ringsSection.iv_offset; + + do + { + // Call the tor function will a null block pointer to get the + // section size + rc = tor_get_block_of_rings( ringsSection, + i_ddLevel, + SBE, + l_ringType, + BASE, + unused_parm, + l_blockPtr, + l_blockSize); + + if(rc) + { + fprintf(stderr, "error calling tor API rc = %d\n", rc); + break; + } + + if( l_blockSize == 0 ) + { + fprintf(stderr, "No rings for dd_level %#02x found\n", i_ddLevel); + break; + } + + fprintf(stderr, " SBE .ring section size for DD level %#02x ", i_ddLevel); + + // return failure if the block size would exceed the maximum allowed size + if( l_blockSize > i_maxSize ) + { + fprintf(stderr, "is %d bytes, which exceeds maximum size limit of %i\n", l_blockSize, i_maxSize); + rc = P9_XIP_SBE_DD_SIZE_ERR; + } + else + { + fprintf(stderr, "is %d bytes - OK\n", l_blockSize); + } + + } + while(0); + } + +#endif + return rc; +} // Parse and execute a pre-tokenized command @@ -2381,6 +2467,27 @@ command(const char* i_imageFile, const int i_argc, const char** i_argv, const ui exit(1); } + else if (strcmp(i_argv[0], "check-sbe-ring-section") == 0) + { + if(i_argc != 3) + { + fprintf(stderr, g_usage); + exit(1); + } + + openAndMapWritable(i_imageFile, &fd, &image, i_maskIgnores); + + // grab the size and dd level from the cmdline + const char* i_ddLevel = i_argv[1]; + + uint8_t l_ddLevel = strtol(i_ddLevel, 0, 0); + + uint32_t l_maxSize = strtol(i_argv[2], 0, 10); + + // validate that the dd level specific .rings section generated for the + // sbe image will not exceed the given size. + rc = check_sbe_ring_section_size(image, l_ddLevel, l_maxSize) ; + } else if (strcmp(i_argv[0], "TEST") == 0) { |