mirror of
https://git.stationery.faith/corn/corn.git
synced 2024-11-25 07:10:04 +00:00
print registers on fatal exception
This commit is contained in:
parent
361561c5f4
commit
22df3f473c
4 changed files with 119 additions and 108 deletions
|
@ -4,69 +4,8 @@
|
||||||
#include <serial.h>
|
#include <serial.h>
|
||||||
|
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "registers.h"
|
||||||
struct dr6 {
|
#include "idt.h"
|
||||||
uint64_t b0 : 1,
|
|
||||||
b1 : 1,
|
|
||||||
b2 : 1,
|
|
||||||
b3 : 1,
|
|
||||||
: 7,
|
|
||||||
bld : 1,
|
|
||||||
: 1,
|
|
||||||
bd : 1,
|
|
||||||
bs : 1,
|
|
||||||
bt : 1,
|
|
||||||
rtm : 1,
|
|
||||||
: 47;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct dr7 {
|
|
||||||
uint64_t l0 : 1,
|
|
||||||
g0 : 1,
|
|
||||||
l1 : 1,
|
|
||||||
g1 : 1,
|
|
||||||
l2 : 1,
|
|
||||||
g2 : 1,
|
|
||||||
l3 : 1,
|
|
||||||
g3 : 1,
|
|
||||||
: 8,
|
|
||||||
rw0 : 2,
|
|
||||||
len0 : 2,
|
|
||||||
rw1 : 2,
|
|
||||||
len1 : 2,
|
|
||||||
rw2 : 2,
|
|
||||||
len2 : 2,
|
|
||||||
rw3 : 2,
|
|
||||||
len3 : 2,
|
|
||||||
: 32;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rflags {
|
|
||||||
uint64_t cf : 1,
|
|
||||||
: 1,
|
|
||||||
pf : 1,
|
|
||||||
: 1,
|
|
||||||
af : 1,
|
|
||||||
: 1,
|
|
||||||
zf : 1,
|
|
||||||
sf : 1,
|
|
||||||
|
|
||||||
tf : 1,
|
|
||||||
if_ : 1,
|
|
||||||
df : 1,
|
|
||||||
of : 1,
|
|
||||||
iopl : 2,
|
|
||||||
nt : 1,
|
|
||||||
md : 1,
|
|
||||||
|
|
||||||
rf : 1,
|
|
||||||
vm : 1,
|
|
||||||
ac : 1,
|
|
||||||
vif : 1,
|
|
||||||
vip : 1,
|
|
||||||
id : 1,
|
|
||||||
: 42;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct breakpoint {
|
struct breakpoint {
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
|
@ -138,50 +77,6 @@ static void debugger_msg(int cause, struct dr6 dr6) {
|
||||||
kputs("\n");
|
kputs("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void debugger_print_regs(struct isr_regs *state) {
|
|
||||||
kprintf("rax: %#016lx (%lu)\n", state->rax, state->rax);
|
|
||||||
kprintf("rbx: %#016lx (%lu)\n", state->rbx, state->rbx);
|
|
||||||
kprintf("rcx: %#016lx (%lu)\n", state->rcx, state->rcx);
|
|
||||||
kprintf("rdx: %#016lx (%lu)\n", state->rdx, state->rdx);
|
|
||||||
kprintf("rsi: %#016lx (%lu)\n", state->rsi, state->rsi);
|
|
||||||
kprintf("rdi: %#016lx (%lu)\n", state->rdi, state->rdi);
|
|
||||||
kprintf("rsp: %#016lx (%lu)\n", state->rsp, state->rsp);
|
|
||||||
kprintf("rbp: %#016lx (%lu)\n", state->rbp, state->rbp);
|
|
||||||
kprintf("r8 : %#016lx (%lu)\n", state->r8 , state->r8 );
|
|
||||||
kprintf("r9 : %#016lx (%lu)\n", state->r9 , state->r9 );
|
|
||||||
kprintf("r10: %#016lx (%lu)\n", state->r10, state->r10);
|
|
||||||
kprintf("r11: %#016lx (%lu)\n", state->r11, state->r11);
|
|
||||||
kprintf("r12: %#016lx (%lu)\n", state->r12, state->r12);
|
|
||||||
kprintf("r13: %#016lx (%lu)\n", state->r13, state->r13);
|
|
||||||
kprintf("r14: %#016lx (%lu)\n", state->r14, state->r14);
|
|
||||||
kprintf("r15: %#016lx (%lu)\n", state->r15, state->r15);
|
|
||||||
kputs("---\n");
|
|
||||||
kprintf("rip: %#016lx (%lu)\n", state->rip, state->rip);
|
|
||||||
kputs("---\n");
|
|
||||||
kprintf("rflags: %#016lx (%lu)\n", state->rflags, state->rflags);
|
|
||||||
struct rflags *rflags = (struct rflags *)state->rflags;
|
|
||||||
kputs("rflags: ");
|
|
||||||
if (rflags->cf) kputs("CF ");
|
|
||||||
if (rflags->pf) kputs("PF ");
|
|
||||||
if (rflags->af) kputs("AF ");
|
|
||||||
if (rflags->zf) kputs("ZF ");
|
|
||||||
if (rflags->sf) kputs("SF ");
|
|
||||||
if (rflags->tf) kputs("TF ");
|
|
||||||
if (rflags->if_) kputs("IF ");
|
|
||||||
if (rflags->df) kputs("DF ");
|
|
||||||
if (rflags->of) kputs("OF ");
|
|
||||||
if (rflags->iopl) kputs("IOPL ");
|
|
||||||
if (rflags->nt) kputs("NT ");
|
|
||||||
if (rflags->md) kputs("MD ");
|
|
||||||
if (rflags->rf) kputs("RF ");
|
|
||||||
if (rflags->vm) kputs("VM ");
|
|
||||||
if (rflags->ac) kputs("AC ");
|
|
||||||
if (rflags->vif) kputs("VIF ");
|
|
||||||
if (rflags->vip) kputs("VIP ");
|
|
||||||
if (rflags->id) kputs("ID ");
|
|
||||||
kputs("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PROMPT_LEN 60
|
#define PROMPT_LEN 60
|
||||||
|
|
||||||
static int debugger_handle_bkp_cmd(char *msg) {
|
static int debugger_handle_bkp_cmd(char *msg) {
|
||||||
|
@ -324,7 +219,7 @@ static int debugger_prompt(struct isr_regs *state) {
|
||||||
dbg_continue = 1;
|
dbg_continue = 1;
|
||||||
return 0;
|
return 0;
|
||||||
case 'r': // print registers
|
case 'r': // print registers
|
||||||
debugger_print_regs(state);
|
isr_print_regs(state);
|
||||||
return 1;
|
return 1;
|
||||||
case 'k': // backtrace
|
case 'k': // backtrace
|
||||||
log_backtrace_ex((void *)state->rip, (void *)state->rbp);
|
log_backtrace_ex((void *)state->rip, (void *)state->rbp);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "idt.h"
|
#include "idt.h"
|
||||||
#include "backtrace.h"
|
#include "backtrace.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "registers.h"
|
||||||
#include "../paging.h"
|
#include "../paging.h"
|
||||||
#include "../bindings.h"
|
#include "../bindings.h"
|
||||||
#include "../drivers/pic.h"
|
#include "../drivers/pic.h"
|
||||||
|
@ -73,6 +74,48 @@ void idt_init(void) {
|
||||||
__asm__ volatile ("lidt %0" : : "m"(idtr));
|
__asm__ volatile ("lidt %0" : : "m"(idtr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void isr_print_regs(struct isr_regs *regs) {
|
||||||
|
kprintf("rax: %#016lx (%lu)\n", regs->rax, regs->rax);
|
||||||
|
kprintf("rbx: %#016lx (%lu)\n", regs->rbx, regs->rbx);
|
||||||
|
kprintf("rcx: %#016lx (%lu)\n", regs->rcx, regs->rcx);
|
||||||
|
kprintf("rdx: %#016lx (%lu)\n", regs->rdx, regs->rdx);
|
||||||
|
kprintf("rsi: %#016lx (%lu)\n", regs->rsi, regs->rsi);
|
||||||
|
kprintf("rdi: %#016lx (%lu)\n", regs->rdi, regs->rdi);
|
||||||
|
kprintf("rsp: %#016lx (%lu)\n", regs->rsp, regs->rsp);
|
||||||
|
kprintf("rbp: %#016lx (%lu)\n", regs->rbp, regs->rbp);
|
||||||
|
kprintf("r8 : %#016lx (%lu)\n", regs->r8 , regs->r8 );
|
||||||
|
kprintf("r9 : %#016lx (%lu)\n", regs->r9 , regs->r9 );
|
||||||
|
kprintf("r10: %#016lx (%lu)\n", regs->r10, regs->r10);
|
||||||
|
kprintf("r11: %#016lx (%lu)\n", regs->r11, regs->r11);
|
||||||
|
kprintf("r12: %#016lx (%lu)\n", regs->r12, regs->r12);
|
||||||
|
kprintf("r13: %#016lx (%lu)\n", regs->r13, regs->r13);
|
||||||
|
kprintf("r14: %#016lx (%lu)\n", regs->r14, regs->r14);
|
||||||
|
kprintf("r15: %#016lx (%lu)\n", regs->r15, regs->r15);
|
||||||
|
kprintf("rip: %#016lx (%lu)\n", regs->rip, regs->rip);
|
||||||
|
kprintf("rflags: %#016lx (%lu)\n", regs->rflags, regs->rflags);
|
||||||
|
struct rflags *rflags = (struct rflags *)regs->rflags;
|
||||||
|
kputs("rflags: ");
|
||||||
|
if (rflags->cf) kputs("CF ");
|
||||||
|
if (rflags->pf) kputs("PF ");
|
||||||
|
if (rflags->af) kputs("AF ");
|
||||||
|
if (rflags->zf) kputs("ZF ");
|
||||||
|
if (rflags->sf) kputs("SF ");
|
||||||
|
if (rflags->tf) kputs("TF ");
|
||||||
|
if (rflags->if_) kputs("IF ");
|
||||||
|
if (rflags->df) kputs("DF ");
|
||||||
|
if (rflags->of) kputs("OF ");
|
||||||
|
if (rflags->iopl) kputs("IOPL ");
|
||||||
|
if (rflags->nt) kputs("NT ");
|
||||||
|
if (rflags->md) kputs("MD ");
|
||||||
|
if (rflags->rf) kputs("RF ");
|
||||||
|
if (rflags->vm) kputs("VM ");
|
||||||
|
if (rflags->ac) kputs("AC ");
|
||||||
|
if (rflags->vif) kputs("VIF ");
|
||||||
|
if (rflags->vip) kputs("VIP ");
|
||||||
|
if (rflags->id) kputs("ID ");
|
||||||
|
kputs("\n");
|
||||||
|
}
|
||||||
|
|
||||||
#define EX_DEBUG 0x01
|
#define EX_DEBUG 0x01
|
||||||
#define EX_BREAKPOINT 0x03
|
#define EX_BREAKPOINT 0x03
|
||||||
#define EX_PAGE_FAULT 0x0e
|
#define EX_PAGE_FAULT 0x0e
|
||||||
|
@ -140,6 +183,10 @@ void idt_exception_handler(uint64_t exception, uint64_t code, struct isr_regs *s
|
||||||
|
|
||||||
kputs("\n");
|
kputs("\n");
|
||||||
|
|
||||||
|
isr_print_regs(state);
|
||||||
|
|
||||||
|
kputs("\n");
|
||||||
|
|
||||||
log_backtrace_ex((void *)state->rip, (void *)state->rbp);
|
log_backtrace_ex((void *)state->rip, (void *)state->rbp);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
|
@ -27,3 +27,5 @@ struct isr_regs {
|
||||||
};
|
};
|
||||||
|
|
||||||
void idt_init(void);
|
void idt_init(void);
|
||||||
|
|
||||||
|
void isr_print_regs(struct isr_regs *regs);
|
||||||
|
|
67
src/arch/amd64/cpu/registers.h
Normal file
67
src/arch/amd64/cpu/registers.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct dr6 {
|
||||||
|
uint64_t b0 : 1,
|
||||||
|
b1 : 1,
|
||||||
|
b2 : 1,
|
||||||
|
b3 : 1,
|
||||||
|
: 7,
|
||||||
|
bld : 1,
|
||||||
|
: 1,
|
||||||
|
bd : 1,
|
||||||
|
bs : 1,
|
||||||
|
bt : 1,
|
||||||
|
rtm : 1,
|
||||||
|
: 47;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dr7 {
|
||||||
|
uint64_t l0 : 1,
|
||||||
|
g0 : 1,
|
||||||
|
l1 : 1,
|
||||||
|
g1 : 1,
|
||||||
|
l2 : 1,
|
||||||
|
g2 : 1,
|
||||||
|
l3 : 1,
|
||||||
|
g3 : 1,
|
||||||
|
: 8,
|
||||||
|
rw0 : 2,
|
||||||
|
len0 : 2,
|
||||||
|
rw1 : 2,
|
||||||
|
len1 : 2,
|
||||||
|
rw2 : 2,
|
||||||
|
len2 : 2,
|
||||||
|
rw3 : 2,
|
||||||
|
len3 : 2,
|
||||||
|
: 32;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rflags {
|
||||||
|
uint64_t cf : 1,
|
||||||
|
: 1,
|
||||||
|
pf : 1,
|
||||||
|
: 1,
|
||||||
|
af : 1,
|
||||||
|
: 1,
|
||||||
|
zf : 1,
|
||||||
|
sf : 1,
|
||||||
|
|
||||||
|
tf : 1,
|
||||||
|
if_ : 1,
|
||||||
|
df : 1,
|
||||||
|
of : 1,
|
||||||
|
iopl : 2,
|
||||||
|
nt : 1,
|
||||||
|
md : 1,
|
||||||
|
|
||||||
|
rf : 1,
|
||||||
|
vm : 1,
|
||||||
|
ac : 1,
|
||||||
|
vif : 1,
|
||||||
|
vip : 1,
|
||||||
|
id : 1,
|
||||||
|
: 42;
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in a new issue