|
|
| version 1.11, 2004/02/19 03:04:01 | version 1.12, 2004/02/20 16:09:04 |
|---|---|
| Line 210 exception(int num, int error_code) | Line 210 exception(int num, int error_code) |
| * D : ゲートのサイズ.0 = 16 bit, 1 = 32 bit | * D : ゲートのサイズ.0 = 16 bit, 1 = 32 bit |
| */ | */ |
| static void interrupt_task_gate(descriptor_t *gdp, int softintp, int errorp, int error_code); | static void interrupt_task_gate(descriptor_t *gd, int softintp, int errorp, int error_code); |
| static void interrupt_intr_or_trap(descriptor_t *gdp, int softintp, int errorp, int error_code); | static void interrupt_intr_or_trap(descriptor_t *gd, int softintp, int errorp, int error_code); |
| void | void |
| interrupt(int num, int softintp, int errorp, int error_code) | interrupt(int num, int softintp, int errorp, int error_code) |
| { | { |
| descriptor_t gd; | descriptor_t gd; |
| DWORD idt_idx; | UINT idt_idx; |
| DWORD new_ip; | UINT32 new_ip; |
| WORD new_cs; | UINT16 new_cs; |
| VERBOSE(("interrupt: num = 0x%02x, softintp = %s, errorp = %s, error_code = %08x", num, softintp ? "on" : "off", errorp ? "on" : "off", error_code)); | VERBOSE(("interrupt: num = 0x%02x, softintp = %s, errorp = %s, error_code = %08x", num, softintp ? "on" : "off", errorp ? "on" : "off", error_code)); |
| Line 327 interrupt(int num, int softintp, int err | Line 327 interrupt(int num, int softintp, int err |
| } | } |
| static void | static void |
| interrupt_task_gate(descriptor_t *gdp, int softintp, int errorp, int error_code) | interrupt_task_gate(descriptor_t *gd, int softintp, int errorp, int error_code) |
| { | { |
| selector_t task_sel; | selector_t task_sel; |
| int rv; | int rv; |
| Line 336 interrupt_task_gate(descriptor_t *gdp, i | Line 336 interrupt_task_gate(descriptor_t *gdp, i |
| (void)softintp; | (void)softintp; |
| rv = parse_selector(&task_sel, gdp->u.gate.selector); | rv = parse_selector(&task_sel, gd->u.gate.selector); |
| if (rv < 0 || task_sel.ldt) { | if (rv < 0 || task_sel.ldt) { |
| VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d, %cDT)", gdp->u.gate.selector, rv, task_sel.ldt ? 'L' : 'G')); | VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d, %cDT)", gd->u.gate.selector, rv, task_sel.ldt ? 'L' : 'G')); |
| EXCEPTION(TS_EXCEPTION, task_sel.idx); | EXCEPTION(TS_EXCEPTION, task_sel.idx); |
| } | } |
| Line 372 interrupt_task_gate(descriptor_t *gdp, i | Line 372 interrupt_task_gate(descriptor_t *gdp, i |
| } | } |
| static void | static void |
| interrupt_intr_or_trap(descriptor_t *gdp, int softintp, int errorp, int error_code) | interrupt_intr_or_trap(descriptor_t *gd, int softintp, int errorp, int error_code) |
| { | { |
| selector_t cs_sel, ss_sel; | selector_t cs_sel, ss_sel; |
| DWORD old_flags; | UINT stacksize; |
| DWORD new_flags; | UINT32 old_flags; |
| DWORD mask; | UINT32 new_flags; |
| DWORD stacksize; | UINT32 mask; |
| DWORD sp; | UINT32 sp; |
| DWORD new_ip, new_sp; | UINT32 new_ip, new_sp; |
| DWORD old_ip, old_sp; | UINT32 old_ip, old_sp; |
| WORD old_cs, old_ss, new_ss; | UINT16 old_cs, old_ss, new_ss; |
| int rv; | int rv; |
| new_ip = gdp->u.gate.offset; | new_ip = gd->u.gate.offset; |
| old_ss = CPU_SS; | old_ss = CPU_SS; |
| old_cs = CPU_CS; | old_cs = CPU_CS; |
| old_ip = CPU_EIP; | old_ip = CPU_EIP; |
| old_sp = CPU_ESP; | old_sp = CPU_ESP; |
| new_flags = old_flags = REAL_EFLAGREG; | new_flags = old_flags = REAL_EFLAGREG; |
| switch (gdp->type) { | switch (gd->type) { |
| case CPU_SYSDESC_TYPE_INTR_16: | case CPU_SYSDESC_TYPE_INTR_16: |
| case CPU_SYSDESC_TYPE_INTR_32: | case CPU_SYSDESC_TYPE_INTR_32: |
| VERBOSE(("interrupt: INTERRUPT-GATE")); | VERBOSE(("interrupt: INTERRUPT-GATE")); |
| Line 411 interrupt_intr_or_trap(descriptor_t *gdp | Line 411 interrupt_intr_or_trap(descriptor_t *gdp |
| new_flags &= ~(T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG); | new_flags &= ~(T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG); |
| mask |= T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG; | mask |= T_FLAG|RF_FLAG|NT_FLAG|VM_FLAG; |
| rv = parse_selector(&cs_sel, gdp->u.gate.selector); | rv = parse_selector(&cs_sel, gd->u.gate.selector); |
| if (rv < 0) { | if (rv < 0) { |
| VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d)", gdp->u.gate.selector, rv)); | VERBOSE(("interrupt: parse_selector (selector = %04x, rv = %d)", gd->u.gate.selector, rv)); |
| EXCEPTION(GP_EXCEPTION, cs_sel.idx + !softintp); | EXCEPTION(GP_EXCEPTION, cs_sel.idx + !softintp); |
| } | } |
| Line 454 interrupt_intr_or_trap(descriptor_t *gdp | Line 454 interrupt_intr_or_trap(descriptor_t *gdp |
| VERBOSE(("interrupt: INTERRUPT-FROM-VIRTUAL-8086-MODE")); | VERBOSE(("interrupt: INTERRUPT-FROM-VIRTUAL-8086-MODE")); |
| stacksize = errorp ? 20 : 18; | stacksize = errorp ? 20 : 18; |
| } | } |
| switch (gdp->type) { | switch (gd->type) { |
| case CPU_SYSDESC_TYPE_INTR_32: | case CPU_SYSDESC_TYPE_INTR_32: |
| case CPU_SYSDESC_TYPE_TRAP_32: | case CPU_SYSDESC_TYPE_TRAP_32: |
| stacksize *= 2; | stacksize *= 2; |
| Line 514 interrupt_intr_or_trap(descriptor_t *gdp | Line 514 interrupt_intr_or_trap(descriptor_t *gdp |
| load_cs(cs_sel.selector, &cs_sel.desc, cs_sel.desc.dpl); | load_cs(cs_sel.selector, &cs_sel.desc, cs_sel.desc.dpl); |
| SET_EIP(new_ip); | SET_EIP(new_ip); |
| switch (gdp->type) { | switch (gd->type) { |
| case CPU_SYSDESC_TYPE_INTR_32: | case CPU_SYSDESC_TYPE_INTR_32: |
| case CPU_SYSDESC_TYPE_TRAP_32: | case CPU_SYSDESC_TYPE_TRAP_32: |
| if (CPU_STAT_VM86) { | if (CPU_STAT_VM86) { |
| Line 571 interrupt_intr_or_trap(descriptor_t *gdp | Line 571 interrupt_intr_or_trap(descriptor_t *gdp |
| VERBOSE(("interrupt: INTRA-PRIVILEGE-LEVEL-INTERRUPT")); | VERBOSE(("interrupt: INTRA-PRIVILEGE-LEVEL-INTERRUPT")); |
| stacksize = errorp ? 8 : 6; | stacksize = errorp ? 8 : 6; |
| switch (gdp->type) { | switch (gd->type) { |
| case CPU_SYSDESC_TYPE_INTR_32: | case CPU_SYSDESC_TYPE_INTR_32: |
| case CPU_SYSDESC_TYPE_TRAP_32: | case CPU_SYSDESC_TYPE_TRAP_32: |
| stacksize *= 2; | stacksize *= 2; |
| Line 594 interrupt_intr_or_trap(descriptor_t *gdp | Line 594 interrupt_intr_or_trap(descriptor_t *gdp |
| load_cs(cs_sel.selector, &cs_sel.desc, CPU_STAT_CPL); | load_cs(cs_sel.selector, &cs_sel.desc, CPU_STAT_CPL); |
| SET_EIP(new_ip); | SET_EIP(new_ip); |
| switch (gdp->type) { | switch (gd->type) { |
| case CPU_SYSDESC_TYPE_INTR_32: | case CPU_SYSDESC_TYPE_INTR_32: |
| case CPU_SYSDESC_TYPE_TRAP_32: | case CPU_SYSDESC_TYPE_TRAP_32: |
| PUSH0_32(old_flags); | PUSH0_32(old_flags); |