-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathirq_emu.c
More file actions
56 lines (44 loc) · 1.43 KB
/
irq_emu.c
File metadata and controls
56 lines (44 loc) · 1.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "irq_emu.h"
#include "irq.h"
#include "io.h"
#include "idt.h"
#include "interrupt_emu.h"
#include "gdebug.h"
#include "system.h"
#include "vga.h"
static BYTE master_pic_irq_base = 0;
static BYTE slave_pic_irq_base = 0;
void regist_master_idt_base_addr(BYTE base_addr)
{
master_pic_irq_base = base_addr;
}
void regist_slave_idt_base_addr(BYTE base_addr)
{
slave_pic_irq_base = base_addr;
}
//void redirect_irq(DWORD irq_num, pushed_regs *regs, DWORD error_code, va_list arg){
void redirect_irq(DWORD irq_num, pushed_regs *regs, va_list arg)
{
DWORD target_vect_num;
irq_stack *common_stack;
intr_stack *stack;
va_list orig_list = arg;
common_stack = &va_arg(arg, irq_stack);
if (common_stack->eflags & 0x20000) {
_sys_printf("not support v8086 irq\n");
return;
}
if (common_stack->cs == _KERNEL_CS) {
return;
}else{
stack = &va_arg(orig_list, intr_stack);
}
if (irq_num >= 8) {
target_vect_num = slave_pic_irq_base + (irq_num - 8);
} else {
target_vect_num = master_pic_irq_base + irq_num;
}
/* _sys_printf("idt: %d, irq: %d\n", target_vect_num, irq_num); */
/* jmp_v_idtr(regs, &stack, target_vect_num, 1, error_code); */
jmp_v_idtr(regs, stack, target_vect_num, 0, 0);
}