LibXenon
Bare-metal Xbox 360 homebrew library
Loading...
Searching...
No Matches
c_except.c
Go to the documentation of this file.
1#include <console/console.h>
2#include <ppc/cache.h>
3#include <ppc/register.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <time/time.h>
10#include <xenos/xenos.h>
11#include <xetypes.h>
12
13#define CPU_STACK_TRACE_DEPTH 10
14
15static char text[4096]="\0";
16
17typedef struct _framerec {
18 struct _framerec *up;
19 void *lr;
21
22static int ptr_seems_valid(void * p){
23 return (u32)p>=0x80000000 && (u32)p<0xa0000000;
24}
25
26/* adapted from libogc exception.c */
27static void _cpu_print_stack(void *pc,void *lr,void *r1)
28{
29 register u32 i = 0;
30 register frame_rec_t l,p = (frame_rec_t)lr;
31
32 l = p;
33 p = r1;
34
35 if (!ptr_seems_valid(p)) return;
36
37 sprintf(text,"%s\nSTACK DUMP:",text);
38
39 for(i=0;i<CPU_STACK_TRACE_DEPTH-1 && ptr_seems_valid(p->up);p=p->up,i++) {
40 if(i%4) sprintf(text,"%s --> ",text);
41 else {
42 if(i>0) sprintf(text,"%s -->\n",text);
43 else sprintf(text,"%s\n",text);
44 }
45
46 switch(i) {
47 case 0:
48 if(pc) sprintf(text,"%s%p",text,pc);
49 break;
50 case 1:
51 sprintf(text,"%s%p",text,(void*)l);
52 break;
53 default:
54 if(p && p->up) sprintf(text,"%s%p",text,(u32)(p->up->lr));
55 break;
56 }
57 }
58}
59
60static void flush_console()
61{
62 char * p=text;
63 while(*p){
64 putch(*p);
65 console_putch(*p++);
66 }
67
68 text[0]='\0';
69}
70
71void crashdump(u32 exception,u64 * context)
72{
75
76 console_set_colors(0x000080ff, 0xffffffff);
79
80 if (exception){
81 sprintf(text,"\nException vector! (%p)\n\n",exception);
82 }else{
83 strcpy(text,"\nSegmentation fault!\n\n");
84 }
85
86 flush_console();
87
88 sprintf(text,"%spir=%016llx dar=%016llx\nsr0=%016llx sr1=%016llx lr=%016llx\n\n",
89 text,context[39],context[38],context[36],context[37],context[32]);
90
91 flush_console();
92
93 int i;
94 for(i=0;i<8;++i)
95 sprintf(text,"%s%02d=%016llx %02d=%016llx %02d=%016llx %02d=%016llx\n",
96 text,i,context[i],i+8,context[i+8],i+16,context[i+16],i+24,context[i+24]);
97
98 flush_console();
99
100 _cpu_print_stack((void*)(u32)context[36],(void*)(u32)context[32],(void*)(u32)context[1]);
101
102 strcat(text,"\n\nOn uart: 'x'=Xell, 'h'=Halt, 'r'=Reboot\n\n");
103
104 flush_console();
105
106 for(;;){
107 switch(getch()){
108 case 'x':
109 exit(0);
110 break;
111 case 'h':
113 for(;;);
114 break;
115 case 'r':
117 for(;;);
118 break;
119 }
120 }
121}
struct _framerec * frame_rec_t
void crashdump(u32 exception, u64 *context)
Definition: c_except.c:71
#define CPU_STACK_TRACE_DEPTH
Definition: c_except.c:13
struct _framerec frame_rec
void console_clrscr()
Definition: console.c:82
void console_set_colors(unsigned int background, unsigned int foreground)
Definition: console.c:191
void console_init(void)
Definition: console.c:163
void console_putch(const char c)
Definition: console.c:139
void * lr
Definition: c_except.c:19
struct _framerec * up
Definition: c_except.c:18
void xenon_smc_power_reboot(void)
Definition: xenon_smc.c:274
void xenon_smc_power_shutdown(void)
Definition: xenon_smc.c:268
void putch(unsigned char c)
Definition: xenon_uart.c:5
int getch(void)
Definition: xenon_uart.c:24
int xenos_is_initialized()
Definition: xenos.c:645
void xenos_init(int videoMode)
Definition: xenos.c:599
#define VIDEO_MODE_AUTO
uint64_t u64
64bit unsigned integer
Definition: xetypes.h:15
uint32_t u32
32bit unsigned integer
Definition: xetypes.h:14