diff options
| author | Michael Brown | 2022-03-23 15:39:11 +0100 |
|---|---|---|
| committer | Michael Brown | 2022-03-24 13:58:52 +0100 |
| commit | 27825e555746c379ac045466f692ed77686af2b5 (patch) | |
| tree | 6b2241855530b3782894b9ac40058a8678e2ff05 /src/core/acpi.c | |
| parent | [efi] Support Unicode character output via framebuffer console (diff) | |
| download | ipxe-27825e555746c379ac045466f692ed77686af2b5.tar.gz ipxe-27825e555746c379ac045466f692ed77686af2b5.tar.xz ipxe-27825e555746c379ac045466f692ed77686af2b5.zip | |
[acpi] Allow for the possibility of overriding ACPI tables at link time
Allow for linked-in code to override the mechanism used to locate an
ACPI table, thereby opening up the possibility of ACPI self-tests.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/acpi.c')
| -rw-r--r-- | src/core/acpi.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/core/acpi.c b/src/core/acpi.c index aa486da93..526bf8555 100644 --- a/src/core/acpi.c +++ b/src/core/acpi.c @@ -38,6 +38,12 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); /** Colour for debug messages */ #define colour FADT_SIGNATURE +/** ACPI table finder + * + * May be overridden at link time to inject tables for testing. + */ +typeof ( acpi_find ) *acpi_finder __attribute__ (( weak )) = acpi_find; + /****************************************************************************** * * Utility functions @@ -83,6 +89,18 @@ void acpi_fix_checksum ( struct acpi_header *acpi ) { } /** + * Locate ACPI table + * + * @v signature Requested table signature + * @v index Requested index of table with this signature + * @ret table Table, or UNULL if not found + */ +userptr_t acpi_table ( uint32_t signature, unsigned int index ) { + + return ( *acpi_finder ) ( signature, index ); +} + +/** * Locate ACPI table via RSDT * * @v signature Requested table signature @@ -230,7 +248,7 @@ int acpi_extract ( uint32_t signature, void *data, int rc; /* Try DSDT first */ - fadt = acpi_find ( FADT_SIGNATURE, 0 ); + fadt = acpi_table ( FADT_SIGNATURE, 0 ); if ( fadt ) { copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) ); dsdt = phys_to_user ( fadtab.dsdt ); @@ -241,7 +259,7 @@ int acpi_extract ( uint32_t signature, void *data, /* Try all SSDTs */ for ( i = 0 ; ; i++ ) { - ssdt = acpi_find ( SSDT_SIGNATURE, i ); + ssdt = acpi_table ( SSDT_SIGNATURE, i ); if ( ! ssdt ) break; if ( ( rc = acpi_zsdt ( ssdt, signature, data, |
