mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
Add syscall enum, clean up handler debug prints
This commit is contained in:
@@ -8,8 +8,11 @@
|
|||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
|
#include "syscall.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
void _halt();
|
||||||
|
|
||||||
addr_t isr_handler(addr_t, cpu_state);
|
addr_t isr_handler(addr_t, cpu_state);
|
||||||
addr_t irq_handler(addr_t, cpu_state);
|
addr_t irq_handler(addr_t, cpu_state);
|
||||||
addr_t syscall_handler(addr_t, cpu_state);
|
addr_t syscall_handler(addr_t, cpu_state);
|
||||||
@@ -110,6 +113,55 @@ print_stacktrace(int skip = 0)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_regs(const cpu_state ®s)
|
||||||
|
{
|
||||||
|
console *cons = console::get();
|
||||||
|
|
||||||
|
print_reg("rax", regs.rax);
|
||||||
|
print_reg("rbx", regs.rbx);
|
||||||
|
print_reg("rcx", regs.rcx);
|
||||||
|
print_reg("rdx", regs.rdx);
|
||||||
|
print_reg("rdi", regs.rdi);
|
||||||
|
print_reg("rsi", regs.rsi);
|
||||||
|
|
||||||
|
cons->puts("\n");
|
||||||
|
print_reg(" r8", regs.r8);
|
||||||
|
print_reg(" r9", regs.r9);
|
||||||
|
print_reg("r10", regs.r10);
|
||||||
|
print_reg("r11", regs.r11);
|
||||||
|
print_reg("r12", regs.r12);
|
||||||
|
print_reg("r13", regs.r13);
|
||||||
|
print_reg("r14", regs.r14);
|
||||||
|
print_reg("r15", regs.r15);
|
||||||
|
|
||||||
|
cons->puts("\n");
|
||||||
|
print_reg("rbp", regs.rbp);
|
||||||
|
print_reg("rsp", regs.user_rsp);
|
||||||
|
print_reg("sp0", tss_get_stack(0));
|
||||||
|
|
||||||
|
cons->puts("\n");
|
||||||
|
print_reg(" ds", regs.ds);
|
||||||
|
print_reg(" cs", regs.cs);
|
||||||
|
print_reg(" ss", regs.ss);
|
||||||
|
|
||||||
|
cons->puts("\n");
|
||||||
|
print_reg("rip", regs.rip);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_stack(const cpu_state ®s)
|
||||||
|
{
|
||||||
|
console *cons = console::get();
|
||||||
|
|
||||||
|
cons->puts("\nStack:\n");
|
||||||
|
uint64_t sp = regs.user_rsp;
|
||||||
|
while (sp <= regs.rbp) {
|
||||||
|
cons->printf("%016x: %016x\n", sp, *reinterpret_cast<uint64_t *>(sp));
|
||||||
|
sp += sizeof(uint64_t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
addr_t
|
addr_t
|
||||||
isr_handler(addr_t return_rsp, cpu_state regs)
|
isr_handler(addr_t return_rsp, cpu_state regs)
|
||||||
{
|
{
|
||||||
@@ -169,36 +221,12 @@ isr_handler(addr_t return_rsp, cpu_state regs)
|
|||||||
} else {
|
} else {
|
||||||
cons->putc('\n');
|
cons->putc('\n');
|
||||||
}
|
}
|
||||||
|
print_regs(regs);
|
||||||
cons->puts("\n");
|
|
||||||
print_reg(" ds", regs.ds);
|
|
||||||
print_reg(" cs", regs.cs);
|
|
||||||
print_reg(" ss", regs.ss);
|
|
||||||
|
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rax", regs.rax);
|
|
||||||
print_reg("rbx", regs.rbx);
|
|
||||||
print_reg("rcx", regs.rcx);
|
|
||||||
print_reg("rdx", regs.rdx);
|
|
||||||
print_reg("rdi", regs.rdi);
|
|
||||||
print_reg("rsi", regs.rsi);
|
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rbp", regs.rbp);
|
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rip", regs.rip);
|
|
||||||
print_stacktrace(2);
|
print_stacktrace(2);
|
||||||
|
print_stack(regs);
|
||||||
|
|
||||||
cons->puts("\nStack:\n");
|
|
||||||
uint64_t sp = regs.user_rsp;
|
|
||||||
while (sp <= regs.rbp) {
|
|
||||||
cons->printf("%016x: %016x\n", sp, *reinterpret_cast<uint64_t *>(sp));
|
|
||||||
sp += sizeof(uint64_t);
|
|
||||||
}
|
}
|
||||||
}
|
_halt();
|
||||||
while(1) asm("hlt");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case isr::isrPageFault: {
|
case isr::isrPageFault: {
|
||||||
@@ -224,29 +252,15 @@ isr_handler(addr_t return_rsp, cpu_state regs)
|
|||||||
cons->puts("\n");
|
cons->puts("\n");
|
||||||
print_stacktrace(2);
|
print_stacktrace(2);
|
||||||
}
|
}
|
||||||
while(1) asm("hlt");
|
_halt();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case isr::isrAssert: {
|
case isr::isrAssert: {
|
||||||
cons->set_color();
|
cons->set_color();
|
||||||
|
print_regs(regs);
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rax", regs.rax);
|
|
||||||
print_reg("rbx", regs.rbx);
|
|
||||||
print_reg("rcx", regs.rcx);
|
|
||||||
print_reg("rdx", regs.rdx);
|
|
||||||
print_reg("rdi", regs.rdi);
|
|
||||||
print_reg("rsi", regs.rsi);
|
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rbp", regs.rbp);
|
|
||||||
print_reg("rsp", regs.user_rsp);
|
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rip", regs.rip);
|
|
||||||
print_stacktrace(2);
|
print_stacktrace(2);
|
||||||
}
|
}
|
||||||
while(1) asm("hlt");
|
_halt();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -258,25 +272,9 @@ isr_handler(addr_t return_rsp, cpu_state regs)
|
|||||||
cons->printf(" ERR: %lx\n", regs.errorcode);
|
cons->printf(" ERR: %lx\n", regs.errorcode);
|
||||||
cons->puts("\n");
|
cons->puts("\n");
|
||||||
|
|
||||||
print_reg(" ds", regs.ds);
|
print_regs(regs);
|
||||||
print_reg("rdi", regs.rdi);
|
|
||||||
print_reg("rsi", regs.rsi);
|
|
||||||
print_reg("rbp", regs.rbp);
|
|
||||||
print_reg("rbx", regs.rbx);
|
|
||||||
print_reg("rdx", regs.rdx);
|
|
||||||
print_reg("rcx", regs.rcx);
|
|
||||||
print_reg("rax", regs.rax);
|
|
||||||
cons->puts("\n");
|
|
||||||
|
|
||||||
print_reg("rip", regs.rip);
|
|
||||||
print_reg(" cs", regs.cs);
|
|
||||||
print_reg(" ef", regs.rflags);
|
|
||||||
print_reg("rsp", regs.user_rsp);
|
|
||||||
print_reg(" ss", regs.ss);
|
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_stacktrace(2);
|
print_stacktrace(2);
|
||||||
while(1) asm("hlt");
|
_halt();
|
||||||
}
|
}
|
||||||
*reinterpret_cast<uint32_t *>(0xffffff80fee000b0) = 0;
|
*reinterpret_cast<uint32_t *>(0xffffff80fee000b0) = 0;
|
||||||
|
|
||||||
@@ -293,23 +291,8 @@ irq_handler(addr_t return_rsp, cpu_state regs)
|
|||||||
cons->printf("\nReceived unknown IRQ: %d (vec %d)\n",
|
cons->printf("\nReceived unknown IRQ: %d (vec %d)\n",
|
||||||
irq, regs.interrupt);
|
irq, regs.interrupt);
|
||||||
cons->set_color();
|
cons->set_color();
|
||||||
|
print_regs(regs);
|
||||||
print_reg(" ds", regs.ds);
|
_halt();
|
||||||
print_reg("rdi", regs.rdi);
|
|
||||||
print_reg("rsi", regs.rsi);
|
|
||||||
print_reg("rbp", regs.rbp);
|
|
||||||
print_reg("rbx", regs.rbx);
|
|
||||||
print_reg("rdx", regs.rdx);
|
|
||||||
print_reg("rcx", regs.rcx);
|
|
||||||
print_reg("rax", regs.rax);
|
|
||||||
cons->puts("\n");
|
|
||||||
|
|
||||||
print_reg("rip", regs.rip);
|
|
||||||
print_reg(" cs", regs.cs);
|
|
||||||
print_reg(" ef", regs.rflags);
|
|
||||||
print_reg("rsp", regs.user_rsp);
|
|
||||||
print_reg(" ss", regs.ss);
|
|
||||||
while(1) asm("hlt");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*reinterpret_cast<uint32_t *>(0xffffff80fee000b0) = 0;
|
*reinterpret_cast<uint32_t *>(0xffffff80fee000b0) = 0;
|
||||||
@@ -320,34 +303,27 @@ addr_t
|
|||||||
syscall_handler(addr_t return_rsp, cpu_state regs)
|
syscall_handler(addr_t return_rsp, cpu_state regs)
|
||||||
{
|
{
|
||||||
console *cons = console::get();
|
console *cons = console::get();
|
||||||
cons->printf("SYSCALL\n");
|
syscall call = static_cast<syscall>(regs.rdi & 0xffff);
|
||||||
|
|
||||||
cons->puts("\n");
|
switch (call) {
|
||||||
print_reg("rax", regs.rax);
|
case syscall::message:
|
||||||
print_reg("rbx", regs.rbx);
|
break;
|
||||||
print_reg("rcx", regs.rcx);
|
|
||||||
print_reg("rdx", regs.rdx);
|
|
||||||
print_reg("rdi", regs.rdi);
|
|
||||||
print_reg("rsi", regs.rsi);
|
|
||||||
|
|
||||||
/*
|
case syscall::debug:
|
||||||
cons->puts("\n");
|
cons->set_color(11);
|
||||||
print_reg(" r8", regs.r8);
|
cons->printf("\nReceived DEBUG syscall\n");
|
||||||
print_reg(" r9", regs.r9);
|
cons->set_color();
|
||||||
print_reg("r10", regs.r10);
|
print_regs(regs);
|
||||||
print_reg("r11", regs.r11);
|
break;
|
||||||
print_reg("r12", regs.r12);
|
|
||||||
print_reg("r13", regs.r13);
|
|
||||||
print_reg("r14", regs.r14);
|
|
||||||
print_reg("r15", regs.r15);
|
|
||||||
*/
|
|
||||||
|
|
||||||
cons->puts("\n");
|
default:
|
||||||
print_reg("rbp", regs.rbp);
|
cons->set_color(9);
|
||||||
print_reg("rsp", regs.user_rsp);
|
cons->printf("\nReceived unknown syscall: %02x\n", call);
|
||||||
print_reg("sp0", tss_get_stack(0));
|
cons->set_color();
|
||||||
|
print_regs(regs);
|
||||||
|
_halt();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
cons->puts("\n");
|
|
||||||
print_reg("rip", regs.rip);
|
|
||||||
return return_rsp;
|
return return_rsp;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ global taskA
|
|||||||
taskA:
|
taskA:
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
|
mov rdi, 0
|
||||||
mov rax, 0xaaaaaaaaaaaaaaaa
|
mov rax, 0xaaaaaaaaaaaaaaaa
|
||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
|
|||||||
9
src/kernel/syscall.h
Normal file
9
src/kernel/syscall.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum class syscall : uint16_t
|
||||||
|
{
|
||||||
|
debug,
|
||||||
|
message,
|
||||||
|
|
||||||
|
last_syscall
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user