From bf72618647ca19fd42bdfabff1a6a643c62c0e34 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 3 Aug 2016 16:24:43 +0200 Subject: [PATCH] Add a handler macro that creates wrapper functions --- src/interrupts/mod.rs | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index b41db333..59554436 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -1,10 +1,28 @@ mod idt; +macro_rules! handler { + ($name: ident) => {{ + #[naked] + extern "C" fn wrapper() -> ! { + unsafe { + asm!("mov rdi, rsp + sub rsp, 8 // align the stack pointer + call $0" + :: "i"($name as extern "C" fn( + *const ExceptionStackFrame) -> !) + : "rdi" : "intel"); + ::core::intrinsics::unreachable(); + } + } + wrapper + }} +} + lazy_static! { static ref IDT: idt::Idt = { let mut idt = idt::Idt::new(); - idt.set_handler(0, divide_by_zero_wrapper); + idt.set_handler(0, handler!(divide_by_zero_handler)); idt }; @@ -26,18 +44,6 @@ struct ExceptionStackFrame { use vga_buffer::print_error; -#[naked] -extern "C" fn divide_by_zero_wrapper() -> ! { - unsafe { - asm!("mov rdi, rsp - sub rsp, 8 // align the stack pointer - call $0" - :: "i"(divide_by_zero_handler as extern "C" fn(_) -> !) - : "rdi" : "intel"); - ::core::intrinsics::unreachable(); - } -} - extern "C" fn divide_by_zero_handler(stack_frame: *const ExceptionStackFrame) -> ! {