aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-03-23 14:39:11 +0000
committerMichael Brown <mcb30@ipxe.org>2022-03-24 12:58:52 +0000
commit27825e555746c379ac045466f692ed77686af2b5 (patch)
tree6b2241855530b3782894b9ac40058a8678e2ff05
parentdd3547543811dd2e996b910bdadb609414904352 (diff)
downloadipxe-27825e555746c379ac045466f692ed77686af2b5.zip
ipxe-27825e555746c379ac045466f692ed77686af2b5.tar.gz
ipxe-27825e555746c379ac045466f692ed77686af2b5.tar.bz2
[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>
-rw-r--r--src/arch/x86/interface/pcbios/acpi_timer.c2
-rw-r--r--src/arch/x86/interface/pcbios/acpipwr.c2
-rw-r--r--src/core/acpi.c22
-rw-r--r--src/core/acpi_settings.c2
-rw-r--r--src/include/ipxe/acpi.h3
5 files changed, 26 insertions, 5 deletions
diff --git a/src/arch/x86/interface/pcbios/acpi_timer.c b/src/arch/x86/interface/pcbios/acpi_timer.c
index 82e85a0..2e4047e 100644
--- a/src/arch/x86/interface/pcbios/acpi_timer.c
+++ b/src/arch/x86/interface/pcbios/acpi_timer.c
@@ -107,7 +107,7 @@ static int acpi_timer_probe ( void ) {
unsigned int pm_tmr_blk;
/* Locate FADT */
- fadt = acpi_find ( FADT_SIGNATURE, 0 );
+ fadt = acpi_table ( FADT_SIGNATURE, 0 );
if ( ! fadt ) {
DBGC ( &acpi_timer, "ACPI could not find FADT\n" );
return -ENOENT;
diff --git a/src/arch/x86/interface/pcbios/acpipwr.c b/src/arch/x86/interface/pcbios/acpipwr.c
index 3dac6b6..f08b4af 100644
--- a/src/arch/x86/interface/pcbios/acpipwr.c
+++ b/src/arch/x86/interface/pcbios/acpipwr.c
@@ -123,7 +123,7 @@ int acpi_poweroff ( void ) {
int rc;
/* Locate FADT */
- fadt = acpi_find ( FADT_SIGNATURE, 0 );
+ fadt = acpi_table ( FADT_SIGNATURE, 0 );
if ( ! fadt ) {
DBGC ( colour, "ACPI could not find FADT\n" );
return -ENOENT;
diff --git a/src/core/acpi.c b/src/core/acpi.c
index aa486da..526bf85 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,
diff --git a/src/core/acpi_settings.c b/src/core/acpi_settings.c
index 7ba2e97..b9e2b7f 100644
--- a/src/core/acpi_settings.c
+++ b/src/core/acpi_settings.c
@@ -88,7 +88,7 @@ static int acpi_settings_fetch ( struct settings *settings,
acpi_name ( tag_signature ), tag_index, tag_offset, tag_len );
/* Locate ACPI table */
- table = acpi_find ( tag_signature, tag_index );
+ table = acpi_table ( tag_signature, tag_index );
if ( ! table )
return -ENOENT;
diff --git a/src/include/ipxe/acpi.h b/src/include/ipxe/acpi.h
index 7df3ec2..c346812 100644
--- a/src/include/ipxe/acpi.h
+++ b/src/include/ipxe/acpi.h
@@ -386,7 +386,10 @@ acpi_describe ( struct interface *interface );
#define acpi_describe_TYPE( object_type ) \
typeof ( struct acpi_descriptor * ( object_type ) )
+extern userptr_t ( * acpi_finder ) ( uint32_t signature, unsigned int index );
+
extern void acpi_fix_checksum ( struct acpi_header *acpi );
+extern userptr_t acpi_table ( uint32_t signature, unsigned int index );
extern int acpi_extract ( uint32_t signature, void *data,
int ( * extract ) ( userptr_t zsdt, size_t len,
size_t offset, void *data ) );