185 |
|
|
186 |
/* protected mode interrupt */ |
/* protected mode interrupt */ |
187 |
static void do_interrupt_protected(int intno, int is_int, int error_code, |
static void do_interrupt_protected(int intno, int is_int, int error_code, |
188 |
unsigned int next_eip) |
unsigned int next_eip, int is_hw) |
189 |
{ |
{ |
190 |
SegmentCache *dt; |
SegmentCache *dt; |
191 |
uint8_t *ptr, *ssp; |
uint8_t *ptr, *ssp; |
265 |
|
|
266 |
shift = type >> 3; |
shift = type >> 3; |
267 |
has_error_code = 0; |
has_error_code = 0; |
268 |
if (!is_int) { |
if (!is_int && !is_hw) { |
269 |
switch(intno) { |
switch(intno) { |
270 |
case 8: |
case 8: |
271 |
case 10: |
case 10: |
427 |
* instruction. It is only relevant if is_int is TRUE. |
* instruction. It is only relevant if is_int is TRUE. |
428 |
*/ |
*/ |
429 |
void do_interrupt(int intno, int is_int, int error_code, |
void do_interrupt(int intno, int is_int, int error_code, |
430 |
unsigned int next_eip) |
unsigned int next_eip, int is_hw) |
431 |
{ |
{ |
432 |
if (env->cr[0] & CR0_PE_MASK) { |
if (env->cr[0] & CR0_PE_MASK) { |
433 |
do_interrupt_protected(intno, is_int, error_code, next_eip); |
do_interrupt_protected(intno, is_int, error_code, next_eip, is_hw); |
434 |
} else { |
} else { |
435 |
do_interrupt_real(intno, is_int, error_code, next_eip); |
do_interrupt_real(intno, is_int, error_code, next_eip); |
436 |
} |
} |