[zion] Use a separate stack for PF and GP faults in the kernel.
This commit is contained in:
parent
259c64ef2a
commit
e3a425e274
6 changed files with 28 additions and 2 deletions
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -6,4 +6,6 @@
|
|||
|
||||
void InitIdt();
|
||||
|
||||
void UpdateFaultHandlersToIst1();
|
||||
|
||||
void RegisterPciPort(const glcr::RefPtr<Port>& port);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue