From bee199d2de64328e7e634ad1e8fac985b8aa3472 Mon Sep 17 00:00:00 2001 From: "Richard J. Knight" Date: Sun, 11 Dec 2016 08:50:55 -0600 Subject: 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 Tested-by: PPE CI Tested-by: Hostboot CI Reviewed-by: Joseph J. McGill Reviewed-by: Thi N. Tran Reviewed-by: Sachin Gupta Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33878 Reviewed-by: Hostboot Team Tested-by: FSP CI Jenkins --- src/import/chips/p9/xip/p9_xip_tool.C | 111 +++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) (limited to 'src/import/chips/p9/xip/p9_xip_tool.C') 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 #include -#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 [-i ...] dis
\n" " p9_xip_tool [-i ...] dissect [short,normal(default),long]\n" " p9_xip_tool [-i ...] disasm \n" + " p9_xip_tool [-i ...] check-sbe-ring-section
\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) { -- cgit v1.2.1