Skip to content

Commit

Permalink
Enable and fix error log variable_buffer support.
Browse files Browse the repository at this point in the history
Errorlog support for the fapi2::variable_buffer type was not enabled in
hostboot. Tests showed that when enabled, variable_buffer data was not
being propagated properly to the error log. The issue was found to be
that the pointer to the variable_buffer's internal data was not being
properly passed to an ffdc_t object. Also, transferring the size of
the variable_buffer data was not being correctly communicated to an
ffdc_t object because a specialization of the getErrorInfoFfdcSize
template function is needed. Becuase the specialization of the
getErrorInfoFfdcSize function with an ffdc_t parameter did not exist,
the code base used the primary function template for the
getErrorInfoFfdcSize function which just returns the size of an ffdc_t
object passed to it instead of the size of the contained data within
the ffdc_t.

Changes:
* Added specialization of getErrorInfoFfdcSize for fapi2::ffdc_t.
* Enabled variable_buffer support in parseErrorInfo.mk.
* Added const overload of the pointer() method for the fapi2::buffer
  and fapi2::variable_buffer classes. This to allow these methods
  to be used in the set_BUFFER methods that take a const reference
  to objects of these classes.
* Modified parseErrorInfo.pl to generate code to use the above
  mentioned pointer methods. The adjusted generated code fixes
  the problem of assigning an incorrect buffer pointer.

Change-Id: I96dc89fbb68ee6a153ca43191181c56804b84ae8
RTC: 175239
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41541
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: William G. Hoffa <wghoffa@us.ibm.com>
Reviewed-by: Richard J. Knight <rjknight@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41548
Reviewed-by: Hostboot Team <hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
  • Loading branch information
dwashbur authored and dcrowell77 committed Jun 15, 2017
1 parent ed5d583 commit 80ae8c8
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 10 deletions.
9 changes: 9 additions & 0 deletions src/import/hwpf/fapi2/include/buffer.H
Expand Up @@ -401,6 +401,15 @@ class buffer
return &iv_data;
}

///
/// @brief Get a pointer to the buffer bits
/// @return Pointer to the buffer itself
///
inline const T* pointer(void) const
{
return &iv_data;
}

// Note: Many (all?) of these are not needed and the compiler complains
// as the cast to T yields a better operator. There are here mainly for
// documenation purposes.
Expand Down
12 changes: 11 additions & 1 deletion src/import/hwpf/fapi2/include/error_info_defs.H
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2015,2016 */
/* Contributors Listed Below - COPYRIGHT 2015,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -331,6 +331,16 @@ inline uint16_t getErrorInfoFfdcSize(const fapi2::variable_buffer& i_thing)
i_thing.getLength<uint8_t>());
}
#endif

///
/// @brief Get FFDC Size specialization for ffdc_t
///
template<>
inline uint16_t getErrorInfoFfdcSize(const fapi2::ffdc_t& i_ffdc)
{
return static_cast<uint16_t>(i_ffdc.size());
}

};

#endif // FAPI2_ERRORINFO_DEFS_H_
11 changes: 10 additions & 1 deletion src/import/hwpf/fapi2/include/variable_buffer.H
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2015,2016 */
/* Contributors Listed Below - COPYRIGHT 2015,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -811,6 +811,15 @@ class variable_buffer
return &(iv_data[0]);
}

///
/// @brief Get a pointer to the buffer bits
/// @return Pointer to the buffer itself
///
inline const unit_type* pointer(void) const
{
return &(iv_data[0]);
}

///
/// @brief operator!=()
///
Expand Down
6 changes: 4 additions & 2 deletions src/import/hwpf/fapi2/tools/parseErrorInfo.mk
Expand Up @@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2015,2016
# Contributors Listed Below - COPYRIGHT 2015,2017
# [+] International Business Machines Corp.
#
#
Expand Down Expand Up @@ -44,7 +44,9 @@ CLEAN_TARGETS += $(GENPATH)/collect_reg_ffdc_regs.C
CLEAN_TARGETS += $(GENPATH)/set_sbe_error.H

define parseErrorInfo_RUN
$(C1) $$< --output-dir=$$($(GENERATED)_PATH) $$(filter-out $$<,$$^)
$(C1) $$< --use-variable-buffers \
--output-dir=$$($(GENERATED)_PATH) \
$$(filter-out $$<,$$^)
endef

$(call BUILD_GENERATED)
Expand Down
20 changes: 14 additions & 6 deletions src/import/hwpf/fapi2/tools/parseErrorInfo.pl
Expand Up @@ -324,20 +324,28 @@ sub addFfdcMethod
elsif ( $type eq $buffer_ffdc_type )
{
# Two methods - one for integral buffers and one for variable_buffers
$method = "\n template< typename T >\n";
$method = "\n";
$method .= " template< typename T >\n";
$method .= " inline $class_name& set_$ffdc_uc(const fapi2::buffer<T>& $param)\n";
$method_body =
" {\n $ffdc_uc.ptr() = &i_value(); $ffdc_uc.size() = i_value.template getLength<uint8_t>(); return *this;}\n\n";
$method_body = " {\n";
$method_body .= " $ffdc_uc.ptr() = $param.pointer();\n";
$method_body .= " $ffdc_uc.size() = $param.template getLength<uint8_t>();\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->{$objectNumber}{assignment_string} = "l_obj.$ffdc_uc = $ffdc_uc;";
}

elsif ( $type eq $variable_buffer_ffdc_type )
{
$method = "\n inline $class_name& set_$ffdc_uc(const fapi2::variable_buffer& $param)\n";
$method_body =
" {$ffdc_uc.ptr() = &$param(); $ffdc_uc.size() = $param.template getLength<uint8_t>(); return *this;}\n\n";
$method = "\n";
$method .= " inline $class_name& set_$ffdc_uc(const fapi2::variable_buffer& $param)\n";
$method_body = " {\n";
$method_body .= " $ffdc_uc.ptr() = $param.pointer();\n";
$method_body .= " $ffdc_uc.size() = $param.template getLength<uint8_t>();\n";
$method_body .= " return *this;\n";
$method_body .= " }\n\n";

# No need to add the member here, it was added with fapi2::buffer. And we can't have variable
# buffer support with out integral buffer support (can we?)
Expand Down

0 comments on commit 80ae8c8

Please sign in to comment.