Skip to content

Commit

Permalink
acpiexec: initialize all simple types and field units from user input
Browse files Browse the repository at this point in the history
acpiexec allows a user to provide a file that indicates values to
initialize named objects during table load with the -fi option. This
can provide more accurate simulation by setting named objects to
values found during OS runtime.

Previously, this option only supported integer objects. This change
adds user initialization support for field units, strings, buffers,
and packages.

Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
  • Loading branch information
Erik Schmauss committed Oct 15, 2019
1 parent d509afa commit 367b363
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 31 deletions.
4 changes: 1 addition & 3 deletions source/components/dispatcher/dsfield.c
Expand Up @@ -434,7 +434,6 @@ AcpiDsGetFieldNames (
ACPI_PARSE_OBJECT *Child;

#ifdef ACPI_EXEC_APP
UINT64 Value = 0;
ACPI_OPERAND_OBJECT *ResultDesc;
ACPI_OPERAND_OBJECT *ObjDesc;
char *NamePath;
Expand Down Expand Up @@ -576,8 +575,7 @@ AcpiDsGetFieldNames (
}
#ifdef ACPI_EXEC_APP
NamePath = AcpiNsGetExternalPathname (Info->FieldNode);
ObjDesc = AcpiUtCreateIntegerObject (Value);
if (ACPI_SUCCESS (AeLookupInitFileEntry (NamePath, &Value)))
if (ACPI_SUCCESS (AeLookupInitFileEntry (NamePath, &ObjDesc)))
{
AcpiExWriteDataToField (ObjDesc,
AcpiNsGetAttachedObject (Info->FieldNode),
Expand Down
5 changes: 3 additions & 2 deletions source/tools/acpiexec/aecommon.h
Expand Up @@ -195,7 +195,8 @@ typedef struct ae_debug_regions
typedef struct init_file_entry
{
char *Name;
UINT64 Value;
ACPI_OPERAND_OBJECT *ObjDesc;

} INIT_FILE_ENTRY;

extern BOOLEAN AcpiGbl_UseLocalFaultHandler;
Expand Down Expand Up @@ -356,7 +357,7 @@ AeSetupConfiguration (
ACPI_STATUS
AeLookupInitFileEntry (
char *Pathname,
UINT64 *Value);
ACPI_OPERAND_OBJECT **ObjDesc);

/* aeexec */

Expand Down
74 changes: 49 additions & 25 deletions source/tools/acpiexec/aeinitfile.c
Expand Up @@ -224,9 +224,13 @@ AeProcessInitFile(
void)
{
ACPI_WALK_STATE *WalkState;
int i;
UINT64 idx;
ACPI_STATUS Status;
char *Token;
char *ObjectBuffer;
char *TempNameBuffer;
ACPI_OBJECT_TYPE Type;
ACPI_OBJECT TempObject;


if (!InitFile)
Expand All @@ -249,34 +253,61 @@ AeProcessInitFile(
AcpiOsAllocate (sizeof (INIT_FILE_ENTRY) * AcpiGbl_InitFileLineCount);
for (idx = 0; fgets (LineBuffer, AE_FILE_BUFFER_SIZE, InitFile); ++idx)
{
if (sscanf (LineBuffer, "%s %s\n",
&NameBuffer[1], ValueBuffer) != 2)

TempNameBuffer = AcpiDbGetNextToken (LineBuffer, &Token, &Type);
if (LineBuffer[0] == '\\')
{
goto CleanupAndExit;
strcpy (NameBuffer, TempNameBuffer);
}
else
{
/* Add a root prefix if not present in the string */

/* Add a root prefix if not present in the string */
strcpy (NameBuffer + 1, TempNameBuffer);
}

i = 0;
if (NameBuffer[1] == '\\')
AcpiGbl_InitEntries[idx].Name =
AcpiOsAllocateZeroed (strnlen (NameBuffer, AE_FILE_BUFFER_SIZE) + 1);

strcpy (AcpiGbl_InitEntries[idx].Name, NameBuffer);

ObjectBuffer = AcpiDbGetNextToken (Token, &Token, &Type);

if (Type == ACPI_TYPE_FIELD_UNIT)
{
i = 1;
Status = AcpiDbConvertToObject (ACPI_TYPE_BUFFER, ObjectBuffer,
&TempObject);
}
else
{
Status = AcpiDbConvertToObject (Type, ObjectBuffer, &TempObject);
}

AcpiGbl_InitEntries[idx].Name =
AcpiOsAllocateZeroed (strnlen (NameBuffer + i, AE_FILE_BUFFER_SIZE) + 1);
Status = AcpiUtCopyEobjectToIobject (&TempObject,
&AcpiGbl_InitEntries[idx].ObjDesc);

strcpy (AcpiGbl_InitEntries[idx].Name, NameBuffer + i);
if (Type == ACPI_TYPE_BUFFER || Type == ACPI_TYPE_FIELD_UNIT)
{
ACPI_FREE (TempObject.Buffer.Pointer);
}

Status = AcpiUtStrtoul64 (ValueBuffer, &AcpiGbl_InitEntries[idx].Value);
if (ACPI_FAILURE (Status))
{
AcpiOsPrintf ("%s %s\n", ValueBuffer,
AcpiFormatException (Status));
goto CleanupAndExit;
}

AeEnterInitFileEntry (AcpiGbl_InitEntries[idx], WalkState);
/*
* Special case for field units. Field units are dependent on the
* parent region. This parent region has yet to be created so defer the
* initialization until the dispatcher. For all other types, initialize
* the namespace node with the value found in the init file.
*/
if (Type != ACPI_TYPE_FIELD_UNIT)
{
AeEnterInitFileEntry (AcpiGbl_InitEntries[idx], WalkState);
}
}

/* Cleanup */
Expand Down Expand Up @@ -309,14 +340,12 @@ AeEnterInitFileEntry (
ACPI_WALK_STATE *WalkState)
{
char *Pathname = InitEntry.Name;
UINT64 Value = InitEntry.Value;
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_OPERAND_OBJECT *ObjDesc = InitEntry.ObjDesc;
ACPI_NAMESPACE_NODE *NewNode;
ACPI_STATUS Status;


AcpiOsPrintf ("Initializing namespace element: %s\n", Pathname);
Status = AcpiNsLookup (NULL, Pathname, ACPI_TYPE_INTEGER,
Status = AcpiNsLookup (NULL, Pathname, ObjDesc->Common.Type,
ACPI_IMODE_LOAD_PASS2, ACPI_NS_ERROR_IF_FOUND | ACPI_NS_NO_UPSEARCH |
ACPI_NS_EARLY_INIT, NULL, &NewNode);
if (ACPI_FAILURE (Status))
Expand All @@ -327,15 +356,10 @@ AeEnterInitFileEntry (
return;
}

ObjDesc = AcpiUtCreateIntegerObject (Value);

AcpiOsPrintf ("New value: 0x%8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (Value));

/* Store pointer to value descriptor in the Node */

Status = AcpiNsAttachObject (NewNode, ObjDesc,
ACPI_TYPE_INTEGER);
ObjDesc->Common.Type);
if (ACPI_FAILURE (Status))
{
ACPI_EXCEPTION ((AE_INFO, Status,
Expand Down Expand Up @@ -366,7 +390,7 @@ AeEnterInitFileEntry (
ACPI_STATUS
AeLookupInitFileEntry (
char *Pathname,
UINT64 *Value)
ACPI_OPERAND_OBJECT **ObjDesc)
{
UINT32 i;

Expand All @@ -379,7 +403,7 @@ AeLookupInitFileEntry (
{
if (!strcmp(AcpiGbl_InitEntries[i].Name, Pathname))
{
*Value = AcpiGbl_InitEntries[i].Value;
*ObjDesc = AcpiGbl_InitEntries[i].ObjDesc;
return AE_OK;
}
}
Expand Down
2 changes: 1 addition & 1 deletion source/tools/acpiexec/aemain.c
Expand Up @@ -841,8 +841,8 @@ main (

ErrorExit:
AeLateTest ();
AcpiOsFree (AcpiGbl_InitEntries);
(void) AcpiTerminate ();
AcDeleteTableList (ListHead);
AcpiOsFree (AcpiGbl_InitEntries);
return (ExitCode);
}

0 comments on commit 367b363

Please sign in to comment.