1a9f12690SJung-uk Kim /****************************************************************************** 2a9f12690SJung-uk Kim * 3a9f12690SJung-uk Kim * Name: acdebug.h - ACPI/AML debugger 4a9f12690SJung-uk Kim * 5a9f12690SJung-uk Kim *****************************************************************************/ 6a9f12690SJung-uk Kim 7d244b227SJung-uk Kim /* 8d244b227SJung-uk Kim * Copyright (C) 2000 - 2011, Intel Corp. 9a9f12690SJung-uk Kim * All rights reserved. 10a9f12690SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 25a9f12690SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 29a9f12690SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 43a9f12690SJung-uk Kim 44a9f12690SJung-uk Kim #ifndef __ACDEBUG_H__ 45a9f12690SJung-uk Kim #define __ACDEBUG_H__ 46a9f12690SJung-uk Kim 47a9f12690SJung-uk Kim 485a77b11bSJung-uk Kim #define ACPI_DEBUG_BUFFER_SIZE 0x4000 /* 16K buffer for return objects */ 49a9f12690SJung-uk Kim 50a9f12690SJung-uk Kim typedef struct CommandInfo 51a9f12690SJung-uk Kim { 52a9f12690SJung-uk Kim char *Name; /* Command Name */ 53a9f12690SJung-uk Kim UINT8 MinArgs; /* Minimum arguments required */ 54a9f12690SJung-uk Kim 55a9f12690SJung-uk Kim } COMMAND_INFO; 56a9f12690SJung-uk Kim 57a9f12690SJung-uk Kim typedef struct ArgumentInfo 58a9f12690SJung-uk Kim { 59a9f12690SJung-uk Kim char *Name; /* Argument Name */ 60a9f12690SJung-uk Kim 61a9f12690SJung-uk Kim } ARGUMENT_INFO; 62a9f12690SJung-uk Kim 63f556842eSJung-uk Kim typedef struct acpi_execute_walk 64f556842eSJung-uk Kim { 65f556842eSJung-uk Kim UINT32 Count; 66f556842eSJung-uk Kim UINT32 MaxCount; 67f556842eSJung-uk Kim 68f556842eSJung-uk Kim } ACPI_EXECUTE_WALK; 69f556842eSJung-uk Kim 70a9f12690SJung-uk Kim 71a9f12690SJung-uk Kim #define PARAM_LIST(pl) pl 72a9f12690SJung-uk Kim #define DBTEST_OUTPUT_LEVEL(lvl) if (AcpiGbl_DbOpt_verbose) 73a9f12690SJung-uk Kim #define VERBOSE_PRINT(fp) DBTEST_OUTPUT_LEVEL(lvl) {\ 74a9f12690SJung-uk Kim AcpiOsPrintf PARAM_LIST(fp);} 75a9f12690SJung-uk Kim 76a9f12690SJung-uk Kim #define EX_NO_SINGLE_STEP 1 77a9f12690SJung-uk Kim #define EX_SINGLE_STEP 2 78a9f12690SJung-uk Kim 79a9f12690SJung-uk Kim 80a9f12690SJung-uk Kim /* 81a9f12690SJung-uk Kim * dbxface - external debugger interfaces 82a9f12690SJung-uk Kim */ 83a9f12690SJung-uk Kim ACPI_STATUS 84a9f12690SJung-uk Kim AcpiDbInitialize ( 85a9f12690SJung-uk Kim void); 86a9f12690SJung-uk Kim 87a9f12690SJung-uk Kim void 88a9f12690SJung-uk Kim AcpiDbTerminate ( 89a9f12690SJung-uk Kim void); 90a9f12690SJung-uk Kim 91a9f12690SJung-uk Kim ACPI_STATUS 92a9f12690SJung-uk Kim AcpiDbSingleStep ( 93a9f12690SJung-uk Kim ACPI_WALK_STATE *WalkState, 94a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op, 95a9f12690SJung-uk Kim UINT32 OpType); 96a9f12690SJung-uk Kim 97a9f12690SJung-uk Kim 98a9f12690SJung-uk Kim /* 99a9f12690SJung-uk Kim * dbcmds - debug commands and output routines 100a9f12690SJung-uk Kim */ 1010b94ba42SJung-uk Kim ACPI_NAMESPACE_NODE * 1020b94ba42SJung-uk Kim AcpiDbConvertToNode ( 1030b94ba42SJung-uk Kim char *InString); 104a9f12690SJung-uk Kim 105a9f12690SJung-uk Kim void 106a9f12690SJung-uk Kim AcpiDbDisplayTableInfo ( 107a9f12690SJung-uk Kim char *TableArg); 108a9f12690SJung-uk Kim 109a9f12690SJung-uk Kim void 110*3f0275a0SJung-uk Kim AcpiDbDisplayTemplate ( 111*3f0275a0SJung-uk Kim char *BufferArg); 112*3f0275a0SJung-uk Kim 113*3f0275a0SJung-uk Kim void 114a9f12690SJung-uk Kim AcpiDbUnloadAcpiTable ( 115a9f12690SJung-uk Kim char *TableArg, 116a9f12690SJung-uk Kim char *InstanceArg); 117a9f12690SJung-uk Kim 118a9f12690SJung-uk Kim void 119a9f12690SJung-uk Kim AcpiDbSendNotify ( 120a9f12690SJung-uk Kim char *Name, 121a9f12690SJung-uk Kim UINT32 Value); 122a9f12690SJung-uk Kim 123a9f12690SJung-uk Kim void 124709fac06SJung-uk Kim AcpiDbDisplayInterfaces ( 125709fac06SJung-uk Kim char *ActionArg, 126709fac06SJung-uk Kim char *InterfaceNameArg); 127709fac06SJung-uk Kim 128a9f12690SJung-uk Kim ACPI_STATUS 129a9f12690SJung-uk Kim AcpiDbSleep ( 130a9f12690SJung-uk Kim char *ObjectArg); 131a9f12690SJung-uk Kim 132a9f12690SJung-uk Kim void 133a9f12690SJung-uk Kim AcpiDbDisplayLocks ( 134a9f12690SJung-uk Kim void); 135a9f12690SJung-uk Kim 136a9f12690SJung-uk Kim void 137a9f12690SJung-uk Kim AcpiDbDisplayResources ( 138a9f12690SJung-uk Kim char *ObjectArg); 139a9f12690SJung-uk Kim 140a9f12690SJung-uk Kim void 141a9f12690SJung-uk Kim AcpiDbDisplayGpes ( 142a9f12690SJung-uk Kim void); 143a9f12690SJung-uk Kim 144a9f12690SJung-uk Kim void 1450b94ba42SJung-uk Kim AcpiDbDisplayHandlers ( 146a9f12690SJung-uk Kim void); 147a9f12690SJung-uk Kim 148a9f12690SJung-uk Kim void 149a9f12690SJung-uk Kim AcpiDbGenerateGpe ( 150a9f12690SJung-uk Kim char *GpeArg, 151a9f12690SJung-uk Kim char *BlockArg); 152a9f12690SJung-uk Kim 1530b94ba42SJung-uk Kim 1540b94ba42SJung-uk Kim /* 1550b94ba42SJung-uk Kim * dbmethod - control method commands 1560b94ba42SJung-uk Kim */ 157a9f12690SJung-uk Kim void 1580b94ba42SJung-uk Kim AcpiDbSetMethodBreakpoint ( 1590b94ba42SJung-uk Kim char *Location, 1600b94ba42SJung-uk Kim ACPI_WALK_STATE *WalkState, 1610b94ba42SJung-uk Kim ACPI_PARSE_OBJECT *Op); 1620b94ba42SJung-uk Kim 1630b94ba42SJung-uk Kim void 1640b94ba42SJung-uk Kim AcpiDbSetMethodCallBreakpoint ( 1650b94ba42SJung-uk Kim ACPI_PARSE_OBJECT *Op); 1660b94ba42SJung-uk Kim 1670b94ba42SJung-uk Kim void 1680b94ba42SJung-uk Kim AcpiDbSetMethodData ( 1690b94ba42SJung-uk Kim char *TypeArg, 1700b94ba42SJung-uk Kim char *IndexArg, 1710b94ba42SJung-uk Kim char *ValueArg); 1720b94ba42SJung-uk Kim 1730b94ba42SJung-uk Kim ACPI_STATUS 1740b94ba42SJung-uk Kim AcpiDbDisassembleMethod ( 1750b94ba42SJung-uk Kim char *Name); 1760b94ba42SJung-uk Kim 1770b94ba42SJung-uk Kim void 1780b94ba42SJung-uk Kim AcpiDbDisassembleAml ( 1790b94ba42SJung-uk Kim char *Statements, 1800b94ba42SJung-uk Kim ACPI_PARSE_OBJECT *Op); 181a9f12690SJung-uk Kim 182a9f12690SJung-uk Kim void 183a9f12690SJung-uk Kim AcpiDbBatchExecute ( 184f556842eSJung-uk Kim char *CountArg); 185a9f12690SJung-uk Kim 1860b94ba42SJung-uk Kim 1870b94ba42SJung-uk Kim /* 1880b94ba42SJung-uk Kim * dbnames - namespace commands 1890b94ba42SJung-uk Kim */ 1900b94ba42SJung-uk Kim void 1910b94ba42SJung-uk Kim AcpiDbSetScope ( 1920b94ba42SJung-uk Kim char *Name); 1930b94ba42SJung-uk Kim 1940b94ba42SJung-uk Kim void 1950b94ba42SJung-uk Kim AcpiDbDumpNamespace ( 1960b94ba42SJung-uk Kim char *StartArg, 1970b94ba42SJung-uk Kim char *DepthArg); 1980b94ba42SJung-uk Kim 1990b94ba42SJung-uk Kim void 2000b94ba42SJung-uk Kim AcpiDbDumpNamespaceByOwner ( 2010b94ba42SJung-uk Kim char *OwnerArg, 2020b94ba42SJung-uk Kim char *DepthArg); 2030b94ba42SJung-uk Kim 2040b94ba42SJung-uk Kim ACPI_STATUS 2050b94ba42SJung-uk Kim AcpiDbFindNameInNamespace ( 2060b94ba42SJung-uk Kim char *NameArg); 2070b94ba42SJung-uk Kim 2080b94ba42SJung-uk Kim void 2090b94ba42SJung-uk Kim AcpiDbCheckPredefinedNames ( 2100b94ba42SJung-uk Kim void); 2110b94ba42SJung-uk Kim 2120b94ba42SJung-uk Kim ACPI_STATUS 2130b94ba42SJung-uk Kim AcpiDbDisplayObjects ( 2140b94ba42SJung-uk Kim char *ObjTypeArg, 2150b94ba42SJung-uk Kim char *DisplayCountArg); 2160b94ba42SJung-uk Kim 2170b94ba42SJung-uk Kim void 2180b94ba42SJung-uk Kim AcpiDbCheckIntegrity ( 2190b94ba42SJung-uk Kim void); 2200b94ba42SJung-uk Kim 2210b94ba42SJung-uk Kim void 2220b94ba42SJung-uk Kim AcpiDbFindReferences ( 2230b94ba42SJung-uk Kim char *ObjectArg); 2240b94ba42SJung-uk Kim 2250b94ba42SJung-uk Kim void 2260b94ba42SJung-uk Kim AcpiDbGetBusInfo ( 2270b94ba42SJung-uk Kim void); 2280b94ba42SJung-uk Kim 2290b94ba42SJung-uk Kim 230a9f12690SJung-uk Kim /* 231a9f12690SJung-uk Kim * dbdisply - debug display commands 232a9f12690SJung-uk Kim */ 233a9f12690SJung-uk Kim void 234a9f12690SJung-uk Kim AcpiDbDisplayMethodInfo ( 235a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op); 236a9f12690SJung-uk Kim 237a9f12690SJung-uk Kim void 238a9f12690SJung-uk Kim AcpiDbDecodeAndDisplayObject ( 239a9f12690SJung-uk Kim char *Target, 240a9f12690SJung-uk Kim char *OutputType); 241a9f12690SJung-uk Kim 242a9f12690SJung-uk Kim void 243a9f12690SJung-uk Kim AcpiDbDisplayResultObject ( 244a9f12690SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc, 245a9f12690SJung-uk Kim ACPI_WALK_STATE *WalkState); 246a9f12690SJung-uk Kim 247a9f12690SJung-uk Kim ACPI_STATUS 248a9f12690SJung-uk Kim AcpiDbDisplayAllMethods ( 249a9f12690SJung-uk Kim char *DisplayCountArg); 250a9f12690SJung-uk Kim 251a9f12690SJung-uk Kim void 252a9f12690SJung-uk Kim AcpiDbDisplayArguments ( 253a9f12690SJung-uk Kim void); 254a9f12690SJung-uk Kim 255a9f12690SJung-uk Kim void 256a9f12690SJung-uk Kim AcpiDbDisplayLocals ( 257a9f12690SJung-uk Kim void); 258a9f12690SJung-uk Kim 259a9f12690SJung-uk Kim void 260a9f12690SJung-uk Kim AcpiDbDisplayResults ( 261a9f12690SJung-uk Kim void); 262a9f12690SJung-uk Kim 263a9f12690SJung-uk Kim void 264a9f12690SJung-uk Kim AcpiDbDisplayCallingTree ( 265a9f12690SJung-uk Kim void); 266a9f12690SJung-uk Kim 267a9f12690SJung-uk Kim void 268a9f12690SJung-uk Kim AcpiDbDisplayObjectType ( 269a9f12690SJung-uk Kim char *ObjectArg); 270a9f12690SJung-uk Kim 271a9f12690SJung-uk Kim void 272a9f12690SJung-uk Kim AcpiDbDisplayArgumentObject ( 273a9f12690SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc, 274a9f12690SJung-uk Kim ACPI_WALK_STATE *WalkState); 275a9f12690SJung-uk Kim 276d6dd1baeSJung-uk Kim 277a9f12690SJung-uk Kim /* 278a9f12690SJung-uk Kim * dbexec - debugger control method execution 279a9f12690SJung-uk Kim */ 280a9f12690SJung-uk Kim void 281a9f12690SJung-uk Kim AcpiDbExecute ( 282a9f12690SJung-uk Kim char *Name, 283a9f12690SJung-uk Kim char **Args, 28442e58c03SJung-uk Kim ACPI_OBJECT_TYPE *Types, 285a9f12690SJung-uk Kim UINT32 Flags); 286a9f12690SJung-uk Kim 287a9f12690SJung-uk Kim void 288a9f12690SJung-uk Kim AcpiDbCreateExecutionThreads ( 289a9f12690SJung-uk Kim char *NumThreadsArg, 290a9f12690SJung-uk Kim char *NumLoopsArg, 291a9f12690SJung-uk Kim char *MethodNameArg); 292a9f12690SJung-uk Kim 293a9f12690SJung-uk Kim #ifdef ACPI_DBG_TRACK_ALLOCATIONS 294a9f12690SJung-uk Kim UINT32 295a9f12690SJung-uk Kim AcpiDbGetCacheInfo ( 296a9f12690SJung-uk Kim ACPI_MEMORY_LIST *Cache); 297a9f12690SJung-uk Kim #endif 298a9f12690SJung-uk Kim 299a9f12690SJung-uk Kim 300a9f12690SJung-uk Kim /* 301a9f12690SJung-uk Kim * dbfileio - Debugger file I/O commands 302a9f12690SJung-uk Kim */ 303a9f12690SJung-uk Kim ACPI_OBJECT_TYPE 304a9f12690SJung-uk Kim AcpiDbMatchArgument ( 305a9f12690SJung-uk Kim char *UserArgument, 306a9f12690SJung-uk Kim ARGUMENT_INFO *Arguments); 307a9f12690SJung-uk Kim 308a9f12690SJung-uk Kim void 309a9f12690SJung-uk Kim AcpiDbCloseDebugFile ( 310a9f12690SJung-uk Kim void); 311a9f12690SJung-uk Kim 312a9f12690SJung-uk Kim void 313a9f12690SJung-uk Kim AcpiDbOpenDebugFile ( 314a9f12690SJung-uk Kim char *Name); 315a9f12690SJung-uk Kim 316a9f12690SJung-uk Kim ACPI_STATUS 317a9f12690SJung-uk Kim AcpiDbLoadAcpiTable ( 318a9f12690SJung-uk Kim char *Filename); 319a9f12690SJung-uk Kim 320a9f12690SJung-uk Kim ACPI_STATUS 321a9f12690SJung-uk Kim AcpiDbGetTableFromFile ( 322a9f12690SJung-uk Kim char *Filename, 323a9f12690SJung-uk Kim ACPI_TABLE_HEADER **Table); 324a9f12690SJung-uk Kim 325a9f12690SJung-uk Kim ACPI_STATUS 326a9f12690SJung-uk Kim AcpiDbReadTableFromFile ( 327a9f12690SJung-uk Kim char *Filename, 328a9f12690SJung-uk Kim ACPI_TABLE_HEADER **Table); 329a9f12690SJung-uk Kim 330a9f12690SJung-uk Kim 331a9f12690SJung-uk Kim /* 332a9f12690SJung-uk Kim * dbhistry - debugger HISTORY command 333a9f12690SJung-uk Kim */ 334a9f12690SJung-uk Kim void 335a9f12690SJung-uk Kim AcpiDbAddToHistory ( 336a9f12690SJung-uk Kim char *CommandLine); 337a9f12690SJung-uk Kim 338a9f12690SJung-uk Kim void 339a9f12690SJung-uk Kim AcpiDbDisplayHistory ( 340a9f12690SJung-uk Kim void); 341a9f12690SJung-uk Kim 342a9f12690SJung-uk Kim char * 343a9f12690SJung-uk Kim AcpiDbGetFromHistory ( 344a9f12690SJung-uk Kim char *CommandNumArg); 345a9f12690SJung-uk Kim 346a9f12690SJung-uk Kim 347a9f12690SJung-uk Kim /* 348a9f12690SJung-uk Kim * dbinput - user front-end to the AML debugger 349a9f12690SJung-uk Kim */ 350a9f12690SJung-uk Kim ACPI_STATUS 351a9f12690SJung-uk Kim AcpiDbCommandDispatch ( 352a9f12690SJung-uk Kim char *InputBuffer, 353a9f12690SJung-uk Kim ACPI_WALK_STATE *WalkState, 354a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op); 355a9f12690SJung-uk Kim 356a9f12690SJung-uk Kim void ACPI_SYSTEM_XFACE 357a9f12690SJung-uk Kim AcpiDbExecuteThread ( 358a9f12690SJung-uk Kim void *Context); 359a9f12690SJung-uk Kim 360a9f12690SJung-uk Kim ACPI_STATUS 361a9f12690SJung-uk Kim AcpiDbUserCommands ( 362a9f12690SJung-uk Kim char Prompt, 363a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op); 364a9f12690SJung-uk Kim 36542e58c03SJung-uk Kim char * 36642e58c03SJung-uk Kim AcpiDbGetNextToken ( 36742e58c03SJung-uk Kim char *String, 36842e58c03SJung-uk Kim char **Next, 36942e58c03SJung-uk Kim ACPI_OBJECT_TYPE *ReturnType); 37042e58c03SJung-uk Kim 371a9f12690SJung-uk Kim 372a9f12690SJung-uk Kim /* 373a9f12690SJung-uk Kim * dbstats - Generation and display of ACPI table statistics 374a9f12690SJung-uk Kim */ 375a9f12690SJung-uk Kim void 376a9f12690SJung-uk Kim AcpiDbGenerateStatistics ( 377a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Root, 378a9f12690SJung-uk Kim BOOLEAN IsMethod); 379a9f12690SJung-uk Kim 380a9f12690SJung-uk Kim ACPI_STATUS 381a9f12690SJung-uk Kim AcpiDbDisplayStatistics ( 382a9f12690SJung-uk Kim char *TypeArg); 383a9f12690SJung-uk Kim 384a9f12690SJung-uk Kim 385a9f12690SJung-uk Kim /* 386a9f12690SJung-uk Kim * dbutils - AML debugger utilities 387a9f12690SJung-uk Kim */ 388a9f12690SJung-uk Kim void 389a9f12690SJung-uk Kim AcpiDbSetOutputDestination ( 390a9f12690SJung-uk Kim UINT32 Where); 391a9f12690SJung-uk Kim 392a9f12690SJung-uk Kim void 393a9f12690SJung-uk Kim AcpiDbDumpExternalObject ( 394a9f12690SJung-uk Kim ACPI_OBJECT *ObjDesc, 395a9f12690SJung-uk Kim UINT32 Level); 396a9f12690SJung-uk Kim 397a9f12690SJung-uk Kim void 398a9f12690SJung-uk Kim AcpiDbPrepNamestring ( 399a9f12690SJung-uk Kim char *Name); 400a9f12690SJung-uk Kim 401a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE * 402a9f12690SJung-uk Kim AcpiDbLocalNsLookup ( 403a9f12690SJung-uk Kim char *Name); 404a9f12690SJung-uk Kim 405a9f12690SJung-uk Kim void 406a9f12690SJung-uk Kim AcpiDbUInt32ToHexString ( 407a9f12690SJung-uk Kim UINT32 Value, 408a9f12690SJung-uk Kim char *Buffer); 409a9f12690SJung-uk Kim 410a9f12690SJung-uk Kim #endif /* __ACDEBUG_H__ */ 411