diff options
| author | Martin Peschke <mpeschke@de.ibm.com> | 2017-05-11 08:10:35 +0200 |
|---|---|---|
| committer | Joshua Hunsberger <jahunsbe@us.ibm.com> | 2017-10-23 17:39:04 -0500 |
| commit | d5bec8388e281338ae4f4412951cac1bc46e1bb7 (patch) | |
| tree | 8625e44b827d4e253681e77bba8e2befc898e091 /import/chips/p9/xip | |
| parent | e25e9bd998faeea6f7ec3cf183a5a48a70e52083 (diff) | |
| download | talos-hcode-d5bec8388e281338ae4f4412951cac1bc46e1bb7.tar.gz talos-hcode-d5bec8388e281338ae4f4412951cac1bc46e1bb7.zip | |
H-code ddLevel support: Bridging front-end to back-end.
Further add a small update to xip_image.C to clear the ddSupport
field in XipSection upon deleting a section.
Change-Id: I5a0aa28ac209d8d31a1e30a75389910da366c5f6
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/40046
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: Richard J. Knight <rjknight@us.ibm.com>
Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Diffstat (limited to 'import/chips/p9/xip')
| -rw-r--r-- | import/chips/p9/xip/p9_xip_image.C | 84 | ||||
| -rw-r--r-- | import/chips/p9/xip/p9_xip_image.h | 8 | ||||
| -rw-r--r-- | import/chips/p9/xip/p9_xip_image.mk | 2 | ||||
| -rw-r--r-- | import/chips/p9/xip/p9_xip_tool.mk | 2 |
4 files changed, 84 insertions, 12 deletions
diff --git a/import/chips/p9/xip/p9_xip_image.C b/import/chips/p9/xip/p9_xip_image.C index 0f70ece4..c13f0677 100644 --- a/import/chips/p9/xip/p9_xip_image.C +++ b/import/chips/p9/xip/p9_xip_image.C @@ -44,6 +44,9 @@ #else #include <stdint.h> #include <endian.h> + #ifndef __PPE__ + #include "p9_dd_container.h" + #endif #endif #include <stdlib.h> #include <string.h> @@ -555,6 +558,25 @@ xipSetSectionSize(void* io_image, const int i_section, const uint32_t i_size) } +/// Set the properties of a section +// +XIP_STATIC int +xipSetSectionProps(void* io_image, const int i_section, const uint8_t i_props) +{ + P9XipSection* section; + int rc; + + rc = xipGetSectionPointer(io_image, i_section, §ion); + + if (!rc) + { + section->iv_ddSupport = i_props; + } + + return rc; +} + + /// Translate a IMAGE address in the image to a section and offset // We first check to be sure that the IMAGE address is contained in the image, @@ -650,7 +672,7 @@ xipDeleteLastSection(void* io_image, xipSetSectionOffset(io_image, i_sectionId, 0); xipSetSectionSize(io_image, i_sectionId, 0); - + xipSetSectionProps(io_image, i_sectionId, 0); // For cleanliness we also remove any alignment padding that had been // appended between the now-last section and the deleted section, then @@ -2004,7 +2026,7 @@ p9_xip_image_size(void* io_image, uint32_t* o_size) } -#ifdef __PPE__ +#if defined(__PPE__) || defined(WIN32) int p9_xip_get_section(const void* i_image, const int i_sectionId, @@ -2031,14 +2053,9 @@ p9_xip_get_section(const void* i_image, P9XipSection* o_hostSection, const uint8_t i_ddLevel) { - int rc; + int rc = 0; P9XipSection* imageSection; - if (i_ddLevel != P9_XIP_UNDEFINED_DDLEVEL) - { - return P9_XIP_NO_DDLEVEL_SUPPORT; - } - rc = xipGetSectionPointer(i_image, i_sectionId, &imageSection); if (!rc) @@ -2046,6 +2063,55 @@ p9_xip_get_section(const void* i_image, xipTranslateSection(o_hostSection, imageSection); } + if (i_ddLevel == P9_XIP_UNDEFINED_DDLEVEL) + { + //Here we always return the entire XIP section. Nothing more to do. + } + else if (o_hostSection->iv_ddSupport == 1) + { + uint8_t* buf; + uint32_t size; + rc = p9_dd_get( (uint8_t*)i_image + o_hostSection->iv_offset, + i_ddLevel, + &buf, + &size ); + + if (!rc) + { + o_hostSection->iv_offset = (uint32_t)(buf - (uint8_t*)i_image); + o_hostSection->iv_size = size; + o_hostSection->iv_alignment = 0; + o_hostSection->iv_ddSupport = 0; + //@FIXME: In order to inform caller more clearly, we could do this instead + // where the idea is to clear the DD support flag which no longer + // applies and to clear the flag that indicates this section is no + // longer the full/original XIP section. + //o_hostSection->iv_support = o_hostSection->iv_support & ~SECTION_ATTRIBS_DD_SUPP + //o_hostSection->iv_support = o_hostSection->iv_support & ~SECTION_ATTRIBS_XIP_SECTION + } + else + { + switch (rc) + { + case P9_DD_FAILURE_NOT_FOUND: + rc = P9_XIP_DDLEVEL_NOT_FOUND; + break; + + case P9_DD_FAILURE_DOES_NOT_EXIST: + rc = P9_XIP_NULL_BUFFER; + break; + + case P9_DD_FAILURE_BROKEN: + rc = P9_XIP_NO_DDLEVEL_SUPPORT; + break; + + default: + rc = P9_XIP_DDLEVEL_CODE_BUG; + break; + } + } + } + return rc; } #endif @@ -3188,7 +3254,7 @@ p9_xip_map_toc(void* io_image, } -#ifndef __PPE__ +#if !defined(__PPE__) && !defined(WIN32) // // Inform caller if specified sectionId has DD support // diff --git a/import/chips/p9/xip/p9_xip_image.h b/import/chips/p9/xip/p9_xip_image.h index 0db5ff5c..c0564033 100644 --- a/import/chips/p9/xip/p9_xip_image.h +++ b/import/chips/p9/xip/p9_xip_image.h @@ -699,7 +699,7 @@ p9_xip_image_size(void* i_image, uint32_t* o_size); int p9_xip_get_section(const void* i_image, const int i_sectionId, -#ifdef __PPE__ +#if defined(__PPE__) || defined(WIN32) P9XipSection* o_hostSection); #else P9XipSection* o_hostSection, @@ -1380,7 +1380,7 @@ p9_xip_get_toc(void* i_image, /// \retval 0 Success /// /// \retval non-0 See \ref p9_xip_image_errors -#ifndef __PPE__ +#if !defined(__PPE__) && !defined(WIN32) int p9_xip_dd_section_support(const void* i_image, const int i_sectionId, @@ -1504,6 +1504,9 @@ p9_xip_decode_toc_dump(void* i_image, void* i_dump, /// Specified ddLevel was not found in section #define P9_XIP_DDLEVEL_NOT_FOUND 21 +/// Code bug in the ddLevel handling codes +#define P9_XIP_DDLEVEL_CODE_BUG 22 + /// Applications can expand this macro to declare an array of string forms of /// the error codes if desired. #define P9_XIP_ERROR_STRINGS(var) \ @@ -1530,6 +1533,7 @@ p9_xip_decode_toc_dump(void* i_image, void* i_dump, "P9_XIP_SBE_DD_SIZE_ERR", \ "P9_XIP_NO_DDLEVEL_SUPPORT", \ "P9_XIP_DDLEVEL_NOT_FOUND", \ + "P9_XIP_DDLEVEL_CODE_BUG", \ } /// Applications can use this macro to safely index the array of error diff --git a/import/chips/p9/xip/p9_xip_image.mk b/import/chips/p9/xip/p9_xip_image.mk index 872ffdce..2880287c 100644 --- a/import/chips/p9/xip/p9_xip_image.mk +++ b/import/chips/p9/xip/p9_xip_image.mk @@ -24,4 +24,6 @@ # IBM_PROLOG_END_TAG PROCEDURE = p9_xip_image lib$(PROCEDURE)_COMMONFLAGS += -DDEBUG_P9_XIP_IMAGE=1 +lib$(PROCEDURE)_DEPLIBS += p9_dd_container +$(call ADD_MODULE_INCDIR,$(PROCEDURE),$(ROOTPATH)/chips/p9/utils/imageProcs) $(call BUILD_PROCEDURE) diff --git a/import/chips/p9/xip/p9_xip_tool.mk b/import/chips/p9/xip/p9_xip_tool.mk index 3d1d45ef..0ce57390 100644 --- a/import/chips/p9/xip/p9_xip_tool.mk +++ b/import/chips/p9/xip/p9_xip_tool.mk @@ -24,6 +24,6 @@ # IBM_PROLOG_END_TAG EXE = p9_xip_tool OBJS += $(EXE).o -$(EXE)_DEPLIBS += p9_xip_image p9_tor p9_ringId p9_scan_compression +$(EXE)_DEPLIBS += p9_xip_image p9_tor p9_ringId p9_scan_compression p9_dd_container $(call ADD_EXE_INCDIR,$(EXE),$(ROOTPATH)/chips/p9/utils/imageProcs) $(call BUILD_EXE) |

