int set_isr(int irq, void (*isr)(void), _go32_dpmi_seginfo *prev_isr) { int vector = irq_vector(irq); if(_go32_dpmi_get_protected_mode_interrupt_vector(vector, prev_isr)) return -1; _go32_dpmi_seginfo new_isr; new_isr.pm_selector = _go32_my_cs( ); new_isr.pm_offset=(unsigned long) isr; if(_go32_dpmi_set_protected_mode_interrupt_vector(vector, &new_isr)) return -1; return 0; }
int set_isr_c_wrapper(int irq, void (*isr)(void), _go32_dpmi_seginfo *prev_isr) { int vector = irq_vector(irq); if(_go32_dpmi_get_protected_mode_interrupt_vector(vector, prev_isr)) return -1; _go32_dpmi_seginfo new_isr; new_isr.pm_selector = _go32_my_cs(); new_isr.pm_offset=(unsigned long) isr; /* prepara função assembly para chamar função C */ _go32_dpmi_allocate_iret_wrapper(&new_isr); if(_go32_dpmi_set_protected_mode_interrupt_vector(vector, &new_isr)) return -1; return 0; }
void restore_isr_c_wrapper(int irq, _go32_dpmi_seginfo *isr) { int vector = irq_vector(irq); _go32_dpmi_set_protected_mode_interrupt_vector(vector, isr); }