replace nob with ms' build, move disk creation to build.bat, major comment cleanup, remove old and stupid tests, overhaul interrupt management with per-CPU vector allocation, affinity migration and safe teardown, add proper IOAPIC routing and PCI MSI/MSI-X/INTx support, migrate drivers to the new interrupt API, integrate ACPICA with a proper OS services layer, move ACPI firmware events, power button handling and S5 shutdown into acpi.sys, add parallel driver startup and atomic publication, replace PnP arrays with dynamic lists, redesign service startup again to be asynchronous, add delayed startup mode for services, allow omitting keys in services.ini, fix acpi ec deferred work handling, fix kernel threads having garbage exit code.
This commit is contained in:
1 parent
d36f19509c
commit
36eef8f58d
696 files changed
+147281
-7530
No files matched your search
+309
-14
@@ -12,6 +12,7 @@
|
||||
#include <string.h>
|
||||
#include <kernel/ke_idt.h>
|
||||
#include <kernel/ke_cpu.h>
|
||||
#include <kernel/ke_vectors.h>
|
||||
|
||||
// External assembly procedures.
|
||||
extern void KeFlushGdt(void* pGdtr, uint16_t codeSel, uint16_t dataSel, uint16_t tssSel);
|
||||
@@ -41,7 +42,145 @@ extern void KeIrqStub20(void);
|
||||
extern void KeIrqStub21(void);
|
||||
extern void KeIrqStub22(void);
|
||||
extern void KeIrqStub23(void);
|
||||
extern void KeIrqStub24(void);
|
||||
extern void KeIrqStub25(void);
|
||||
extern void KeIrqStub26(void);
|
||||
extern void KeIrqStub27(void);
|
||||
extern void KeIrqStub28(void);
|
||||
extern void KeIrqStub29(void);
|
||||
extern void KeIrqStub30(void);
|
||||
extern void KeIrqStub31(void);
|
||||
extern void KeIrqStub32(void);
|
||||
extern void KeIrqStub33(void);
|
||||
extern void KeIrqStub34(void);
|
||||
extern void KeIrqStub35(void);
|
||||
extern void KeIrqStub36(void);
|
||||
extern void KeIrqStub37(void);
|
||||
extern void KeIrqStub38(void);
|
||||
extern void KeIrqStub39(void);
|
||||
extern void KeIrqStub40(void);
|
||||
extern void KeIrqStub41(void);
|
||||
extern void KeIrqStub42(void);
|
||||
extern void KeIrqStub43(void);
|
||||
extern void KeIrqStub44(void);
|
||||
extern void KeIrqStub45(void);
|
||||
extern void KeIrqStub46(void);
|
||||
extern void KeIrqStub47(void);
|
||||
extern void KeIrqStub48(void);
|
||||
extern void KeIrqStub49(void);
|
||||
extern void KeIrqStub50(void);
|
||||
extern void KeIrqStub51(void);
|
||||
extern void KeIrqStub52(void);
|
||||
extern void KeIrqStub53(void);
|
||||
extern void KeIrqStub54(void);
|
||||
extern void KeIrqStub55(void);
|
||||
extern void KeIrqStub56(void);
|
||||
extern void KeIrqStub57(void);
|
||||
extern void KeIrqStub58(void);
|
||||
extern void KeIrqStub59(void);
|
||||
extern void KeIrqStub60(void);
|
||||
extern void KeIrqStub61(void);
|
||||
extern void KeIrqStub62(void);
|
||||
extern void KeIrqStub63(void);
|
||||
extern void KeIrqStub64(void);
|
||||
extern void KeIrqStub65(void);
|
||||
extern void KeIrqStub66(void);
|
||||
extern void KeIrqStub67(void);
|
||||
extern void KeIrqStub68(void);
|
||||
extern void KeIrqStub69(void);
|
||||
extern void KeIrqStub70(void);
|
||||
extern void KeIrqStub71(void);
|
||||
extern void KeIrqStub72(void);
|
||||
extern void KeIrqStub73(void);
|
||||
extern void KeIrqStub74(void);
|
||||
extern void KeIrqStub75(void);
|
||||
extern void KeIrqStub76(void);
|
||||
extern void KeIrqStub77(void);
|
||||
extern void KeIrqStub78(void);
|
||||
extern void KeIrqStub79(void);
|
||||
extern void KeIrqStub80(void);
|
||||
extern void KeIrqStub81(void);
|
||||
extern void KeIrqStub82(void);
|
||||
extern void KeIrqStub83(void);
|
||||
extern void KeIrqStub84(void);
|
||||
extern void KeIrqStub85(void);
|
||||
extern void KeIrqStub86(void);
|
||||
extern void KeIrqStub87(void);
|
||||
extern void KeIrqStub88(void);
|
||||
extern void KeIrqStub89(void);
|
||||
extern void KeIrqStub90(void);
|
||||
extern void KeIrqStub91(void);
|
||||
extern void KeIrqStub92(void);
|
||||
extern void KeIrqStub93(void);
|
||||
extern void KeIrqStub94(void);
|
||||
extern void KeIrqStub95(void);
|
||||
extern void KeIrqStub96(void);
|
||||
extern void KeIrqStub97(void);
|
||||
extern void KeIrqStub98(void);
|
||||
extern void KeIrqStub99(void);
|
||||
extern void KeIrqStub100(void);
|
||||
extern void KeIrqStub101(void);
|
||||
extern void KeIrqStub102(void);
|
||||
extern void KeIrqStub103(void);
|
||||
extern void KeIrqStub104(void);
|
||||
extern void KeIrqStub105(void);
|
||||
extern void KeIrqStub106(void);
|
||||
extern void KeIrqStub107(void);
|
||||
extern void KeIrqStub108(void);
|
||||
extern void KeIrqStub109(void);
|
||||
extern void KeIrqStub110(void);
|
||||
extern void KeIrqStub111(void);
|
||||
extern void KeIrqStub112(void);
|
||||
extern void KeIrqStub113(void);
|
||||
extern void KeIrqStub114(void);
|
||||
extern void KeIrqStub115(void);
|
||||
extern void KeIrqStub116(void);
|
||||
extern void KeIrqStub117(void);
|
||||
extern void KeIrqStub118(void);
|
||||
extern void KeIrqStub119(void);
|
||||
extern void KeIrqStub120(void);
|
||||
extern void KeIrqStub121(void);
|
||||
extern void KeIrqStub122(void);
|
||||
extern void KeIrqStub123(void);
|
||||
extern void KeIrqStub124(void);
|
||||
extern void KeIrqStub125(void);
|
||||
extern void KeIrqStub126(void);
|
||||
extern void KeIrqStub127(void);
|
||||
extern void KeIrqStub128(void);
|
||||
extern void KeIrqStub129(void);
|
||||
extern void KeIrqStub130(void);
|
||||
extern void KeIrqStub131(void);
|
||||
extern void KeIrqStub132(void);
|
||||
extern void KeIrqStub133(void);
|
||||
extern void KeIrqStub134(void);
|
||||
extern void KeIrqStub135(void);
|
||||
extern void KeIrqStub136(void);
|
||||
extern void KeIrqStub137(void);
|
||||
extern void KeIrqStub138(void);
|
||||
extern void KeIrqStub139(void);
|
||||
extern void KeIrqStub140(void);
|
||||
extern void KeIrqStub141(void);
|
||||
extern void KeIrqStub142(void);
|
||||
extern void KeIrqStub143(void);
|
||||
extern void KeIrqStub144(void);
|
||||
extern void KeIrqStub145(void);
|
||||
extern void KeIrqStub146(void);
|
||||
extern void KeIrqStub147(void);
|
||||
extern void KeIrqStub148(void);
|
||||
extern void KeIrqStub149(void);
|
||||
extern void KeIrqStub150(void);
|
||||
extern void KeIrqStub151(void);
|
||||
extern void KeIrqStub152(void);
|
||||
extern void KeIrqStub153(void);
|
||||
extern void KeIrqStub154(void);
|
||||
extern void KeIrqStub155(void);
|
||||
extern void KeIrqStub156(void);
|
||||
extern void KeIrqStub157(void);
|
||||
extern void KeIrqStub158(void);
|
||||
extern void KeIrqStub159(void);
|
||||
extern void KeRescheduleIpiStub(void);
|
||||
extern void KeLocalTimerStub(void);
|
||||
extern void KeSpuriousStub(void);
|
||||
|
||||
extern void KeFaultDB(void);
|
||||
extern void KeFaultNMI(void);
|
||||
@@ -74,7 +213,7 @@ extern void KeFaultVC(void);
|
||||
extern void KeFaultSX(void);
|
||||
extern void KeFaultRSV31(void);
|
||||
|
||||
#define NUM_IRQS 24
|
||||
#define NUM_DEVICE_VECTORS (KE_VECTOR_DEVICE_LAST - KE_VECTOR_DEVICE_FIRST + 1u)
|
||||
|
||||
// GDT.
|
||||
static void KiGdtSetEntry(uint64_t* gdt, int idx, uint32_t base, uint32_t limit,
|
||||
@@ -88,7 +227,6 @@ static void KiGdtSetEntry(uint64_t* gdt, int idx, uint32_t base, uint32_t limit,
|
||||
((uint64_t)(base >> 24 & 0xFF)<< 56);
|
||||
}
|
||||
|
||||
// Implements the gdt Set Tss operation.
|
||||
static void KiGdtSetTss(uint64_t* gdt, int idx, uintptr_t base, uint32_t limit) {
|
||||
// TSS descriptor is 16 bytes (two GDT slots).
|
||||
gdt[idx] = 0;
|
||||
@@ -219,23 +357,180 @@ void KeInitializeIdt(void) {
|
||||
// User-mode INT3 must enter #BP, not fail the gate-DPL check and become #GP.
|
||||
KiIdtSetGate(3, (uintptr_t)KeFaultBP, KI_IDT_TYPE_USER_INTERRUPT_GATE, 0);
|
||||
|
||||
KiIdtSetGate(0x40, (uintptr_t)KeSyscallEntry, KI_IDT_TYPE_USER_INTERRUPT_GATE, 0);
|
||||
KiIdtSetGate(KE_VECTOR_SYSCALL, (uintptr_t)KeSyscallEntry, KI_IDT_TYPE_USER_INTERRUPT_GATE, 0);
|
||||
|
||||
static void* irqStubs[NUM_IRQS] = {
|
||||
(void*)KeIrqStub0, (void*)KeIrqStub1, (void*)KeIrqStub2,
|
||||
(void*)KeIrqStub3, (void*)KeIrqStub4, (void*)KeIrqStub5,
|
||||
(void*)KeIrqStub6, (void*)KeIrqStub7, (void*)KeIrqStub8,
|
||||
(void*)KeIrqStub9, (void*)KeIrqStub10, (void*)KeIrqStub11,
|
||||
(void*)KeIrqStub12, (void*)KeIrqStub13, (void*)KeIrqStub14,
|
||||
(void*)KeIrqStub15, (void*)KeIrqStub16, (void*)KeIrqStub17,
|
||||
(void*)KeIrqStub18, (void*)KeIrqStub19, (void*)KeIrqStub20,
|
||||
(void*)KeIrqStub21, (void*)KeIrqStub22, (void*)KeIrqStub23,
|
||||
static void* irqStubs[NUM_DEVICE_VECTORS] = {
|
||||
(void*)KeIrqStub0,
|
||||
(void*)KeIrqStub1,
|
||||
(void*)KeIrqStub2,
|
||||
(void*)KeIrqStub3,
|
||||
(void*)KeIrqStub4,
|
||||
(void*)KeIrqStub5,
|
||||
(void*)KeIrqStub6,
|
||||
(void*)KeIrqStub7,
|
||||
(void*)KeIrqStub8,
|
||||
(void*)KeIrqStub9,
|
||||
(void*)KeIrqStub10,
|
||||
(void*)KeIrqStub11,
|
||||
(void*)KeIrqStub12,
|
||||
(void*)KeIrqStub13,
|
||||
(void*)KeIrqStub14,
|
||||
(void*)KeIrqStub15,
|
||||
(void*)KeIrqStub16,
|
||||
(void*)KeIrqStub17,
|
||||
(void*)KeIrqStub18,
|
||||
(void*)KeIrqStub19,
|
||||
(void*)KeIrqStub20,
|
||||
(void*)KeIrqStub21,
|
||||
(void*)KeIrqStub22,
|
||||
(void*)KeIrqStub23,
|
||||
(void*)KeIrqStub24,
|
||||
(void*)KeIrqStub25,
|
||||
(void*)KeIrqStub26,
|
||||
(void*)KeIrqStub27,
|
||||
(void*)KeIrqStub28,
|
||||
(void*)KeIrqStub29,
|
||||
(void*)KeIrqStub30,
|
||||
(void*)KeIrqStub31,
|
||||
(void*)KeIrqStub32,
|
||||
(void*)KeIrqStub33,
|
||||
(void*)KeIrqStub34,
|
||||
(void*)KeIrqStub35,
|
||||
(void*)KeIrqStub36,
|
||||
(void*)KeIrqStub37,
|
||||
(void*)KeIrqStub38,
|
||||
(void*)KeIrqStub39,
|
||||
(void*)KeIrqStub40,
|
||||
(void*)KeIrqStub41,
|
||||
(void*)KeIrqStub42,
|
||||
(void*)KeIrqStub43,
|
||||
(void*)KeIrqStub44,
|
||||
(void*)KeIrqStub45,
|
||||
(void*)KeIrqStub46,
|
||||
(void*)KeIrqStub47,
|
||||
(void*)KeIrqStub48,
|
||||
(void*)KeIrqStub49,
|
||||
(void*)KeIrqStub50,
|
||||
(void*)KeIrqStub51,
|
||||
(void*)KeIrqStub52,
|
||||
(void*)KeIrqStub53,
|
||||
(void*)KeIrqStub54,
|
||||
(void*)KeIrqStub55,
|
||||
(void*)KeIrqStub56,
|
||||
(void*)KeIrqStub57,
|
||||
(void*)KeIrqStub58,
|
||||
(void*)KeIrqStub59,
|
||||
(void*)KeIrqStub60,
|
||||
(void*)KeIrqStub61,
|
||||
(void*)KeIrqStub62,
|
||||
(void*)KeIrqStub63,
|
||||
(void*)KeIrqStub64,
|
||||
(void*)KeIrqStub65,
|
||||
(void*)KeIrqStub66,
|
||||
(void*)KeIrqStub67,
|
||||
(void*)KeIrqStub68,
|
||||
(void*)KeIrqStub69,
|
||||
(void*)KeIrqStub70,
|
||||
(void*)KeIrqStub71,
|
||||
(void*)KeIrqStub72,
|
||||
(void*)KeIrqStub73,
|
||||
(void*)KeIrqStub74,
|
||||
(void*)KeIrqStub75,
|
||||
(void*)KeIrqStub76,
|
||||
(void*)KeIrqStub77,
|
||||
(void*)KeIrqStub78,
|
||||
(void*)KeIrqStub79,
|
||||
(void*)KeIrqStub80,
|
||||
(void*)KeIrqStub81,
|
||||
(void*)KeIrqStub82,
|
||||
(void*)KeIrqStub83,
|
||||
(void*)KeIrqStub84,
|
||||
(void*)KeIrqStub85,
|
||||
(void*)KeIrqStub86,
|
||||
(void*)KeIrqStub87,
|
||||
(void*)KeIrqStub88,
|
||||
(void*)KeIrqStub89,
|
||||
(void*)KeIrqStub90,
|
||||
(void*)KeIrqStub91,
|
||||
(void*)KeIrqStub92,
|
||||
(void*)KeIrqStub93,
|
||||
(void*)KeIrqStub94,
|
||||
(void*)KeIrqStub95,
|
||||
(void*)KeIrqStub96,
|
||||
(void*)KeIrqStub97,
|
||||
(void*)KeIrqStub98,
|
||||
(void*)KeIrqStub99,
|
||||
(void*)KeIrqStub100,
|
||||
(void*)KeIrqStub101,
|
||||
(void*)KeIrqStub102,
|
||||
(void*)KeIrqStub103,
|
||||
(void*)KeIrqStub104,
|
||||
(void*)KeIrqStub105,
|
||||
(void*)KeIrqStub106,
|
||||
(void*)KeIrqStub107,
|
||||
(void*)KeIrqStub108,
|
||||
(void*)KeIrqStub109,
|
||||
(void*)KeIrqStub110,
|
||||
(void*)KeIrqStub111,
|
||||
(void*)KeIrqStub112,
|
||||
(void*)KeIrqStub113,
|
||||
(void*)KeIrqStub114,
|
||||
(void*)KeIrqStub115,
|
||||
(void*)KeIrqStub116,
|
||||
(void*)KeIrqStub117,
|
||||
(void*)KeIrqStub118,
|
||||
(void*)KeIrqStub119,
|
||||
(void*)KeIrqStub120,
|
||||
(void*)KeIrqStub121,
|
||||
(void*)KeIrqStub122,
|
||||
(void*)KeIrqStub123,
|
||||
(void*)KeIrqStub124,
|
||||
(void*)KeIrqStub125,
|
||||
(void*)KeIrqStub126,
|
||||
(void*)KeIrqStub127,
|
||||
(void*)KeIrqStub128,
|
||||
(void*)KeIrqStub129,
|
||||
(void*)KeIrqStub130,
|
||||
(void*)KeIrqStub131,
|
||||
(void*)KeIrqStub132,
|
||||
(void*)KeIrqStub133,
|
||||
(void*)KeIrqStub134,
|
||||
(void*)KeIrqStub135,
|
||||
(void*)KeIrqStub136,
|
||||
(void*)KeIrqStub137,
|
||||
(void*)KeIrqStub138,
|
||||
(void*)KeIrqStub139,
|
||||
(void*)KeIrqStub140,
|
||||
(void*)KeIrqStub141,
|
||||
(void*)KeIrqStub142,
|
||||
(void*)KeIrqStub143,
|
||||
(void*)KeIrqStub144,
|
||||
(void*)KeIrqStub145,
|
||||
(void*)KeIrqStub146,
|
||||
(void*)KeIrqStub147,
|
||||
(void*)KeIrqStub148,
|
||||
(void*)KeIrqStub149,
|
||||
(void*)KeIrqStub150,
|
||||
(void*)KeIrqStub151,
|
||||
(void*)KeIrqStub152,
|
||||
(void*)KeIrqStub153,
|
||||
(void*)KeIrqStub154,
|
||||
(void*)KeIrqStub155,
|
||||
(void*)KeIrqStub156,
|
||||
(void*)KeIrqStub157,
|
||||
(void*)KeIrqStub158,
|
||||
(void*)KeIrqStub159,
|
||||
};
|
||||
for (int i = 0; i < NUM_IRQS; i++)
|
||||
KiIdtSetGate(0x20 + i, (uintptr_t)irqStubs[i], KI_IDT_TYPE_INTERRUPT_GATE, 0);
|
||||
for (uint32_t i = 0; i < NUM_DEVICE_VECTORS; i++)
|
||||
KiIdtSetGate(KE_VECTOR_DEVICE_FIRST + i, (uintptr_t)irqStubs[i],
|
||||
KI_IDT_TYPE_INTERRUPT_GATE, 0);
|
||||
|
||||
KiIdtSetGate(KE_VECTOR_CPU_TIMER, (uintptr_t)KeLocalTimerStub,
|
||||
KI_IDT_TYPE_INTERRUPT_GATE, 0);
|
||||
KiIdtSetGate(KE_VECTOR_RESCHEDULE_IPI, (uintptr_t)KeRescheduleIpiStub,
|
||||
KI_IDT_TYPE_INTERRUPT_GATE, 0);
|
||||
KiIdtSetGate(KE_VECTOR_SPURIOUS, (uintptr_t)KeSpuriousStub,
|
||||
KI_IDT_TYPE_INTERRUPT_GATE, 0);
|
||||
|
||||
KeLoadIdtForCurrentCpu();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user