@@ -37,41 +37,58 @@ extern void _interrupt_handler_0x1D_exception();
3737extern void _interrupt_handler_0x1E_exception ();
3838extern void _interrupt_handler_0x1F_exception ();
3939
40- void interrupt_handler_0x00_0x1F_exception (int id , int err_code , int ds , int ss , int ip , int cs , int eflag ) {
40+ #define gdt_address_from_segment (s , gdte_size ) (((s)%(gdte_size)==0)?get_gdt_baseaddress(gdt_table, GDT_TABLE_SIZE, (s)/(gdte_size)):-1)
41+
42+ struct exceptionContext {
43+ int id ; // exception id
44+
45+ int ss , ds , es , fs , gs ;
46+ int edi , esi , ebp , esp , ebx , edx , ecx , eax ;
47+
48+ // at end
49+ int err_code ; // can be optional for some interrupts.
50+ int ip , cs , eflag ;
51+ };
52+
53+ void interrupt_handler_0x00_0x1F_exception (struct exceptionContext context ) {
54+ // written for handler with error code otherwise ip, cs and eflag will skew.
55+ const int gdte_size = sizeof (struct GDTEntry );
4156 panic_screen_init ();
42- print_log ("Hardware exception %d (0x%x) triggered" , id , id );
43- print_log (" Error Code: %x" , err_code );
44- print_log (" CS : %x (GDT entry)" , cs );
45- print_log (" DS : %x (GDT entry)" , ds );
46- print_log (" SS : %x (GDT entry)" , ss );
47- print_log (" IP : %x" , ip );
48- print_log (" FLAG : %x" , eflag );
49- if (cs %sizeof (struct GDTEntry )== 0 ) {
50- print_log (" PID : %d" , get_idt_reverse_pid_lookup_cs (cs ));
51- unsigned int abs_cs = get_gdt_baseaddress (gdt_table , GDT_TABLE_SIZE , cs /sizeof (struct GDTEntry ));
52- print_log (" abs IP: %x" , abs_cs + ip );
53- print_log (" abs CS: %x" , abs_cs );
54- } else {
55- print_log (" PID : invalid" );
56- print_log (" abs IP: invalid" );
57- print_log (" abs CS: invalid" );
58- }
59- if (ds %sizeof (struct GDTEntry )== 0 ) {
60- print_log (" abs DS: %x" , get_gdt_baseaddress (gdt_table , GDT_TABLE_SIZE , ds /sizeof (struct GDTEntry )));
61- } else {
62- print_log (" abs DS: invalid" );
57+
58+ print_log ("Hardware exception %d (0x%x) triggered" , context .id , context .id );
59+ print_log (" Error Code: %x" , context .err_code );
60+ if (context .cs %gdte_size == 0 ) {
61+ print_log (" PID : %d" , get_idt_reverse_pid_lookup_cs (context .cs ));
6362 }
64- if (ss %sizeof (struct GDTEntry )== 0 ) {
65- print_log (" abs SS: %x" , get_gdt_baseaddress (gdt_table , GDT_TABLE_SIZE , ss /sizeof (struct GDTEntry )));
66- } else {
67- print_log (" abs SS: invalid" );
63+ print_log (" FLAG : %x" , context .eflag );
64+ print_log (" IP : %x" , context .ip );
65+ print_log (" CS : %x => %x" , context .cs , gdt_address_from_segment (context .cs , gdte_size ));
66+ print_log (" DS : %x => %x" , context .ds , gdt_address_from_segment (context .ds , gdte_size ));
67+ print_log (" SS : %x => %x" , context .ss , gdt_address_from_segment (context .ss , gdte_size ));
68+ print_log (" ES : %x => %x" , context .es , gdt_address_from_segment (context .es , gdte_size ));
69+ print_log (" FS : %x => %x" , context .fs , gdt_address_from_segment (context .fs , gdte_size ));
70+ print_log (" GS : %x => %x" , context .gs , gdt_address_from_segment (context .gs , gdte_size ));
71+ print_log (" EAX: %x EBX: %x ECX: %x EDX: %x" , context .eax , context .ebx , context .ecx , context .edx );
72+ print_log (" ESP: %x EBP: %x ESI: %x EDI: %x" , context .esp , context .ebp , context .esi , context .edi );
73+
74+ // stack trace
75+ {
76+ const int stack_trace_max_depth = 5 ;
77+ int last_ebp = context .ebp ;
78+ // stack[ebp] => previous_ebp, if previous_ebp == 0 then break;
79+ for (int i = 0 ; i < stack_trace_max_depth ; i ++ ) {
80+ // to be implemented
81+ break ;
82+ }
83+
6884 }
6985
70- switch (id ) {
86+
87+ switch (context .id ) {
7188 case 0x0D :
72- PANIC (id , "[hw_exception] general_protection_fault" );
89+ PANIC (context . id , "[hw_exception] general_protection_fault" );
7390 }
74- PANIC (id , "[hw_exception] triggered: no handler" );
91+ PANIC (context . id , "[hw_exception] triggered: no handler" );
7592}
7693
7794void interrupt_handler_0x0D_general_protection_fault (int id , int ip , int cs ) {
0 commit comments