Revision d05e66d2
b/cpu-exec.c | ||
---|---|---|
170 | 170 |
do_interrupt(env->exception_index, |
171 | 171 |
env->exception_is_int, |
172 | 172 |
env->error_code, |
173 |
env->exception_next_eip); |
|
173 |
env->exception_next_eip, 0);
|
|
174 | 174 |
#endif |
175 | 175 |
} |
176 | 176 |
env->exception_index = -1; |
... | ... | |
192 | 192 |
if (loglevel) { |
193 | 193 |
fprintf(logfile, "Servicing hardware INT=0x%02x\n", intno); |
194 | 194 |
} |
195 |
do_interrupt(intno, 0, 0, 0); |
|
195 |
do_interrupt(intno, 0, 0, 0, 1);
|
|
196 | 196 |
env->interrupt_request &= ~CPU_INTERRUPT_HARD; |
197 | 197 |
/* ensure that no TB jump will be modified as |
198 | 198 |
the program flow was changed */ |
b/exec-i386.h | ||
---|---|---|
142 | 142 |
void __hidden cpu_lock(void); |
143 | 143 |
void __hidden cpu_unlock(void); |
144 | 144 |
void do_interrupt(int intno, int is_int, int error_code, |
145 |
unsigned int next_eip); |
|
145 |
unsigned int next_eip, int is_hw);
|
|
146 | 146 |
void do_interrupt_user(int intno, int is_int, int error_code, |
147 | 147 |
unsigned int next_eip); |
148 | 148 |
void raise_interrupt(int intno, int is_int, int error_code, |
b/helper-i386.c | ||
---|---|---|
185 | 185 |
|
186 | 186 |
/* protected mode interrupt */ |
187 | 187 |
static void do_interrupt_protected(int intno, int is_int, int error_code, |
188 |
unsigned int next_eip) |
|
188 |
unsigned int next_eip, int is_hw)
|
|
189 | 189 |
{ |
190 | 190 |
SegmentCache *dt; |
191 | 191 |
uint8_t *ptr, *ssp; |
... | ... | |
265 | 265 |
|
266 | 266 |
shift = type >> 3; |
267 | 267 |
has_error_code = 0; |
268 |
if (!is_int) { |
|
268 |
if (!is_int && !is_hw) {
|
|
269 | 269 |
switch(intno) { |
270 | 270 |
case 8: |
271 | 271 |
case 10: |
... | ... | |
427 | 427 |
* instruction. It is only relevant if is_int is TRUE. |
428 | 428 |
*/ |
429 | 429 |
void do_interrupt(int intno, int is_int, int error_code, |
430 |
unsigned int next_eip) |
|
430 |
unsigned int next_eip, int is_hw)
|
|
431 | 431 |
{ |
432 | 432 |
if (env->cr[0] & CR0_PE_MASK) { |
433 |
do_interrupt_protected(intno, is_int, error_code, next_eip); |
|
433 |
do_interrupt_protected(intno, is_int, error_code, next_eip, is_hw);
|
|
434 | 434 |
} else { |
435 | 435 |
do_interrupt_real(intno, is_int, error_code, next_eip); |
436 | 436 |
} |
Also available in: Unified diff