1*a159c266SJung-uk Kim /******************************************************************************* 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: dbxface - AML Debugger external interfaces 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim ******************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim 45*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 50*a159c266SJung-uk Kim 51*a159c266SJung-uk Kim 52*a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 55*a159c266SJung-uk Kim ACPI_MODULE_NAME ("dbxface") 56*a159c266SJung-uk Kim 57*a159c266SJung-uk Kim 58*a159c266SJung-uk Kim /* Local prototypes */ 59*a159c266SJung-uk Kim 60*a159c266SJung-uk Kim static ACPI_STATUS 61*a159c266SJung-uk Kim AcpiDbStartCommand ( 62*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState, 63*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op); 64*a159c266SJung-uk Kim 65*a159c266SJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 66*a159c266SJung-uk Kim void 67*a159c266SJung-uk Kim AcpiDbMethodEnd ( 68*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState); 69*a159c266SJung-uk Kim #endif 70*a159c266SJung-uk Kim 71*a159c266SJung-uk Kim 72*a159c266SJung-uk Kim /******************************************************************************* 73*a159c266SJung-uk Kim * 74*a159c266SJung-uk Kim * FUNCTION: AcpiDbStartCommand 75*a159c266SJung-uk Kim * 76*a159c266SJung-uk Kim * PARAMETERS: WalkState - Current walk 77*a159c266SJung-uk Kim * Op - Current executing Op, from AML interpreter 78*a159c266SJung-uk Kim * 79*a159c266SJung-uk Kim * RETURN: Status 80*a159c266SJung-uk Kim * 81*a159c266SJung-uk Kim * DESCRIPTION: Enter debugger command loop 82*a159c266SJung-uk Kim * 83*a159c266SJung-uk Kim ******************************************************************************/ 84*a159c266SJung-uk Kim 85*a159c266SJung-uk Kim static ACPI_STATUS 86*a159c266SJung-uk Kim AcpiDbStartCommand ( 87*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState, 88*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 89*a159c266SJung-uk Kim { 90*a159c266SJung-uk Kim ACPI_STATUS Status; 91*a159c266SJung-uk Kim 92*a159c266SJung-uk Kim 93*a159c266SJung-uk Kim /* TBD: [Investigate] are there namespace locking issues here? */ 94*a159c266SJung-uk Kim 95*a159c266SJung-uk Kim /* AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); */ 96*a159c266SJung-uk Kim 97*a159c266SJung-uk Kim /* Go into the command loop and await next user command */ 98*a159c266SJung-uk Kim 99*a159c266SJung-uk Kim 100*a159c266SJung-uk Kim AcpiGbl_MethodExecuting = TRUE; 101*a159c266SJung-uk Kim Status = AE_CTRL_TRUE; 102*a159c266SJung-uk Kim while (Status == AE_CTRL_TRUE) 103*a159c266SJung-uk Kim { 104*a159c266SJung-uk Kim if (AcpiGbl_DebuggerConfiguration == DEBUGGER_MULTI_THREADED) 105*a159c266SJung-uk Kim { 106*a159c266SJung-uk Kim /* Handshake with the front-end that gets user command lines */ 107*a159c266SJung-uk Kim 108*a159c266SJung-uk Kim Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE); 109*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 110*a159c266SJung-uk Kim { 111*a159c266SJung-uk Kim return (Status); 112*a159c266SJung-uk Kim } 113*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY); 114*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 115*a159c266SJung-uk Kim { 116*a159c266SJung-uk Kim return (Status); 117*a159c266SJung-uk Kim } 118*a159c266SJung-uk Kim } 119*a159c266SJung-uk Kim else 120*a159c266SJung-uk Kim { 121*a159c266SJung-uk Kim /* Single threaded, we must get a command line ourselves */ 122*a159c266SJung-uk Kim 123*a159c266SJung-uk Kim /* Force output to console until a command is entered */ 124*a159c266SJung-uk Kim 125*a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 126*a159c266SJung-uk Kim 127*a159c266SJung-uk Kim /* Different prompt if method is executing */ 128*a159c266SJung-uk Kim 129*a159c266SJung-uk Kim if (!AcpiGbl_MethodExecuting) 130*a159c266SJung-uk Kim { 131*a159c266SJung-uk Kim AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT); 132*a159c266SJung-uk Kim } 133*a159c266SJung-uk Kim else 134*a159c266SJung-uk Kim { 135*a159c266SJung-uk Kim AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT); 136*a159c266SJung-uk Kim } 137*a159c266SJung-uk Kim 138*a159c266SJung-uk Kim /* Get the user input line */ 139*a159c266SJung-uk Kim 140*a159c266SJung-uk Kim Status = AcpiOsGetLine (AcpiGbl_DbLineBuf, 141*a159c266SJung-uk Kim ACPI_DB_LINE_BUFFER_SIZE, NULL); 142*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 143*a159c266SJung-uk Kim { 144*a159c266SJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, "While parsing command line")); 145*a159c266SJung-uk Kim return (Status); 146*a159c266SJung-uk Kim } 147*a159c266SJung-uk Kim } 148*a159c266SJung-uk Kim 149*a159c266SJung-uk Kim Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, WalkState, Op); 150*a159c266SJung-uk Kim } 151*a159c266SJung-uk Kim 152*a159c266SJung-uk Kim /* AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); */ 153*a159c266SJung-uk Kim 154*a159c266SJung-uk Kim return (Status); 155*a159c266SJung-uk Kim } 156*a159c266SJung-uk Kim 157*a159c266SJung-uk Kim 158*a159c266SJung-uk Kim /******************************************************************************* 159*a159c266SJung-uk Kim * 160*a159c266SJung-uk Kim * FUNCTION: AcpiDbSingleStep 161*a159c266SJung-uk Kim * 162*a159c266SJung-uk Kim * PARAMETERS: WalkState - Current walk 163*a159c266SJung-uk Kim * Op - Current executing op (from aml interpreter) 164*a159c266SJung-uk Kim * OpcodeClass - Class of the current AML Opcode 165*a159c266SJung-uk Kim * 166*a159c266SJung-uk Kim * RETURN: Status 167*a159c266SJung-uk Kim * 168*a159c266SJung-uk Kim * DESCRIPTION: Called just before execution of an AML opcode. 169*a159c266SJung-uk Kim * 170*a159c266SJung-uk Kim ******************************************************************************/ 171*a159c266SJung-uk Kim 172*a159c266SJung-uk Kim ACPI_STATUS 173*a159c266SJung-uk Kim AcpiDbSingleStep ( 174*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState, 175*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op, 176*a159c266SJung-uk Kim UINT32 OpcodeClass) 177*a159c266SJung-uk Kim { 178*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Next; 179*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 180*a159c266SJung-uk Kim UINT32 OriginalDebugLevel; 181*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *DisplayOp; 182*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp; 183*a159c266SJung-uk Kim 184*a159c266SJung-uk Kim 185*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 186*a159c266SJung-uk Kim 187*a159c266SJung-uk Kim 188*a159c266SJung-uk Kim /* Check the abort flag */ 189*a159c266SJung-uk Kim 190*a159c266SJung-uk Kim if (AcpiGbl_AbortMethod) 191*a159c266SJung-uk Kim { 192*a159c266SJung-uk Kim AcpiGbl_AbortMethod = FALSE; 193*a159c266SJung-uk Kim return (AE_ABORT_METHOD); 194*a159c266SJung-uk Kim } 195*a159c266SJung-uk Kim 196*a159c266SJung-uk Kim /* Check for single-step breakpoint */ 197*a159c266SJung-uk Kim 198*a159c266SJung-uk Kim if (WalkState->MethodBreakpoint && 199*a159c266SJung-uk Kim (WalkState->MethodBreakpoint <= Op->Common.AmlOffset)) 200*a159c266SJung-uk Kim { 201*a159c266SJung-uk Kim /* Check if the breakpoint has been reached or passed */ 202*a159c266SJung-uk Kim /* Hit the breakpoint, resume single step, reset breakpoint */ 203*a159c266SJung-uk Kim 204*a159c266SJung-uk Kim AcpiOsPrintf ("***Break*** at AML offset %X\n", Op->Common.AmlOffset); 205*a159c266SJung-uk Kim AcpiGbl_CmSingleStep = TRUE; 206*a159c266SJung-uk Kim AcpiGbl_StepToNextCall = FALSE; 207*a159c266SJung-uk Kim WalkState->MethodBreakpoint = 0; 208*a159c266SJung-uk Kim } 209*a159c266SJung-uk Kim 210*a159c266SJung-uk Kim /* Check for user breakpoint (Must be on exact Aml offset) */ 211*a159c266SJung-uk Kim 212*a159c266SJung-uk Kim else if (WalkState->UserBreakpoint && 213*a159c266SJung-uk Kim (WalkState->UserBreakpoint == Op->Common.AmlOffset)) 214*a159c266SJung-uk Kim { 215*a159c266SJung-uk Kim AcpiOsPrintf ("***UserBreakpoint*** at AML offset %X\n", 216*a159c266SJung-uk Kim Op->Common.AmlOffset); 217*a159c266SJung-uk Kim AcpiGbl_CmSingleStep = TRUE; 218*a159c266SJung-uk Kim AcpiGbl_StepToNextCall = FALSE; 219*a159c266SJung-uk Kim WalkState->MethodBreakpoint = 0; 220*a159c266SJung-uk Kim } 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim /* 223*a159c266SJung-uk Kim * Check if this is an opcode that we are interested in -- 224*a159c266SJung-uk Kim * namely, opcodes that have arguments 225*a159c266SJung-uk Kim */ 226*a159c266SJung-uk Kim if (Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP) 227*a159c266SJung-uk Kim { 228*a159c266SJung-uk Kim return (AE_OK); 229*a159c266SJung-uk Kim } 230*a159c266SJung-uk Kim 231*a159c266SJung-uk Kim switch (OpcodeClass) 232*a159c266SJung-uk Kim { 233*a159c266SJung-uk Kim case AML_CLASS_UNKNOWN: 234*a159c266SJung-uk Kim case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ 235*a159c266SJung-uk Kim return (AE_OK); 236*a159c266SJung-uk Kim 237*a159c266SJung-uk Kim default: 238*a159c266SJung-uk Kim /* All other opcodes -- continue */ 239*a159c266SJung-uk Kim break; 240*a159c266SJung-uk Kim } 241*a159c266SJung-uk Kim 242*a159c266SJung-uk Kim /* 243*a159c266SJung-uk Kim * Under certain debug conditions, display this opcode and its operands 244*a159c266SJung-uk Kim */ 245*a159c266SJung-uk Kim if ((AcpiGbl_DbOutputToFile) || 246*a159c266SJung-uk Kim (AcpiGbl_CmSingleStep) || 247*a159c266SJung-uk Kim (AcpiDbgLevel & ACPI_LV_PARSE)) 248*a159c266SJung-uk Kim { 249*a159c266SJung-uk Kim if ((AcpiGbl_DbOutputToFile) || 250*a159c266SJung-uk Kim (AcpiDbgLevel & ACPI_LV_PARSE)) 251*a159c266SJung-uk Kim { 252*a159c266SJung-uk Kim AcpiOsPrintf ("\n[AmlDebug] Next AML Opcode to execute:\n"); 253*a159c266SJung-uk Kim } 254*a159c266SJung-uk Kim 255*a159c266SJung-uk Kim /* 256*a159c266SJung-uk Kim * Display this op (and only this op - zero out the NEXT field 257*a159c266SJung-uk Kim * temporarily, and disable parser trace output for the duration of 258*a159c266SJung-uk Kim * the display because we don't want the extraneous debug output) 259*a159c266SJung-uk Kim */ 260*a159c266SJung-uk Kim OriginalDebugLevel = AcpiDbgLevel; 261*a159c266SJung-uk Kim AcpiDbgLevel &= ~(ACPI_LV_PARSE | ACPI_LV_FUNCTIONS); 262*a159c266SJung-uk Kim Next = Op->Common.Next; 263*a159c266SJung-uk Kim Op->Common.Next = NULL; 264*a159c266SJung-uk Kim 265*a159c266SJung-uk Kim 266*a159c266SJung-uk Kim DisplayOp = Op; 267*a159c266SJung-uk Kim ParentOp = Op->Common.Parent; 268*a159c266SJung-uk Kim if (ParentOp) 269*a159c266SJung-uk Kim { 270*a159c266SJung-uk Kim if ((WalkState->ControlState) && 271*a159c266SJung-uk Kim (WalkState->ControlState->Common.State == 272*a159c266SJung-uk Kim ACPI_CONTROL_PREDICATE_EXECUTING)) 273*a159c266SJung-uk Kim { 274*a159c266SJung-uk Kim /* 275*a159c266SJung-uk Kim * We are executing the predicate of an IF or WHILE statement 276*a159c266SJung-uk Kim * Search upwards for the containing IF or WHILE so that the 277*a159c266SJung-uk Kim * entire predicate can be displayed. 278*a159c266SJung-uk Kim */ 279*a159c266SJung-uk Kim while (ParentOp) 280*a159c266SJung-uk Kim { 281*a159c266SJung-uk Kim if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || 282*a159c266SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) 283*a159c266SJung-uk Kim { 284*a159c266SJung-uk Kim DisplayOp = ParentOp; 285*a159c266SJung-uk Kim break; 286*a159c266SJung-uk Kim } 287*a159c266SJung-uk Kim ParentOp = ParentOp->Common.Parent; 288*a159c266SJung-uk Kim } 289*a159c266SJung-uk Kim } 290*a159c266SJung-uk Kim else 291*a159c266SJung-uk Kim { 292*a159c266SJung-uk Kim while (ParentOp) 293*a159c266SJung-uk Kim { 294*a159c266SJung-uk Kim if ((ParentOp->Common.AmlOpcode == AML_IF_OP) || 295*a159c266SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_ELSE_OP) || 296*a159c266SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) || 297*a159c266SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_METHOD_OP) || 298*a159c266SJung-uk Kim (ParentOp->Common.AmlOpcode == AML_WHILE_OP)) 299*a159c266SJung-uk Kim { 300*a159c266SJung-uk Kim break; 301*a159c266SJung-uk Kim } 302*a159c266SJung-uk Kim DisplayOp = ParentOp; 303*a159c266SJung-uk Kim ParentOp = ParentOp->Common.Parent; 304*a159c266SJung-uk Kim } 305*a159c266SJung-uk Kim } 306*a159c266SJung-uk Kim } 307*a159c266SJung-uk Kim 308*a159c266SJung-uk Kim /* Now we can display it */ 309*a159c266SJung-uk Kim 310*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER 311*a159c266SJung-uk Kim AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX); 312*a159c266SJung-uk Kim #endif 313*a159c266SJung-uk Kim 314*a159c266SJung-uk Kim if ((Op->Common.AmlOpcode == AML_IF_OP) || 315*a159c266SJung-uk Kim (Op->Common.AmlOpcode == AML_WHILE_OP)) 316*a159c266SJung-uk Kim { 317*a159c266SJung-uk Kim if (WalkState->ControlState->Common.Value) 318*a159c266SJung-uk Kim { 319*a159c266SJung-uk Kim AcpiOsPrintf ("Predicate = [True], IF block was executed\n"); 320*a159c266SJung-uk Kim } 321*a159c266SJung-uk Kim else 322*a159c266SJung-uk Kim { 323*a159c266SJung-uk Kim AcpiOsPrintf ("Predicate = [False], Skipping IF block\n"); 324*a159c266SJung-uk Kim } 325*a159c266SJung-uk Kim } 326*a159c266SJung-uk Kim else if (Op->Common.AmlOpcode == AML_ELSE_OP) 327*a159c266SJung-uk Kim { 328*a159c266SJung-uk Kim AcpiOsPrintf ("Predicate = [False], ELSE block was executed\n"); 329*a159c266SJung-uk Kim } 330*a159c266SJung-uk Kim 331*a159c266SJung-uk Kim /* Restore everything */ 332*a159c266SJung-uk Kim 333*a159c266SJung-uk Kim Op->Common.Next = Next; 334*a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 335*a159c266SJung-uk Kim if ((AcpiGbl_DbOutputToFile) || 336*a159c266SJung-uk Kim (AcpiDbgLevel & ACPI_LV_PARSE)) 337*a159c266SJung-uk Kim { 338*a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 339*a159c266SJung-uk Kim } 340*a159c266SJung-uk Kim AcpiDbgLevel = OriginalDebugLevel; 341*a159c266SJung-uk Kim } 342*a159c266SJung-uk Kim 343*a159c266SJung-uk Kim /* If we are not single stepping, just continue executing the method */ 344*a159c266SJung-uk Kim 345*a159c266SJung-uk Kim if (!AcpiGbl_CmSingleStep) 346*a159c266SJung-uk Kim { 347*a159c266SJung-uk Kim return (AE_OK); 348*a159c266SJung-uk Kim } 349*a159c266SJung-uk Kim 350*a159c266SJung-uk Kim /* 351*a159c266SJung-uk Kim * If we are executing a step-to-call command, 352*a159c266SJung-uk Kim * Check if this is a method call. 353*a159c266SJung-uk Kim */ 354*a159c266SJung-uk Kim if (AcpiGbl_StepToNextCall) 355*a159c266SJung-uk Kim { 356*a159c266SJung-uk Kim if (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP) 357*a159c266SJung-uk Kim { 358*a159c266SJung-uk Kim /* Not a method call, just keep executing */ 359*a159c266SJung-uk Kim 360*a159c266SJung-uk Kim return (AE_OK); 361*a159c266SJung-uk Kim } 362*a159c266SJung-uk Kim 363*a159c266SJung-uk Kim /* Found a method call, stop executing */ 364*a159c266SJung-uk Kim 365*a159c266SJung-uk Kim AcpiGbl_StepToNextCall = FALSE; 366*a159c266SJung-uk Kim } 367*a159c266SJung-uk Kim 368*a159c266SJung-uk Kim /* 369*a159c266SJung-uk Kim * If the next opcode is a method call, we will "step over" it 370*a159c266SJung-uk Kim * by default. 371*a159c266SJung-uk Kim */ 372*a159c266SJung-uk Kim if (Op->Common.AmlOpcode == AML_INT_METHODCALL_OP) 373*a159c266SJung-uk Kim { 374*a159c266SJung-uk Kim /* Force no more single stepping while executing called method */ 375*a159c266SJung-uk Kim 376*a159c266SJung-uk Kim AcpiGbl_CmSingleStep = FALSE; 377*a159c266SJung-uk Kim 378*a159c266SJung-uk Kim /* 379*a159c266SJung-uk Kim * Set the breakpoint on/before the call, it will stop execution 380*a159c266SJung-uk Kim * as soon as we return 381*a159c266SJung-uk Kim */ 382*a159c266SJung-uk Kim WalkState->MethodBreakpoint = 1; /* Must be non-zero! */ 383*a159c266SJung-uk Kim } 384*a159c266SJung-uk Kim 385*a159c266SJung-uk Kim 386*a159c266SJung-uk Kim Status = AcpiDbStartCommand (WalkState, Op); 387*a159c266SJung-uk Kim 388*a159c266SJung-uk Kim /* User commands complete, continue execution of the interrupted method */ 389*a159c266SJung-uk Kim 390*a159c266SJung-uk Kim return (Status); 391*a159c266SJung-uk Kim } 392*a159c266SJung-uk Kim 393*a159c266SJung-uk Kim 394*a159c266SJung-uk Kim /******************************************************************************* 395*a159c266SJung-uk Kim * 396*a159c266SJung-uk Kim * FUNCTION: AcpiDbInitialize 397*a159c266SJung-uk Kim * 398*a159c266SJung-uk Kim * PARAMETERS: None 399*a159c266SJung-uk Kim * 400*a159c266SJung-uk Kim * RETURN: Status 401*a159c266SJung-uk Kim * 402*a159c266SJung-uk Kim * DESCRIPTION: Init and start debugger 403*a159c266SJung-uk Kim * 404*a159c266SJung-uk Kim ******************************************************************************/ 405*a159c266SJung-uk Kim 406*a159c266SJung-uk Kim ACPI_STATUS 407*a159c266SJung-uk Kim AcpiDbInitialize ( 408*a159c266SJung-uk Kim void) 409*a159c266SJung-uk Kim { 410*a159c266SJung-uk Kim ACPI_STATUS Status; 411*a159c266SJung-uk Kim 412*a159c266SJung-uk Kim 413*a159c266SJung-uk Kim /* Init globals */ 414*a159c266SJung-uk Kim 415*a159c266SJung-uk Kim AcpiGbl_DbBuffer = NULL; 416*a159c266SJung-uk Kim AcpiGbl_DbFilename = NULL; 417*a159c266SJung-uk Kim AcpiGbl_DbOutputToFile = FALSE; 418*a159c266SJung-uk Kim 419*a159c266SJung-uk Kim AcpiGbl_DbDebugLevel = ACPI_LV_VERBOSITY2; 420*a159c266SJung-uk Kim AcpiGbl_DbConsoleDebugLevel = ACPI_NORMAL_DEFAULT | ACPI_LV_TABLES; 421*a159c266SJung-uk Kim AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT; 422*a159c266SJung-uk Kim 423*a159c266SJung-uk Kim AcpiGbl_DbOpt_tables = FALSE; 424*a159c266SJung-uk Kim AcpiGbl_DbOpt_stats = FALSE; 425*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER 426*a159c266SJung-uk Kim AcpiGbl_DbOpt_disasm = FALSE; 427*a159c266SJung-uk Kim AcpiGbl_DbOpt_verbose = TRUE; 428*a159c266SJung-uk Kim #endif 429*a159c266SJung-uk Kim AcpiGbl_DbOpt_ini_methods = TRUE; 430*a159c266SJung-uk Kim 431*a159c266SJung-uk Kim AcpiGbl_DbBuffer = AcpiOsAllocate (ACPI_DEBUG_BUFFER_SIZE); 432*a159c266SJung-uk Kim if (!AcpiGbl_DbBuffer) 433*a159c266SJung-uk Kim { 434*a159c266SJung-uk Kim return (AE_NO_MEMORY); 435*a159c266SJung-uk Kim } 436*a159c266SJung-uk Kim ACPI_MEMSET (AcpiGbl_DbBuffer, 0, ACPI_DEBUG_BUFFER_SIZE); 437*a159c266SJung-uk Kim 438*a159c266SJung-uk Kim /* Initial scope is the root */ 439*a159c266SJung-uk Kim 440*a159c266SJung-uk Kim AcpiGbl_DbScopeBuf [0] = '\\'; 441*a159c266SJung-uk Kim AcpiGbl_DbScopeBuf [1] = 0; 442*a159c266SJung-uk Kim AcpiGbl_DbScopeNode = AcpiGbl_RootNode; 443*a159c266SJung-uk Kim 444*a159c266SJung-uk Kim /* 445*a159c266SJung-uk Kim * If configured for multi-thread support, the debug executor runs in 446*a159c266SJung-uk Kim * a separate thread so that the front end can be in another address 447*a159c266SJung-uk Kim * space, environment, or even another machine. 448*a159c266SJung-uk Kim */ 449*a159c266SJung-uk Kim if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED) 450*a159c266SJung-uk Kim { 451*a159c266SJung-uk Kim /* These were created with one unit, grab it */ 452*a159c266SJung-uk Kim 453*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE); 454*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 455*a159c266SJung-uk Kim { 456*a159c266SJung-uk Kim AcpiOsPrintf ("Could not get debugger mutex\n"); 457*a159c266SJung-uk Kim return (Status); 458*a159c266SJung-uk Kim } 459*a159c266SJung-uk Kim 460*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY); 461*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 462*a159c266SJung-uk Kim { 463*a159c266SJung-uk Kim AcpiOsPrintf ("Could not get debugger mutex\n"); 464*a159c266SJung-uk Kim return (Status); 465*a159c266SJung-uk Kim } 466*a159c266SJung-uk Kim 467*a159c266SJung-uk Kim /* Create the debug execution thread to execute commands */ 468*a159c266SJung-uk Kim 469*a159c266SJung-uk Kim Status = AcpiOsExecute (OSL_DEBUGGER_THREAD, AcpiDbExecuteThread, NULL); 470*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 471*a159c266SJung-uk Kim { 472*a159c266SJung-uk Kim AcpiOsPrintf ("Could not start debugger thread\n"); 473*a159c266SJung-uk Kim return (Status); 474*a159c266SJung-uk Kim } 475*a159c266SJung-uk Kim } 476*a159c266SJung-uk Kim 477*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER 478*a159c266SJung-uk Kim if (!AcpiGbl_DbOpt_verbose) 479*a159c266SJung-uk Kim { 480*a159c266SJung-uk Kim AcpiGbl_DbOpt_disasm = TRUE; 481*a159c266SJung-uk Kim AcpiGbl_DbOpt_stats = FALSE; 482*a159c266SJung-uk Kim } 483*a159c266SJung-uk Kim #endif 484*a159c266SJung-uk Kim 485*a159c266SJung-uk Kim return (AE_OK); 486*a159c266SJung-uk Kim } 487*a159c266SJung-uk Kim 488*a159c266SJung-uk Kim 489*a159c266SJung-uk Kim /******************************************************************************* 490*a159c266SJung-uk Kim * 491*a159c266SJung-uk Kim * FUNCTION: AcpiDbTerminate 492*a159c266SJung-uk Kim * 493*a159c266SJung-uk Kim * PARAMETERS: None 494*a159c266SJung-uk Kim * 495*a159c266SJung-uk Kim * RETURN: None 496*a159c266SJung-uk Kim * 497*a159c266SJung-uk Kim * DESCRIPTION: Stop debugger 498*a159c266SJung-uk Kim * 499*a159c266SJung-uk Kim ******************************************************************************/ 500*a159c266SJung-uk Kim 501*a159c266SJung-uk Kim void 502*a159c266SJung-uk Kim AcpiDbTerminate ( 503*a159c266SJung-uk Kim void) 504*a159c266SJung-uk Kim { 505*a159c266SJung-uk Kim 506*a159c266SJung-uk Kim if (AcpiGbl_DbBuffer) 507*a159c266SJung-uk Kim { 508*a159c266SJung-uk Kim AcpiOsFree (AcpiGbl_DbBuffer); 509*a159c266SJung-uk Kim } 510*a159c266SJung-uk Kim } 511*a159c266SJung-uk Kim 512*a159c266SJung-uk Kim 513*a159c266SJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 514*a159c266SJung-uk Kim /******************************************************************************* 515*a159c266SJung-uk Kim * 516*a159c266SJung-uk Kim * FUNCTION: AcpiDbMethodEnd 517*a159c266SJung-uk Kim * 518*a159c266SJung-uk Kim * PARAMETERS: WalkState - Current walk 519*a159c266SJung-uk Kim * 520*a159c266SJung-uk Kim * RETURN: Status 521*a159c266SJung-uk Kim * 522*a159c266SJung-uk Kim * DESCRIPTION: Called at method termination 523*a159c266SJung-uk Kim * 524*a159c266SJung-uk Kim ******************************************************************************/ 525*a159c266SJung-uk Kim 526*a159c266SJung-uk Kim void 527*a159c266SJung-uk Kim AcpiDbMethodEnd ( 528*a159c266SJung-uk Kim ACPI_WALK_STATE *WalkState) 529*a159c266SJung-uk Kim { 530*a159c266SJung-uk Kim 531*a159c266SJung-uk Kim if (!AcpiGbl_CmSingleStep) 532*a159c266SJung-uk Kim { 533*a159c266SJung-uk Kim return; 534*a159c266SJung-uk Kim } 535*a159c266SJung-uk Kim 536*a159c266SJung-uk Kim AcpiOsPrintf ("<Method Terminating>\n"); 537*a159c266SJung-uk Kim 538*a159c266SJung-uk Kim AcpiDbStartCommand (WalkState, NULL); 539*a159c266SJung-uk Kim } 540*a159c266SJung-uk Kim #endif 541*a159c266SJung-uk Kim 542*a159c266SJung-uk Kim #endif /* ACPI_DEBUGGER */ 543