55#include "../kklibc/stdlib.h"
66#include "timer.h"
77#include "../drivers/lowlevel_io.h"
8+ #include "../kklibc/stdio.h"
9+ #include "../kklibc/paging/paging.h"
810
911isr_t interrupt_handlers [256 ];
1012
@@ -116,14 +118,47 @@ char *exception_messages[] = {
116118 "Reserved"
117119};
118120
121+ void page_fault_handler (registers_t r ) {
122+ u32 fault_addr ;
123+ asm volatile ("mov %%cr2, %0" : "=r" (fault_addr ));
124+
125+ int present = !(r .err_code & 0x1 ); // Bit 0: 0 if not present
126+ int rw = r .err_code & 0x2 ; // Bit 1: 1 if write
127+ int us = r .err_code & 0x4 ; // Bit 2: 1 if user mode
128+ int reserved = r .err_code & 0x8 ; // Bit 3: 1 if reserved bit overwritten
129+
130+ kprintf ("Page fault at %x: %s %s in %s mode\n" ,
131+ fault_addr ,
132+ present ? "protection fault" : "not present" ,
133+ rw ? "write" : "read" ,
134+ us ? "user" : "kernel" );
135+
136+ debug_page_fault (fault_addr );
137+
138+ if (us ) {
139+ kprintf ("Killing process.\n" );
140+ asm volatile ("hlt" );
141+ return ;
142+ }
143+
144+ kprintf ("Kernel page fault! Halting.\n" );
145+ for (;;);
146+ }
147+
119148void isr_handler (registers_t r ) {
149+ if (r .int_no == 14 ) {
150+ page_fault_handler (r );
151+ }
152+
120153 kprint ("received interrupt: " );
121154 char s [3 ];
122155 int_to_ascii (r .int_no , s );
156+
123157 kprint (s );
124158 kprint ("\n" );
125159 kprint (exception_messages [r .int_no ]);
126160 kprint ("\n" );
161+ asm volatile ("hlt" );
127162}
128163
129164void register_interrupt_handler (u8 n , isr_t handler ) {
@@ -148,6 +183,7 @@ void irq_install() {
148183 asm volatile ("sti" );
149184 /* IRQ0: таймер */
150185 init_timer (50 );
186+
151187 /* IRQ1: клавиатура */
152188 init_keyboard ();
153189}
0 commit comments