sel4: kernel patch to get ACPI information

Issue #2242
This commit is contained in:
Alexander Boettcher 2017-08-11 18:31:57 +02:00 committed by Christian Helmuth
parent 09ce611353
commit a8227e80af
2 changed files with 147 additions and 1 deletions

View File

@ -0,0 +1,146 @@
--- src/kernel/sel4/libsel4/include/sel4/bootinfo_types.h
+++ src/kernel/sel4/libsel4/include/sel4/bootinfo_types.h
@@ -65,7 +65,12 @@
seL4_SlotRegion extraBIPages; /* caps for any pages used to back the additional bootinfo information */
seL4_Uint8 initThreadCNodeSizeBits; /* initial thread's root CNode size (2^n slots) */
seL4_Domain initThreadDomain; /* Initial thread's domain ID */
- seL4_Word archInfo; /* tsc freq on x86, unused on arm */
+ struct {
+ seL4_Word tsc; /* tsc freq on x86, unused on arm */
+ seL4_Word revision;
+ seL4_Word rsdt;
+ unsigned long long xsdt;
+ } archInfo;
seL4_SlotRegion untyped; /* untyped-object caps (untyped caps) */
seL4_UntypedDesc untypedList[CONFIG_MAX_NUM_BOOTINFO_UNTYPED_CAPS]; /* information about each untyped */
/* the untypedList should be the last entry in this struct, in order
--- src/kernel/sel4/include/arch/x86/arch/kernel/boot.h
+++ src/kernel/sel4/include/arch/x86/arch/kernel/boot.h
@@ -41,7 +41,8 @@
paddr_t* drhu_list,
acpi_rmrr_list_t *rmrr_list,
seL4_X86_BootInfo_VBE *vbe,
- seL4_X86_BootInfo_mmap_t *mb_mmap
+ seL4_X86_BootInfo_mmap_t *mb_mmap,
+ acpi_info_t* acpi_info
);
bool_t init_cpu(
--- src/kernel/sel4/src/plat/pc99/machine/acpi.c
+++ src/kernel/sel4/src/plat/pc99/machine/acpi.c
@@ -30,10 +30,10 @@
uint8_t revision;
uint32_t rsdt_address;
uint32_t length;
- uint32_t xsdt_address[2];
+ uint64_t xsdt_address;
uint8_t extended_checksum;
char reserved[3];
-} acpi_rsdp_t;
+} PACKED acpi_rsdp_t;
compile_assert(acpi_rsdp_packed, sizeof(acpi_rsdp_t) == 36)
/* DMA Remapping Reporting Table */
@@ -245,7 +245,7 @@
}
BOOT_CODE acpi_rsdt_t*
-acpi_init(void)
+acpi_init(acpi_info_t *acpi_info)
{
acpi_rsdp_t* acpi_rsdp = acpi_get_rsdp();
acpi_rsdt_t* acpi_rsdt;
@@ -259,6 +259,12 @@
acpi_rsdp = acpi_table_init(acpi_rsdp, ACPI_RSDP);
printf("ACPI: RSDP vaddr=%p\n", acpi_rsdp);
+ if (acpi_info) {
+ acpi_info->revision = acpi_rsdp->revision;
+ acpi_info->phys_rsdt = acpi_rsdp->rsdt_address;
+ acpi_info->phys_xsdt = acpi_rsdp->xsdt_address;
+ }
+
acpi_rsdt = (acpi_rsdt_t*)(word_t)acpi_rsdp->rsdt_address;
printf("ACPI: RSDT paddr=%p\n", acpi_rsdt);
acpi_rsdt_mapped = (acpi_rsdt_t*)acpi_table_init(acpi_rsdt, ACPI_RSDT);
--- src/kernel/sel4/include/plat/pc99/plat/machine/acpi.h
+++ src/kernel/sel4/include/plat/pc99/plat/machine/acpi.h
@@ -34,7 +34,13 @@
uint32_t entry[1];
} PACKED acpi_rsdt_t;
-acpi_rsdt_t* acpi_init(void);
+typedef struct acpi_info_t {
+ uint32_t revision;
+ uint32_t phys_rsdt;
+ uint64_t phys_xsdt;
+} acpi_info_t;
+
+acpi_rsdt_t * acpi_init(acpi_info_t *);
uint32_t acpi_madt_scan(
acpi_rsdt_t* acpi_rsdt,
--- src/kernel/sel4/src/arch/x86/kernel/boot_sys.c
+++ src/kernel/sel4/src/arch/x86/kernel/boot_sys.c
@@ -187,7 +187,7 @@
}
static BOOT_CODE bool_t
-try_boot_sys_node(cpu_id_t cpu_id)
+try_boot_sys_node(cpu_id_t cpu_id, acpi_info_t* acpi_info)
{
p_region_t boot_mem_reuse_p_reg;
@@ -224,7 +224,8 @@
boot_state.drhu_list,
&boot_state.rmrr_list,
&boot_state.vbe_info,
- &boot_state.mb_mmap_info
+ &boot_state.mb_mmap_info,
+ acpi_info
)) {
return false;
}
@@ -487,7 +488,8 @@
}
/* get ACPI root table */
- acpi_rsdt = acpi_init();
+ acpi_info_t acpi_info = { 0, 0, 0 };
+ acpi_rsdt = acpi_init(&acpi_info);
if (!acpi_rsdt) {
return false;
}
@@ -597,7 +599,7 @@
ksNumCPUs = boot_state.num_cpus;
printf("Starting node #0 with APIC ID %lu\n", boot_state.cpus[0]);
- if (!try_boot_sys_node(boot_state.cpus[0])) {
+ if (!try_boot_sys_node(boot_state.cpus[0], &acpi_info)) {
return false;
}
--- src/kernel/sel4/src/arch/x86/kernel/boot.c
+++ src/kernel/sel4/src/arch/x86/kernel/boot.c
@@ -250,7 +250,8 @@
paddr_t* drhu_list,
acpi_rmrr_list_t *rmrr_list,
seL4_X86_BootInfo_VBE *vbe,
- seL4_X86_BootInfo_mmap_t *mb_mmap
+ seL4_X86_BootInfo_mmap_t *mb_mmap,
+ acpi_info_t* acpi_info
)
{
cap_t root_cnode_cap;
@@ -405,7 +406,10 @@
}
write_it_asid_pool(it_ap_cap, it_vspace_cap);
- ndks_boot.bi_frame->archInfo = tsc_init();
+ ndks_boot.bi_frame->archInfo.tsc = tsc_init();
+ ndks_boot.bi_frame->archInfo.revision = acpi_info->revision;
+ ndks_boot.bi_frame->archInfo.rsdt = acpi_info->phys_rsdt;
+ ndks_boot.bi_frame->archInfo.xsdt = acpi_info->phys_xsdt;
/* create the idle thread */
if (!create_idle_thread()) {

View File

@ -1 +1 @@
8ab77c39000530e8f78a66581bf368a902cbcdc3
090682dbb3c4c92e47f116acabc030e3ad659b43