added x86 and x86_64 interrupt support

This commit is contained in:
Morten Delenk 2017-04-30 18:43:20 +00:00
parent 20038f84ab
commit 30855b250e
7 changed files with 102 additions and 3 deletions

View file

@ -0,0 +1,38 @@
#include "../../hw/pc/8259/pic.hpp"
#include <base.hpp>
#include <regs.h>
void print_regdump(cpu_state *state) {
(*out << "eax: ").puti(state->eax);
(*out << " ebx: ").puti(state->ebx);
(*out << " ecx: ").puti(state->ecx);
(*out << " edx: ").puti(state->edx);
(*out << " esi: ").puti(state->esi);
(*out << " edi: ").puti(state->edi);
(*out << " ebp: ").puti(state->ebp);
(*out << " eip: ").puti(state->eip);
(*out << " esp: ").puti(state->esp);
*out << "\n";
}
extern "C" void panic2(cpu_state *state);
extern "C" cpu_state *handleINT(cpu_state *state) {
*out << "Interrupt ";
out->puti(state->intr);
*out << " occurred!\n";
if (state->intr < 32) {
out->setColor(Color::RED);
print_regdump(state);
*out << "KERNEL PANIC: Unhandled CPU exception\n";
for (;;)
;
}
return state;
}
extern "C" void panic2(cpu_state *state) {
state->esp = (uintptr_t)state;
state->eip = state->intr;
out->setColor(Color::RED);
*out << "KERNEL PANIC: " << (char *)state->error << "\n";
print_regdump(state);
for (;;)
;
}

View file

@ -5,6 +5,8 @@
#else #else
#include "../../../hw/pc/vesafb/vesafb.hpp" #include "../../../hw/pc/vesafb/vesafb.hpp"
#endif #endif
#include "../../../hw/pc/8259/pic.hpp"
#include "../../../hw/pc/idt/idt.hpp"
#include <base.hpp> #include <base.hpp>
static multiboot_info_t *mb_info; static multiboot_info_t *mb_info;
#ifndef ENABLE_FRAMEBUFFER #ifndef ENABLE_FRAMEBUFFER
@ -20,4 +22,8 @@ extern "C" void start(int eax, multiboot_info_t *ebx) {
void drivers_init() { void drivers_init() {
setMainTTY(&term); setMainTTY(&term);
--term; --term;
initIDT();
PIC::initPIC(0x20, 0x28);
asm volatile("sti");
asm volatile("int $0");
} }

View file

@ -24,7 +24,8 @@ if config["ENABLE_FPU"] and not config["ENABLE_SSE"]:
if config["ENABLE_SSE"]: if config["ENABLE_SSE"]:
data_section+=".align 16\nfxsave_reg:\n .space 512" data_section+=".align 16\nfxsave_reg:\n .space 512"
all_regs_push.append("fxsave fxsave_reg") all_regs_push.append("fxsave fxsave_reg")
all_regs_pop.append("fxrstor fxsave_reg") all_regs_pop.append("fxrstor (%eax)")
all_regs_pop.append("pop %eax")
all_regs_push.append("pushl $fxsave_reg") all_regs_push.append("pushl $fxsave_reg")
print("Writing interrupt handler") print("Writing interrupt handler")

View file

@ -0,0 +1,46 @@
#include "../../hw/pc/8259/pic.hpp"
#include <base.hpp>
#include <regs.h>
void print_regdump(cpu_state *state) {
(*out << "rax: ").puti(state->rax);
(*out << " rbx: ").puti(state->rbx);
(*out << " rcx: ").puti(state->rcx);
(*out << " rdx: ").puti(state->rdx);
(*out << " rsi: ").puti(state->rsi);
(*out << " rdi: ").puti(state->rdi);
(*out << " rbp: ").puti(state->rbp);
(*out << " rip: ").puti(state->rip);
(*out << " rsp: ").puti(state->rsp);
(*out << " r8: ").puti(state->r8);
(*out << " r9: ").puti(state->r9);
(*out << " r10: ").puti(state->r10);
(*out << " r11: ").puti(state->r11);
(*out << " r12: ").puti(state->r12);
(*out << " r13: ").puti(state->r13);
(*out << " r14: ").puti(state->r14);
(*out << " r15: ").puti(state->r15);
*out << "\n";
}
extern "C" void panic2(cpu_state *state);
extern "C" cpu_state *handleINT(cpu_state *state) {
*out << "Interrupt ";
out->puti(state->intr);
*out << " occurred!\n";
if (state->intr < 32) {
out->setColor(Color::RED);
print_regdump(state);
*out << "KERNEL PANIC: Unhandled CPU exception\n";
for (;;)
;
}
return state;
}
extern "C" void panic2(cpu_state *state) {
state->rsp = (uintptr_t)state;
state->rip = state->intr;
out->setColor(Color::RED);
*out << "KERNEL PANIC: " << (char *)state->rdi << "\n";
print_regdump(state);
for (;;)
;
}

View file

@ -5,6 +5,9 @@
#else #else
#include "../../../hw/pc/vesafb/vesafb.hpp" #include "../../../hw/pc/vesafb/vesafb.hpp"
#endif #endif
#include "../../../hw/pc/8259/pic.hpp"
#include "../../../hw/pc/idt/idt.hpp"
#include <base.hpp> #include <base.hpp>
static multiboot_info_t *mb_info; static multiboot_info_t *mb_info;
#ifndef ENABLE_FRAMEBUFFER #ifndef ENABLE_FRAMEBUFFER
@ -20,4 +23,8 @@ extern "C" void start(int eax, multiboot_info_t *ebx) {
void drivers_init() { void drivers_init() {
setMainTTY(&term); setMainTTY(&term);
--term; --term;
initIDT();
PIC::initPIC(0x20, 0x28);
asm volatile("sti");
asm volatile("int $0");
} }

View file

@ -27,9 +27,9 @@ void initIDT() {
for (int i = 0; i < 256; i++) setIDTEntry(i, start_vectors + 16 * i); for (int i = 0; i < 256; i++) setIDTEntry(i, start_vectors + 16 * i);
struct { struct {
uint16_t size; uint16_t size;
uint32_t off; IDT_entry *off;
} __attribute__((packed)) idtr; } __attribute__((packed)) idtr;
idtr.size = sizeof(entries); idtr.size = sizeof(entries);
idtr.off = (uint32_t)((uintptr_t)entries); idtr.off = (IDT_entry *)(&entries);
asm volatile("lidt %0" : : "m"(idtr)); asm volatile("lidt %0" : : "m"(idtr));
} }

View file

@ -77,6 +77,7 @@ class Kobject {
refctr--; refctr--;
if (refctr == 0) { if (refctr == 0) {
// TODO delete this; // TODO delete this;
this->~Kobject();
return *((Kobject *)nullptr); return *((Kobject *)nullptr);
} }
return *this; return *this;