Extract handle_syscall().

This commit is contained in:
Alexander Myltsev 2023-01-31 15:43:55 +04:00
parent 4de207cd42
commit eff482f932

View File

@ -85,7 +85,31 @@ void register_interrupt_handler(uint8_t i, isr_t handler) {
}
void trap(registers_t *r) {
if (r->int_no == T_SYSCALL) {
// EOI
if (r->int_no >= 40) {
port_byte_out(0xA0, 0x20); /* follower */
}
if (r->int_no >= 32) {
port_byte_out(0x20, 0x20); /* leader */
}
// Call registered handler
if (interrupt_handlers[r->int_no] != 0) {
isr_t handler = interrupt_handlers[r->int_no];
handler(r);
return;
}
if (r->int_no < 32) {
const char* msg = "Reserved";
if (r->int_no < ARRLEN(exception_messages)) {
msg = exception_messages[r->int_no];
}
panic(msg);
}
}
static void handle_syscall(registers_t* r) {
switch (r->eax) {
case SYS_exit:
if (r->ebx == 0) {
@ -102,30 +126,6 @@ void trap(registers_t *r) {
printk("Unknown syscall\n");
r->eax = -1;
}
return;
}
if (r->int_no < 32) {
const char* msg = "Reserved";
if (r->int_no < ARRLEN(exception_messages)) {
msg = exception_messages[r->int_no];
}
panic(msg);
}
/* Handle the interrupt in a more modular way */
if (interrupt_handlers[r->int_no] != 0) {
isr_t handler = interrupt_handlers[r->int_no];
handler(r);
}
// EOI
if (r->int_no >= 40) {
port_byte_out(0xA0, 0x20); /* follower */
}
if (r->int_no >= 32) {
port_byte_out(0x20, 0x20); /* leader */
}
}
static void init_pic() {
@ -165,6 +165,8 @@ void load_idt() {
asm("lidt (%0)" : : "r"(&idt_reg));
init_pic();
register_interrupt_handler(T_SYSCALL, handle_syscall);
}
void cli() {