Commit d05e66d217f8f83487c3b1d3015a67316b47645f
1 parent
2d80ae89
no error code if hardware interrupt
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@371 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
7 additions
and
7 deletions
cpu-exec.c
... | ... | @@ -170,7 +170,7 @@ int cpu_exec(CPUState *env1) |
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,7 +192,7 @@ int cpu_exec(CPUState *env1) |
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 */ | ... | ... |
exec-i386.h
... | ... | @@ -142,7 +142,7 @@ void tlb_fill(unsigned long addr, int is_write, void *retaddr); |
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, | ... | ... |
helper-i386.c
... | ... | @@ -185,7 +185,7 @@ static inline int load_segment(uint32_t *e1_ptr, uint32_t *e2_ptr, |
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,7 +265,7 @@ static void do_interrupt_protected(int intno, int is_int, int error_code, |
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,10 +427,10 @@ void do_interrupt_user(int intno, int is_int, int error_code, |
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 | } | ... | ... |