Skip to content

Commit

Permalink
iASL/Headers: Fix incorrect definition of FPDT table
Browse files Browse the repository at this point in the history
ACPICA BZ 1249.
Reported by Greg Elkin <greg.elkin@ericsson.com>
  • Loading branch information
acpibob committed Feb 18, 2016
1 parent 0406c46 commit f30ba83
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 38 deletions.
6 changes: 3 additions & 3 deletions source/common/dmtbdump.c
Original file line number Diff line number Diff line change
Expand Up @@ -3211,7 +3211,7 @@ AcpiDmDumpS3pt (
{
ACPI_STATUS Status;
UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
ACPI_S3PT_HEADER *SubTable;
ACPI_FPDT_HEADER *SubTable;
ACPI_DMTABLE_INFO *InfoTable;
ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);

Expand All @@ -3224,7 +3224,7 @@ AcpiDmDumpS3pt (
return 0;
}

SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
while (Offset < S3ptTable->Length)
{
/* Common subtable header */
Expand Down Expand Up @@ -3276,7 +3276,7 @@ AcpiDmDumpS3pt (
/* Point to next subtable */

Offset += SubTable->Length;
SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
}

return (S3ptTable->Length);
Expand Down
22 changes: 13 additions & 9 deletions source/common/dmtbinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,8 @@
#define ACPI_EINJ0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_WHEA_HEADER,f)
#define ACPI_ERST0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_WHEA_HEADER,f)
#define ACPI_FPDTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
#define ACPI_FPDT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_BOOT,f)
#define ACPI_FPDT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_S3PT_PTR,f)
#define ACPI_FPDT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_BOOT_POINTER,f)
#define ACPI_FPDT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_S3PT_POINTER,f)
#define ACPI_GTDT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GTDT_TIMER_BLOCK,f)
#define ACPI_GTDT0a_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GTDT_TIMER_ENTRY,f)
#define ACPI_GTDT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GTDT_WATCHDOG,f)
Expand Down Expand Up @@ -294,7 +294,7 @@
#define ACPI_PMTT1A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f)
#define ACPI_PMTT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PMTT_PHYSICAL_COMPONENT,f)
#define ACPI_PMTTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PMTT_HEADER,f)
#define ACPI_S3PTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_HEADER,f)
#define ACPI_S3PTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f)
#define ACPI_S3PT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
#define ACPI_S3PT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
#define ACPI_SLIC_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f)
Expand Down Expand Up @@ -1167,11 +1167,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFpdtHdr[] =
ACPI_DMTABLE_INFO AcpiDmTableInfoFpdt0[] =
{
{ACPI_DMT_UINT32, ACPI_FPDT0_OFFSET (Reserved), "Reserved", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ResetEnd), "Reset End", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (LoadStart), "Load Image Start", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (StartupStart), "Start Image Start", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ExitServicesEntry), "Exit Services Entry", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ExitServicesExit), "Exit Services Exit", 0},
{ACPI_DMT_UINT64, ACPI_FPDT1_OFFSET (Address), "FPDT Boot Record Address", 0},
ACPI_DMT_TERMINATOR
};

Expand All @@ -1180,10 +1176,18 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFpdt0[] =
ACPI_DMTABLE_INFO AcpiDmTableInfoFpdt1[] =
{
{ACPI_DMT_UINT32, ACPI_FPDT1_OFFSET (Reserved), "Reserved", 0},
{ACPI_DMT_UINT64, ACPI_FPDT1_OFFSET (Address), "S3PT Address", 0},
{ACPI_DMT_UINT64, ACPI_FPDT1_OFFSET (Address), "S3PT Record Address", 0},
ACPI_DMT_TERMINATOR
};

#if 0
/* Boot Performance Record, not supported at this time. */
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ResetEnd), "Reset End", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (LoadStart), "Load Image Start", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (StartupStart), "Start Image Start", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ExitServicesEntry), "Exit Services Entry", 0},
{ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ExitServicesExit), "Exit Services Exit", 0},
#endif

/*******************************************************************************
*
Expand Down
4 changes: 2 additions & 2 deletions source/compiler/dttable2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1048,7 +1048,7 @@ DtCompileS3pt (
DT_FIELD **PFieldList)
{
ACPI_STATUS Status;
ACPI_S3PT_HEADER *S3ptHeader;
ACPI_FPDT_HEADER *S3ptHeader;
DT_SUBTABLE *Subtable;
DT_SUBTABLE *ParentTable;
ACPI_DMTABLE_INFO *InfoTable;
Expand Down Expand Up @@ -1078,7 +1078,7 @@ DtCompileS3pt (
DtInsertSubtable (ParentTable, Subtable);
DtPushSubtable (Subtable);

S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);

switch (S3ptHeader->Type)
{
Expand Down
52 changes: 29 additions & 23 deletions source/include/actbl3.h
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ typedef struct acpi_table_fpdt
} ACPI_TABLE_FPDT;


/* FPDT subtable header */
/* FPDT subtable header (Performance Record Structure) */

typedef struct acpi_fpdt_header
{
Expand All @@ -302,33 +302,29 @@ enum AcpiFpdtType

/* 0: Firmware Basic Boot Performance Record */

typedef struct acpi_fpdt_boot
typedef struct acpi_fpdt_boot_pointer
{
ACPI_FPDT_HEADER Header;
UINT8 Reserved[4];
UINT64 ResetEnd;
UINT64 LoadStart;
UINT64 StartupStart;
UINT64 ExitServicesEntry;
UINT64 ExitServicesExit;
UINT64 Address;

} ACPI_FPDT_BOOT;
} ACPI_FPDT_BOOT_POINTER;


/* 1: S3 Performance Table Pointer Record */

typedef struct acpi_fpdt_s3pt_ptr
typedef struct acpi_fpdt_s3pt_pointer
{
ACPI_FPDT_HEADER Header;
UINT8 Reserved[4];
UINT64 Address;

} ACPI_FPDT_S3PT_PTR;
} ACPI_FPDT_S3PT_POINTER;


/*
* S3PT - S3 Performance Table. This table is pointed to by the
* FPDT S3 Pointer Record above.
* S3 Pointer Record above.
*/
typedef struct acpi_table_s3pt
{
Expand All @@ -339,27 +335,21 @@ typedef struct acpi_table_s3pt


/*
* S3PT Subtables
* S3PT Subtables (Not part of the actual FPDT)
*/
typedef struct acpi_s3pt_header
{
UINT16 Type;
UINT8 Length;
UINT8 Revision;

} ACPI_S3PT_HEADER;

/* Values for Type field above */
/* Values for Type field in S3PT header */

enum AcpiS3ptType
{
ACPI_S3PT_TYPE_RESUME = 0,
ACPI_S3PT_TYPE_SUSPEND = 1
ACPI_S3PT_TYPE_SUSPEND = 1,
ACPI_FPDT_BOOT_PERFORMANCE = 2
};

typedef struct acpi_s3pt_resume
{
ACPI_S3PT_HEADER Header;
ACPI_FPDT_HEADER Header;
UINT32 ResumeCount;
UINT64 FullResume;
UINT64 AverageResume;
Expand All @@ -368,13 +358,29 @@ typedef struct acpi_s3pt_resume

typedef struct acpi_s3pt_suspend
{
ACPI_S3PT_HEADER Header;
ACPI_FPDT_HEADER Header;
UINT64 SuspendStart;
UINT64 SuspendEnd;

} ACPI_S3PT_SUSPEND;


/*
* FPDT Boot Performance Record (Not part of the actual FPDT)
*/
typedef struct acpi_fpdt_boot
{
ACPI_FPDT_HEADER Header;
UINT8 Reserved[4];
UINT64 ResetEnd;
UINT64 LoadStart;
UINT64 StartupStart;
UINT64 ExitServicesEntry;
UINT64 ExitServicesExit;

} ACPI_FPDT_BOOT;


/*******************************************************************************
*
* GTDT - Generic Timer Description Table (ACPI 5.1)
Expand Down
3 changes: 2 additions & 1 deletion source/tools/acpisrc/astable.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,8 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = {
{"ACPI_ERST_INFO", SRC_TYPE_STRUCT},
{"ACPI_FPDT_HEADER", SRC_TYPE_STRUCT},
{"ACPI_FPDT_BOOT", SRC_TYPE_STRUCT},
{"ACPI_FPDT_S3PT_PTR", SRC_TYPE_STRUCT},
{"ACPI_FPDT_BOOT_POINTER", SRC_TYPE_STRUCT},
{"ACPI_FPDT_S3PT_POINTER", SRC_TYPE_STRUCT},
{"ACPI_GTDT_HEADER", SRC_TYPE_STRUCT},
{"ACPI_GTDT_TIMER_BLOCK", SRC_TYPE_STRUCT},
{"ACPI_GTDT_TIMER_ENTRY", SRC_TYPE_STRUCT},
Expand Down

0 comments on commit f30ba83

Please sign in to comment.