@@ -196,35 +196,34 @@ void exception(x86_64_registers* reg) {
196
196
schedule ();
197
197
198
198
case INT_GPF :
199
- console_printf (CPOS (24 , 0 ), 0xC000 , "Process %d GPF (rip=%p)!\n" ,
200
- current -> p_pid , current -> p_registers .reg_rip );
199
+ error_printf (CPOS (23 , 0 ), 0xC000 , "Process %d GPF!\n" , current -> p_pid );
201
200
current -> p_state = P_BLOCKED ;
202
201
break ;
203
202
204
203
case INT_PAGEFAULT : {
205
- uintptr_t faultaddr = rcr2 ();
206
- const char * who = reg -> reg_err & PFERR_USER
207
- ? "user" : "kernel" ;
204
+ uintptr_t addr = rcr2 ();
208
205
const char * operation = reg -> reg_err & PFERR_WRITE
209
- ? "write" : "read" ;
206
+ ? "write" : "read" ;
210
207
const char * problem = reg -> reg_err & PFERR_PRESENT
211
- ? "protection problem" : "missing page" ;
212
-
213
- if (reg -> reg_err & PFERR_USER ) {
214
- console_printf (CPOS (23 , 0 ), 0xC000 ,
215
- "process %d page fault for %p (%s %s, rip=%p)!\n" ,
216
- current -> p_pid , faultaddr , operation , problem ,
217
- reg -> reg_rip );
218
- current -> p_state = P_BLOCKED ;
219
- } else
220
- panic ("%s page fault for %p (%s %s, rip=%p)!\n" ,
221
- who , faultaddr , operation , problem , reg -> reg_rip );
208
+ ? "protection problem" : "missing page" ;
209
+ char name [20 ];
210
+ if (reg -> reg_err & PFERR_USER )
211
+ snprintf (name , sizeof (name ), "Process %d" , current -> p_pid );
212
+ else
213
+ strcpy (name , "Kernel" );
214
+
215
+ error_printf (CPOS (23 , 0 ), 0xC000 ,
216
+ "%s page fault for %p (%s %s, rip=%p)!\n" ,
217
+ name , addr , operation , problem , reg -> reg_rip );
218
+ if (!(reg -> reg_err & PFERR_USER ))
219
+ panic ("Kernel page fault" );
220
+ current -> p_state = P_BLOCKED ;
222
221
break ;
223
222
}
224
223
225
224
default :
226
- panic ("Unexpected exception %d!\n" , current -> p_registers . reg_intno );
227
- break ; /* will not be reached */
225
+ panic ("Unexpected exception %d!\n" , reg -> reg_intno );
226
+ break ; /* will not be reached */
228
227
229
228
}
230
229
@@ -273,7 +272,9 @@ void run(proc* p) {
273
272
assert (p -> p_state == P_RUNNABLE );
274
273
current = p ;
275
274
275
+ // Load the process's current pagetable
276
276
lcr3 ((uintptr_t ) p -> p_pagetable );
277
+
277
278
// This function is defined in k-exception.S. It restores the process's
278
279
// registers then jumps back to user mode.
279
280
exception_return (& p -> p_registers );
0 commit comments