Skip to content

Commit 64e316b

Browse files
committed
kernel/idt: Handle kernel page-faults to user-memory
The page-fault handler did not handle faults to the user memory region correctly when they were coming from kernel code. Rewrite the handler to implement the right behavior. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
1 parent a78b18a commit 64e316b

1 file changed

Lines changed: 17 additions & 22 deletions

File tree

kernel/src/cpu/idt/svsm.rs

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -277,34 +277,29 @@ extern "C" fn ex_handler_page_fault(ctxt: &mut X86ExceptionContext, vector: usiz
277277
let err = ctxt.error_code;
278278
let vaddr = VirtAddr::from(cr2);
279279

280-
if user_mode(ctxt) {
281-
let kill_task: bool = if is_task_fault(vaddr) {
282-
current_task()
283-
.fault(vaddr, (err & PageFaultError::W.bits() as usize) != 0)
284-
.is_err()
285-
} else {
286-
true
287-
};
280+
let resolved = if is_task_fault(vaddr) {
281+
current_task()
282+
.fault(vaddr, (err & PageFaultError::W.bits() as usize) != 0)
283+
.is_ok()
284+
} else {
285+
this_cpu()
286+
.handle_pf(vaddr, (err & PageFaultError::W.bits() as usize) != 0)
287+
.is_ok()
288+
};
288289

289-
if kill_task {
290+
if !resolved {
291+
if user_mode(ctxt) {
290292
log::error!(
291293
"Unexpected user-mode page-fault at RIP {rip:#018x} CR2: {cr2:#018x} error code: {err:#018x} - Terminating task"
292294
);
293295
terminate();
296+
} else if !handle_exception_table(ctxt) {
297+
handle_debug_exception(ctxt, vector);
298+
panic!(
299+
"Unhandled Page-Fault at RIP {:#018x} CR2: {:#018x} error code: {:#018x}",
300+
rip, cr2, err
301+
);
294302
}
295-
} else if this_cpu()
296-
.handle_pf(
297-
VirtAddr::from(cr2),
298-
(err & PageFaultError::W.bits() as usize) != 0,
299-
)
300-
.is_err()
301-
&& !handle_exception_table(ctxt)
302-
{
303-
handle_debug_exception(ctxt, vector);
304-
panic!(
305-
"Unhandled Page-Fault at RIP {:#018x} CR2: {:#018x} error code: {:#018x}",
306-
rip, cr2, err
307-
);
308303
}
309304
}
310305

0 commit comments

Comments
 (0)