From 7799749ee2db86f4fb66c4a7a69fb9fb0b46334e Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Mon, 21 Nov 2011 15:44:52 -0600 Subject: Interactive debug tool. - Modify debug fw to support writing data. - Modify debug fw to support clocking model forward. - Add simics environment support for both. - Kernel support to start a task when directed. - Write debug tool to modify kernel structure for debug. Change-Id: Ic001dfd45f91392aefbc9d5096c5344018d5190e Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/518 Tested-by: Jenkins Server Reviewed-by: Andrew J. Geissler Reviewed-by: Daniel M. Crowell Reviewed-by: A. Patrick Williams III --- src/kernel/idebug.C | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/kernel/idebug.C (limited to 'src/kernel/idebug.C') diff --git a/src/kernel/idebug.C b/src/kernel/idebug.C new file mode 100644 index 000000000..673ecb149 --- /dev/null +++ b/src/kernel/idebug.C @@ -0,0 +1,89 @@ +// IBM_PROLOG_BEGIN_TAG +// This is an automatically generated prolog. +// +// $Source: src/kernel/idebug.C $ +// +// IBM CONFIDENTIAL +// +// COPYRIGHT International Business Machines Corp. 2011 +// +// 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 other- +// wise divested of its trade secrets, irrespective of what has +// been deposited with the U.S. Copyright Office. +// +// Origin: 30 +// +// IBM_PROLOG_END +#include +#include +#include +#include +#include + + // Set Ready = 0, Running = 1, Complete = 0. +static const uint64_t IDEBUG_RUNNING_STATE = 0x0001000000000000ull; + // Set Ready = 0, Running = 0, Complete = 1. +static const uint64_t IDEBUG_COMPLETE_STATE = 0x0000010000000000ull; + +void InteractiveDebug::startDebugTask() +{ + // Atomically set state to 'running'. + // Set Ready = 0, Running = 1, Complete = 0. + __sync_lock_test_and_set(&state_value, IDEBUG_RUNNING_STATE); + + // Create userspace task to execute function. + task_t* t = TaskManager::createTask(&debugEntryPoint, this, true); + CpuManager::getCurrentCPU()->scheduler->addTask(t); + + return; +} + +void InteractiveDebug::debugEntryPoint(void* i_idObject) +{ + // Detach task so it is cleaned up properly once it exits. + task_detach(); + + // Get interactive debug structure from cast of input paramater. + InteractiveDebug* interactiveDebug = + static_cast(i_idObject); + + // Get function pointer from 'entry_point_toc'. + typedef uint64_t(*func)(uint64_t,uint64_t,uint64_t,uint64_t, + uint64_t,uint64_t,uint64_t,uint64_t); + func entry_point = + reinterpret_cast(interactiveDebug->entry_point_toc); + + // Call function with parameters. + // Due to the PowerABI, parameters get passed in r3-r10 and any + // unused parameters are ignored by the called function. You can + // therefore treat every function as if it has 8 parameters, even + // if it has fewer, and the calling conventions are the same from + // an assembly perspective. + interactiveDebug->return_value = + entry_point(interactiveDebug->parms[0], + interactiveDebug->parms[1], + interactiveDebug->parms[2], + interactiveDebug->parms[3], + interactiveDebug->parms[4], + interactiveDebug->parms[5], + interactiveDebug->parms[6], + interactiveDebug->parms[7]); + + // Atomically set state to 'complete'. + // This must be proceeded by a sync to ensure all memory operations + // and instructions have fully completed prior to setting the complete + // state (due to weak consistency). + // Set Ready = 0, Running = 0, Complete = 1. + __sync_synchronize(); + __sync_lock_test_and_set(&interactiveDebug->state_value, + IDEBUG_COMPLETE_STATE); + + task_end(); +} + -- cgit v1.2.1