Skip to content

Commit 761cb0d

Browse files
committed
增加 NeoACPI fadt 表获取与 DSDT 表校验检查.
1 parent 1a49491 commit 761cb0d

File tree

11 files changed

+506
-61
lines changed

11 files changed

+506
-61
lines changed

src/include/lib/neoacpi/fadt.h

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#pragma once
2+
3+
#define ACPI_FADT_WBINVD (1) /* 00: [V1] The WBINVD instruction works properly */
4+
#define ACPI_FADT_WBINVD_FLUSH (1 << 1) /* 01: [V1] WBINVD flushes but does not invalidate caches */
5+
#define ACPI_FADT_C1_SUPPORTED (1 << 2) /* 02: [V1] All processors support C1 state */
6+
#define ACPI_FADT_C2_MP_SUPPORTED (1 << 3) /* 03: [V1] C2 state works on MP system */
7+
#define ACPI_FADT_POWER_BUTTON \
8+
(1 << 4) /* 04: [V1] Power button is handled as a control method device */
9+
#define ACPI_FADT_SLEEP_BUTTON \
10+
(1 << 5) /* 05: [V1] Sleep button is handled as a control method device */
11+
#define ACPI_FADT_FIXED_RTC (1 << 6) /* 06: [V1] RTC wakeup status is not in fixed register space */
12+
#define ACPI_FADT_S4_RTC_WAKE (1 << 7) /* 07: [V1] RTC alarm can wake system from S4 */
13+
#define ACPI_FADT_32BIT_TIMER (1 << 8) /* 08: [V1] ACPI timer width is 32-bit (0=24-bit) */
14+
#define ACPI_FADT_DOCKING_SUPPORTED (1 << 9) /* 09: [V1] Docking supported */
15+
#define ACPI_FADT_RESET_REGISTER \
16+
(1 << 10) /* 10: [V2] System reset via the FADT RESET_REG supported */
17+
#define ACPI_FADT_SEALED_CASE \
18+
(1 << 11) /* 11: [V3] No internal expansion capabilities and case is sealed */
19+
#define ACPI_FADT_HEADLESS \
20+
(1 << 12) /* 12: [V3] No local video capabilities or local input devices */
21+
#define ACPI_FADT_SLEEP_TYPE \
22+
(1 << 13) /* 13: [V3] Must execute native instruction after writing SLP_TYPx register */
23+
#define ACPI_FADT_PCI_EXPRESS_WAKE \
24+
(1 << 14) /* 14: [V4] System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
25+
#define ACPI_FADT_PLATFORM_CLOCK \
26+
(1 << 15) /* 15: [V4] OSPM should use platform-provided timer (ACPI 3.0) */
27+
#define ACPI_FADT_S4_RTC_VALID \
28+
(1 << 16) /* 16: [V4] Contents of RTC_STS valid after S4 wake (ACPI 3.0) */
29+
#define ACPI_FADT_REMOTE_POWER_ON \
30+
(1 << 17) /* 17: [V4] System is compatible with remote power on (ACPI 3.0) */
31+
#define ACPI_FADT_APIC_CLUSTER \
32+
(1 << 18) /* 18: [V4] All local APICs must use cluster model (ACPI 3.0) */
33+
#define ACPI_FADT_APIC_PHYSICAL \
34+
(1 << 19) /* 19: [V4] All local xAPICs must use physical dest mode (ACPI 3.0) */
35+
#define ACPI_FADT_HW_REDUCED (1 << 20) /* 20: [V5] ACPI hardware is not implemented (ACPI 5.0) */
36+
#define ACPI_FADT_LOW_POWER_S0 \
37+
(1 << 21) /* 21: [V5] S0 power savings are equal or better than S3 (ACPI 5.0) */
38+
39+
#define ACPI_FADT_OPTIONAL 0
40+
#define ACPI_FADT_REQUIRED 1
41+
#define ACPI_FADT_SEPARATE_LENGTH 2
42+
#define ACPI_FADT_GPE_REGISTER 4
43+
44+
#define ACPI_FADT_OFFSET(f) (uint16_t)offsetof(struct acpi_fadt, f)
45+
46+
#define ACPI_FADT_V1_SIZE (uint32_t)(ACPI_FADT_OFFSET(flags) + 4)
47+
#define ACPI_FADT_V2_SIZE (uint32_t)(ACPI_FADT_OFFSET(fadt_minor_verison) + 1)
48+
#define ACPI_FADT_V3_SIZE (uint32_t)(ACPI_FADT_OFFSET(sleep_control_reg))
49+
#define ACPI_FADT_V5_SIZE (uint32_t)(ACPI_FADT_OFFSET(hypervisor_vendor_identity))
50+
#define ACPI_FADT_V6_SIZE (uint32_t)(sizeof(struct acpi_fadt))
51+
52+
#define ACPI_FADT_INFO_ENTRIES (sizeof(fadt_info_table) / sizeof(acpi_fadt_info_t))
53+
54+
#include "neotype.h"
55+
56+
typedef struct acpi_fadt_info {
57+
const char *name;
58+
uint16_t addr64;
59+
uint16_t addr32;
60+
uint16_t length;
61+
uint8_t default_length;
62+
uint8_t flags;
63+
} acpi_fadt_info_t;

src/include/lib/neoacpi/libaml.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#pragma once
2+
3+
#include "neotype.h"
4+
5+
typedef enum {
6+
AML_OBJ_TYPE_UNINITIALIZED = 0,
7+
AML_OBJ_TYPE_INTEGER,
8+
AML_OBJ_TYPE_STRING,
9+
AML_OBJ_TYPE_BUFFER,
10+
AML_OBJ_TYPE_PACKAGE,
11+
AML_OBJ_TYPE_DEVICE,
12+
AML_OBJ_TYPE_METHOD,
13+
AML_OBJ_TYPE_REGION,
14+
AML_OBJ_TYPE_SCOPE,
15+
AML_OBJ_TYPE_UNKNOWN
16+
} aml_obj_type_t;
17+
18+
typedef struct aml_node {
19+
char name[5];
20+
aml_obj_type_t type;
21+
struct aml_node *parent;
22+
struct aml_node *children;
23+
struct aml_node *next;
24+
} aml_node_t;
25+
26+
typedef struct {
27+
const uint8_t *curr_ptr;
28+
const uint8_t *end_ptr;
29+
aml_node_t *curr_scope;
30+
} aml_context_t;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#pragma once

src/include/lib/neoacpi/neoacpi.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#define CONFIG_ACPI_PLAIN_LOG_BUFFER_SIZE 128
44
#define CONFIG_ACPI_VERSION "0.0.1"
55

6-
#include "neo_impl.h"
6+
#include "libaml.h"
77
#include "neotable.h"
88
#include "neotype.h"
99

@@ -16,7 +16,9 @@ typedef struct {
1616
typedef struct neo_acpi_handle {
1717
neo_acpi_table_entry_t **entries;
1818
size_t entries_length;
19-
struct acpi_fadt *fadt;
19+
aml_context_t *aml_context;
20+
struct acpi_fadt global_fadt;
21+
bool reduced_hardware;
2022
} neo_acpi_handle_t;
2123

2224
neo_acpi_handle_t *neo_acpi_initialize(neo_acpi_phys_addr rsdt_base_addr);
@@ -25,3 +27,5 @@ bool table_find_by_signature(const neo_acpi_handle_t *handle, cons
2527
neo_acpi_handle_t *neo_acpi_rsdt_init(neo_acpi_handle_t *handle, neo_acpi_phys_addr roor_table_phy,
2628
size_t entry_size);
2729
neo_acpi_handle_t *acpi_load_fadt(neo_acpi_handle_t *handle);
30+
31+
void aml_context_initialize(neo_acpi_handle_t *handle, struct acpi_dsdt *dsdt);

src/include/lib/neoacpi/neotable.h

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,38 @@
1616
#define ACPI_ECDT_SIGNATURE "ECDT"
1717
#define ACPI_RHCT_SIGNATURE "RHCT"
1818

19+
/* Number of distinct FADT-based GPE register blocks (GPE0 and GPE1) */
20+
21+
#define ACPI_MAX_GPE_BLOCKS 2
22+
23+
/* Default ACPI register widths */
24+
25+
#define ACPI_GPE_REGISTER_WIDTH 8
26+
#define ACPI_PM1_REGISTER_WIDTH 16
27+
#define ACPI_PM2_REGISTER_WIDTH 8
28+
#define ACPI_PM_TIMER_WIDTH 32
29+
#define ACPI_RESET_REGISTER_WIDTH 8
30+
31+
/* Names within the namespace are 4 bytes long */
32+
33+
#define ACPI_NAMESEG_SIZE 4 /* Fixed by ACPI spec */
34+
#define ACPI_PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 char for separator */
35+
#define ACPI_PATH_SEPARATOR '.'
36+
37+
/* Sizes for ACPI table headers */
38+
39+
#define ACPI_OEM_ID_SIZE 6
40+
#define ACPI_OEM_TABLE_ID_SIZE 8
41+
42+
/* ACPI/PNP hardware IDs */
43+
44+
#define PCI_ROOT_HID_STRING "PNP0A03"
45+
#define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08"
46+
47+
/* PM Timer ticks per second (HZ) */
48+
49+
#define ACPI_PM_TIMER_FREQUENCY 3579545
50+
1951
#define ACPI_PM1_CNT_SCI_EN (1 << 0)
2052

2153
#include "neotype.h"
@@ -74,15 +106,6 @@ struct acpi_rxsdt {
74106
uint8_t ptr_bytes[];
75107
} __attribute__((packed));
76108

77-
typedef struct acpi_fadt_info {
78-
const char *name;
79-
uint16_t address64;
80-
uint16_t address32;
81-
uint16_t length;
82-
uint8_t default_length;
83-
uint8_t flags;
84-
} acpi_fadt_info;
85-
86109
struct acpi_hpet {
87110
struct acpi_sdt_hdr hdr;
88111
uint32_t block_id;
@@ -130,7 +153,7 @@ struct acpi_fadt {
130153
uint8_t mon_alrm;
131154
uint8_t century;
132155
uint16_t iapc_boot_arch;
133-
uint8_t rsvd;
156+
uint8_t _rsvd;
134157
uint32_t flags;
135158
struct acpi_gas reset_reg;
136159
uint8_t reset_value;
@@ -161,4 +184,13 @@ struct acpi_ssdt {
161184
uint8_t definition_block[];
162185
} __attribute__((packed));
163186

187+
typedef struct acpi_generic_address {
188+
uint8_t space_id; /* Address space where struct or register exists */
189+
uint8_t bit_width; /* Size in bits of given register */
190+
uint8_t bit_offset; /* Bit offset within the register */
191+
uint8_t access_width; /* Minimum Access size (ACPI 3.0) */
192+
uint64_t address; /* 64-bit address of struct or register */
193+
} acpi_generic_address_t;
194+
164195
void dump_table_header(neo_acpi_phys_addr phys_addr, void *hdr);
196+
bool verify_table_checksum(void *table, size_t size);

src/include/lib/neoacpi/neotype.h

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,60 @@
11
#pragma once
22

33
#ifndef NO_STD_TYPE_DEF
4-
#include "stddef.h"
5-
#include "stdint.h"
6-
#include "stdbool.h"
7-
#include "stdarg.h"
8-
#include "limits.h"
4+
# include "limits.h"
5+
# include "stdarg.h"
6+
# include "stdbool.h"
7+
# include "stddef.h"
8+
# include "stdint.h"
99
#else
1010

11-
typedef __SIZE_TYPE__ size_t;
11+
typedef __SIZE_TYPE__ size_t;
1212

13-
#ifndef __cplusplus
14-
# define NULL ((void *)0)
15-
#else
16-
# define NULL 0
13+
# ifndef __cplusplus
14+
# define NULL ((void *)0)
15+
# else
16+
# define NULL 0
1717

18-
#endif
18+
# endif
1919

2020
typedef __builtin_va_list va_list;
2121

22-
#undef va_start
23-
#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 201710L
24-
# define va_start(v, ...) __builtin_va_start(v, 0)
25-
#else
26-
# define va_start(v, l) __builtin_va_start(v, l)
27-
#endif
28-
#undef va_end
29-
#define va_end(v) __builtin_va_end(v)
30-
#undef va_arg
31-
#define va_arg(v, l) __builtin_va_arg(v, l)
32-
#if (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
33-
(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
34-
# undef va_copy
35-
# define va_copy(d, s) __builtin_va_copy(d, s)
36-
#endif
37-
38-
#undef UCHAR_MAX
39-
#if __SCHAR_MAX__ == __INT_MAX__
40-
# define UCHAR_MAX (SCHAR_MAX * 2U + 1U)
41-
#else
42-
# define UCHAR_MAX (SCHAR_MAX * 2 + 1)
43-
#endif
22+
# undef va_start
23+
# if defined(__STDC_VERSION__) && __STDC_VERSION__ > 201710L
24+
# define va_start(v, ...) __builtin_va_start(v, 0)
25+
# else
26+
# define va_start(v, l) __builtin_va_start(v, l)
27+
# endif
28+
# undef va_end
29+
# define va_end(v) __builtin_va_end(v)
30+
# undef va_arg
31+
# define va_arg(v, l) __builtin_va_arg(v, l)
32+
# if (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
33+
(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
34+
# undef va_copy
35+
# define va_copy(d, s) __builtin_va_copy(d, s)
36+
# endif
37+
38+
# undef UCHAR_MAX
39+
# if __SCHAR_MAX__ == __INT_MAX__
40+
# define UCHAR_MAX (SCHAR_MAX * 2U + 1U)
41+
# else
42+
# define UCHAR_MAX (SCHAR_MAX * 2 + 1)
43+
# endif
4444

4545
#endif // NO_STD_TYPE_DEF
4646

4747
#define neo_acpi_unlikely(expr) __builtin_expect(!!(expr), 0)
48-
#define neo_acpi_likely(expr) __builtin_expect(!!(expr), 1)
48+
#define neo_acpi_likely(expr) __builtin_expect(!!(expr), 1)
4949

5050
typedef uint64_t neo_acpi_phys_addr;
5151

5252
typedef va_list neo_acpi_va_list;
5353
#define neo_acpi_va_start va_start
54-
#define neo_acpi_va_end va_end
55-
#define neo_acpi_va_arg va_arg
54+
#define neo_acpi_va_end va_end
55+
#define neo_acpi_va_arg va_arg
56+
57+
#define ACPI_CAST_PTR(t, p) ((t *)(uintptr_t)(p))
58+
#define ACPI_CAST_INDIRECT_PTR(t, p) ((t **)(uintptr_t)(p))
59+
#define ACPI_ADD_PTR(t, a, b) ACPI_CAST_PTR(t, (ACPI_CAST_PTR(uint8_t, (a)) + (size_t)(b)))
60+
#define ACPI_SUB_PTR(t, a, b) ACPI_CAST_PTR(t, (ACPI_CAST_PTR(uint8_t, (a)) - (size_t)(b)))

0 commit comments

Comments
 (0)