Revision 84409ddb linux-user/main.c
b/linux-user/main.c | ||
---|---|---|
194 | 194 |
queue_signal(info.si_signo, &info); |
195 | 195 |
break; |
196 | 196 |
case EXCP0D_GPF: |
197 |
#ifndef TARGET_X86_64 |
|
197 | 198 |
if (env->eflags & VM_MASK) { |
198 | 199 |
handle_vm86_fault(env); |
199 |
} else { |
|
200 |
} else |
|
201 |
#endif |
|
202 |
{ |
|
200 | 203 |
info.si_signo = SIGSEGV; |
201 | 204 |
info.si_errno = 0; |
202 | 205 |
info.si_code = TARGET_SI_KERNEL; |
... | ... | |
215 | 218 |
queue_signal(info.si_signo, &info); |
216 | 219 |
break; |
217 | 220 |
case EXCP00_DIVZ: |
221 |
#ifndef TARGET_X86_64 |
|
218 | 222 |
if (env->eflags & VM_MASK) { |
219 | 223 |
handle_vm86_trap(env, trapnr); |
220 |
} else { |
|
224 |
} else |
|
225 |
#endif |
|
226 |
{ |
|
221 | 227 |
/* division by zero */ |
222 | 228 |
info.si_signo = SIGFPE; |
223 | 229 |
info.si_errno = 0; |
... | ... | |
228 | 234 |
break; |
229 | 235 |
case EXCP01_SSTP: |
230 | 236 |
case EXCP03_INT3: |
237 |
#ifndef TARGET_X86_64 |
|
231 | 238 |
if (env->eflags & VM_MASK) { |
232 | 239 |
handle_vm86_trap(env, trapnr); |
233 |
} else { |
|
240 |
} else |
|
241 |
#endif |
|
242 |
{ |
|
234 | 243 |
info.si_signo = SIGTRAP; |
235 | 244 |
info.si_errno = 0; |
236 | 245 |
if (trapnr == EXCP01_SSTP) { |
... | ... | |
245 | 254 |
break; |
246 | 255 |
case EXCP04_INTO: |
247 | 256 |
case EXCP05_BOUND: |
257 |
#ifndef TARGET_X86_64 |
|
248 | 258 |
if (env->eflags & VM_MASK) { |
249 | 259 |
handle_vm86_trap(env, trapnr); |
250 |
} else { |
|
260 |
} else |
|
261 |
#endif |
|
262 |
{ |
|
251 | 263 |
info.si_signo = SIGSEGV; |
252 | 264 |
info.si_errno = 0; |
253 | 265 |
info.si_code = TARGET_SI_KERNEL; |
... | ... | |
1807 | 1819 |
env->eflags |= IF_MASK; |
1808 | 1820 |
|
1809 | 1821 |
/* linux register setup */ |
1822 |
#if defined(TARGET_X86_64) |
|
1823 |
env->regs[R_EAX] = regs->rax; |
|
1824 |
env->regs[R_EBX] = regs->rbx; |
|
1825 |
env->regs[R_ECX] = regs->rcx; |
|
1826 |
env->regs[R_EDX] = regs->rdx; |
|
1827 |
env->regs[R_ESI] = regs->rsi; |
|
1828 |
env->regs[R_EDI] = regs->rdi; |
|
1829 |
env->regs[R_EBP] = regs->rbp; |
|
1830 |
env->regs[R_ESP] = regs->rsp; |
|
1831 |
env->eip = regs->rip; |
|
1832 |
#else |
|
1810 | 1833 |
env->regs[R_EAX] = regs->eax; |
1811 | 1834 |
env->regs[R_EBX] = regs->ebx; |
1812 | 1835 |
env->regs[R_ECX] = regs->ecx; |
... | ... | |
1816 | 1839 |
env->regs[R_EBP] = regs->ebp; |
1817 | 1840 |
env->regs[R_ESP] = regs->esp; |
1818 | 1841 |
env->eip = regs->eip; |
1842 |
#endif |
|
1819 | 1843 |
|
1820 | 1844 |
/* linux interrupt setup */ |
1821 | 1845 |
env->idt.base = h2g(idt_table); |
... | ... | |
1903 | 1927 |
if (i != 12 && i != 6 && i != 13) |
1904 | 1928 |
env->msr[i] = (regs->msr >> i) & 1; |
1905 | 1929 |
} |
1930 |
#if defined(TARGET_PPC64) |
|
1931 |
msr_sf = 1; |
|
1932 |
#endif |
|
1906 | 1933 |
env->nip = regs->nip; |
1907 | 1934 |
for(i = 0; i < 32; i++) { |
1908 | 1935 |
env->gpr[i] = regs->gpr[i]; |
Also available in: Unified diff