[zion] Use a separate stack for PF and GP faults in the kernel.

This commit is contained in:
Drew Galbraith 2023-08-01 23:11:12 -07:00
parent 259c64ef2a
commit e3a425e274
6 changed files with 28 additions and 2 deletions

View file

@ -30,12 +30,12 @@ struct InterruptDescriptor {
static InterruptDescriptor gIdt[256];
InterruptDescriptor CreateDescriptor(void isr(void)) {
InterruptDescriptor CreateDescriptor(void isr(void), uint8_t ist = 0) {
uint64_t offset = reinterpret_cast<uint64_t>(isr);
return InterruptDescriptor{
.offset_low = static_cast<uint16_t>(offset),
.selector = KERNEL_CS,
.ist = 0,
.ist = ist,
.flags = IDT_INTERRUPT_GATE,
.offset_medium = static_cast<uint16_t>(offset >> 16),
.offset_high = static_cast<uint32_t>(offset >> 32),
@ -192,4 +192,15 @@ void InitIdt() {
asm volatile("lidt %0" ::"m"(idtp));
}
void UpdateFaultHandlersToIst1() {
gIdt[13] = CreateDescriptor(isr_protection_fault, 1);
gIdt[14] = CreateDescriptor(isr_page_fault, 1);
InterruptDescriptorTablePointer idtp{
.size = sizeof(gIdt),
.base = reinterpret_cast<uint64_t>(gIdt),
};
asm volatile("lidt %0" ::"m"(idtp));
}
void RegisterPciPort(const glcr::RefPtr<Port>& port) { pci1_port = port; }

View file

@ -6,4 +6,6 @@
void InitIdt();
void UpdateFaultHandlersToIst1();
void RegisterPciPort(const glcr::RefPtr<Port>& port);