mirror of
https://github.com/acpica/acpica/
synced 2025-02-24 09:24:08 +03:00
Namespace: simplify creation of the initial/default namespace
For the objects that are created by default (_GPE, _SB_, etc) there is no need to use the heavyweight NsLookup function. Instead, simply create each object and link it in as the namespace is built.
This commit is contained in:
parent
36449fa1dc
commit
76658f55d8
57
source/components/namespace/nsaccess.c
Normal file → Executable file
57
source/components/namespace/nsaccess.c
Normal file → Executable file
@ -184,6 +184,7 @@ AcpiNsRootInitialize (
|
||||
ACPI_STATUS Status;
|
||||
const ACPI_PREDEFINED_NAMES *InitVal = NULL;
|
||||
ACPI_NAMESPACE_NODE *NewNode;
|
||||
ACPI_NAMESPACE_NODE *PrevNode = NULL;
|
||||
ACPI_OPERAND_OBJECT *ObjDesc;
|
||||
ACPI_STRING Val = NULL;
|
||||
|
||||
@ -213,13 +214,30 @@ AcpiNsRootInitialize (
|
||||
*/
|
||||
AcpiGbl_RootNode = &AcpiGbl_RootNodeStruct;
|
||||
|
||||
/* Enter the pre-defined names in the name table */
|
||||
/* Enter the predefined names in the name table */
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
|
||||
"Entering predefined entries into namespace\n"));
|
||||
|
||||
/*
|
||||
* Create the initial (default) namespace.
|
||||
* This namespace looks like something similar to this:
|
||||
*
|
||||
* ACPI Namespace (from Namespace Root):
|
||||
* 0 _GPE Scope 00203160 00
|
||||
* 0 _PR_ Scope 002031D0 00
|
||||
* 0 _SB_ Device 00203240 00 Notify Object: 0020ADD8
|
||||
* 0 _SI_ Scope 002032B0 00
|
||||
* 0 _TZ_ Device 00203320 00
|
||||
* 0 _REV Integer 00203390 00 = 0000000000000002
|
||||
* 0 _OS_ String 00203488 00 Len 14 "Microsoft Windows NT"
|
||||
* 0 _GL_ Mutex 00203580 00 Object 002035F0
|
||||
* 0 _OSI Method 00203678 00 Args 1 Len 0000 Aml 00000000
|
||||
*/
|
||||
for (InitVal = AcpiGbl_PreDefinedNames; InitVal->Name; InitVal++)
|
||||
{
|
||||
Status = AE_OK;
|
||||
|
||||
/* _OSI is optional for now, will be permanent later */
|
||||
|
||||
if (!strcmp (InitVal->Name, "_OSI") && !AcpiGbl_CreateOsiMethod)
|
||||
@ -227,17 +245,35 @@ AcpiNsRootInitialize (
|
||||
continue;
|
||||
}
|
||||
|
||||
Status = AcpiNsLookup (NULL, ACPI_CAST_PTR (char, InitVal->Name),
|
||||
InitVal->Type, ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH,
|
||||
NULL, &NewNode);
|
||||
if (ACPI_FAILURE (Status))
|
||||
/*
|
||||
* Create, init, and link the new predefined name
|
||||
* Note: No need to use AcpiNsLookup here because all the
|
||||
* predefined names are at the root level. It is much easier to
|
||||
* just create and link the new node(s) here.
|
||||
*/
|
||||
NewNode = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_NAMESPACE_NODE));
|
||||
if (!NewNode)
|
||||
{
|
||||
ACPI_EXCEPTION ((AE_INFO, Status,
|
||||
"Could not create predefined name %s",
|
||||
InitVal->Name));
|
||||
continue;
|
||||
Status = AE_NO_MEMORY;
|
||||
goto UnlockAndExit;
|
||||
}
|
||||
|
||||
ACPI_COPY_NAMESEG (NewNode->Name.Ascii, InitVal->Name);
|
||||
NewNode->DescriptorType = ACPI_DESC_TYPE_NAMED;
|
||||
NewNode->Type = InitVal->Type;
|
||||
|
||||
if (!PrevNode)
|
||||
{
|
||||
AcpiGbl_RootNodeStruct.Child = NewNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
PrevNode->Peer = NewNode;
|
||||
}
|
||||
|
||||
NewNode->Parent = &AcpiGbl_RootNodeStruct;
|
||||
PrevNode = NewNode;
|
||||
|
||||
/*
|
||||
* Name entered successfully. If entry in PreDefinedNames[] specifies
|
||||
* an initial value, create the initial value.
|
||||
@ -286,7 +322,7 @@ AcpiNsRootInitialize (
|
||||
|
||||
NewNode->Value = ObjDesc->Method.ParamCount;
|
||||
#else
|
||||
/* Mark this as a very SPECIAL method */
|
||||
/* Mark this as a very SPECIAL method (_OSI) */
|
||||
|
||||
ObjDesc->Method.InfoFlags = ACPI_METHOD_INTERNAL_ONLY;
|
||||
ObjDesc->Method.Dispatch.Implementation = AcpiUtOsiImplementation;
|
||||
@ -359,7 +395,6 @@ AcpiNsRootInitialize (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UnlockAndExit:
|
||||
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user