Skip to content

Commit

Permalink
HBRT Reserved Mem Trace Buffer implementation.
Browse files Browse the repository at this point in the history
-Hostboot master Drawer will create TRACEBUF section in the HB
 Rsvd Mem and HBRT, while booting, gets the TRACEBUF section
 details and initializes the circual buffer, if available.
-If a valid data is present in the buffer, HBRT will create an
 info log ERRL, otherwise initializes the buffer.
-Traces from all components are serialized and stored in the
 single TRACEBUF in the same format (fsp-binary Trace). When
 buffer is full, it deletes the oldest entry/entries to store
 the new ones.
-ERRL->collectTrace() works similar to other buffers.
-A new test case is added to dump the traces from TRACEBUF.

Change-Id: I4ce943231a2ba30e3a13ca34d1c40ff68464a994
RTC:188726
RTC:191302
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/56450
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Tested-by: Daniel M. Crowell <dcrowell@us.ibm.com>
  • Loading branch information
sakethan authored and dcrowell77 committed Jun 19, 2018
1 parent 34d086e commit 1ec6201
Show file tree
Hide file tree
Showing 13 changed files with 145 additions and 14 deletions.
12 changes: 12 additions & 0 deletions src/include/runtime/interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -989,6 +989,18 @@ struct postInitCalls_t
*/
void (*callClearPendingOccMsgs)();

/** @brief Calls RsvdTraceBufService::init() which maps
* the Reserved Memory section to the circular buffer, which will keep
* track of all runtime traces
*/
void (*callInitRsvdTraceBufService)();

/** @brief Calls RsvdTraceBufService::commitRsvdMemTraceErrl(), which commits
* the ERRL with Rsved Mem Traces from previous boot, if created in
* RsvdTraceBufService::init()
*/
void (*callCommitRsvdTraceBufErrl)();

};

extern hostInterfaces_t* g_hostInterfaces;
Expand Down
5 changes: 4 additions & 1 deletion src/include/usr/runtime/runtime_reasoncodes.H
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ namespace RUNTIME
MOD_RT_FIRMWARE_NOTIFY = 0x23, /**< rt_fwnotify.C */
MOD_RT_FIRMWARE_REQUEST = 0x24, /**< rt_fwreq_helper.C */
MOD_RT_ATTR_SYNC_REQUEST = 0x25, /**< rt_fwnotify.C */
MOD_CHECK_HB_RES_MEM_LIMIT = 0x26, /**<populate_hbruntime.C */
MOD_CHECK_HB_RES_MEM_LIMIT = 0x26, /**< populate_hbruntime.C */
MOD_INIT_RT_RES_MEM_TRACE_BUF = 0x27, /**< rt_rsvdtracebuffer.C */
};

enum RuntimeReasonCode
Expand Down Expand Up @@ -132,6 +133,8 @@ namespace RUNTIME
RC_HB_RES_MEM_EXCEEDED = RUNTIME_COMP_ID | 0x3D,
RC_SEND_SBE_TIMER_EXPIRED = RUNTIME_COMP_ID | 0x3E,
RC_HOST_TIMER_THREAD_FAIL = RUNTIME_COMP_ID | 0x3F,
RC_RT_RES_TRACE_BUF_DUMPED = RUNTIME_COMP_ID | 0x40,
RC_RT_RES_TRACE_BUF_INVALID = RUNTIME_COMP_ID | 0x41,
};

enum UserDetailsTypes
Expand Down
8 changes: 7 additions & 1 deletion src/include/usr/util/utilrsvdmem.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017 */
/* Contributors Listed Below - COPYRIGHT 2017,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -49,6 +49,9 @@ namespace Util
// Ascii label "HYPCOMM " in hex
constexpr hbrt_mem_label_t HBRT_MEM_LABEL_HYPCOMM = 0x485950434f4d4d20;

// Ascii label "TRACEBUF" in hex
constexpr hbrt_mem_label_t HBRT_MEM_LABEL_TRACEBUF = 0x5452414345425546;

/** @brief A 32 byte table of contents entry */
struct hbrtTableOfContentsEntry_t
{
Expand All @@ -62,6 +65,9 @@ namespace Util
#define HBRT_TOC_MAX_ENTRIES \
(((4*KILOBYTE) - 64) / sizeof(hbrtTableOfContentsEntry_t))

// HBRT Reserved memory size for TRACEBUF
constexpr uint64_t HBRT_RSVD_TRACEBUF_SIZE = (64*KILOBYTE);

/** @brief A 4KB Table of Contents */
struct hbrtTableOfContents_t
{
Expand Down
1 change: 1 addition & 0 deletions src/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ RUNTIME_TESTCASE_MODULES += testsecureboot_rt
RUNTIME_TESTCASE_MODULES += testtargeting_rt
RUNTIME_TESTCASE_MODULES += testsbeio_rt
RUNTIME_TESTCASE_MODULES += testpm_rt
RUNTIME_TESTCASE_MODULES += testrsvdtracebuf_rt

RELOCATABLE_IMAGE_LDFLAGS = -pie --export-dynamic

Expand Down
15 changes: 14 additions & 1 deletion src/runtime/rt_main.C
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,16 @@ runtimeInterfaces_t* rt_start(hostInterfaces_t* intf)
// Initialize all modules.
vfs_module_init();

// apply temp overrides
// Call rtPost functions
postInitCalls_t* rtPost = getPostInitCalls();

// Call InitRsvdTraceBufService
// NOTE: This function has pre-req of vfs_module_init() for using
// hb_get_rt_rsvd_mem(). Due to pre-req of rtPost->callInitErrlManager()
// committing ERRL is moved to callCommitRsvdTraceBufErrl().
rtPost->callInitRsvdTraceBufService();

// apply temp overrides
rtPost->callApplyTempOverrides();

// load FIRDATA section into memory so PRD can access
Expand All @@ -139,6 +147,11 @@ runtimeInterfaces_t* rt_start(hostInterfaces_t* intf)
// Make sure errlmanager is ready
rtPost->callInitErrlManager();

// Call commitRsvdTraceBufErrl
// NOTE: This function has pre-req of rtPost->callInitErrlManager()
// for committing ERRL, which was created in InitRsvdTraceBufService().
rtPost->callCommitRsvdTraceBufErrl();

// check for possible missed in-flight messages/interrupts
rtPost->callClearPendingSbeMsgs();

Expand Down
27 changes: 24 additions & 3 deletions src/usr/runtime/populate_hbruntime.C
Original file line number Diff line number Diff line change
Expand Up @@ -462,12 +462,14 @@ errlHndl_t setNextHbRsvMemEntry(const HDAT::hdatMsVpdRhbAddrRangeType i_type,
* @param[in] i_startAddressValid Is io_start_address valid?
* @param[out] io_size if not zero, maxSize in bytes allowed
* returns Total 64kb aligned size for all the data
* @param[in] i_master_node = true if we are the master hb instance
* @return Error handle if error
*/
errlHndl_t fill_RsvMem_hbData(uint64_t & io_start_address,
uint64_t & io_end_address,
bool i_startAddressValid,
uint64_t & io_size)
uint64_t & io_size,
bool i_master_node)
{
TRACFCOMP( g_trac_runtime, ENTER_MRK"fill_RsvMem_hbData> io_start_address=0x%.16llX,io_end_address=0x%.16llX,startAddressValid=%d",
io_start_address, io_end_address, i_startAddressValid?1:0 );
Expand Down Expand Up @@ -563,6 +565,17 @@ errlHndl_t fill_RsvMem_hbData(uint64_t & io_start_address,
ALIGN_PAGE(l_hbTOC.entry[l_hbTOC.total_entries].size);
l_hbTOC.total_entries++;

// Fill in the TRACEBUF only for Master Node
if(i_master_node == true )
{
// Fill in TRACEBUF size
l_hbTOC.entry[l_hbTOC.total_entries].label = Util::HBRT_MEM_LABEL_TRACEBUF;
l_hbTOC.entry[l_hbTOC.total_entries].offset = 0;
l_hbTOC.entry[l_hbTOC.total_entries].size = Util::HBRT_RSVD_TRACEBUF_SIZE;
l_totalSectionSize +=
ALIGN_PAGE(l_hbTOC.entry[l_hbTOC.total_entries].size);
l_hbTOC.total_entries++;
}
l_totalSectionSize += sizeof(l_hbTOC); // Add 4KB Table of Contents

// Fill in PADDING size
Expand Down Expand Up @@ -758,6 +771,14 @@ errlHndl_t fill_RsvMem_hbData(uint64_t & io_start_address,
}
break;
}

case Util::HBRT_MEM_LABEL_TRACEBUF:

TRACFCOMP( g_trac_runtime, "fill_RsvMem_hbData> TRACEBUF v address 0x%.16llX, size: %lld", l_prevDataAddr, aligned_size);
//Nothing much to do here, except zero-ing the memory
memset(reinterpret_cast<uint8_t*>(l_prevDataAddr),0,aligned_size);
break;

default:
break;
}
Expand Down Expand Up @@ -1103,7 +1124,7 @@ errlHndl_t populate_HbRsvMem(uint64_t i_nodeId, bool i_master_node)
// fills in the reserved memory with HB Data and
// will update addresses and totalSize
l_elog = fill_RsvMem_hbData(l_startAddr, l_endAddr,
startAddressValid, l_totalSizeAligned);
startAddressValid, l_totalSizeAligned,i_master_node);

if (l_elog)
{
Expand Down Expand Up @@ -3114,7 +3135,7 @@ errlHndl_t populate_hbRuntimeData( void )
bool startAddressValid = true;

l_elog = fill_RsvMem_hbData(l_startAddr, l_endAddr,
startAddressValid, l_totalSizeAligned);
startAddressValid, l_totalSizeAligned,true);
if(l_elog != nullptr)
{
TRACFCOMP( g_trac_runtime, "fill_RsvMem_hbData failed" );
Expand Down
26 changes: 23 additions & 3 deletions src/usr/trace/interface.C
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2012,2017 */
/* Contributors Listed Below - COPYRIGHT 2012,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -34,10 +34,14 @@
#include <util/singleton.H>
#include <stdarg.h>
#include <limits.h>
#include <string.h>

#include "compdesc.H"
#include "service.H"

#if __HOSTBOOT_RUNTIME
#include "runtime/rt_rsvdtracebufservice.H"
#endif

namespace TRACE
{
Expand Down Expand Up @@ -105,15 +109,31 @@ namespace TRACE
void * o_data,
size_t i_bufferSize )
{
size_t l_bufferSize(0);

ComponentDesc* l_comp =
Singleton<ComponentList>::instance().getDescriptor(i_comp, 0);

if (NULL == l_comp)
{
return 0;
#if __HOSTBOOT_RUNTIME
// All the components will have a corresponding CompDescriptor,
// if buffer is created. RSVD_MEM_TRACE is a speacial case without
// a corresponding compDescriptor. Check for RSVD_MEM_TRACE, if
// not RSVD_MEM_TRACE then return 0.
if(strcmp( i_comp, "RSVD_MEM_TRACE") == 0)
{
l_bufferSize = Singleton<RsvdTraceBufService>::
instance().getBuffer(o_data,i_bufferSize);
}
#endif
}
return Singleton<Service>::instance().getBuffer(l_comp,
else
{
l_bufferSize = Singleton<Service>::instance().getBuffer(l_comp,
o_data, i_bufferSize);
}
return l_bufferSize;
}

void flushBuffers()
Expand Down
6 changes: 5 additions & 1 deletion src/usr/trace/runtime/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2013,2017
# Contributors Listed Below - COPYRIGHT 2013,2018
# [+] International Business Machines Corp.
#
#
Expand All @@ -26,6 +26,8 @@ HOSTBOOT_RUNTIME = 1
ROOTPATH = ../../../..
MODULE = trace_rt

SUBDIRS += test.d

OBJS += interface.o
OBJS += assert.o
OBJS += compdesc.o
Expand All @@ -34,6 +36,8 @@ OBJS += rt_service.o
OBJS += bufferpage.o
OBJS += rt_daemon.o
OBJS += rt_buffer.o
OBJS += rt_rsvdtracebuffer.o
OBJS += rt_rsvdtracebufservice.o


VPATH += ..
Expand Down
16 changes: 15 additions & 1 deletion src/usr/trace/runtime/rt_service.C
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2013,2017 */
/* Contributors Listed Below - COPYRIGHT 2013,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -38,6 +38,7 @@
#include <util/align.H>
#include <runtime/interface.h>
#include <util/singleton.H>
#include "rt_rsvdtracebufservice.H"

namespace TRACE
{
Expand All @@ -52,6 +53,9 @@ namespace TRACE
iv_buffers[BUFFER_SLOW] = nullptr;
iv_buffers[BUFFER_FAST] = new Buffer(iv_daemon);

// Force create the Reserved Trace Buffer Service object
iv_rsvdtracebufservice = &(Singleton<RsvdTraceBufService>::instance());

iv_compList = &(Singleton<ComponentList>::instance());
}

Expand Down Expand Up @@ -240,6 +244,11 @@ namespace TRACE
// "Commit" entry to buffer.
l_buffer->commitEntry(l_entry);

// Copy the trace entry in to the Reserved Trace Buffer too
iv_rsvdtracebufservice->writeEntry(i_td,
reinterpret_cast<char*>(&l_entry->data[0]),
l_realSize);

} while(0);
}

Expand Down Expand Up @@ -384,6 +393,11 @@ namespace TRACE
// "Commit" entry to buffer.
l_buffer->commitEntry(l_entry);

// Copy the trace entry in to the Reserved Trace Buffer too
iv_rsvdtracebufservice->writeEntry(i_td,
reinterpret_cast<char*>(&l_entry->data[0]),
l_realSize);

} while(0);

}
Expand Down
31 changes: 31 additions & 0 deletions src/usr/trace/runtime/test/makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/usr/trace/runtime/test/makefile $
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2013,2018
# [+] International Business Machines Corp.
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# IBM_PROLOG_END_TAG
HOSTBOOT_RUNTIME = 1
ROOTPATH = ../../../../..

MODULE = testrsvdtracebuf_rt
TESTS = testrsvdtracebuf.H

include ${ROOTPATH}/config.mk
6 changes: 5 additions & 1 deletion src/usr/trace/service.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2012,2017 */
/* Contributors Listed Below - COPYRIGHT 2012,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -71,6 +71,7 @@ namespace TRACE
class DaemonIf;
class ComponentList;
class trace_entry_stamp_t;
class RsvdTraceBufService;

/** @class Service
*
Expand Down Expand Up @@ -189,6 +190,9 @@ namespace TRACE
#else
/** Runtime daemon **/
TRACEDAEMON::Daemon * iv_daemon;

/** Runtime Reserved Trace Buffer Service **/
RsvdTraceBufService * iv_rsvdtracebufservice;
#endif
};
}
Expand Down
3 changes: 2 additions & 1 deletion src/usr/util/runtime/util_rt.C
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017 */
/* Contributors Listed Below - COPYRIGHT 2017,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -54,6 +54,7 @@ uint64_t hb_get_rt_rsvd_mem(Util::hbrt_mem_label_t i_label,
case Util::HBRT_MEM_LABEL_ATTROVER:
case Util::HBRT_MEM_LABEL_PADDING:
case Util::HBRT_MEM_LABEL_HYPCOMM:
case Util::HBRT_MEM_LABEL_TRACEBUF:
if( (g_hostInterfaces != NULL) &&
(g_hostInterfaces->get_reserved_mem) )
{
Expand Down

0 comments on commit 1ec6201

Please sign in to comment.