2011-03-15 12:16:27 +00:00
|
|
|
#include "Tier0/panic.h"
|
|
|
|
#include "Tier0/kstdio.h"
|
2011-07-02 11:03:29 +00:00
|
|
|
//#include "Tier0/prng.h"
|
2011-04-03 16:49:04 +00:00
|
|
|
#include "preprocessor_hacks.h"
|
2011-03-15 12:16:27 +00:00
|
|
|
|
2011-04-03 16:49:04 +00:00
|
|
|
#define KPANIC_HEADER(n) KPANIC_HEADER##n
|
|
|
|
|
|
|
|
#define KPANIC_HEADER0 " *** kernel fucking panic ***"
|
|
|
|
#define KPANIC_HEADER1 " *** fucked up beyond all repair ***"
|
|
|
|
#define KPANIC_HEADER2 " *** situation normal - all fucked up ***"
|
2012-05-07 17:22:20 +00:00
|
|
|
#define KPANIC_HEADER3 " *** well shit. ***"
|
|
|
|
#define KPANIC_HEADER4 " *** oh noes!1!1! ***"
|
|
|
|
#define KPANIC_HEADER5 " *** crap! ***"
|
|
|
|
#define KPANIC_HEADER6 " *** flail your arms, for this is a kernel panic ***"
|
|
|
|
#define KPANIC_HEADER7 " *** oh fuck oh fuck oh fuck oh fuck oh fu...***"
|
|
|
|
#define KPANIC_HEADER8 " *** you get to keep the pieces ***"
|
|
|
|
#define KPANIC_HEADER9 " *** just give up already ***"
|
2011-04-03 16:49:04 +00:00
|
|
|
|
|
|
|
#define KPANIC_CASE(n) case n: \
|
|
|
|
return KPANIC_HEADER(n);
|
|
|
|
|
|
|
|
char *kpanic_get_random_message(void)
|
|
|
|
{
|
2011-07-02 11:03:29 +00:00
|
|
|
//u16 N = krand() % 10;
|
|
|
|
u16 N = 0;
|
2011-04-03 16:49:04 +00:00
|
|
|
switch (N)
|
|
|
|
{
|
|
|
|
PPHAX_DO10(KPANIC_CASE);
|
|
|
|
}
|
|
|
|
return KPANIC_HEADER0;
|
|
|
|
}
|
2011-03-15 12:16:27 +00:00
|
|
|
|
2011-03-16 07:33:27 +00:00
|
|
|
void kpanic_ex(const s8 *Error, const s8 *File, u32 Line, T_ISR_REGISTERS R)
|
2011-03-15 12:16:27 +00:00
|
|
|
{
|
|
|
|
__asm__ volatile("cli");
|
|
|
|
|
|
|
|
kclear();
|
|
|
|
|
2011-04-03 16:49:04 +00:00
|
|
|
char *Message = kpanic_get_random_message();
|
|
|
|
|
|
|
|
u8 Margin = (80 - kstrlen(Message)) / 2;
|
2011-03-15 12:16:27 +00:00
|
|
|
|
|
|
|
for (u8 i = 0; i < Margin; i++)
|
|
|
|
kprintf(" ");
|
|
|
|
|
2011-04-03 16:49:04 +00:00
|
|
|
kprintf(Message);
|
2011-03-15 12:16:27 +00:00
|
|
|
kprintf("\n");
|
|
|
|
|
|
|
|
kprintf("\n");
|
|
|
|
|
|
|
|
Margin = (80 - kstrlen(Error)) / 2;
|
|
|
|
for (u8 i = 0; i < Margin; i++)
|
|
|
|
kprintf(" ");
|
|
|
|
kprintf("%s\n", Error);
|
|
|
|
|
2011-03-16 07:33:27 +00:00
|
|
|
if (File != 0)
|
|
|
|
{
|
|
|
|
Margin = (62 - kstrlen(File)) / 2;
|
|
|
|
for (u8 i = 0; i < Margin; i++)
|
|
|
|
kprintf(" ");
|
|
|
|
|
|
|
|
kprintf(" in file %s, line %i\n", File, Line);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Margin = 36;
|
|
|
|
for (u8 i = 0; i < Margin; i++)
|
|
|
|
kprintf(" ");
|
|
|
|
|
|
|
|
kprintf("%x\n", Line);
|
|
|
|
}
|
2011-03-15 12:16:27 +00:00
|
|
|
|
|
|
|
// Dumping registers
|
|
|
|
|
2012-05-08 12:57:44 +00:00
|
|
|
u64 ds, cr0, cr3;
|
2011-03-15 12:16:27 +00:00
|
|
|
|
|
|
|
__asm__ volatile("mov %%cr0, %0": "=r"(cr0));
|
|
|
|
__asm__ volatile("mov %%cr3, %0": "=r"(cr3));
|
|
|
|
__asm__ volatile("mov %%ds, %0": "=r"(ds));
|
|
|
|
|
2011-03-16 07:33:27 +00:00
|
|
|
kprintf("\n register dump:\n");
|
|
|
|
|
2012-05-08 12:57:44 +00:00
|
|
|
kprintf(" cr0: 0x%X cr3: 0x%x cs: 0x%x\n", cr0, cr3, R.cs, ds);
|
2012-07-20 21:26:38 +00:00
|
|
|
kprintf(" rip 0x%X rax: 0x%X rbx: 0x%x\n", R.rip, R.rax, R.rbx);
|
2012-05-08 12:57:44 +00:00
|
|
|
kprintf(" rcx: 0x%x rdx: 0x%x rsi: 0x%x\n", R.rcx, R.rdx, R.rsi);
|
|
|
|
kprintf(" rdi: 0x%x rbp: 0x%x rsp: 0x%x\n", R.rdi, R.rbp, R.rsp);
|
|
|
|
kprintf(" r8 : 0x%x r9 : 0x%x r10: 0x%x\n", R.r8, R.r9, R.r10);
|
|
|
|
kprintf(" r11: 0x%x r12: 0x%x r13: 0x%x\n", R.r11, R.r12, R.r13);
|
|
|
|
kprintf(" r14: 0x%x r15: 0x%x\n", R.r14, R.r15);
|
2011-03-15 12:16:27 +00:00
|
|
|
|
2012-05-08 12:57:44 +00:00
|
|
|
// s64 FrameSize = R.rbp - R.rsp;
|
2011-03-15 12:16:27 +00:00
|
|
|
|
2012-05-08 12:57:44 +00:00
|
|
|
// if (FrameSize > 0 && FrameSize < 0x100)
|
|
|
|
// {
|
|
|
|
kprintf("\n stack frame looks promising...\n");
|
2011-03-15 12:16:27 +00:00
|
|
|
kprintf(" attempting stack dump:\n");
|
|
|
|
|
2012-05-08 12:57:44 +00:00
|
|
|
u64 Number = 20;
|
|
|
|
for (u64 *v = (u64*)R.rsp; v < ((u64 *)R.rsp + Number); v+=4)
|
2011-03-15 12:16:27 +00:00
|
|
|
{
|
2012-05-08 12:57:44 +00:00
|
|
|
kprintf(" %x %x %x %x\n",
|
2011-03-15 12:16:27 +00:00
|
|
|
*v, *(v+1), *(v+2), *(v+3), *(v+4), *(v+5), *(v+6), *(v+7));
|
2012-05-08 12:57:44 +00:00
|
|
|
}
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// kprintf("\n stack looks unusable (%i byte frame), not dummping.\n", FrameSize);
|
2011-03-15 12:16:27 +00:00
|
|
|
|
|
|
|
kprintf("\n if you want to keep using the OS, please reset your PC.");
|
|
|
|
|
|
|
|
for(;;){}
|
|
|
|
}
|
|
|
|
|
2011-03-16 07:33:27 +00:00
|
|
|
void kpanic(const s8 *Error, const s8 *File, u32 Line)
|
|
|
|
{
|
|
|
|
__asm__ volatile("cli");
|
|
|
|
|
|
|
|
T_ISR_REGISTERS R;
|
|
|
|
|
2012-04-21 18:39:09 +00:00
|
|
|
__asm__ volatile("mov %%rax, %0": "=r"(R.rax));
|
|
|
|
__asm__ volatile("mov %%rbx, %0": "=r"(R.rbx));
|
|
|
|
__asm__ volatile("mov %%rcx, %0": "=r"(R.rcx));
|
|
|
|
__asm__ volatile("mov %%rdx, %0": "=r"(R.rdx));
|
|
|
|
|
|
|
|
__asm__ volatile("mov %%rsi, %0": "=r"(R.rsi));
|
|
|
|
__asm__ volatile("mov %%rdi, %0": "=r"(R.rdi));
|
|
|
|
__asm__ volatile("mov %%rbp, %0": "=r"(R.rbp));
|
|
|
|
__asm__ volatile("mov %%rsp, %0": "=r"(R.rsp));
|
2011-03-16 07:33:27 +00:00
|
|
|
|
|
|
|
__asm__ volatile("mov %%cs, %0": "=r"(R.cs));
|
|
|
|
|
|
|
|
kpanic_ex(Error, File, Line, R);
|
|
|
|
}
|
|
|
|
|
2011-03-15 12:16:27 +00:00
|
|
|
void kassert(u8 Value, const s8* File, u32 Line)
|
|
|
|
{
|
|
|
|
if (Value == 0)
|
|
|
|
kpanic("assertion error", File, Line);
|
|
|
|
}
|
|
|
|
|