972
edits
[unchecked revision] | [unchecked revision] |
No edit summary |
m (Bot: Replace deprecated source tag with syntaxhighlight) |
||
(27 intermediate revisions by 15 users not shown) | |||
Line 1:
{{ACPI}}
RSDP (Root System Description Pointer) is a data structure used in the [[ACPI]] programming interface. It is set out like this (for ACPI Version 1.0):▼
▲'''RSDP''' (Root System Description Pointer) is a data structure used in the [[ACPI]] programming interface.
char signature[8];▼
char oemID[6];▼
In ACPI Version 1.0 it has this structure:
<syntaxhighlight lang="c">
struct RSDP_t {
uint8_t Checksum;
uint8_t Revision;
uint32_t RsdtAddress;
} __attribute__ ((packed));
</syntaxhighlight>
BYTE reserved[3];▼
since Version 2.0 it has been extended:
<syntaxhighlight lang="c">
struct XSDP_t {
uint8_t Checksum;
uint8_t Revision;
uint32_t RsdtAddress; // deprecated since version 2.0
uint32_t Length;
uint64_t XsdtAddress;
uint8_t ExtendedChecksum;
} __attribute__ ((packed));
</syntaxhighlight>
==Detecting the RSDP==
The RSDP is either located within the first 1 KB of the [[EBDA]] (Extended BIOS Data Area) (a 2 byte real mode segment pointer to it is located at
If you're using UEFI, you can find it somewhere in EFI_SYSTEM_TABLE. Thus, there's no need for searching the RAM.
'''Note''': The standard methods to find the RSDP may not work on UEFI systems. Because of that, finding it inside EFI_SYSTEM_TABLE is the correct and reliable method (see ACPI 6.2 section 5.2.5.2 'Finding the RSDP on UEFI Enabled Systems').
When booting with a multiboot2 compliant loader, a copy of the RSDP is contained in the ACPI new RSDP or ACPI old RSDP tag respectively.
==Validating the RSDP==
Once you have found the RSDP Table you have to see what version of ACPI the BIOS is using, then you must check that the checksum is valid.
===Detecting ACPI Version===
The ACPI Version can be detected using the Revision field in the RSDP. If this field contains 0, then ACPI Version 1.0 is used. For subsequent versions (ACPI version 2.0 to 6.1), the value 2 is used [http://www.uefi.org/sites/default/files/resources/ACPI_6_1.pdf]. The exact version of ACPI can be deduced via the [[FADT]] table.
===Checksum validation===
Before the RSDP is relied upon you should check that the checksum is valid.
== Explaining the fields ==
=== Always present ===
==== Signature ====
This 8-byte string (not null terminated!) must contain "RSD PTR ". It stands on a 16-byte boundary.
==== Checksum ====
The value to add to all the other bytes (of the Version 1.0 table) to calculate the Checksum of the table. If this value added to all the others and casted to byte isn't equal to 0, the table must be ignored.
==== OEMID ====
The specification says: "An OEM-supplied string that identifies the OEM".
==== Revision ====
The revision of the ACPI. Larger revision numbers are backward compatible to lower revision numbers. See [[#Detecting ACPI Version|Detecting ACPI Version]] for further information.
==== Rsdt Address ====
32-bit physical (I repeat: physical) address of the [[RSDT]] table.
<hr/>
=== Since Version 2.0 ===
==== Length ====
The size of the entire table since offset 0 to the end.
==== Xsdt Address ====
64-bit physical address of the [[XSDT]] table. If you detect ACPI Version 2.0 you should use this table instead of RSDT even on IA-32, casting the address to uint32_t.
==== Extended Checksum ====
This field is used to calculate the checksum of the entire table, including both checksum fields.
==== Reserved ====
▲Before the RSDP is relied upon you should check that the checksum is valid. For ACPI 1.0 (the first structure) you add up every byte in the structure and make sure the lowest byte of the result is equal to zero. For ACPI 2.0 and later you'd do exactly the same thing for the original (ACPI 1.0) part of the second structure, and then do it again for the fields that are part of the ACPI 2.0 extension.
3 bytes to be ignored in reading and that must not be written.
== What's next? ==
Well, you should now parse the [[RSDT]] (or [[XSDT]]).
[[Category:
|