From a094332bbe8807c8f24aeb79f34be063845cea10 Mon Sep 17 00:00:00 2001 From: Mike Baiocchi Date: Fri, 20 Sep 2013 14:47:15 -0500 Subject: Initial Support for Updating SBE SEEPROM This initial commit will be used to create the new SBE directories and files. It also supports the usr functions to find and copy SBE PNOR images. NOTE: It will not enable Updating SBE SEEPROMs in the IPL. Change-Id: I3f545a134493c7595ce50fd885478bbe606de472 RTC: 47032 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6311 Tested-by: Jenkins Server Reviewed-by: ADAM R. MUHLE Reviewed-by: Daniel M. Crowell Reviewed-by: A. Patrick Williams III --- src/build/buildpnor/buildSbePart.pl | 348 ++++++++++++++++++++++++++++++++++++ src/build/mkrules/dist.targets.mk | 1 + src/build/mkrules/hbfw/img/makefile | 72 +++++++- 3 files changed, 416 insertions(+), 5 deletions(-) create mode 100755 src/build/buildpnor/buildSbePart.pl (limited to 'src/build') diff --git a/src/build/buildpnor/buildSbePart.pl b/src/build/buildpnor/buildSbePart.pl new file mode 100755 index 000000000..11269bcfe --- /dev/null +++ b/src/build/buildpnor/buildSbePart.pl @@ -0,0 +1,348 @@ +#!/usr/bin/perl +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/build/buildpnor/buildSbePart.pl $ +# +# IBM CONFIDENTIAL +# +# COPYRIGHT International Business Machines Corp. 2013 +# +# p1 +# +# Object Code Only (OCO) source materials +# Licensed Internal Code Source Materials +# IBM HostBoot Licensed Internal Code +# +# The source code for this program is not published or otherwise +# divested of its trade secrets, irrespective of what has been +# deposited with the U.S. Copyright Office. +# +# Origin: 30 +# +# IBM_PROLOG_END_TAG + +#Builds an SBE partition for PNOR based on user-provided SBE images +#It works for both Processor SBE-IPL images and Centaur SBE images + +use strict; +use File::Basename; +use File::Temp qw/ tempfile tempdir /; + +my $TRAC_ERR = 0; +# 0=errors, >0 for more traces, leaving at 1 to keep key milestone traces. +my $g_trace = 1; + +my $progName = File::Basename::basename $0; +my $outBin = ""; +my %ecImgs; +my $injectVerHdrs = undef; +my $tocVersion = 1; #Only version 1 currently defined + +if ($#ARGV < 0) { + usage(); + exit; +} + + +#Parse the commandline args +for (my $i=0; $i < $#ARGV + 1; $i++) +{ + if ($ARGV[$i] =~ /-h/) { + usage(); + exit 0; + } + elsif($ARGV[$i] =~ /--injectVersionHeaders/) { + $injectVerHdrs = 1; + trace(2, "injectVersionHeaders flag specified"); + } + elsif($ARGV[$i] =~ /--sbeOutBin/) { + $outBin = $ARGV[++$i]; + trace(2, "SBE output Binary File=$outBin"); + } + elsif($ARGV[$i] =~ /--ecImg/) { + my $argName = $ARGV[$i]; + my $argVal = $ARGV[++$i]; + saveInputFile("--ecImg", $argName, $argVal, \%ecImgs); + } + else { + traceErr("Unrecognized Input: $ARGV[$i]"); + exit 1; + } +} + + +#Verify all the SBE images exist +my $rc = verifyFilesExist(\%ecImgs); +if($rc != 0) +{ + trace(0, "$progName: Error detected from call to verifyFilesExist(). Exiting"); + exit 1; +} + +#Generate the output image +my $rc = genOutputImage($injectVerHdrs, $tocVersion, $outBin, \%ecImgs); +if($rc != 0) +{ + trace(0, "$progName: Error detected from call to genOutputImage(). Exiting"); + exit 1; +} + + +################################################################################ +# saveInputFile - save inputfile name into ecImgss array +################################################################################ +sub saveInputFile +{ + my ($i_argPrefix, $i_argName, $i_argVal, $i_ecImgs) = @_; + my $this_func = (caller(0))[3]; + + #$i_argName will be something like --ecIMG_10 + #This substr command should return just the 10, which is the image EC Level + my $ecLevel = substr($i_argName, + length($i_argPrefix)+1, + length($i_argName)-length($i_argPrefix)); + + trace(10, "$this_func: $ecLevel=$i_argVal"); + + $$i_ecImgs{$ecLevel} = $i_argVal; + + trace(10, "$this_func: $$i_ecImgs{$ecLevel}"); + + #no return code expected +} + +################################################################################ +# verifyFilesExist - Verify all the input files exist +################################################################################ +sub verifyFilesExist +{ + my ($i_ecImgs) = @_; + my $this_func = (caller(0))[3]; + my $key; + my $rc = 0; + + for $key ( keys %$i_ecImgs) + { + unless(-e $$i_ecImgs{$key}) + { + my $inputFile = $$i_ecImgs{$key}; + trace(0, "$this_func: Specified input file ($inputFile) for key ($key) does not exist. Aborting!"); + $rc = 1; + last; + } + else + { + trace(10, "$this_func: $$i_ecImgs{$key} exists"); + } + } + + return $rc; +} + +################################################################################ +# genOutputImage - Generate output image +# -Build SBE TOC in first 128 bytes +# -Insert 4K header in front of each image with SHA512 as version +# -Insert each SBE image after corresponding header +################################################################################ +#Output image layout (Defined in Hostboot SBE Layout document) +#word 0: 'SBE\0' eyecatcher +#word 1: SBE TOC Layout version - currently only 1 is defined +#word 2: SBE image EC +#word 3: Sbe image offset in partition +#word 4: SBE image size +#Repeat words 2-4 for each supported EC + +#Actual SBE Images start at offset 0x1000 and must always be on a 4k boundary. +################################################################################ +sub genOutputImage +{ + my ($i_injectVerHdrs, $i_tocVersion, $i_outBin, $i_ecImgs) = @_; + my $this_func = (caller(0))[3]; + my $key; + my %ecOffsets; + my $rc = 0; + my $FILEHANDLE; + my $curOffset = 0x1000; #first offset is at 4k + trace(4, "$this_func: >>Enter"); + +#open output file + open( $FILEHANDLE, ">:raw", $i_outBin) + or die "Can't open $i_outBin file for writing"; + + #Build the TOC + #WORD 0: EyeCatcher - "SBE\0" in ASCII + my @charArray = split //, 'SBE'; + my $curChar; + foreach $curChar (@charArray) + { + print $FILEHANDLE pack('C', ord($curChar)); + } + + #Pad byte for null character after SBE + insertPadBytes($FILEHANDLE, 1); + + #WORD 1: Version = 0x00000001 + print $FILEHANDLE pack('N', 1); + + #Insert header data for each EC provided + for $key ( keys %{$i_ecImgs}) + { + trace(2, "$this_func: Inserting header for EC=$key"); + my $filesize = -s $$i_ecImgs{$key}; + + if($i_injectVerHdrs) + { + $filesize += 0x1000; + } + + #EC Word + print $FILEHANDLE pack('N', hex($key)); + + #Offset Word + print $FILEHANDLE pack('N', $curOffset); + + #Size Word + print $FILEHANDLE pack('N', $filesize); + + #safe offset for inserting images + $ecOffsets{$key} = $curOffset; + + #generate next to 4k offset + $curOffset += $filesize; + if (($curOffset & 0x00000FFF) != 0) + { + $curOffset = $curOffset & 0xFFFFF000; + $curOffset += 0x1000; + } + } + + close $FILEHANDLE; + + #Insert actual image for each EC provided + for $key ( keys %{$i_ecImgs}) + { + trace(2, "$this_func: Inserting data for EC=$key, offset=$ecOffsets{$key}"); + + my $seekOffset = $ecOffsets{$key}; + my $inFile = $$i_ecImgs{$key}; + + #Image is prefixed with 4k header containing version + if($i_injectVerHdrs) + { + my $headerOffset = $seekOffset; + $seekOffset += 0x1000; + + my $headerFh; + my $headerFile; + ($headerFh, $headerFile) = tempfile(UNLINK => 1); + #Disable file handle buffering + + trace(0, "$this_func: headerFile=$headerFile"); + + + #Insert 'VERSION\0' Eyecatcher + my @eyeCatchArray = split //, 'VERSION'; + foreach $curChar (@eyeCatchArray) + { + print $headerFh pack('C', ord($curChar)); + } + #Pad byte for null character after VERSION + insertPadBytes($headerFh, 1); + + #make sure date written to file handle is flushed to disk + close $headerFh; + + #Create the SHA512 hash + my $cmd = "sha512sum $inFile \| awk \'\{print $1\}\' \| xxd -ps -r \>> $headerFile"; + system( $cmd ) == 0 or die "Creating $headerFile failed!"; + + #Write to output file + my $hdrdd = "dd if=$headerFile of=$i_outBin bs=1 seek=$headerOffset"; + system ( $hdrdd ) == 0 or die "Couldn't Write $headerFile to $i_outBin!"; + } + my $ddCmd = "dd if=$inFile of=$i_outBin bs=1 seek=$seekOffset"; + system ( $ddCmd ) == 0 or die "Couldn't Write $inFile to $i_outBin!"; + + } + + trace(4, "$this_func: <= $i_traceLevel) + { + print "TRACE: ".$i_string."\n"; + } +} + + + +################################################################################ +# print usage instructions +################################################################################ +sub usage +{ +print <<"ENDUSAGE"; + $progName = Creates SBE partition with SBE TOC based on input data. + + Usage: + $progName --sbeOutBin + [--ecImg_10 ] [--ecImg_20 ] + [--injectVersionHeaders] + + Parms: + -h Print this help text + --sbeOutBin Name of output file for PNOR Binary + --ecImg_ This is a special paramater. It is used to specify + input files to use for populating the partition with + supported SBE EC specific images + Examples: --binFile_10 s1_10.sbe_seeprom.bin + --binFile_13 s1_13.sbe_seeprom.bin + --binFile_20 s1_20.sbe_seeprom.bin + --injectVersionHeaders Injects a 4k header at the top of each image + containing a SHA512 Hash computed over the image. + + +ENDUSAGE +} diff --git a/src/build/mkrules/dist.targets.mk b/src/build/mkrules/dist.targets.mk index 44405b6a2..a17e95c0c 100644 --- a/src/build/mkrules/dist.targets.mk +++ b/src/build/mkrules/dist.targets.mk @@ -169,6 +169,7 @@ simics.tar_CONTENTS = \ fsp.tar_CONTENTS = \ obj/genfiles/hwp_id.html \ src/build/mkrules/hbfw/fsp/makefile \ + src/build/buildpnor/buildSbePart.pl \ src/build/buildpnor/buildpnor.pl \ src/build/buildpnor/defaultPnorLayout.xml \ img/simics_MURANO_targeting.bin \ diff --git a/src/build/mkrules/hbfw/img/makefile b/src/build/mkrules/hbfw/img/makefile index 94647f827..4e6aa8179 100755 --- a/src/build/mkrules/hbfw/img/makefile +++ b/src/build/mkrules/hbfw/img/makefile @@ -36,8 +36,13 @@ VPATH += ../fsp DEFAULT_PATH = ${.PATH} SRCPATH = ${DEFAULT_PATH:M*src*} -build_all: cp_hbfiles -install_all: build_pnor_images +build_all: cp_hbfiles +install_all: build_sbe_partitions build_pnor_images + +#Some useful search paths +HBFW_OBJPATH = ${.PATH:M*obj*} +ENGD_OBJPATH = ${HBFW_OBJPATH:S/hbfw\/img/engd\/href/g} + ################################################# # Copy Hostboot binary images to obj dir to be grabbed @@ -96,6 +101,57 @@ clobber_cp_hbfiles: rm -f ${ALL_HB_IMAGES} \ sbe.header secureboot.header hb.footer hostboot.stage.bin +################################################# +### SAMPLE for building an SBE Partition with multiple ECs +################################################# +#S1_EC10_BIN = ${ENGD_OBJPATH:Fs1_10.sbe_seeprom.bin} +#s1SbePartition.bin: ${SBE_BUILD_SCRIPT} ${S1_EC10_BIN} +# ${buildSbePart.pl:P} --sbeOutBin s1SbePartition.bin \ +# --ecImg_10 ${S1_EC10_BIN} +################################################# +SBE_BUILD_SCRIPT = ${buildSbePart.pl:P} + +S1_EC10_BIN = ${ENGD_OBJPATH:Fs1_10.sbe_seeprom.hdr.bin} +S1_EC12_BIN = ${ENGD_OBJPATH:Fs1_12.sbe_seeprom.hdr.bin} +S1_EC13_BIN = ${ENGD_OBJPATH:Fs1_13.sbe_seeprom.hdr.bin} +S1_EC20_BIN = ${ENGD_OBJPATH:Fs1_20.sbe_seeprom.hdr.bin} +P8_EC10_BIN = ${ENGD_OBJPATH:Fp8_10.sbe_seeprom.hdr.bin} +CENT_EC10_BIN = ${ENGD_OBJPATH:Fcentaur_10.sbe_seeprom.hdr.bin} +CENT_EC20_BIN = ${ENGD_OBJPATH:Fcentaur_20.sbe_seeprom.hdr.bin} + +SBE_PART_INFO = \ + s1SbePartition.bin:10=${S1_EC10_BIN},12=${S1_EC12_BIN},13=${S1_EC13_BIN},20=${S1_EC20_BIN} \ + p8SbePartition.bin:10=${P8_EC10_BIN} \ + centSbePartition.bin:10=${CENT_EC10_BIN},20=${CENT_EC20_BIN} + + +__SBE_PART_BUILD/% : .SPECTARG .PMAKE + @${MAKE:T:R} BUILD_SPECIFIC_SBEPART \ + "SBE_PART_PARAMS=${.TARGET:s/__SBE_PART_BUILD\///:s/:/ /g}" + +.ifdef SBE_PART_PARAMS + +SBEPART_TARGET = ${SBE_PART_PARAMS:xs/ .*//} +SBEPART_SECTIONS = ${SBE_PART_PARAMS:xs/[^ ]* //:xs/ .*//} +SBEPART_BINS = ${SBEPART_SECTIONS:s/,/ /g:xS/[^=]*=//g} +SBEPART_BIN_OPTION = ${SBEPART_SECTIONS:s/,/ /g:S/^/--ecImg_/g:s/=/ /g:p} + +BUILD_SPECIFIC_SBEPART: .SPECTARG ${SBEPART_TARGET} + #@echo TARGET ${SBEPART_TARGET} + #@echo LAYOUT ${SBEPART_LAYOUT} + #@echo BINARIES ${SBEPART_BINS} + #@echo BIN_OPTION ${SBEPART_BIN_OPTION} + +${SBEPART_TARGET}: ${SBEPART_LAYOUT} ${SBEPART_BINS} ${PNOR_BUILD_SCRIPT} + ${SBE_BUILD_SCRIPT} --sbeOutBin ${SBEPART_TARGET} \ + ${SBEPART_BIN_OPTION} + +.endif + +build_sbe_partitions: .SPECTARG ${SBE_PART_INFO:S/^/__SBE_PART_BUILD\//g} + +clobber_build_sbe_partitions: + ${SBE_PART_INFO:@image@${pnorimg:!rm -f ${image:s/:/ /g:xs/ .*//};!e}@} ################################################# ### SAMPLE for building a PNOR image @@ -123,10 +179,16 @@ HOSTBOOT_DEFAULT_SECTIONS = HBB=${BASE_W_HEADER_ECC_IMAGE},HBI=${EXT_HEADER_IMAG HBFW_OBJPATH = ${.PATH:M*obj*} ENGD_OBJPATH = ${HBFW_OBJPATH:S/hbfw\/img/engd\/href/g} +MURANO_TARG_IMG = simics_MURANO_targeting.bin +VENICE_TARG_IMG = simics_VENICE_targeting.bin MURANO_SLW_IMG = ${ENGD_OBJPATH:Fs1.ref_image.bin} VENICE_SLW_IMG = ${ENGD_OBJPATH:Fp8.ref_image.bin} -MURANO_SECT = HBD=simics_MURANO_targeting.bin,WINK=${MURANO_SLW_IMG} -VENICE_SECT = HBD=simics_VENICE_targeting.bin,WINK=${VENICE_SLW_IMG} +MURANO_SBE_IMG = s1SbePartition.bin +VENICE_SBE_IMG = p8SbePartition.bin +SBEC_IMG = centSbePartition.bin +MURANO_SECT = HBD=${MURANO_TARG_IMG},SBE=${MURANO_SBE_IMG},SBEC=${SBEC_IMG},WINK=${MURANO_SLW_IMG} +VENICE_SECT = HBD=${VENICE_TARG_IMG},SBE=${VENICE_SBE_IMG},SBEC=${SBEC_IMG},WINK=${VENICE_SLW_IMG} + PNOR_IMG_INFO = \ murano.pnor:defaultPnorLayout.xml:${MURANO_SECT},${HOSTBOOT_DEFAULT_SECTIONS} \ @@ -180,7 +242,7 @@ clobber_build_pnor_images: FLASH_DEST = $(MAKETOP)$(OBJECTDIRTOP)../images/$(CONTEXT)/lab/flash FLASH_IMG = ${BASE_IMAGE} ${BASE_ECC_IMAGE} -update_images_for_sandbox: build_pnor_images +update_images_for_sandbox: build_sbe_partitions build_pnor_images mkdir -p ${FLASH_DEST} #Copy hostboot base image to flash dir ${FLASH_IMG:@image@${baseimg:!cd ${FLASH_DEST}; cp -f ${.PATH:F${image}} ${image};!e}@} -- cgit v1.2.1