From 3fdc193a8ad53116ec675c71c720bec15b519290 Mon Sep 17 00:00:00 2001 From: "Richard J. Knight" Date: Wed, 26 Jul 2017 14:50:20 -0500 Subject: B1814616 - hwsvd sig:11 core dump on zzfp247 -Modified collectRegFfdc to skip register data if the passed in target pointer is null. -Added new RC to be used when we detect an invalid SBE ffdc buffer. -Updated parseErrorInfo.pl to genrate code to support logging the new error when an invalid pointer is detected Change-Id: I436de31738af3f2b93b5776d7ce1459c8664ebf1 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43707 Tested-by: Jenkins Server Tested-by: Hostboot CI Tested-by: PPE CI Reviewed-by: MURULIDHAR NATARAJU Reviewed-by: Sachin Gupta Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43710 Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell --- src/import/hwpf/fapi2/tools/parseErrorInfo.pl | 40 +++++++++++++++++++-------- 1 file changed, 29 insertions(+), 11 deletions(-) (limited to 'src/import/hwpf/fapi2/tools') diff --git a/src/import/hwpf/fapi2/tools/parseErrorInfo.pl b/src/import/hwpf/fapi2/tools/parseErrorInfo.pl index fb6f17548..662e7889a 100755 --- a/src/import/hwpf/fapi2/tools/parseErrorInfo.pl +++ b/src/import/hwpf/fapi2/tools/parseErrorInfo.pl @@ -301,8 +301,9 @@ sub addFfdcMethod { $method_body = " {\n $ffdc_uc.ptr() = &i_value;\n $ffdc_uc.size() ="; $method_body .= " fapi2::getErrorInfoFfdcSize(i_value);\n return *this;\n }\n\n"; - $methods->{$key}{member} = "$ffdc_type $ffdc_uc;"; - $methods->{$objectNumber}{localvar} = "$ffdc_type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber]);"; + $methods->{$key}{member} = "$ffdc_type $ffdc_uc;"; + $methods->{$objectNumber}{localvar} = + "$ffdc_type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber],invalid_data);"; $methods->{$objectNumber}{assignment_string} = "l_obj.$ffdc_uc = $ffdc_uc;"; } else @@ -333,8 +334,9 @@ sub addFfdcMethod $method_body .= " $ffdc_uc.size() = $param.template getLength();\n"; $method_body .= " return *this;\n"; $method_body .= " }\n\n"; - $methods->{$key}{member} = "$ffdc_type $ffdc_uc;"; - $methods->{$objectNumber}{localvar} = "$buffer_ffdc_type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber]);"; + $methods->{$key}{member} = "$ffdc_type $ffdc_uc;"; + $methods->{$objectNumber}{localvar} = + "$buffer_ffdc_type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber],invalid_data);"; $methods->{$objectNumber}{assignment_string} = "l_obj.$ffdc_uc = $ffdc_uc;"; } @@ -369,15 +371,16 @@ sub addFfdcMethod . " return *this;\n }\n\n"; } - $methods->{$key}{member} = "$ffdc_type $ffdc_uc;"; - $methods->{$objectNumber}{localvar} = "$ffdc_type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber]);"; + $methods->{$key}{member} = "$ffdc_type $ffdc_uc;"; + $methods->{$objectNumber}{localvar} = + "$ffdc_type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber],invalid_data);"; $methods->{$objectNumber}{assignment_string} = "l_obj.$ffdc_uc=$ffdc_uc;"; } elsif ( $type eq $scom_addr_type ) { if ( $arg_local_ffdc eq undef ) { - $method = "\n static $type $ffdc_uc(const sbeFfdc_t *ffdc)\n"; + $method = "\n static $type $ffdc_uc(const sbeFfdc_t *ffdc)\n"; $method_body = " {\n return ffdc[$objectNumber].data;\n }\n\n"; } } @@ -389,8 +392,9 @@ sub addFfdcMethod { $method_body = " { $ffdc_uc = i_value; "; $method_body .= " return *this;}\n\n"; - $methods->{$key}{member} = "$type $ffdc_uc;"; - $methods->{$objectNumber}{localvar} = "$type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber]);"; + $methods->{$key}{member} = "$type $ffdc_uc;"; + $methods->{$objectNumber}{localvar} = + "$type $ffdc_uc = getFfdcData(FFDC_BUFFER[$objectNumber],invalid_data);"; $methods->{$objectNumber}{assignment_string} = "l_obj.$ffdc_uc = $ffdc_uc;"; } else @@ -548,6 +552,7 @@ print SBFILE "#ifndef FAPI2_SETSBEERROR_H_\n"; print SBFILE "#define FAPI2_SETSBEERROR_H_\n\n"; print SBFILE "#define FAPI_SET_SBE_ERROR(RC,ERRVAL,FFDC_BUFFER,SBE_INSTANCE)\\\n"; print SBFILE "{\\\n"; +print SBFILE "bool invalid_data = false;\\\n"; print SBFILE "switch (ERRVAL)\\\n"; print SBFILE "{\\\n"; @@ -1610,7 +1615,10 @@ foreach my $argnum ( 0 .. $#ARGV ) { print SBFILE "$objectStr"; } - print SBFILE " l_obj.execute(); \\\n"; + print SBFILE " if(!invalid_data) \\\n"; + print SBFILE " { \\\n"; + print SBFILE " l_obj.execute(); \\\n"; + print SBFILE " } \\\n"; print SBFILE " break; \\\n } \\\n"; } @@ -1750,9 +1758,19 @@ print ECFILE "\n\n#endif\n"; #------------------------------------------------------------------------------ print SBFILE " default:\\\n"; -#print SBFILE " FAPI_SET_HWP_ERROR(RC, RC_SBE_UNKNOWN_ERROR,0);\\\n"; +print SBFILE " invalid_data = true;\\\n"; print SBFILE " break;\\\n"; print SBFILE "}\\\n"; +print SBFILE "if(invalid_data)\\\n"; +print SBFILE "{\\\n"; +print SBFILE " /* create a new rc and capture invalid ffdc buffer */\\\n"; +print SBFILE " /* FFDC buffer size is 20 sbeFfdc_t entries */\\\n"; +print SBFILE " /* variable buffer needs size in uint32_t, and the resulting bit count */\\\n"; +print SBFILE " const uint32_t size_bytes = (sizeof(sbeFfdc_t)*20);\\\n"; +print SBFILE " fapi2::variable_buffer l_buffer((uint32_t*)FFDC_BUFFER, size_bytes/4, size_bytes*8);\\\n"; +print SBFILE " fapi2::INVALID_SBE_FFDC_PACKET(fapi2::FAPI2_ERRL_SEV_UNRECOVERABLE,RC)."; +print SBFILE "set_FFDC_BUFFER(l_buffer).execute();\\\n"; +print SBFILE "}\\\n"; print SBFILE "}\n\n"; print SBFILE "#endif\n"; -- cgit v1.2.1