]>
Commit | Line | Data |
---|---|---|
3248f1b4 BW |
1 | /* |
2 | * Utilities for working with ACPI tables | |
3 | * | |
4 | * Copyright (c) 2013 Red Hat Inc. | |
5 | * | |
6 | * Authors: | |
7 | * Michael S. Tsirkin <[email protected]>, | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
10 | * See the COPYING file in the top-level directory. | |
11 | */ | |
12 | ||
13 | #ifndef TEST_ACPI_UTILS_H | |
14 | #define TEST_ACPI_UTILS_H | |
15 | ||
16 | #include "hw/acpi/acpi-defs.h" | |
17 | #include "libqtest.h" | |
18 | ||
19 | /* DSDT and SSDTs format */ | |
20 | typedef struct { | |
21 | AcpiTableHeader header; | |
22 | gchar *aml; /* aml bytecode from guest */ | |
23 | gsize aml_len; | |
24 | gchar *aml_file; | |
25 | gchar *asl; /* asl code generated from aml */ | |
26 | gsize asl_len; | |
27 | gchar *asl_file; | |
28 | bool tmp_files_retain; /* do not delete the temp asl/aml */ | |
0d876080 | 29 | } AcpiSdtTable; |
3248f1b4 | 30 | |
3831c07b TH |
31 | #define ACPI_READ_FIELD(field, addr) \ |
32 | do { \ | |
33 | memread(addr, &field, sizeof(field)); \ | |
3248f1b4 | 34 | addr += sizeof(field); \ |
2562755e | 35 | } while (0) |
3248f1b4 BW |
36 | |
37 | #define ACPI_READ_ARRAY_PTR(arr, length, addr) \ | |
38 | do { \ | |
39 | int idx; \ | |
40 | for (idx = 0; idx < length; ++idx) { \ | |
41 | ACPI_READ_FIELD(arr[idx], addr); \ | |
42 | } \ | |
2562755e | 43 | } while (0) |
3248f1b4 BW |
44 | |
45 | #define ACPI_READ_ARRAY(arr, addr) \ | |
46 | ACPI_READ_ARRAY_PTR(arr, sizeof(arr) / sizeof(arr[0]), addr) | |
47 | ||
48 | #define ACPI_READ_TABLE_HEADER(table, addr) \ | |
49 | do { \ | |
50 | ACPI_READ_FIELD((table)->signature, addr); \ | |
51 | ACPI_READ_FIELD((table)->length, addr); \ | |
52 | ACPI_READ_FIELD((table)->revision, addr); \ | |
53 | ACPI_READ_FIELD((table)->checksum, addr); \ | |
54 | ACPI_READ_ARRAY((table)->oem_id, addr); \ | |
55 | ACPI_READ_ARRAY((table)->oem_table_id, addr); \ | |
56 | ACPI_READ_FIELD((table)->oem_revision, addr); \ | |
57 | ACPI_READ_ARRAY((table)->asl_compiler_id, addr); \ | |
58 | ACPI_READ_FIELD((table)->asl_compiler_revision, addr); \ | |
2562755e | 59 | } while (0) |
3248f1b4 BW |
60 | |
61 | #define ACPI_ASSERT_CMP(actual, expected) do { \ | |
3248f1b4 | 62 | char ACPI_ASSERT_CMP_str[5] = {}; \ |
3831c07b | 63 | memcpy(ACPI_ASSERT_CMP_str, &actual, 4); \ |
3248f1b4 BW |
64 | g_assert_cmpstr(ACPI_ASSERT_CMP_str, ==, expected); \ |
65 | } while (0) | |
66 | ||
67 | #define ACPI_ASSERT_CMP64(actual, expected) do { \ | |
3248f1b4 | 68 | char ACPI_ASSERT_CMP_str[9] = {}; \ |
3831c07b | 69 | memcpy(ACPI_ASSERT_CMP_str, &actual, 8); \ |
3248f1b4 BW |
70 | g_assert_cmpstr(ACPI_ASSERT_CMP_str, ==, expected); \ |
71 | } while (0) | |
72 | ||
77af8a2b PDJ |
73 | #define ACPI_READ_GENERIC_ADDRESS(field, addr) \ |
74 | do { \ | |
75 | ACPI_READ_FIELD((field).space_id, addr); \ | |
76 | ACPI_READ_FIELD((field).bit_width, addr); \ | |
77 | ACPI_READ_FIELD((field).bit_offset, addr); \ | |
78 | ACPI_READ_FIELD((field).access_width, addr); \ | |
79 | ACPI_READ_FIELD((field).address, addr); \ | |
2562755e | 80 | } while (0) |
77af8a2b PDJ |
81 | |
82 | ||
3248f1b4 BW |
83 | uint8_t acpi_calc_checksum(const uint8_t *data, int len); |
84 | uint32_t acpi_find_rsdp_address(void); | |
85 | void acpi_parse_rsdp_table(uint32_t addr, AcpiRsdpDescriptor *rsdp_table); | |
86 | ||
87 | #endif /* TEST_ACPI_UTILS_H */ |