Rework x86_64 paging and vmm
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "intr.h"
|
||||
#include "io.h"
|
||||
#include "gdt.h"
|
||||
@ -55,45 +56,6 @@ void idt_init(void) {
|
||||
LOG("hal", "idt init\n");
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
uint64_t r15;
|
||||
uint64_t r14;
|
||||
uint64_t r13;
|
||||
uint64_t r12;
|
||||
uint64_t r11;
|
||||
uint64_t r10;
|
||||
uint64_t r9;
|
||||
uint64_t r8;
|
||||
uint64_t rsi;
|
||||
uint64_t rdi;
|
||||
uint64_t rbp;
|
||||
uint64_t rdx;
|
||||
uint64_t rcx;
|
||||
uint64_t rbx;
|
||||
uint64_t rax;
|
||||
} PACKED CpuRegs;
|
||||
|
||||
typedef struct {
|
||||
uint64_t cr8;
|
||||
uint64_t cr4;
|
||||
uint64_t cr3;
|
||||
uint64_t cr2;
|
||||
uint64_t cr0;
|
||||
} PACKED CpuCtrlRegs;
|
||||
|
||||
typedef struct {
|
||||
CpuCtrlRegs ctrl;
|
||||
CpuRegs regs;
|
||||
uint64_t trapnum;
|
||||
uint64_t errnum;
|
||||
|
||||
uint64_t rip;
|
||||
uint64_t cs;
|
||||
uint64_t rflags;
|
||||
uint64_t rsp;
|
||||
uint64_t ss;
|
||||
} PACKED IntrStackFrame;
|
||||
|
||||
extern void *ISR_REDIRTABLE[];
|
||||
|
||||
static const char *exceptions[] = {
|
||||
@ -164,36 +126,39 @@ void intr_init(void) {
|
||||
}
|
||||
|
||||
void intr_dumpframe(IntrStackFrame *frame) {
|
||||
kprintf("r15=%016lx r14=%016lx r13=%016lx r12=%016lx\n"
|
||||
"r11=%016lx r10=%016lx r9 =%016lx r8 =%016lx\n"
|
||||
"rsi=%016lx rdi=%016lx rbp=%016lx rdx=%016lx\n"
|
||||
"rcx=%016lx rbx=%016lx rax=%016lx\n"
|
||||
"cr8=%016lx cr4=%016lx cr3=%016lx cr2=%016lx\n"
|
||||
"cr0=%016lx rip=%016lx cs =%016lx rfl=%016lx\n"
|
||||
"rsp=%016lx ss =%016lx trp=%016lx err=%016lx\n",
|
||||
frame->regs.r15, frame->regs.r14, frame->regs.r13, frame->regs.r12,
|
||||
frame->regs.r11, frame->regs.r10, frame->regs.r9, frame->regs.r8,
|
||||
frame->regs.rsi, frame->regs.rdi, frame->regs.rbp, frame->regs.rdx,
|
||||
frame->regs.rcx, frame->regs.rbx, frame->regs.rax,
|
||||
frame->ctrl.cr8, frame->ctrl.cr4, frame->ctrl.cr3,
|
||||
frame->ctrl.cr2, frame->ctrl.cr0, frame->rip, frame->cs, frame->rflags,
|
||||
frame->rsp, frame->ss, frame->trapnum, frame->errnum
|
||||
uint64_t cr2;
|
||||
asm volatile("mov %%cr2, %0" : "=r"(cr2));
|
||||
uint64_t cr3;
|
||||
asm volatile("mov %%cr3, %0" : "=r"(cr3));
|
||||
uint64_t cr4;
|
||||
asm volatile("mov %%cr4, %0" : "=r"(cr4));
|
||||
kprintf_unsafe("rax=%016lx rcx=%016lx rdx=%016lx\n"
|
||||
"rsi=%016lx rdi=%016lx r8 =%016lx\n"
|
||||
"r9 =%016lx r10=%016lx r11=%016lx\n"
|
||||
"rip=%016lx rfl=%016lx rsp=%016lx\n"
|
||||
"cs =%016lx ss =%016lx trp=%016lx\n"
|
||||
"cr2=%016lx cr3=%016lx cr4=%016lx\n"
|
||||
"\n\n",
|
||||
frame->regs.rax, frame->regs.rcx, frame->regs.rdx,
|
||||
frame->regs.rsi, frame->regs.rdi, frame->regs.r8,
|
||||
frame->regs.r9, frame->regs.r10, frame->regs.r11,
|
||||
frame->rip, frame->rflags, frame->rsp,
|
||||
frame->cs, frame->ss, frame->trapnum,
|
||||
cr2, cr3, cr4
|
||||
);
|
||||
}
|
||||
|
||||
void intr_handleintr(IntrStackFrame *frame) {
|
||||
if (frame->trapnum >= 0 && frame->trapnum <= 31) {
|
||||
// EXCEPTION
|
||||
ERR("ERROR", "%s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
|
||||
kprintf_unsafe("ERROR", "%s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
|
||||
intr_dumpframe(frame);
|
||||
hal_hang();
|
||||
} else if (frame->trapnum >= 32 && frame->trapnum <= 47) {
|
||||
if (frame->trapnum == INTR_TIMER) {
|
||||
kprintf("ACK %d\n", PIT_TICKS);
|
||||
PIT_TICKS++;
|
||||
io_out8(PIC2_CMD, 0x20);
|
||||
PIT_TICKS++;
|
||||
}
|
||||
|
||||
io_out8(PIC1_CMD, 0x20);
|
||||
lapic_write(LAPIC_EOI, 0x00);
|
||||
}
|
||||
|
Reference in New Issue
Block a user