void DtCompileOneField ( UINT8 *Buffer, DT_FIELD *Field, UINT32 ByteLength, UINT8 Type, UINT8 Flags) { ACPI_STATUS Status; switch (Type) { case DT_FIELD_TYPE_INTEGER: DtCompileInteger (Buffer, Field, ByteLength, Flags); break; case DT_FIELD_TYPE_STRING: DtCompileString (Buffer, Field, ByteLength); break; case DT_FIELD_TYPE_UUID: Status = DtCompileUuid (Buffer, Field, ByteLength); if (ACPI_SUCCESS (Status)) { break; } /* Fall through. */ case DT_FIELD_TYPE_BUFFER: DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); break; case DT_FIELD_TYPE_UNICODE: DtCompileUnicode (Buffer, Field, ByteLength); break; case DT_FIELD_TYPE_DEVICE_PATH: break; default: DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); break; } }
ACPI_STATUS DtCompileSlit ( void **List) { ACPI_STATUS Status; DT_SUBTABLE *Subtable; DT_SUBTABLE *ParentTable; DT_FIELD **PFieldList = (DT_FIELD **) List; DT_FIELD *FieldList; UINT32 Localities; UINT8 *LocalityBuffer; UINT32 RemainingData; Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, &Subtable, TRUE); if (ACPI_FAILURE (Status)) { return (Status); } ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); LocalityBuffer = UtLocalCalloc (Localities); FieldList = *PFieldList; while (FieldList) { /* Handle multiple-line buffer */ RemainingData = Localities; while (RemainingData && FieldList) { RemainingData = DtCompileBuffer ( LocalityBuffer + (Localities - RemainingData), FieldList->Value, FieldList, RemainingData); FieldList = FieldList->Next; } DtCreateSubtable (LocalityBuffer, Localities, &Subtable); DtInsertSubtable (ParentTable, Subtable); } ACPI_FREE (LocalityBuffer); return (AE_OK); }
ACPI_STATUS DtCompileSlit ( void **List) { ACPI_STATUS Status; DT_SUBTABLE *Subtable; DT_SUBTABLE *ParentTable; DT_FIELD **PFieldList = (DT_FIELD **) List; DT_FIELD *FieldList; UINT32 Localities; UINT8 *LocalityBuffer; Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit, &Subtable, TRUE); if (ACPI_FAILURE (Status)) { return (Status); } ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer); LocalityBuffer = UtLocalCalloc (Localities); /* Compile each locality buffer */ FieldList = *PFieldList; while (FieldList) { DtCompileBuffer (LocalityBuffer, FieldList->Value, FieldList, Localities); DtCreateSubtable (LocalityBuffer, Localities, &Subtable); DtInsertSubtable (ParentTable, Subtable); FieldList = FieldList->Next; } ACPI_FREE (LocalityBuffer); return (AE_OK); }