Commit b689bc57d62dca9c48d8be15914d3dd53e33443e

Authored by bellard
1 parent a69d83b6

more accurate signal handling


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@123 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 18 additions and 8 deletions
linux-user/main.c
@@ -67,34 +67,34 @@ void gemu_log(const char *fmt, ...) @@ -67,34 +67,34 @@ void gemu_log(const char *fmt, ...)
67 /***********************************************************/ 67 /***********************************************************/
68 /* CPUX86 core interface */ 68 /* CPUX86 core interface */
69 69
70 -void cpu_x86_outb(int addr, int val) 70 +void cpu_x86_outb(CPUX86State *env, int addr, int val)
71 { 71 {
72 fprintf(stderr, "outb: port=0x%04x, data=%02x\n", addr, val); 72 fprintf(stderr, "outb: port=0x%04x, data=%02x\n", addr, val);
73 } 73 }
74 74
75 -void cpu_x86_outw(int addr, int val) 75 +void cpu_x86_outw(CPUX86State *env, int addr, int val)
76 { 76 {
77 fprintf(stderr, "outw: port=0x%04x, data=%04x\n", addr, val); 77 fprintf(stderr, "outw: port=0x%04x, data=%04x\n", addr, val);
78 } 78 }
79 79
80 -void cpu_x86_outl(int addr, int val) 80 +void cpu_x86_outl(CPUX86State *env, int addr, int val)
81 { 81 {
82 fprintf(stderr, "outl: port=0x%04x, data=%08x\n", addr, val); 82 fprintf(stderr, "outl: port=0x%04x, data=%08x\n", addr, val);
83 } 83 }
84 84
85 -int cpu_x86_inb(int addr) 85 +int cpu_x86_inb(CPUX86State *env, int addr)
86 { 86 {
87 fprintf(stderr, "inb: port=0x%04x\n", addr); 87 fprintf(stderr, "inb: port=0x%04x\n", addr);
88 return 0; 88 return 0;
89 } 89 }
90 90
91 -int cpu_x86_inw(int addr) 91 +int cpu_x86_inw(CPUX86State *env, int addr)
92 { 92 {
93 fprintf(stderr, "inw: port=0x%04x\n", addr); 93 fprintf(stderr, "inw: port=0x%04x\n", addr);
94 return 0; 94 return 0;
95 } 95 }
96 96
97 -int cpu_x86_inl(int addr) 97 +int cpu_x86_inl(CPUX86State *env, int addr)
98 { 98 {
99 fprintf(stderr, "inl: port=0x%04x\n", addr); 99 fprintf(stderr, "inl: port=0x%04x\n", addr);
100 return 0; 100 return 0;
@@ -303,12 +303,22 @@ void cpu_loop(struct CPUX86State *env) @@ -303,12 +303,22 @@ void cpu_loop(struct CPUX86State *env)
303 /* XXX: more precise info */ 303 /* XXX: more precise info */
304 info.si_signo = SIGSEGV; 304 info.si_signo = SIGSEGV;
305 info.si_errno = 0; 305 info.si_errno = 0;
306 - info.si_code = 0; 306 + info.si_code = TARGET_SI_KERNEL;
307 info._sifields._sigfault._addr = 0; 307 info._sifields._sigfault._addr = 0;
308 queue_signal(info.si_signo, &info); 308 queue_signal(info.si_signo, &info);
309 } 309 }
310 } 310 }
311 break; 311 break;
  312 + case EXCP0E_PAGE:
  313 + info.si_signo = SIGSEGV;
  314 + info.si_errno = 0;
  315 + if (!(env->error_code & 1))
  316 + info.si_code = TARGET_SEGV_MAPERR;
  317 + else
  318 + info.si_code = TARGET_SEGV_ACCERR;
  319 + info._sifields._sigfault._addr = env->cr2;
  320 + queue_signal(info.si_signo, &info);
  321 + break;
312 case EXCP00_DIVZ: 322 case EXCP00_DIVZ:
313 if (env->eflags & VM_MASK) { 323 if (env->eflags & VM_MASK) {
314 do_int(env, trapnr); 324 do_int(env, trapnr);
@@ -328,7 +338,7 @@ void cpu_loop(struct CPUX86State *env) @@ -328,7 +338,7 @@ void cpu_loop(struct CPUX86State *env)
328 } else { 338 } else {
329 info.si_signo = SIGSEGV; 339 info.si_signo = SIGSEGV;
330 info.si_errno = 0; 340 info.si_errno = 0;
331 - info.si_code = 0; 341 + info.si_code = TARGET_SI_KERNEL;
332 info._sifields._sigfault._addr = 0; 342 info._sifields._sigfault._addr = 0;
333 queue_signal(info.si_signo, &info); 343 queue_signal(info.si_signo, &info);
334 } 344 }