Commit d05e66d217f8f83487c3b1d3015a67316b47645f

Authored by bellard
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
cpu-exec.c
@@ -170,7 +170,7 @@ int cpu_exec(CPUState *env1) @@ -170,7 +170,7 @@ int cpu_exec(CPUState *env1)
170 do_interrupt(env->exception_index, 170 do_interrupt(env->exception_index,
171 env->exception_is_int, 171 env->exception_is_int,
172 env->error_code, 172 env->error_code,
173 - env->exception_next_eip); 173 + env->exception_next_eip, 0);
174 #endif 174 #endif
175 } 175 }
176 env->exception_index = -1; 176 env->exception_index = -1;
@@ -192,7 +192,7 @@ int cpu_exec(CPUState *env1) @@ -192,7 +192,7 @@ int cpu_exec(CPUState *env1)
192 if (loglevel) { 192 if (loglevel) {
193 fprintf(logfile, "Servicing hardware INT=0x%02x\n", intno); 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 env->interrupt_request &= ~CPU_INTERRUPT_HARD; 196 env->interrupt_request &= ~CPU_INTERRUPT_HARD;
197 /* ensure that no TB jump will be modified as 197 /* ensure that no TB jump will be modified as
198 the program flow was changed */ 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,7 +142,7 @@ void tlb_fill(unsigned long addr, int is_write, void *retaddr);
142 void __hidden cpu_lock(void); 142 void __hidden cpu_lock(void);
143 void __hidden cpu_unlock(void); 143 void __hidden cpu_unlock(void);
144 void do_interrupt(int intno, int is_int, int error_code, 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 void do_interrupt_user(int intno, int is_int, int error_code, 146 void do_interrupt_user(int intno, int is_int, int error_code,
147 unsigned int next_eip); 147 unsigned int next_eip);
148 void raise_interrupt(int intno, int is_int, int error_code, 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,7 +185,7 @@ static inline int load_segment(uint32_t *e1_ptr, uint32_t *e2_ptr,
185 185
186 /* protected mode interrupt */ 186 /* protected mode interrupt */
187 static void do_interrupt_protected(int intno, int is_int, int error_code, 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 SegmentCache *dt; 190 SegmentCache *dt;
191 uint8_t *ptr, *ssp; 191 uint8_t *ptr, *ssp;
@@ -265,7 +265,7 @@ static void do_interrupt_protected(int intno, int is_int, int error_code, @@ -265,7 +265,7 @@ static void do_interrupt_protected(int intno, int is_int, int error_code,
265 265
266 shift = type >> 3; 266 shift = type >> 3;
267 has_error_code = 0; 267 has_error_code = 0;
268 - if (!is_int) { 268 + if (!is_int && !is_hw) {
269 switch(intno) { 269 switch(intno) {
270 case 8: 270 case 8:
271 case 10: 271 case 10:
@@ -427,10 +427,10 @@ void do_interrupt_user(int intno, int is_int, int error_code, @@ -427,10 +427,10 @@ void do_interrupt_user(int intno, int is_int, int error_code,
427 * instruction. It is only relevant if is_int is TRUE. 427 * instruction. It is only relevant if is_int is TRUE.
428 */ 428 */
429 void do_interrupt(int intno, int is_int, int error_code, 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 if (env->cr[0] & CR0_PE_MASK) { 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 } else { 434 } else {
435 do_interrupt_real(intno, is_int, error_code, next_eip); 435 do_interrupt_real(intno, is_int, error_code, next_eip);
436 } 436 }