Skip to content

Commit fa7b0b8

Browse files
committed
删除 UACPI 与 NeoACPI 实现, 替换为 ACPICA.
1 parent d31ccb6 commit fa7b0b8

File tree

348 files changed

+150190
-32701
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

348 files changed

+150190
-32701
lines changed

CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ project(CoolPotOS LANGUAGES C ASM)
33

44
set(PROJECT_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
55

6+
add_compile_definitions(__CPOS__)
7+
add_compile_definitions(ACPI_USE_SYSTEM_CLIBRARY)
8+
69
set(CMAKE_C_COMPILER clang)
710
set(CMAKE_CXX_COMPILER clang++)
811
set(CMAKE_ASM_COMPILER clang)
@@ -69,6 +72,12 @@ file(GLOB_RECURSE TASK_SOURCES "src/task/*.c")
6972
file(GLOB_RECURSE INT_SOURCES "src/int/*.c")
7073
file(GLOB_RECURSE LIB_SOURCES "src/lib/*.c")
7174

75+
# Exclude ACPICA debugger/disassembler sources for kernel build.
76+
list(FILTER LIB_SOURCES EXCLUDE REGEX "acpica/components/debugger/.*")
77+
list(FILTER LIB_SOURCES EXCLUDE REGEX "acpica/components/disassembler/.*")
78+
list(FILTER LIB_SOURCES EXCLUDE REGEX "acpica/components/resources/rsdump\\.c$")
79+
list(FILTER LIB_SOURCES EXCLUDE REGEX "acpica/components/resources/rsdumpinfo\\.c$")
80+
7281
execute_process(
7382
COMMAND git rev-parse --short HEAD
7483
OUTPUT_VARIABLE GIT_HASH

src/arch/x86_64/acpi/apic.c

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
#include "apic.h"
2-
#include "driver/uacpi/acpi.h"
3-
#include "driver/uacpi/tables.h"
4-
#include "timer.h"
52
#include "intctl.h"
63
#include "io.h"
4+
#include "lib/acpica/acpi.h"
75
#include "mem/frame.h"
86
#include "mem/page.h"
9-
#include "term/klog.h"
107
#include "task/smp.h"
8+
#include "term/klog.h"
9+
#include "timer.h"
1110

1211
bool x2apic_mode = false;
1312
uint64_t lapic_address;
@@ -126,29 +125,29 @@ void lapic_timer_stop() {
126125
lapic_write(LAPIC_REG_TIMER, (1 << 16));
127126
}
128127

129-
static void apic_handle_ioapic(struct acpi_madt_ioapic *ioapic_madt) {
128+
static void apic_handle_ioapic(ACPI_MADT_IO_APIC *ioapic_madt) {
130129
struct ioapic_info *ioapic = &found_ioapics[found_ioapic_count];
131130
found_ioapic_count++;
132131

133-
uint64_t mmio_phys = ioapic_madt->address;
132+
uint64_t mmio_phys = ioapic_madt->Address;
134133
uint64_t mmio_virt = (uint64_t)phys_to_virt(mmio_phys);
135134
page_map_range(get_kernel_pagedir(), mmio_virt, mmio_phys, PAGE_SIZE, KERNEL_PTE_FLAGS);
136135
ioapic->mmio_base = mmio_virt;
137136

138-
ioapic->gsi_base = ioapic_madt->gsi_base;
137+
ioapic->gsi_base = ioapic_madt->GlobalIrqBase;
139138
ioapic->irq_count = (ioapic_mmio_read(ioapic->mmio_base, 0x01) & 0x00FF0000) >> 16;
140139

141140
kinfo("IOAPIC found: MMIO %p, GSI base %d, IRQs %d", (void *)ioapic->mmio_base,
142-
ioapic->gsi_base, ioapic->irq_count);
141+
ioapic->gsi_base, ioapic->irq_count);
143142

144-
ioapic->id = ioapic_madt->id;
143+
ioapic->id = ioapic_madt->Id;
145144
}
146145

147-
static void apic_handle_override(struct acpi_madt_interrupt_source_override *override_madt) {
146+
static void apic_handle_override(ACPI_MADT_INTERRUPT_OVERRIDE *override_madt) {
148147
struct iso_info *override = &found_isos[found_iso_count];
149148
found_iso_count++;
150-
override->irq_source = override_madt->source;
151-
override->gsi = override_madt->gsi;
149+
override->irq_source = override_madt->SourceIrq;
150+
override->gsi = override_madt->GlobalIrq;
152151
}
153152

154153
void local_apic_init() {
@@ -193,53 +192,51 @@ void ap_local_apic_init() {
193192
}
194193

195194
void apic_init() {
196-
struct uacpi_table madt_table;
197-
uacpi_status status = uacpi_table_find_by_signature("APIC", &madt_table);
198-
if (status != UACPI_STATUS_OK) return;
199-
struct acpi_madt *madt = (struct acpi_madt *)madt_table.ptr;
200-
lapic_address = (uint64_t)phys_to_virt((uint64_t)madt->local_interrupt_controller_address);
201-
page_map_range(get_kernel_pagedir(), lapic_address, madt->local_interrupt_controller_address,
202-
PAGE_SIZE, KERNEL_PTE_FLAGS);
203-
x2apic_mode = x2apic_mode_supported();
204-
uint64_t current = 0;
205-
for (;;) {
206-
if (current + ((uint32_t)sizeof(struct acpi_madt) - 1) >= madt->hdr.length) { break; }
207-
struct acpi_entry_hdr *header =
208-
(struct acpi_entry_hdr *)((uint64_t)(&madt->entries) + current);
209-
if (header->type == ACPI_MADT_ENTRY_TYPE_IOAPIC) {
210-
struct acpi_madt_ioapic *ioapic =
211-
(struct acpi_madt_ioapic *)((uint64_t)(&madt->entries) + current);
195+
ACPI_TABLE_MADT *madt = NULL;
196+
const ACPI_STATUS status = AcpiGetTable(ACPI_SIG_MADT, 1, (ACPI_TABLE_HEADER **)&madt);
197+
if (ACPI_FAILURE(status)) {
198+
kerror("Failed to get MADT table: %s", AcpiFormatException(status));
199+
return;
200+
}
201+
202+
lapic_address = (uint64_t)phys_to_virt(madt->Address);
203+
page_map_range(get_kernel_pagedir(), lapic_address, madt->Address, PAGE_SIZE, KERNEL_PTE_FLAGS);
204+
x2apic_mode = x2apic_mode_supported();
205+
ACPI_SUBTABLE_HEADER *subtable = (ACPI_SUBTABLE_HEADER *)(madt + 1);
206+
uintptr_t end = (uintptr_t)madt + madt->Header.Length;
207+
while ((uintptr_t)subtable < end) {
208+
switch (subtable->Type) {
209+
case ACPI_MADT_TYPE_IO_APIC:;
210+
ACPI_MADT_IO_APIC *ioapic = (ACPI_MADT_IO_APIC *)subtable;
212211
apic_handle_ioapic(ioapic);
213-
} else if (header->type == ACPI_MADT_ENTRY_TYPE_INTERRUPT_SOURCE_OVERRIDE) {
214-
struct acpi_madt_interrupt_source_override *override =
215-
(struct acpi_madt_interrupt_source_override *)((uint64_t)(&madt->entries) +
216-
current);
217-
apic_handle_override(override);
212+
break;
213+
case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:;
214+
ACPI_MADT_INTERRUPT_OVERRIDE *iso = (ACPI_MADT_INTERRUPT_OVERRIDE *)subtable;
215+
apic_handle_override(iso);
216+
break;
217+
default: break;
218218
}
219-
current += (uint64_t)header->length;
219+
subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable + subtable->Length);
220220
}
221221

222222
disable_pic();
223223
local_apic_init();
224224
}
225225

226-
int64_t apic_mask(uint64_t irq,uint64_t flags) {
227-
if (flags & IRQ_FLAGS_MSIX)
228-
return 0;
226+
int64_t apic_mask(uint64_t irq, uint64_t flags) {
227+
if (flags & IRQ_FLAGS_MSIX) return 0;
229228
ioapic_disable((uint8_t)irq);
230229
return 0;
231230
}
232231

233-
int64_t apic_unmask(uint64_t irq,uint64_t flags) {
234-
if (flags & IRQ_FLAGS_MSIX)
235-
return 0;
232+
int64_t apic_unmask(uint64_t irq, uint64_t flags) {
233+
if (flags & IRQ_FLAGS_MSIX) return 0;
236234
ioapic_enable((uint8_t)irq);
237235
return 0;
238236
}
239237

240-
int64_t apic_install(uint64_t vector, uint64_t irq,uint64_t flags) {
241-
if (flags & IRQ_FLAGS_MSIX)
242-
return 0;
238+
int64_t apic_install(uint64_t vector, uint64_t irq, uint64_t flags) {
239+
if (flags & IRQ_FLAGS_MSIX) return 0;
243240
ioapic_add(vector, irq);
244241
return 0;
245242
}

src/arch/x86_64/acpi/hpet.c

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
#include "hpet.h"
2-
#include "driver/uacpi/acpi.h"
3-
#include "driver/uacpi/tables.h"
2+
#include "krlibc.h"
3+
#include "lib/acpica/acpi.h"
44
#include "mem/frame.h"
55
#include "mem/page.h"
66
#include "term/klog.h"
77
#include "timer.h"
8-
#include "krlibc.h"
98

109
HpetInfo *hpet_addr;
1110
static uint64_t hpetPeriod = 0;
@@ -39,20 +38,24 @@ void nsleep(uint64_t nano) {
3938
}
4039

4140
void hpet_init() {
42-
struct uacpi_table hpet_table;
43-
uacpi_status status = uacpi_table_find_by_signature("HPET", &hpet_table);
44-
45-
if (status == UACPI_STATUS_OK) {
46-
struct acpi_hpet *hpet = hpet_table.ptr;
47-
48-
hpet_addr = (HpetInfo *)phys_to_virt(hpet->address.address);
49-
page_map_range(get_kernel_pagedir(), (uint64_t)hpet_addr, hpet->address.address, PAGE_SIZE,
50-
KERNEL_PTE_FLAGS);
51-
uint32_t counterClockPeriod = hpet_addr->generalCapabilities >> 32;
52-
hpetPeriod = counterClockPeriod / 1000000;
53-
hpet_addr->generalConfiguration |= 1;
54-
*(volatile uint64_t *)((uint64_t)hpet_addr + 0xf0) = 0;
55-
fms_per_tick = hpet_addr->mainCounterValue;
56-
kinfo("Setup acpi hpet table (nano_time: %#ld).", nano_time());
41+
ACPI_TABLE_HPET *hpet_table = NULL;
42+
ACPI_STATUS status = AcpiGetTable(ACPI_SIG_HPET, 1, (ACPI_TABLE_HEADER **)&hpet_table);
43+
if (ACPI_FAILURE(status)) {
44+
kerror("ACPI: HPET table not found.");
45+
return;
46+
}
47+
ACPI_GENERIC_ADDRESS *gas = &hpet_table->Address;
48+
if (gas->SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
49+
kerror("ACPI: Error! HPET is not MMIO.");
50+
return;
5751
}
52+
hpet_addr = (HpetInfo *)phys_to_virt(gas->Address);
53+
page_map_range(get_kernel_pagedir(), (uint64_t)hpet_addr, gas->Address, PAGE_SIZE,
54+
KERNEL_PTE_FLAGS);
55+
uint32_t counterClockPeriod = hpet_addr->generalCapabilities >> 32;
56+
hpetPeriod = counterClockPeriod / 1000000;
57+
hpet_addr->generalConfiguration |= 1;
58+
*(volatile uint64_t *)((uint64_t)hpet_addr + 0xf0) = 0;
59+
fms_per_tick = hpet_addr->mainCounterValue;
60+
kinfo("Setup acpi hpet table (nano_time: %#ld).", nano_time());
5861
}

src/driver/acpi/acpi.c

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)