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