1 /////////////////////////////////////////////////////////////////////////
2 // $Id: soft_int.cc,v 1.32 2006/08/31 18:18:17 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
5 // Copyright (C) 2001 MandrakeSoft S.A.
9 // 75002 Paris - France
10 // http://www.linux-mandrake.com/
11 // http://www.mandrakesoft.com/
13 // This library is free software; you can redistribute it and/or
14 // modify it under the terms of the GNU Lesser General Public
15 // License as published by the Free Software Foundation; either
16 // version 2 of the License, or (at your option) any later version.
18 // This library is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 // Lesser General Public License for more details.
23 // You should have received a copy of the GNU Lesser General Public
24 // License along with this library; if not, write to the Free Software
25 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #define NEED_CPU_REG_SHORTCUTS 1
31 #define LOG_THIS BX_CPU_THIS_PTR
33 #if BX_EXTERNAL_DEBUGGER
37 void BX_CPU_C::BOUND_GwMa(bxInstruction_c
*i
)
40 BX_INFO(("BOUND_GwMa: op2 must be memory reference"));
44 Bit16s bound_min
, bound_max
;
45 Bit16s op1_16
= BX_READ_16BIT_REG(i
->nnn());
47 read_virtual_word(i
->seg(), RMAddr(i
), (Bit16u
*) &bound_min
);
48 read_virtual_word(i
->seg(), RMAddr(i
)+2, (Bit16u
*) &bound_max
);
50 if (op1_16
< bound_min
|| op1_16
> bound_max
) {
51 BX_INFO(("BOUND_GdMa: fails bounds test"));
52 exception(BX_BR_EXCEPTION
, 0, 0);
56 void BX_CPU_C::BOUND_GdMa(bxInstruction_c
*i
)
59 BX_INFO(("BOUND_GdMa: op2 must be memory reference"));
63 Bit32s bound_min
, bound_max
;
64 Bit32s op1_32
= BX_READ_32BIT_REG(i
->nnn());
66 read_virtual_dword(i
->seg(), RMAddr(i
), (Bit32u
*) &bound_min
);
67 read_virtual_dword(i
->seg(), RMAddr(i
)+4, (Bit32u
*) &bound_max
);
69 if (op1_32
< bound_min
|| op1_32
> bound_max
) {
70 BX_INFO(("BOUND_GdMa: fails bounds test"));
71 exception(BX_BR_EXCEPTION
, 0, 0);
75 void BX_CPU_C::INT1(bxInstruction_c
*i
)
77 // This is an undocumented instrucion (opcode 0xf1)
78 // which is useful for an ICE system.
81 BX_CPU_THIS_PTR show_flag
|= Flag_softint
;
84 #if BX_EXTERNAL_DEBUGGER
88 interrupt(1, 1, 0, 0);
89 BX_INSTR_FAR_BRANCH(BX_CPU_ID
, BX_INSTR_IS_INT
,
90 BX_CPU_THIS_PTR sregs
[BX_SEG_REG_CS
].selector
.value
,
94 void BX_CPU_C::INT3(bxInstruction_c
*i
)
96 // INT 3 is not IOPL sensitive
99 BX_CPU_THIS_PTR show_flag
|= Flag_softint
;
102 interrupt(3, 1, 0, 0);
103 BX_INSTR_FAR_BRANCH(BX_CPU_ID
, BX_INSTR_IS_INT
,
104 BX_CPU_THIS_PTR sregs
[BX_SEG_REG_CS
].selector
.value
,
109 void BX_CPU_C::INT_Ib(bxInstruction_c
*i
)
112 BX_CPU_THIS_PTR show_flag
|= Flag_softint
;
115 Bit8u vector
= i
->Ib();
119 if (BX_CPU_THIS_PTR cr4
.get_VME())
121 Bit8u vme_redirection_bitmap
;
124 access_linear(BX_CPU_THIS_PTR tr
.cache
.u
.system
.base
+ 102,
125 2, 0, BX_READ
, &io_base
);
126 access_linear(BX_CPU_THIS_PTR tr
.cache
.u
.system
.base
+ io_base
- 32 + (vector
>> 3),
127 1, 0, BX_READ
, &vme_redirection_bitmap
);
129 if (! (vme_redirection_bitmap
& (1 << (vector
& 7))))
131 // redirect interrupt through virtual-mode idt
132 v86_redirect_interrupt(vector
);
137 // interrupt is not redirected or VME is OFF
138 if (BX_CPU_THIS_PTR
get_IOPL() < 3)
140 BX_DEBUG(("INT_Ib(): Interrupt cannot be redirected, generate #GP(0)"));
141 exception(BX_GP_EXCEPTION
, 0, 0);
145 #ifdef SHOW_EXIT_STATUS
146 if ( (vector
== 0x21) && (AH
== 0x4c) ) {
147 BX_INFO(("INT 21/4C called AL=0x%02x, BX=0x%04x", (unsigned) AL
, (unsigned) BX
));
151 interrupt(vector
, 1, 0, 0);
152 BX_INSTR_FAR_BRANCH(BX_CPU_ID
, BX_INSTR_IS_INT
,
153 BX_CPU_THIS_PTR sregs
[BX_SEG_REG_CS
].selector
.value
,
157 void BX_CPU_C::INTO(bxInstruction_c
*i
)
160 BX_CPU_THIS_PTR show_flag
|= Flag_softint
;
164 interrupt(4, 1, 0, 0);
165 BX_INSTR_FAR_BRANCH(BX_CPU_ID
, BX_INSTR_IS_INT
,
166 BX_CPU_THIS_PTR sregs
[BX_SEG_REG_CS
].selector
.value
,