aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-03-23 14:57:53 +0000
committerMichael Brown <mcb30@ipxe.org>2022-03-24 12:58:52 +0000
commit614c3f43a12cd6be6d79d7a8a63cfa603ff9d49f (patch)
tree2fd90e1ec06866b33e1ea77abe6d10a594cf8199
parent1e1b9593e6f7d6026f2d6a2109e06a9629ef0ce0 (diff)
downloadipxe-614c3f43a12cd6be6d79d7a8a63cfa603ff9d49f.tar.gz
[acpi] Add MAC address extraction self-tests
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/tests/acpi_test.c238
-rw-r--r--src/tests/tests.c1
2 files changed, 239 insertions, 0 deletions
diff --git a/src/tests/acpi_test.c b/src/tests/acpi_test.c
new file mode 100644
index 000000000..972067ee2
--- /dev/null
+++ b/src/tests/acpi_test.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2022 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * You can also choose to distribute this program under the terms of
+ * the Unmodified Binary Distribution Licence (as given in the file
+ * COPYING.UBDL), provided that you have satisfied its requirements.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+/** @file
+ *
+ * ACPI tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <ipxe/acpi.h>
+#include <ipxe/acpimac.h>
+#include <ipxe/if_ether.h>
+#include <ipxe/test.h>
+
+/** An ACPI test table signature */
+union acpi_test_signature {
+ /** String */
+ char str[4];
+ /** Raw value */
+ uint32_t raw;
+};
+
+/** An ACPI test table */
+struct acpi_test_table {
+ /** Signature */
+ union acpi_test_signature signature;
+ /** Table content */
+ const void *data;
+};
+
+/** An ACPI test table set */
+struct acpi_test_tables {
+ /** Tables */
+ struct acpi_test_table **table;
+ /** Number of tables */
+ unsigned int count;
+};
+
+/** An ACPI MAC extraction test */
+struct acpi_mac_test {
+ /** ACPI test table set */
+ struct acpi_test_tables *tables;
+ /** Expected MAC address */
+ uint8_t expected[ETH_ALEN];
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define an ACPI test table */
+#define ACPI_TABLE( name, SIGNATURE, DATA ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct acpi_test_table name = { \
+ .signature = { \
+ .str = SIGNATURE, \
+ }, \
+ .data = name ## _data, \
+ }
+
+/** Define an ACPI test table set */
+#define ACPI_TABLES( name, ... ) \
+ static struct acpi_test_table * name ## _table[] = \
+ { __VA_ARGS__ }; \
+ static struct acpi_test_tables name = { \
+ .table = name ## _table, \
+ .count = ( sizeof ( name ## _table ) / \
+ sizeof ( name ## _table[0] ) ), \
+ }
+
+/** Define an ACPI MAC extraction test */
+#define ACPI_MAC( name, TABLES, EXPECTED ) \
+ static struct acpi_mac_test name = { \
+ .tables = TABLES, \
+ .expected = EXPECTED, \
+ }
+
+/** "AMAC" SSDT
+ *
+ * DefinitionBlock ("", "SSDT", 2, "", "", 0x0) {
+ * Scope (\_SB) {
+ * Method (HW00, 0, Serialized) { Return(0) }
+ * Method (AMAC, 0, Serialized) { ToString("_AUXMAC_#525400aabbcc#") }
+ * Method (HW42, 0, Serialized) { Return(42) }
+ * }
+ * }
+ */
+ACPI_TABLE ( amac_ssdt, "SSDT",
+ DATA ( 0x53, 0x53, 0x44, 0x54, 0x5d, 0x00, 0x00, 0x00, 0x02,
+ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x4e, 0x54, 0x4c, 0x04, 0x06, 0x21, 0x20,
+ 0x10, 0x38, 0x5c, 0x5f, 0x53, 0x42, 0x5f, 0x14, 0x08,
+ 0x48, 0x57, 0x30, 0x30, 0x08, 0xa4, 0x00, 0x14, 0x1e,
+ 0x41, 0x4d, 0x41, 0x43, 0x08, 0x0d, 0x5f, 0x41, 0x55,
+ 0x58, 0x4d, 0x41, 0x43, 0x5f, 0x23, 0x35, 0x32, 0x35,
+ 0x34, 0x30, 0x30, 0x61, 0x61, 0x62, 0x62, 0x63, 0x63,
+ 0x23, 0x00, 0x14, 0x09, 0x48, 0x57, 0x34, 0x32, 0x08,
+ 0xa4, 0x0a, 0x2a ) );
+
+/** "AMAC" test tables */
+ACPI_TABLES ( amac_tables, &amac_ssdt );
+
+/** "AMAC" test */
+ACPI_MAC ( amac, &amac_tables,
+ DATA ( 0x52, 0x54, 0x00, 0xaa, 0xbb, 0xcc ) );
+
+/** "MACA" SSDT1 (does not contain AUXMAC) */
+ACPI_TABLE ( maca_ssdt1, "SSDT",
+ DATA ( 0x53, 0x53, 0x44, 0x54, 0x3e, 0x00, 0x00, 0x00, 0x02,
+ 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x4e, 0x54, 0x4c, 0x04, 0x06, 0x21, 0x20,
+ 0x10, 0x19, 0x5c, 0x5f, 0x53, 0x42, 0x5f, 0x14, 0x08,
+ 0x48, 0x57, 0x30, 0x30, 0x08, 0xa4, 0x00, 0x14, 0x09,
+ 0x48, 0x57, 0x34, 0x32, 0x08, 0xa4, 0x0a, 0x2a ) );
+
+/** "MACA" SSDT2 (contains AUXMAC) */
+ACPI_TABLE ( maca_ssdt2, "SSDT",
+ DATA ( 0x53, 0x53, 0x44, 0x54, 0x54, 0x00, 0x00, 0x00, 0x02,
+ 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x4e, 0x54, 0x4c, 0x04, 0x06, 0x21, 0x20,
+ 0x10, 0x2f, 0x5c, 0x5f, 0x53, 0x42, 0x5f, 0x14, 0x1e,
+ 0x4d, 0x41, 0x43, 0x41, 0x08, 0x0d, 0x5f, 0x41, 0x55,
+ 0x58, 0x4d, 0x41, 0x43, 0x5f, 0x23, 0x35, 0x32, 0x35,
+ 0x34, 0x30, 0x30, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33,
+ 0x23, 0x00, 0x14, 0x09, 0x48, 0x57, 0x39, 0x39, 0x08,
+ 0xa4, 0x0a, 0x63 ) );
+
+/** "MACA" test tables */
+ACPI_TABLES ( maca_tables, &maca_ssdt1, &maca_ssdt2 );
+
+/** "MACA" test */
+ACPI_MAC ( maca, &maca_tables,
+ DATA ( 0x52, 0x54, 0x00, 0x11, 0x22, 0x33 ) );
+
+/** Current ACPI test table set */
+static struct acpi_test_tables *acpi_test_tables;
+
+/**
+ * Locate ACPI test table
+ *
+ * @v signature Requested table signature
+ * @v index Requested index of table with this signature
+ * @ret table Table, or UNULL if not found
+ */
+static userptr_t acpi_test_find ( uint32_t signature, unsigned int index ) {
+ struct acpi_test_table *table;
+ unsigned int i;
+
+ /* Fail if no test tables are installed */
+ if ( ! acpi_test_tables )
+ return UNULL;
+
+ /* Scan through test tables */
+ for ( i = 0 ; i < acpi_test_tables->count ; i++ ) {
+ table = acpi_test_tables->table[i];
+ if ( ( signature == le32_to_cpu ( table->signature.raw ) ) &&
+ ( index-- == 0 ) ) {
+ return virt_to_user ( table->data );
+ }
+ }
+
+ return UNULL;
+}
+
+/** Override ACPI table finder */
+typeof ( acpi_find ) *acpi_finder = acpi_test_find;
+
+/**
+ * Report ACPI MAC extraction test result
+ *
+ * @v test ACPI MAC extraction test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void acpi_mac_okx ( struct acpi_mac_test *test,
+ const char *file, unsigned int line ) {
+ uint8_t mac[ETH_ALEN];
+ int rc;
+
+ /* Set test table set */
+ acpi_test_tables = test->tables;
+
+ /* Extract MAC address */
+ rc = acpi_mac ( mac );
+ okx ( rc == 0, file, line );
+
+ /* Check extracted MAC address */
+ okx ( memcmp ( mac, test->expected, ETH_ALEN ) == 0, file, line );
+
+ /* Clear test table set */
+ acpi_test_tables = NULL;
+}
+#define acpi_mac_ok( test ) \
+ acpi_mac_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Perform ACPI self-test
+ *
+ */
+static void acpi_test_exec ( void ) {
+
+ /* MAC extraction tests */
+ acpi_mac_ok ( &amac );
+ acpi_mac_ok ( &maca );
+}
+
+/** ACPI self-test */
+struct self_test acpi_test __self_test = {
+ .name = "acpi",
+ .exec = acpi_test_exec,
+};
diff --git a/src/tests/tests.c b/src/tests/tests.c
index 4dd4adf84..5dbbac1b1 100644
--- a/src/tests/tests.c
+++ b/src/tests/tests.c
@@ -76,3 +76,4 @@ REQUIRE_OBJECT ( ntlm_test );
REQUIRE_OBJECT ( zlib_test );
REQUIRE_OBJECT ( gzip_test );
REQUIRE_OBJECT ( utf8_test );
+REQUIRE_OBJECT ( acpi_test );