0c2da16e8fada30dab670431e1e29830ac4fb9e3
[tpg/acess2.git] / Kernel / arch / x86 / errors.c
1 /*
2  * Acess2 - x86 Architecture
3  * arch/x86/errors.c
4  * - CPU Error Handler
5  */
6 #include <common.h>
7
8 // === CONSTANTS ===
9 #define MAX_BACKTRACE   8       //!< Maximum distance to trace the stack backwards
10
11 // === IMPORTS ===
12 extern void     MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs);
13 extern void Threads_Dump();
14
15 // === PROTOTYPES ===
16 void    Error_Backtrace(Uint eip, Uint ebp);
17
18 // === CODE ===
19 /**
20  * \fn void ErrorHandler(tRegs *Regs)
21  * \brief General Error Handler
22  */
23 void ErrorHandler(tRegs *Regs)
24 {
25         Uint    cr;
26         __asm__ __volatile__ ("cli");
27         
28         if(Regs->int_num == 14)
29         {
30                 __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr));
31                 MM_PageFault( cr, Regs->err_code, Regs );
32                 return ;
33         }
34         
35         Warning("CPU Error %i, Code: 0x%x", Regs->int_num, Regs->err_code);
36         Warning(" CS:EIP = 0x%04x:%08x", Regs->cs, Regs->eip);
37         Warning(" SS:ESP = 0x%04x:%08x", Regs->ss, Regs->esp);
38         Warning(" EFLAGS = 0x%08x", Regs->eflags);
39         Warning(" EAX %08x EBX %08x", Regs->eax, Regs->ebx);
40         Warning(" ECX %08x EDX %08x", Regs->ecx, Regs->edx);
41         Warning(" ESP %08x EBP %08x", Regs->esp, Regs->ebp);
42         Warning(" ESI %08x EDI %08x", Regs->esi, Regs->edi);
43         Warning(" DS %04x ES %04x", Regs->ds, Regs->es);
44         Warning(" FS %04x GS %04x", Regs->fs, Regs->gs);
45         
46         // Control Registers
47         __asm__ __volatile__ ("mov %%cr0, %0":"=r"(cr));
48         Warning(" CR0: 0x%08x", cr);
49         __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr));
50         Warning(" CR2: 0x%08x", cr);
51         __asm__ __volatile__ ("mov %%cr3, %0":"=r"(cr));
52         Warning(" CR3: 0x%08x", cr);
53         
54         // Print Stack Backtrace
55         Error_Backtrace(Regs->eip, Regs->ebp);
56         
57         // Dump running threads
58         Threads_Dump();
59         
60         for(;;) __asm__ __volatile__ ("hlt");
61 }
62 /**
63  * \fn void Error_Backtrace(Uint eip, Uint ebp)
64  * \brief Unrolls the stack to trace execution
65  */
66 void Error_Backtrace(Uint eip, Uint ebp)
67 {
68          int    i = 0;
69         Uint    delta = 0;
70         char    *str = NULL;
71         
72         //if(eip < 0xC0000000 && eip > 0x1000)
73         //{
74         //      LogF("Backtrace: User - 0x%x\n", eip);
75         //      return;
76         //}
77         
78         if(eip > 0xE0000000)
79         {
80                 LogF("Backtrace: Data Area - 0x%x\n", eip);
81                 return;
82         }
83         
84         if(eip > 0xC8000000)
85         {
86                 LogF("Backtrace: Kernel Module - 0x%x\n", eip);
87                 return;
88         }
89         
90         //str = Debug_GetSymbol(eip, &delta);
91         if(str == NULL)
92                 LogF("Backtrace: 0x%x", eip);
93         else
94                 LogF("Backtrace: %s+0x%x", str, delta);
95         if(!MM_GetPhysAddr(ebp))
96         {
97                 LogF("\nBacktrace: Invalid EBP, stopping\n");
98                 return;
99         }
100         
101         
102         while( MM_GetPhysAddr(ebp) && i < MAX_BACKTRACE )
103         {
104                 //str = Debug_GetSymbol(*(Uint*)(ebp+4), &delta);
105                 if(str == NULL)
106                         LogF(" >> 0x%x", *(Uint*)(ebp+4));
107                 else
108                         LogF(" >> %s+0x%x", str, delta);
109                 ebp = *(Uint*)ebp;
110                 i++;
111         }
112         LogF("\n");
113 }

UCC git Repository :: git.ucc.asn.au