Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendswload.c
Go to the documentation of this file.
00001 /****************************************************************************** 00002 * 00003 * Module Name: dswload - Dispatcher first pass namespace load callbacks 00004 * 00005 *****************************************************************************/ 00006 00007 /****************************************************************************** 00008 * 00009 * 1. Copyright Notice 00010 * 00011 * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. 00012 * All rights reserved. 00013 * 00014 * 2. License 00015 * 00016 * 2.1. This is your license from Intel Corp. under its intellectual property 00017 * rights. You may have additional license terms from the party that provided 00018 * you this software, covering your right to use that party's intellectual 00019 * property rights. 00020 * 00021 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 00022 * copy of the source code appearing in this file ("Covered Code") an 00023 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 00024 * base code distributed originally by Intel ("Original Intel Code") to copy, 00025 * make derivatives, distribute, use and display any portion of the Covered 00026 * Code in any form, with the right to sublicense such rights; and 00027 * 00028 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 00029 * license (with the right to sublicense), under only those claims of Intel 00030 * patents that are infringed by the Original Intel Code, to make, use, sell, 00031 * offer to sell, and import the Covered Code and derivative works thereof 00032 * solely to the minimum extent necessary to exercise the above copyright 00033 * license, and in no event shall the patent license extend to any additions 00034 * to or modifications of the Original Intel Code. No other license or right 00035 * is granted directly or by implication, estoppel or otherwise; 00036 * 00037 * The above copyright and patent license is granted only if the following 00038 * conditions are met: 00039 * 00040 * 3. Conditions 00041 * 00042 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 00043 * Redistribution of source code of any substantial portion of the Covered 00044 * Code or modification with rights to further distribute source must include 00045 * the above Copyright Notice, the above License, this list of Conditions, 00046 * and the following Disclaimer and Export Compliance provision. In addition, 00047 * Licensee must cause all Covered Code to which Licensee contributes to 00048 * contain a file documenting the changes Licensee made to create that Covered 00049 * Code and the date of any change. Licensee must include in that file the 00050 * documentation of any changes made by any predecessor Licensee. Licensee 00051 * must include a prominent statement that the modification is derived, 00052 * directly or indirectly, from Original Intel Code. 00053 * 00054 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 00055 * Redistribution of source code of any substantial portion of the Covered 00056 * Code or modification without rights to further distribute source must 00057 * include the following Disclaimer and Export Compliance provision in the 00058 * documentation and/or other materials provided with distribution. In 00059 * addition, Licensee may not authorize further sublicense of source of any 00060 * portion of the Covered Code, and must include terms to the effect that the 00061 * license from Licensee to its licensee is limited to the intellectual 00062 * property embodied in the software Licensee provides to its licensee, and 00063 * not to intellectual property embodied in modifications its licensee may 00064 * make. 00065 * 00066 * 3.3. Redistribution of Executable. Redistribution in executable form of any 00067 * substantial portion of the Covered Code or modification must reproduce the 00068 * above Copyright Notice, and the following Disclaimer and Export Compliance 00069 * provision in the documentation and/or other materials provided with the 00070 * distribution. 00071 * 00072 * 3.4. Intel retains all right, title, and interest in and to the Original 00073 * Intel Code. 00074 * 00075 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 00076 * Intel shall be used in advertising or otherwise to promote the sale, use or 00077 * other dealings in products derived from or relating to the Covered Code 00078 * without prior written authorization from Intel. 00079 * 00080 * 4. Disclaimer and Export Compliance 00081 * 00082 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 00083 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 00084 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 00085 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 00086 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 00087 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 00088 * PARTICULAR PURPOSE. 00089 * 00090 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 00091 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 00092 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 00093 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 00094 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 00095 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 00096 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 00097 * LIMITED REMEDY. 00098 * 00099 * 4.3. Licensee shall not export, either directly or indirectly, any of this 00100 * software or system incorporating such software without first obtaining any 00101 * required license or other approval from the U. S. Department of Commerce or 00102 * any other agency or department of the United States Government. In the 00103 * event Licensee exports any such software from the United States or 00104 * re-exports any such software from a foreign destination, Licensee shall 00105 * ensure that the distribution and export/re-export of the software is in 00106 * compliance with all laws, regulations, orders, or other restrictions of the 00107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 00108 * any of its subsidiaries will export/re-export any technical data, process, 00109 * software, or service, directly or indirectly, to any country for which the 00110 * United States government or any agency thereof requires an export license, 00111 * other governmental approval, or letter of assurance, without first obtaining 00112 * such license, approval or letter. 00113 * 00114 *****************************************************************************/ 00115 00116 #define __DSWLOAD_C__ 00117 00118 #include "acpi.h" 00119 #include "accommon.h" 00120 #include "acparser.h" 00121 #include "amlcode.h" 00122 #include "acdispat.h" 00123 #include "acinterp.h" 00124 #include "acnamesp.h" 00125 00126 #ifdef ACPI_ASL_COMPILER 00127 #include "acdisasm.h" 00128 #endif 00129 00130 #define _COMPONENT ACPI_DISPATCHER 00131 ACPI_MODULE_NAME ("dswload") 00132 00133 00134 /******************************************************************************* 00135 * 00136 * FUNCTION: AcpiDsInitCallbacks 00137 * 00138 * PARAMETERS: WalkState - Current state of the parse tree walk 00139 * PassNumber - 1, 2, or 3 00140 * 00141 * RETURN: Status 00142 * 00143 * DESCRIPTION: Init walk state callbacks 00144 * 00145 ******************************************************************************/ 00146 00147 ACPI_STATUS 00148 AcpiDsInitCallbacks ( 00149 ACPI_WALK_STATE *WalkState, 00150 UINT32 PassNumber) 00151 { 00152 00153 switch (PassNumber) 00154 { 00155 case 1: 00156 WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 | 00157 ACPI_PARSE_DELETE_TREE; 00158 WalkState->DescendingCallback = AcpiDsLoad1BeginOp; 00159 WalkState->AscendingCallback = AcpiDsLoad1EndOp; 00160 break; 00161 00162 case 2: 00163 WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 | 00164 ACPI_PARSE_DELETE_TREE; 00165 WalkState->DescendingCallback = AcpiDsLoad2BeginOp; 00166 WalkState->AscendingCallback = AcpiDsLoad2EndOp; 00167 break; 00168 00169 case 3: 00170 #ifndef ACPI_NO_METHOD_EXECUTION 00171 WalkState->ParseFlags |= ACPI_PARSE_EXECUTE | 00172 ACPI_PARSE_DELETE_TREE; 00173 WalkState->DescendingCallback = AcpiDsExecBeginOp; 00174 WalkState->AscendingCallback = AcpiDsExecEndOp; 00175 #endif 00176 break; 00177 00178 default: 00179 return (AE_BAD_PARAMETER); 00180 } 00181 00182 return (AE_OK); 00183 } 00184 00185 00186 /******************************************************************************* 00187 * 00188 * FUNCTION: AcpiDsLoad1BeginOp 00189 * 00190 * PARAMETERS: WalkState - Current state of the parse tree walk 00191 * OutOp - Where to return op if a new one is created 00192 * 00193 * RETURN: Status 00194 * 00195 * DESCRIPTION: Descending callback used during the loading of ACPI tables. 00196 * 00197 ******************************************************************************/ 00198 00199 ACPI_STATUS 00200 AcpiDsLoad1BeginOp ( 00201 ACPI_WALK_STATE *WalkState, 00202 ACPI_PARSE_OBJECT **OutOp) 00203 { 00204 ACPI_PARSE_OBJECT *Op; 00205 ACPI_NAMESPACE_NODE *Node; 00206 ACPI_STATUS Status; 00207 ACPI_OBJECT_TYPE ObjectType; 00208 char *Path; 00209 UINT32 Flags; 00210 00211 00212 ACPI_FUNCTION_TRACE (DsLoad1BeginOp); 00213 00214 00215 Op = WalkState->Op; 00216 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); 00217 00218 /* We are only interested in opcodes that have an associated name */ 00219 00220 if (Op) 00221 { 00222 if (!(WalkState->OpInfo->Flags & AML_NAMED)) 00223 { 00224 *OutOp = Op; 00225 return_ACPI_STATUS (AE_OK); 00226 } 00227 00228 /* Check if this object has already been installed in the namespace */ 00229 00230 if (Op->Common.Node) 00231 { 00232 *OutOp = Op; 00233 return_ACPI_STATUS (AE_OK); 00234 } 00235 } 00236 00237 Path = AcpiPsGetNextNamestring (&WalkState->ParserState); 00238 00239 /* Map the raw opcode into an internal object type */ 00240 00241 ObjectType = WalkState->OpInfo->ObjectType; 00242 00243 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 00244 "State=%p Op=%p [%s]\n", WalkState, Op, AcpiUtGetTypeName (ObjectType))); 00245 00246 switch (WalkState->Opcode) 00247 { 00248 case AML_SCOPE_OP: 00249 00250 /* 00251 * The target name of the Scope() operator must exist at this point so 00252 * that we can actually open the scope to enter new names underneath it. 00253 * Allow search-to-root for single namesegs. 00254 */ 00255 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 00256 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &(Node)); 00257 #ifdef ACPI_ASL_COMPILER 00258 if (Status == AE_NOT_FOUND) 00259 { 00260 /* 00261 * Table disassembly: 00262 * Target of Scope() not found. Generate an External for it, and 00263 * insert the name into the namespace. 00264 */ 00265 AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_DEVICE, 0); 00266 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 00267 ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, 00268 WalkState, &Node); 00269 } 00270 #endif 00271 if (ACPI_FAILURE (Status)) 00272 { 00273 ACPI_ERROR_NAMESPACE (Path, Status); 00274 return_ACPI_STATUS (Status); 00275 } 00276 00277 /* 00278 * Check to make sure that the target is 00279 * one of the opcodes that actually opens a scope 00280 */ 00281 switch (Node->Type) 00282 { 00283 case ACPI_TYPE_ANY: 00284 case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ 00285 case ACPI_TYPE_DEVICE: 00286 case ACPI_TYPE_POWER: 00287 case ACPI_TYPE_PROCESSOR: 00288 case ACPI_TYPE_THERMAL: 00289 00290 /* These are acceptable types */ 00291 break; 00292 00293 case ACPI_TYPE_INTEGER: 00294 case ACPI_TYPE_STRING: 00295 case ACPI_TYPE_BUFFER: 00296 00297 /* 00298 * These types we will allow, but we will change the type. 00299 * This enables some existing code of the form: 00300 * 00301 * Name (DEB, 0) 00302 * Scope (DEB) { ... } 00303 * 00304 * Note: silently change the type here. On the second pass, 00305 * we will report a warning 00306 */ 00307 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 00308 "Type override - [%4.4s] had invalid type (%s) " 00309 "for Scope operator, changed to type ANY\n", 00310 AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type))); 00311 00312 Node->Type = ACPI_TYPE_ANY; 00313 WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY; 00314 break; 00315 00316 default: 00317 00318 /* All other types are an error */ 00319 00320 ACPI_ERROR ((AE_INFO, 00321 "Invalid type (%s) for target of " 00322 "Scope operator [%4.4s] (Cannot override)", 00323 AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node))); 00324 00325 return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 00326 } 00327 break; 00328 00329 00330 default: 00331 /* 00332 * For all other named opcodes, we will enter the name into 00333 * the namespace. 00334 * 00335 * Setup the search flags. 00336 * Since we are entering a name into the namespace, we do not want to 00337 * enable the search-to-root upsearch. 00338 * 00339 * There are only two conditions where it is acceptable that the name 00340 * already exists: 00341 * 1) the Scope() operator can reopen a scoping object that was 00342 * previously defined (Scope, Method, Device, etc.) 00343 * 2) Whenever we are parsing a deferred opcode (OpRegion, Buffer, 00344 * BufferField, or Package), the name of the object is already 00345 * in the namespace. 00346 */ 00347 if (WalkState->DeferredNode) 00348 { 00349 /* This name is already in the namespace, get the node */ 00350 00351 Node = WalkState->DeferredNode; 00352 Status = AE_OK; 00353 break; 00354 } 00355 00356 /* 00357 * If we are executing a method, do not create any namespace objects 00358 * during the load phase, only during execution. 00359 */ 00360 if (WalkState->MethodNode) 00361 { 00362 Node = NULL; 00363 Status = AE_OK; 00364 break; 00365 } 00366 00367 Flags = ACPI_NS_NO_UPSEARCH; 00368 if ((WalkState->Opcode != AML_SCOPE_OP) && 00369 (!(WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP))) 00370 { 00371 Flags |= ACPI_NS_ERROR_IF_FOUND; 00372 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Cannot already exist\n", 00373 AcpiUtGetTypeName (ObjectType))); 00374 } 00375 else 00376 { 00377 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 00378 "[%s] Both Find or Create allowed\n", 00379 AcpiUtGetTypeName (ObjectType))); 00380 } 00381 00382 /* 00383 * Enter the named type into the internal namespace. We enter the name 00384 * as we go downward in the parse tree. Any necessary subobjects that 00385 * involve arguments to the opcode must be created as we go back up the 00386 * parse tree later. 00387 */ 00388 Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 00389 ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 00390 if (ACPI_FAILURE (Status)) 00391 { 00392 if (Status == AE_ALREADY_EXISTS) 00393 { 00394 /* The name already exists in this scope */ 00395 00396 if (Node->Flags & ANOBJ_IS_EXTERNAL) 00397 { 00398 /* 00399 * Allow one create on an object or segment that was 00400 * previously declared External 00401 */ 00402 Node->Flags &= ~ANOBJ_IS_EXTERNAL; 00403 Node->Type = (UINT8) ObjectType; 00404 00405 /* Just retyped a node, probably will need to open a scope */ 00406 00407 if (AcpiNsOpensScope (ObjectType)) 00408 { 00409 Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 00410 if (ACPI_FAILURE (Status)) 00411 { 00412 return_ACPI_STATUS (Status); 00413 } 00414 } 00415 00416 Status = AE_OK; 00417 } 00418 } 00419 00420 if (ACPI_FAILURE (Status)) 00421 { 00422 ACPI_ERROR_NAMESPACE (Path, Status); 00423 return_ACPI_STATUS (Status); 00424 } 00425 } 00426 break; 00427 } 00428 00429 /* Common exit */ 00430 00431 if (!Op) 00432 { 00433 /* Create a new op */ 00434 00435 Op = AcpiPsAllocOp (WalkState->Opcode); 00436 if (!Op) 00437 { 00438 return_ACPI_STATUS (AE_NO_MEMORY); 00439 } 00440 } 00441 00442 /* Initialize the op */ 00443 00444 #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)) 00445 Op->Named.Path = ACPI_CAST_PTR (UINT8, Path); 00446 #endif 00447 00448 if (Node) 00449 { 00450 /* 00451 * Put the Node in the "op" object that the parser uses, so we 00452 * can get it again quickly when this scope is closed 00453 */ 00454 Op->Common.Node = Node; 00455 Op->Named.Name = Node->Name.Integer; 00456 } 00457 00458 AcpiPsAppendArg (AcpiPsGetParentScope (&WalkState->ParserState), Op); 00459 *OutOp = Op; 00460 return_ACPI_STATUS (Status); 00461 } 00462 00463 00464 /******************************************************************************* 00465 * 00466 * FUNCTION: AcpiDsLoad1EndOp 00467 * 00468 * PARAMETERS: WalkState - Current state of the parse tree walk 00469 * 00470 * RETURN: Status 00471 * 00472 * DESCRIPTION: Ascending callback used during the loading of the namespace, 00473 * both control methods and everything else. 00474 * 00475 ******************************************************************************/ 00476 00477 ACPI_STATUS 00478 AcpiDsLoad1EndOp ( 00479 ACPI_WALK_STATE *WalkState) 00480 { 00481 ACPI_PARSE_OBJECT *Op; 00482 ACPI_OBJECT_TYPE ObjectType; 00483 ACPI_STATUS Status = AE_OK; 00484 00485 00486 ACPI_FUNCTION_TRACE (DsLoad1EndOp); 00487 00488 00489 Op = WalkState->Op; 00490 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState)); 00491 00492 /* We are only interested in opcodes that have an associated name */ 00493 00494 if (!(WalkState->OpInfo->Flags & (AML_NAMED | AML_FIELD))) 00495 { 00496 return_ACPI_STATUS (AE_OK); 00497 } 00498 00499 /* Get the object type to determine if we should pop the scope */ 00500 00501 ObjectType = WalkState->OpInfo->ObjectType; 00502 00503 #ifndef ACPI_NO_METHOD_EXECUTION 00504 if (WalkState->OpInfo->Flags & AML_FIELD) 00505 { 00506 /* 00507 * If we are executing a method, do not create any namespace objects 00508 * during the load phase, only during execution. 00509 */ 00510 if (!WalkState->MethodNode) 00511 { 00512 if (WalkState->Opcode == AML_FIELD_OP || 00513 WalkState->Opcode == AML_BANK_FIELD_OP || 00514 WalkState->Opcode == AML_INDEX_FIELD_OP) 00515 { 00516 Status = AcpiDsInitFieldObjects (Op, WalkState); 00517 } 00518 } 00519 return_ACPI_STATUS (Status); 00520 } 00521 00522 /* 00523 * If we are executing a method, do not create any namespace objects 00524 * during the load phase, only during execution. 00525 */ 00526 if (!WalkState->MethodNode) 00527 { 00528 if (Op->Common.AmlOpcode == AML_REGION_OP) 00529 { 00530 Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, 00531 (ACPI_ADR_SPACE_TYPE) ((Op->Common.Value.Arg)->Common.Value.Integer), 00532 WalkState); 00533 if (ACPI_FAILURE (Status)) 00534 { 00535 return_ACPI_STATUS (Status); 00536 } 00537 } 00538 else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP) 00539 { 00540 Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, 00541 ACPI_ADR_SPACE_DATA_TABLE, WalkState); 00542 if (ACPI_FAILURE (Status)) 00543 { 00544 return_ACPI_STATUS (Status); 00545 } 00546 } 00547 } 00548 #endif 00549 00550 if (Op->Common.AmlOpcode == AML_NAME_OP) 00551 { 00552 /* For Name opcode, get the object type from the argument */ 00553 00554 if (Op->Common.Value.Arg) 00555 { 00556 ObjectType = (AcpiPsGetOpcodeInfo ( 00557 (Op->Common.Value.Arg)->Common.AmlOpcode))->ObjectType; 00558 00559 /* Set node type if we have a namespace node */ 00560 00561 if (Op->Common.Node) 00562 { 00563 Op->Common.Node->Type = (UINT8) ObjectType; 00564 } 00565 } 00566 } 00567 00568 /* 00569 * If we are executing a method, do not create any namespace objects 00570 * during the load phase, only during execution. 00571 */ 00572 if (!WalkState->MethodNode) 00573 { 00574 if (Op->Common.AmlOpcode == AML_METHOD_OP) 00575 { 00576 /* 00577 * MethodOp PkgLength NameString MethodFlags TermList 00578 * 00579 * Note: We must create the method node/object pair as soon as we 00580 * see the method declaration. This allows later pass1 parsing 00581 * of invocations of the method (need to know the number of 00582 * arguments.) 00583 */ 00584 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 00585 "LOADING-Method: State=%p Op=%p NamedObj=%p\n", 00586 WalkState, Op, Op->Named.Node)); 00587 00588 if (!AcpiNsGetAttachedObject (Op->Named.Node)) 00589 { 00590 WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node); 00591 WalkState->NumOperands = 1; 00592 00593 Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg); 00594 if (ACPI_SUCCESS (Status)) 00595 { 00596 Status = AcpiExCreateMethod (Op->Named.Data, 00597 Op->Named.Length, WalkState); 00598 } 00599 00600 WalkState->Operands[0] = NULL; 00601 WalkState->NumOperands = 0; 00602 00603 if (ACPI_FAILURE (Status)) 00604 { 00605 return_ACPI_STATUS (Status); 00606 } 00607 } 00608 } 00609 } 00610 00611 /* Pop the scope stack (only if loading a table) */ 00612 00613 if (!WalkState->MethodNode && 00614 AcpiNsOpensScope (ObjectType)) 00615 { 00616 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n", 00617 AcpiUtGetTypeName (ObjectType), Op)); 00618 00619 Status = AcpiDsScopeStackPop (WalkState); 00620 } 00621 00622 return_ACPI_STATUS (Status); 00623 } Generated on Sun May 27 2012 04:27:15 for ReactOS by
1.7.6.1
|