Revision e1833e1f darwin-user/main.c

b/darwin-user/main.c
139 139
    cpu_ppc_store_tb(env, ((uint64_t)cpu_ppc_load_tbl(env) << 32) | value);
140 140
}
141 141

  
142
uint32_t cpu_ppc_load_decr (CPUState *env)
143
{
144
    /* TO FIX */
145
    return -1;
146
}
147

  
148
void cpu_ppc_store_decr (CPUState *env, uint32_t value)
149
{
150
    /* TO FIX */
151
}
152

  
153 142
void cpu_ppc601_store_rtcu (CPUState *env, uint32_t value)
154 143
{
155 144
    cpu_ppc_store_tbu( env, value );
......
165 154
    return cpu_ppc_load_tbl(env) & 0x3FFFFF80;
166 155
}
167 156

  
157
/* XXX: to be fixed */
158
int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, target_ulong *valp)
159
{
160
    return -1;
161
}
162

  
163
int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val)
164
{
165
    return -1;
166
}
167

  
168
#define EXCP_DUMP(env, fmt, args...)                                         \
169
do {                                                                          \
170
    fprintf(stderr, fmt , ##args);                                            \
171
    cpu_dump_state(env, stderr, fprintf, 0);                                  \
172
    if (loglevel != 0) {                                                      \
173
        fprintf(logfile, fmt , ##args);                                       \
174
        cpu_dump_state(env, logfile, fprintf, 0);                             \
175
    }                                                                         \
176
} while (0)
177

  
168 178
void cpu_loop(CPUPPCState *env)
169 179
{
170 180
    int trapnr;
......
173 183

  
174 184
    for(;;) {
175 185
        trapnr = cpu_ppc_exec(env);
176
        if (trapnr != EXCP_SYSCALL_USER && trapnr != EXCP_BRANCH &&
177
            trapnr != EXCP_TRACE) {
178
            if (loglevel > 0) {
179
                cpu_dump_state(env, logfile, fprintf, 0);
180
            }
181
        }
182 186
        switch(trapnr) {
183
        case EXCP_NONE:
187
        case POWERPC_EXCP_NONE:
188
            /* Just go on */
184 189
            break;
185
        case EXCP_SYSCALL_USER:
186
            /* system call */
187
            if(((int)env->gpr[0]) <= SYS_MAXSYSCALL && ((int)env->gpr[0])>0)
188
                ret = do_unix_syscall(env, env->gpr[0]/*, env->gpr[3], env->gpr[4],
189
                                      env->gpr[5], env->gpr[6], env->gpr[7],
190
                                      env->gpr[8], env->gpr[9], env->gpr[10]*/);
191
            else if(((int)env->gpr[0])<0)
192
                ret = do_mach_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
193
                                      env->gpr[5], env->gpr[6], env->gpr[7],
194
                                      env->gpr[8], env->gpr[9], env->gpr[10]);
195
            else
196
                ret = do_thread_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
197
                                        env->gpr[5], env->gpr[6], env->gpr[7],
198
                                        env->gpr[8], env->gpr[9], env->gpr[10]);
199

  
200
            /* Unix syscall error signaling */
201
            if(((int)env->gpr[0]) <= SYS_MAXSYSCALL && ((int)env->gpr[0])>0)
202
            {
203
                if( (int)ret < 0 )
204
                    env->nip += 0;
205
                else
206
                    env->nip += 4;
207
            }
208

  
209
            /* Return value */
210
            env->gpr[3] = ret;
190
        case POWERPC_EXCP_CRITICAL: /* Critical input                        */
191
            cpu_abort(env, "Critical interrupt while in user mode. "
192
                      "Aborting\n");
211 193
            break;
212
        case EXCP_RESET:
213
            /* Should not happen ! */
214
            fprintf(stderr, "RESET asked... Stop emulation\n");
215
            if (loglevel)
216
                fprintf(logfile, "RESET asked... Stop emulation\n");
217
                abort();
218
        case EXCP_MACHINE_CHECK:
219
            fprintf(stderr, "Machine check exeption...  Stop emulation\n");
220
            if (loglevel)
221
                fprintf(logfile, "RESET asked... Stop emulation\n");
222
                info.si_signo = SIGBUS;
223
            info.si_errno = 0;
224
            info.si_code = BUS_OBJERR;
225
            info.si_addr = (void*)(env->nip - 4);
226
            queue_signal(info.si_signo, &info);
227
        case EXCP_DSI:
194
        case POWERPC_EXCP_MCHECK:   /* Machine check exception               */
195
            cpu_abort(env, "Machine check exception while in user mode. "
196
                      "Aborting\n");
197
            break;
198
        case POWERPC_EXCP_DSI:      /* Data storage exception                */
228 199
#ifndef DAR
229 200
/* To deal with multiple qemu header version as host for the darwin-user code */
230 201
# define DAR SPR_DAR
231 202
#endif
232
            fprintf(stderr, "Invalid data memory access: 0x%08x\n", env->spr[DAR]);
233
            if (loglevel) {
234
                fprintf(logfile, "Invalid data memory access: 0x%08x\n",
235
                        env->spr[DAR]);
236
            }
203
            EXCP_DUMP(env, "Invalid data memory access: 0x" ADDRX "\n",
204
                      env->spr[SPR_DAR]);
237 205
            /* Handle this via the gdb */
238 206
            gdb_handlesig (env, SIGSEGV);
239 207

  
240 208
            info.si_addr = (void*)env->nip;
241 209
            queue_signal(info.si_signo, &info);
242 210
            break;
243
        case EXCP_ISI:
244
            fprintf(stderr, "Invalid instruction fetch\n");
245
            if (loglevel)
246
                fprintf(logfile, "Invalid instruction fetch\n");
211
        case POWERPC_EXCP_ISI:      /* Instruction storage exception         */
212
            EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" ADDRX "\n",
213
                      env->spr[SPR_DAR]);
247 214
            /* Handle this via the gdb */
248 215
            gdb_handlesig (env, SIGSEGV);
249 216

  
250 217
            info.si_addr = (void*)(env->nip - 4);
251 218
            queue_signal(info.si_signo, &info);
252 219
            break;
253
        case EXCP_EXTERNAL:
254
            /* Should not happen ! */
255
            fprintf(stderr, "External interruption... Stop emulation\n");
256
            if (loglevel)
257
                fprintf(logfile, "External interruption... Stop emulation\n");
258
                abort();
259
        case EXCP_ALIGN:
260
            fprintf(stderr, "Invalid unaligned memory access\n");
261
            if (loglevel)
262
                fprintf(logfile, "Invalid unaligned memory access\n");
263
                info.si_signo = SIGBUS;
220
        case POWERPC_EXCP_EXTERNAL: /* External input                        */
221
            cpu_abort(env, "External interrupt while in user mode. "
222
                      "Aborting\n");
223
            break;
224
        case POWERPC_EXCP_ALIGN:    /* Alignment exception                   */
225
            EXCP_DUMP(env, "Unaligned memory access\n");
264 226
            info.si_errno = 0;
265 227
            info.si_code = BUS_ADRALN;
266 228
            info.si_addr = (void*)(env->nip - 4);
267 229
            queue_signal(info.si_signo, &info);
268 230
            break;
269
        case EXCP_PROGRAM:
231
        case POWERPC_EXCP_PROGRAM:  /* Program exception                     */
232
            /* XXX: check this */
270 233
            switch (env->error_code & ~0xF) {
271
                case EXCP_FP:
272
                    fprintf(stderr, "Program exception\n");
273
                    if (loglevel)
274
                        fprintf(logfile, "Program exception\n");
275
                        /* Set FX */
276
                        env->fpscr[7] |= 0x8;
277
                    /* Finally, update FEX */
278
                    if ((((env->fpscr[7] & 0x3) << 3) | (env->fpscr[6] >> 1)) &
279
                        ((env->fpscr[1] << 1) | (env->fpscr[0] >> 3)))
280
                        env->fpscr[7] |= 0x4;
281
                        info.si_signo = SIGFPE;
282
                    info.si_errno = 0;
283
                    switch (env->error_code & 0xF) {
284
                        case EXCP_FP_OX:
285
                            info.si_code = FPE_FLTOVF;
286
                            break;
287
                        case EXCP_FP_UX:
288
                            info.si_code = FPE_FLTUND;
289
                            break;
290
                        case EXCP_FP_ZX:
291
                        case EXCP_FP_VXZDZ:
292
                            info.si_code = FPE_FLTDIV;
293
                            break;
294
                        case EXCP_FP_XX:
295
                            info.si_code = FPE_FLTRES;
296
                            break;
297
                        case EXCP_FP_VXSOFT:
298
                            info.si_code = FPE_FLTINV;
299
                            break;
300
                        case EXCP_FP_VXNAN:
301
                        case EXCP_FP_VXISI:
302
                        case EXCP_FP_VXIDI:
303
                        case EXCP_FP_VXIMZ:
304
                        case EXCP_FP_VXVC:
305
                        case EXCP_FP_VXSQRT:
306
                        case EXCP_FP_VXCVI:
307
                            info.si_code = FPE_FLTSUB;
308
                            break;
309
                        default:
310
                            fprintf(stderr, "Unknown floating point exception "
311
                                    "(%02x)\n", env->error_code);
312
                            if (loglevel) {
313
                                fprintf(logfile, "Unknown floating point exception "
314
                                        "(%02x)\n", env->error_code & 0xF);
315
                            }
316
                    }
317
                        break;
318
                case EXCP_INVAL:
319
                    fprintf(stderr, "Invalid instruction\n");
320
                    if (loglevel)
321
                        fprintf(logfile, "Invalid instruction\n");
322
                        info.si_signo = SIGILL;
323
                    info.si_errno = 0;
324
                    switch (env->error_code & 0xF) {
325
                        case EXCP_INVAL_INVAL:
326
                            info.si_code = ILL_ILLOPC;
327
                            break;
328
                        case EXCP_INVAL_LSWX:
329
                            info.si_code = ILL_ILLOPN;
330
                            break;
331
                        case EXCP_INVAL_SPR:
332
                            info.si_code = ILL_PRVREG;
333
                            break;
334
                        case EXCP_INVAL_FP:
335
                            info.si_code = ILL_COPROC;
336
                            break;
337
                        default:
338
                            fprintf(stderr, "Unknown invalid operation (%02x)\n",
339
                                    env->error_code & 0xF);
340
                            if (loglevel) {
341
                                fprintf(logfile, "Unknown invalid operation (%02x)\n",
342
                                        env->error_code & 0xF);
343
                            }
344
                                info.si_code = ILL_ILLADR;
345
                            break;
346
                    }
347
                        /* Handle this via the gdb */
348
                        gdb_handlesig (env, SIGSEGV);
234
            case POWERPC_EXCP_FP:
235
                EXCP_DUMP(env, "Floating point program exception\n");
236
                /* Set FX */
237
                env->fpscr[7] |= 0x8;
238
                /* Finally, update FEX */
239
                if ((((env->fpscr[7] & 0x3) << 3) | (env->fpscr[6] >> 1)) &
240
                    ((env->fpscr[1] << 1) | (env->fpscr[0] >> 3)))
241
                    env->fpscr[7] |= 0x4;
242
                info.si_signo = SIGFPE;
243
                info.si_errno = 0;
244
                switch (env->error_code & 0xF) {
245
                case POWERPC_EXCP_FP_OX:
246
                    info.si_code = FPE_FLTOVF;
247
                    break;
248
                case POWERPC_EXCP_FP_UX:
249
                    info.si_code = FPE_FLTUND;
250
                    break;
251
                case POWERPC_EXCP_FP_ZX:
252
                case POWERPC_EXCP_FP_VXZDZ:
253
                    info.si_code = FPE_FLTDIV;
254
                    break;
255
                case POWERPC_EXCP_FP_XX:
256
                    info.si_code = FPE_FLTRES;
257
                    break;
258
                case POWERPC_EXCP_FP_VXSOFT:
259
                    info.si_code = FPE_FLTINV;
260
                    break;
261
                case POWERPC_EXCP_FP_VXNAN:
262
                case POWERPC_EXCP_FP_VXISI:
263
                case POWERPC_EXCP_FP_VXIDI:
264
                case POWERPC_EXCP_FP_VXIMZ:
265
                case POWERPC_EXCP_FP_VXVC:
266
                case POWERPC_EXCP_FP_VXSQRT:
267
                case POWERPC_EXCP_FP_VXCVI:
268
                    info.si_code = FPE_FLTSUB;
269
                    break;
270
                default:
271
                    EXCP_DUMP(env, "Unknown floating point exception (%02x)\n",
272
                              env->error_code);
273
                    break;
274
                }
275
                break;
276
            case POWERPC_EXCP_INVAL:
277
                EXCP_DUMP(env, "Invalid instruction\n");
278
                info.si_signo = SIGILL;
279
                info.si_errno = 0;
280
                switch (env->error_code & 0xF) {
281
                case POWERPC_EXCP_INVAL_INVAL:
282
                    info.si_code = ILL_ILLOPC;
283
                    break;
284
                case POWERPC_EXCP_INVAL_LSWX:
285
                    info.si_code = ILL_ILLOPN;
286
                    break;
287
                case POWERPC_EXCP_INVAL_SPR:
288
                    info.si_code = ILL_PRVREG;
289
                    break;
290
                case POWERPC_EXCP_INVAL_FP:
291
                    info.si_code = ILL_COPROC;
292
                    break;
293
                default:
294
                    EXCP_DUMP(env, "Unknown invalid operation (%02x)\n",
295
                              env->error_code & 0xF);
296
                    info.si_code = ILL_ILLADR;
297
                    break;
298
                }
299
                /* Handle this via the gdb */
300
                gdb_handlesig (env, SIGSEGV);
301
                break;
302
            case POWERPC_EXCP_PRIV:
303
                EXCP_DUMP(env, "Privilege violation\n");
304
                info.si_signo = SIGILL;
305
                info.si_errno = 0;
306
                switch (env->error_code & 0xF) {
307
                case POWERPC_EXCP_PRIV_OPC:
308
                    info.si_code = ILL_PRVOPC;
309
                    break;
310
                case POWERPC_EXCP_PRIV_REG:
311
                    info.si_code = ILL_PRVREG;
349 312
                    break;
350
                case EXCP_PRIV:
351
                    fprintf(stderr, "Privilege violation\n");
352
                    if (loglevel)
353
                        fprintf(logfile, "Privilege violation\n");
354
                        info.si_signo = SIGILL;
355
                    info.si_errno = 0;
356
                    switch (env->error_code & 0xF) {
357
                        case EXCP_PRIV_OPC:
358
                            info.si_code = ILL_PRVOPC;
359
                            break;
360
                        case EXCP_PRIV_REG:
361
                            info.si_code = ILL_PRVREG;
362
                            break;
363
                        default:
364
                            fprintf(stderr, "Unknown privilege violation (%02x)\n",
365
                                    env->error_code & 0xF);
366
                            info.si_code = ILL_PRVOPC;
367
                            break;
368
                    }
369
                        break;
370
                case EXCP_TRAP:
371
                    fprintf(stderr, "Tried to call a TRAP\n");
372
                    if (loglevel)
373
                        fprintf(logfile, "Tried to call a TRAP\n");
374
                        abort();
375 313
                default:
376
                    /* Should not happen ! */
377
                    fprintf(stderr, "Unknown program exception (%02x)\n",
378
                            env->error_code);
379
                    if (loglevel) {
380
                        fprintf(logfile, "Unknwon program exception (%02x)\n",
381
                                env->error_code);
382
                    }
383
                        abort();
314
                    EXCP_DUMP(env, "Unknown privilege violation (%02x)\n",
315
                              env->error_code & 0xF);
316
                    info.si_code = ILL_PRVOPC;
317
                    break;
318
                }
319
                break;
320
            case POWERPC_EXCP_TRAP:
321
                cpu_abort(env, "Tried to call a TRAP\n");
322
                break;
323
            default:
324
                /* Should not happen ! */
325
                cpu_abort(env, "Unknown program exception (%02x)\n",
326
                          env->error_code);
327
                break;
384 328
            }
385 329
            info.si_addr = (void*)(env->nip - 4);
386 330
            queue_signal(info.si_signo, &info);
387 331
            break;
388
        case EXCP_NO_FP:
389
            fprintf(stderr, "No floating point allowed\n");
390
            if (loglevel)
391
                fprintf(logfile, "No floating point allowed\n");
392
                info.si_signo = SIGILL;
332
        case POWERPC_EXCP_FPU:      /* Floating-point unavailable exception  */
333
            EXCP_DUMP(env, "No floating point allowed\n");
334
            info.si_signo = SIGILL;
393 335
            info.si_errno = 0;
394 336
            info.si_code = ILL_COPROC;
395 337
            info.si_addr = (void*)(env->nip - 4);
396 338
            queue_signal(info.si_signo, &info);
397 339
            break;
398
        case EXCP_DECR:
399
            /* Should not happen ! */
400
            fprintf(stderr, "Decrementer exception\n");
401
            if (loglevel)
402
                fprintf(logfile, "Decrementer exception\n");
403
            abort();
404
        case EXCP_TRACE:
405
            /* Pass to gdb: we use this to trace execution */
406
            gdb_handlesig (env, SIGTRAP);
340
        case POWERPC_EXCP_SYSCALL:  /* System call exception                 */
341
            cpu_abort(env, "Syscall exception while in user mode. "
342
                      "Aborting\n");
407 343
            break;
408
        case EXCP_FP_ASSIST:
409
            /* Should not happen ! */
410
            fprintf(stderr, "Floating point assist exception\n");
411
            if (loglevel)
412
                fprintf(logfile, "Floating point assist exception\n");
413
            abort();
414
        case EXCP_MTMSR:
415
            /* We reloaded the msr, just go on */
416
            if (msr_pr == 0) {
417
                fprintf(stderr, "Tried to go into supervisor mode !\n");
418
                if (loglevel)
419
                    fprintf(logfile, "Tried to go into supervisor mode !\n");
420
                abort();
421
            }
344
        case POWERPC_EXCP_APU:      /* Auxiliary processor unavailable       */
345
            EXCP_DUMP(env, "No APU instruction allowed\n");
346
            info.si_signo = SIGILL;
347
            info.si_errno = 0;
348
            info.si_code = ILL_COPROC;
349
            info.si_addr = (void*)(env->nip - 4);
350
            queue_signal(info.si_signo, &info);
422 351
            break;
423
        case EXCP_BRANCH:
424
            /* We stopped because of a jump... */
352
        case POWERPC_EXCP_DECR:     /* Decrementer exception                 */
353
            cpu_abort(env, "Decrementer interrupt while in user mode. "
354
                      "Aborting\n");
425 355
            break;
426
        case EXCP_INTERRUPT:
427
            /* Don't know why this should ever happen... */
428
            fprintf(stderr, "EXCP_INTERRUPT\n");
356
        case POWERPC_EXCP_FIT:      /* Fixed-interval timer interrupt        */
357
            cpu_abort(env, "Fix interval timer interrupt while in user mode. "
358
                      "Aborting\n");
429 359
            break;
430
        case EXCP_DEBUG:
360
        case POWERPC_EXCP_WDT:      /* Watchdog timer interrupt              */
361
            cpu_abort(env, "Watchdog timer interrupt while in user mode. "
362
                      "Aborting\n");
363
            break;
364
        case POWERPC_EXCP_DTLB:     /* Data TLB error                        */
365
            cpu_abort(env, "Data TLB exception while in user mode. "
366
                      "Aborting\n");
367
            break;
368
        case POWERPC_EXCP_ITLB:     /* Instruction TLB error                 */
369
            cpu_abort(env, "Instruction TLB exception while in user mode. "
370
                      "Aborting\n");
371
            break;
372
        case POWERPC_EXCP_DEBUG:    /* Debug interrupt                       */
431 373
            gdb_handlesig (env, SIGTRAP);
432 374
            break;
433
        default:
434
            fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
435
                    trapnr);
436
            if (loglevel) {
437
                fprintf(logfile, "qemu: unhandled CPU exception 0x%02x - "
438
                        "0x%02x - aborting\n", trapnr, env->error_code);
375
#if defined(TARGET_PPCEMB)
376
        case POWERPC_EXCP_SPEU:     /* SPE/embedded floating-point unavail.  */
377
            EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n");
378
            info.si_signo = SIGILL;
379
            info.si_errno = 0;
380
            info.si_code = ILL_COPROC;
381
            info.si_addr = (void*)(env->nip - 4);
382
            queue_signal(info.si_signo, &info);
383
            break;
384
        case POWERPC_EXCP_EFPDI:    /* Embedded floating-point data IRQ      */
385
            cpu_abort(env, "Embedded floating-point data IRQ not handled\n");
386
            break;
387
        case POWERPC_EXCP_EFPRI:    /* Embedded floating-point round IRQ     */
388
            cpu_abort(env, "Embedded floating-point round IRQ not handled\n");
389
            break;
390
        case POWERPC_EXCP_EPERFM:   /* Embedded performance monitor IRQ      */
391
            cpu_abort(env, "Performance monitor exception not handled\n");
392
            break;
393
        case POWERPC_EXCP_DOORI:    /* Embedded doorbell interrupt           */
394
            cpu_abort(env, "Doorbell interrupt while in user mode. "
395
                       "Aborting\n");
396
            break;
397
        case POWERPC_EXCP_DOORCI:   /* Embedded doorbell critical interrupt  */
398
            cpu_abort(env, "Doorbell critical interrupt while in user mode. "
399
                      "Aborting\n");
400
            break;
401
#endif /* defined(TARGET_PPCEMB) */
402
        case POWERPC_EXCP_RESET:    /* System reset exception                */
403
            cpu_abort(env, "Reset interrupt while in user mode. "
404
                      "Aborting\n");
405
            break;
406
#if defined(TARGET_PPC64) /* PowerPC 64 */
407
        case POWERPC_EXCP_DSEG:     /* Data segment exception                */
408
            cpu_abort(env, "Data segment exception while in user mode. "
409
                      "Aborting\n");
410
            break;
411
        case POWERPC_EXCP_ISEG:     /* Instruction segment exception         */
412
            cpu_abort(env, "Instruction segment exception "
413
                      "while in user mode. Aborting\n");
414
            break;
415
#endif /* defined(TARGET_PPC64) */
416
#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */
417
        case POWERPC_EXCP_HDECR:    /* Hypervisor decrementer exception      */
418
            cpu_abort(env, "Hypervisor decrementer interrupt "
419
                      "while in user mode. Aborting\n");
420
            break;
421
#endif /* defined(TARGET_PPC64H) */
422
        case POWERPC_EXCP_TRACE:    /* Trace exception                       */
423
            /* Nothing to do:
424
             * we use this exception to emulate step-by-step execution mode.
425
             */
426
            break;
427
#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */
428
        case POWERPC_EXCP_HDSI:     /* Hypervisor data storage exception     */
429
            cpu_abort(env, "Hypervisor data storage exception "
430
                      "while in user mode. Aborting\n");
431
            break;
432
        case POWERPC_EXCP_HISI:     /* Hypervisor instruction storage excp   */
433
            cpu_abort(env, "Hypervisor instruction storage exception "
434
                      "while in user mode. Aborting\n");
435
            break;
436
        case POWERPC_EXCP_HDSEG:    /* Hypervisor data segment exception     */
437
            cpu_abort(env, "Hypervisor data segment exception "
438
                      "while in user mode. Aborting\n");
439
            break;
440
        case POWERPC_EXCP_HISEG:    /* Hypervisor instruction segment excp   */
441
            cpu_abort(env, "Hypervisor instruction segment exception "
442
                      "while in user mode. Aborting\n");
443
            break;
444
#endif /* defined(TARGET_PPC64H) */
445
        case POWERPC_EXCP_VPU:      /* Vector unavailable exception          */
446
            EXCP_DUMP(env, "No Altivec instructions allowed\n");
447
            info.si_signo = SIGILL;
448
            info.si_errno = 0;
449
            info.si_code = ILL_COPROC;
450
            info.si_addr = (void*)(env->nip - 4);
451
            queue_signal(info.si_signo, &info);
452
            break;
453
        case POWERPC_EXCP_PIT:      /* Programmable interval timer IRQ       */
454
            cpu_abort(env, "Programable interval timer interrupt "
455
                      "while in user mode. Aborting\n");
456
            break;
457
        case POWERPC_EXCP_IO:       /* IO error exception                    */
458
            cpu_abort(env, "IO error exception while in user mode. "
459
                      "Aborting\n");
460
            break;
461
        case POWERPC_EXCP_RUNM:     /* Run mode exception                    */
462
            cpu_abort(env, "Run mode exception while in user mode. "
463
                      "Aborting\n");
464
            break;
465
        case POWERPC_EXCP_EMUL:     /* Emulation trap exception              */
466
            cpu_abort(env, "Emulation trap exception not handled\n");
467
            break;
468
        case POWERPC_EXCP_IFTLB:    /* Instruction fetch TLB error           */
469
            cpu_abort(env, "Instruction fetch TLB exception "
470
                      "while in user-mode. Aborting");
471
            break;
472
        case POWERPC_EXCP_DLTLB:    /* Data load TLB miss                    */
473
            cpu_abort(env, "Data load TLB exception while in user-mode. "
474
                      "Aborting");
475
            break;
476
        case POWERPC_EXCP_DSTLB:    /* Data store TLB miss                   */
477
            cpu_abort(env, "Data store TLB exception while in user-mode. "
478
                      "Aborting");
479
            break;
480
        case POWERPC_EXCP_FPA:      /* Floating-point assist exception       */
481
            cpu_abort(env, "Floating-point assist exception not handled\n");
482
            break;
483
        case POWERPC_EXCP_IABR:     /* Instruction address breakpoint        */
484
            cpu_abort(env, "Instruction address breakpoint exception "
485
                      "not handled\n");
486
            break;
487
        case POWERPC_EXCP_SMI:      /* System management interrupt           */
488
            cpu_abort(env, "System management interrupt while in user mode. "
489
                      "Aborting\n");
490
            break;
491
        case POWERPC_EXCP_THERM:    /* Thermal interrupt                     */
492
            cpu_abort(env, "Thermal interrupt interrupt while in user mode. "
493
                      "Aborting\n");
494
            break;
495
        case POWERPC_EXCP_PERFM:    /* Embedded performance monitor IRQ      */
496
            cpu_abort(env, "Performance monitor exception not handled\n");
497
            break;
498
        case POWERPC_EXCP_VPUA:     /* Vector assist exception               */
499
            cpu_abort(env, "Vector assist exception not handled\n");
500
            break;
501
        case POWERPC_EXCP_SOFTP:    /* Soft patch exception                  */
502
            cpu_abort(env, "Soft patch exception not handled\n");
503
            break;
504
        case POWERPC_EXCP_MAINT:    /* Maintenance exception                 */
505
            cpu_abort(env, "Maintenance exception while in user mode. "
506
                      "Aborting\n");
507
            break;
508
        case POWERPC_EXCP_STOP:     /* stop translation                      */
509
            /* We did invalidate the instruction cache. Go on */
510
            break;
511
        case POWERPC_EXCP_BRANCH:   /* branch instruction:                   */
512
            /* We just stopped because of a branch. Go on */
513
            break;
514
        case POWERPC_EXCP_SYSCALL_USER:
515
            /* system call in user-mode emulation */
516
            /* system call */
517
            if(((int)env->gpr[0]) <= SYS_MAXSYSCALL && ((int)env->gpr[0])>0)
518
                ret = do_unix_syscall(env, env->gpr[0]/*, env->gpr[3], env->gpr[4],
519
                                      env->gpr[5], env->gpr[6], env->gpr[7],
520
                                      env->gpr[8], env->gpr[9], env->gpr[10]*/);
521
            else if(((int)env->gpr[0])<0)
522
                ret = do_mach_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
523
                                      env->gpr[5], env->gpr[6], env->gpr[7],
524
                                      env->gpr[8], env->gpr[9], env->gpr[10]);
525
            else
526
                ret = do_thread_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
527
                                        env->gpr[5], env->gpr[6], env->gpr[7],
528
                                        env->gpr[8], env->gpr[9], env->gpr[10]);
529

  
530
            /* Unix syscall error signaling */
531
            if(((int)env->gpr[0]) <= SYS_MAXSYSCALL && ((int)env->gpr[0])>0)
532
            {
533
                if( (int)ret < 0 )
534
                    env->nip += 0;
535
                else
536
                    env->nip += 4;
439 537
            }
440
                abort();
538

  
539
            /* Return value */
540
            env->gpr[3] = ret;
541
            break;
542
        default:
543
            cpu_abort(env, "Unknown exception 0x%d. Aborting\n", trapnr);
544
            break;
441 545
        }
442 546
        process_pending_signals(env);
443 547
    }

Also available in: Unified diff