-
Notifications
You must be signed in to change notification settings - Fork 250
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sel4: kernel patch to get ACPI information
Issue #2242
- Loading branch information
Showing
2 changed files
with
147 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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()) { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
8ab77c39000530e8f78a66581bf368a902cbcdc3 | ||
090682dbb3c4c92e47f116acabc030e3ad659b43 |