Commit 6d5e216de979afdc0a26410580ad31376f7107f7
1 parent
e8af50a3
SPARC fixes (Blue Swirl)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1084 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
436 additions
and
0 deletions
linux-user/signal.c
| ... | ... | @@ -1271,6 +1271,346 @@ badframe: |
| 1271 | 1271 | return 0; |
| 1272 | 1272 | } |
| 1273 | 1273 | |
| 1274 | +#elif defined(TARGET_SPARC) | |
| 1275 | +#define __SUNOS_MAXWIN 31 | |
| 1276 | + | |
| 1277 | +/* This is what SunOS does, so shall I. */ | |
| 1278 | +struct target_sigcontext { | |
| 1279 | + target_ulong sigc_onstack; /* state to restore */ | |
| 1280 | + | |
| 1281 | + target_ulong sigc_mask; /* sigmask to restore */ | |
| 1282 | + target_ulong sigc_sp; /* stack pointer */ | |
| 1283 | + target_ulong sigc_pc; /* program counter */ | |
| 1284 | + target_ulong sigc_npc; /* next program counter */ | |
| 1285 | + target_ulong sigc_psr; /* for condition codes etc */ | |
| 1286 | + target_ulong sigc_g1; /* User uses these two registers */ | |
| 1287 | + target_ulong sigc_o0; /* within the trampoline code. */ | |
| 1288 | + | |
| 1289 | + /* Now comes information regarding the users window set | |
| 1290 | + * at the time of the signal. | |
| 1291 | + */ | |
| 1292 | + target_ulong sigc_oswins; /* outstanding windows */ | |
| 1293 | + | |
| 1294 | + /* stack ptrs for each regwin buf */ | |
| 1295 | + char *sigc_spbuf[__SUNOS_MAXWIN]; | |
| 1296 | + | |
| 1297 | + /* Windows to restore after signal */ | |
| 1298 | + struct { | |
| 1299 | + target_ulong locals[8]; | |
| 1300 | + target_ulong ins[8]; | |
| 1301 | + } sigc_wbuf[__SUNOS_MAXWIN]; | |
| 1302 | +}; | |
| 1303 | +/* A Sparc stack frame */ | |
| 1304 | +struct sparc_stackf { | |
| 1305 | + target_ulong locals[8]; | |
| 1306 | + target_ulong ins[6]; | |
| 1307 | + struct sparc_stackf *fp; | |
| 1308 | + target_ulong callers_pc; | |
| 1309 | + char *structptr; | |
| 1310 | + target_ulong xargs[6]; | |
| 1311 | + target_ulong xxargs[1]; | |
| 1312 | +}; | |
| 1313 | + | |
| 1314 | +typedef struct { | |
| 1315 | + struct { | |
| 1316 | + target_ulong psr; | |
| 1317 | + target_ulong pc; | |
| 1318 | + target_ulong npc; | |
| 1319 | + target_ulong y; | |
| 1320 | + target_ulong u_regs[16]; /* globals and ins */ | |
| 1321 | + } si_regs; | |
| 1322 | + int si_mask; | |
| 1323 | +} __siginfo_t; | |
| 1324 | + | |
| 1325 | +typedef struct { | |
| 1326 | + unsigned long si_float_regs [32]; | |
| 1327 | + unsigned long si_fsr; | |
| 1328 | + unsigned long si_fpqdepth; | |
| 1329 | + struct { | |
| 1330 | + unsigned long *insn_addr; | |
| 1331 | + unsigned long insn; | |
| 1332 | + } si_fpqueue [16]; | |
| 1333 | +} __siginfo_fpu_t; | |
| 1334 | + | |
| 1335 | + | |
| 1336 | +struct target_signal_frame { | |
| 1337 | + struct sparc_stackf ss; | |
| 1338 | + __siginfo_t info; | |
| 1339 | + __siginfo_fpu_t *fpu_save; | |
| 1340 | + target_ulong insns[2] __attribute__ ((aligned (8))); | |
| 1341 | + target_ulong extramask[TARGET_NSIG_WORDS - 1]; | |
| 1342 | + target_ulong extra_size; /* Should be 0 */ | |
| 1343 | + __siginfo_fpu_t fpu_state; | |
| 1344 | +}; | |
| 1345 | +struct target_rt_signal_frame { | |
| 1346 | + struct sparc_stackf ss; | |
| 1347 | + siginfo_t info; | |
| 1348 | + target_ulong regs[20]; | |
| 1349 | + sigset_t mask; | |
| 1350 | + __siginfo_fpu_t *fpu_save; | |
| 1351 | + unsigned int insns[2]; | |
| 1352 | + stack_t stack; | |
| 1353 | + unsigned int extra_size; /* Should be 0 */ | |
| 1354 | + __siginfo_fpu_t fpu_state; | |
| 1355 | +}; | |
| 1356 | + | |
| 1357 | +#define UREG_O0 0 | |
| 1358 | +#define UREG_O6 6 | |
| 1359 | +#define UREG_I0 16 | |
| 1360 | +#define UREG_I1 17 | |
| 1361 | +#define UREG_I2 18 | |
| 1362 | +#define UREG_I6 22 | |
| 1363 | +#define UREG_I7 23 | |
| 1364 | +#define UREG_FP UREG_I6 | |
| 1365 | +#define UREG_SP UREG_O6 | |
| 1366 | + | |
| 1367 | +static inline void *get_sigframe(struct emulated_sigaction *sa, CPUState *env, unsigned long framesize) | |
| 1368 | +{ | |
| 1369 | + unsigned long sp; | |
| 1370 | + | |
| 1371 | + sp = env->regwptr[UREG_FP]; | |
| 1372 | +#if 0 | |
| 1373 | + | |
| 1374 | + /* This is the X/Open sanctioned signal stack switching. */ | |
| 1375 | + if (sa->sa_flags & TARGET_SA_ONSTACK) { | |
| 1376 | + if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7)) | |
| 1377 | + sp = current->sas_ss_sp + current->sas_ss_size; | |
| 1378 | + } | |
| 1379 | +#endif | |
| 1380 | + return (void *)(sp - framesize); | |
| 1381 | +} | |
| 1382 | + | |
| 1383 | +static int | |
| 1384 | +setup___siginfo(__siginfo_t *si, CPUState *env, target_ulong mask) | |
| 1385 | +{ | |
| 1386 | + int err = 0, i; | |
| 1387 | + | |
| 1388 | + fprintf(stderr, "2.a %lx psr: %lx regs: %lx\n", si, env->psr, si->si_regs.psr); | |
| 1389 | + err |= __put_user(env->psr, &si->si_regs.psr); | |
| 1390 | + fprintf(stderr, "2.a1 pc:%lx\n", si->si_regs.pc); | |
| 1391 | + err |= __put_user(env->pc, &si->si_regs.pc); | |
| 1392 | + err |= __put_user(env->npc, &si->si_regs.npc); | |
| 1393 | + err |= __put_user(env->y, &si->si_regs.y); | |
| 1394 | + fprintf(stderr, "2.b\n"); | |
| 1395 | + for (i=0; i < 7; i++) { | |
| 1396 | + err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]); | |
| 1397 | + } | |
| 1398 | + for (i=0; i < 7; i++) { | |
| 1399 | + err |= __put_user(env->regwptr[i+16], &si->si_regs.u_regs[i+8]); | |
| 1400 | + } | |
| 1401 | + fprintf(stderr, "2.c\n"); | |
| 1402 | + err |= __put_user(mask, &si->si_mask); | |
| 1403 | + return err; | |
| 1404 | +} | |
| 1405 | +static int | |
| 1406 | +setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ | |
| 1407 | + CPUState *env, unsigned long mask) | |
| 1408 | +{ | |
| 1409 | + int err = 0; | |
| 1410 | + | |
| 1411 | + err |= __put_user(mask, &sc->sigc_mask); | |
| 1412 | + err |= __put_user(env->regwptr[UREG_SP], &sc->sigc_sp); | |
| 1413 | + err |= __put_user(env->pc, &sc->sigc_pc); | |
| 1414 | + err |= __put_user(env->npc, &sc->sigc_npc); | |
| 1415 | + err |= __put_user(env->psr, &sc->sigc_psr); | |
| 1416 | + err |= __put_user(env->gregs[1], &sc->sigc_g1); | |
| 1417 | + err |= __put_user(env->regwptr[UREG_O0], &sc->sigc_o0); | |
| 1418 | + | |
| 1419 | + return err; | |
| 1420 | +} | |
| 1421 | +#define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) | |
| 1422 | + | |
| 1423 | +static void setup_frame(int sig, struct emulated_sigaction *ka, | |
| 1424 | + target_sigset_t *set, CPUState *env) | |
| 1425 | +{ | |
| 1426 | + struct target_signal_frame *sf; | |
| 1427 | + int sigframe_size, err, i; | |
| 1428 | + | |
| 1429 | + /* 1. Make sure everything is clean */ | |
| 1430 | + //synchronize_user_stack(); | |
| 1431 | + | |
| 1432 | + sigframe_size = NF_ALIGNEDSZ; | |
| 1433 | + | |
| 1434 | + sf = (struct target_signal_frame *) | |
| 1435 | + get_sigframe(ka, env, sigframe_size); | |
| 1436 | + | |
| 1437 | +#if 0 | |
| 1438 | + if (invalid_frame_pointer(sf, sigframe_size)) | |
| 1439 | + goto sigill_and_return; | |
| 1440 | +#endif | |
| 1441 | + /* 2. Save the current process state */ | |
| 1442 | + err = setup___siginfo(&sf->info, env, set->sig[0]); | |
| 1443 | + err |= __put_user(0, &sf->extra_size); | |
| 1444 | + | |
| 1445 | + //err |= save_fpu_state(regs, &sf->fpu_state); | |
| 1446 | + //err |= __put_user(&sf->fpu_state, &sf->fpu_save); | |
| 1447 | + | |
| 1448 | + err |= __put_user(set->sig[0], &sf->info.si_mask); | |
| 1449 | + for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) { | |
| 1450 | + err |= __put_user(set->sig[i + 1], &sf->extramask[i]); | |
| 1451 | + } | |
| 1452 | + | |
| 1453 | + for (i = 0; i < 7; i++) { | |
| 1454 | + err |= __put_user(env->regwptr[i + 8], &sf->ss.locals[i]); | |
| 1455 | + } | |
| 1456 | + for (i = 0; i < 7; i++) { | |
| 1457 | + err |= __put_user(env->regwptr[i + 16], &sf->ss.ins[i]); | |
| 1458 | + } | |
| 1459 | + //err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], | |
| 1460 | + // sizeof(struct reg_window)); | |
| 1461 | + if (err) | |
| 1462 | + goto sigsegv; | |
| 1463 | + | |
| 1464 | + /* 3. signal handler back-trampoline and parameters */ | |
| 1465 | + env->regwptr[UREG_FP] = (target_ulong) sf; | |
| 1466 | + env->regwptr[UREG_I0] = sig; | |
| 1467 | + env->regwptr[UREG_I1] = (target_ulong) &sf->info; | |
| 1468 | + env->regwptr[UREG_I2] = (target_ulong) &sf->info; | |
| 1469 | + | |
| 1470 | + /* 4. signal handler */ | |
| 1471 | + env->pc = (unsigned long) ka->sa._sa_handler; | |
| 1472 | + env->npc = (env->pc + 4); | |
| 1473 | + /* 5. return to kernel instructions */ | |
| 1474 | + if (ka->sa.sa_restorer) | |
| 1475 | + env->regwptr[UREG_I7] = (unsigned long)ka->sa.sa_restorer; | |
| 1476 | + else { | |
| 1477 | + env->regwptr[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); | |
| 1478 | + | |
| 1479 | + /* mov __NR_sigreturn, %g1 */ | |
| 1480 | + err |= __put_user(0x821020d8, &sf->insns[0]); | |
| 1481 | + | |
| 1482 | + /* t 0x10 */ | |
| 1483 | + err |= __put_user(0x91d02010, &sf->insns[1]); | |
| 1484 | + if (err) | |
| 1485 | + goto sigsegv; | |
| 1486 | + | |
| 1487 | + /* Flush instruction space. */ | |
| 1488 | + //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | |
| 1489 | + //tb_flush(env); | |
| 1490 | + } | |
| 1491 | + return; | |
| 1492 | + | |
| 1493 | +sigill_and_return: | |
| 1494 | + force_sig(TARGET_SIGILL); | |
| 1495 | +sigsegv: | |
| 1496 | + force_sig(TARGET_SIGSEGV); | |
| 1497 | +} | |
| 1498 | +static inline int | |
| 1499 | +restore_fpu_state(CPUState *env, __siginfo_fpu_t *fpu) | |
| 1500 | +{ | |
| 1501 | + int err; | |
| 1502 | +#if 0 | |
| 1503 | +#ifdef CONFIG_SMP | |
| 1504 | + if (current->flags & PF_USEDFPU) | |
| 1505 | + regs->psr &= ~PSR_EF; | |
| 1506 | +#else | |
| 1507 | + if (current == last_task_used_math) { | |
| 1508 | + last_task_used_math = 0; | |
| 1509 | + regs->psr &= ~PSR_EF; | |
| 1510 | + } | |
| 1511 | +#endif | |
| 1512 | + current->used_math = 1; | |
| 1513 | + current->flags &= ~PF_USEDFPU; | |
| 1514 | +#endif | |
| 1515 | +#if 0 | |
| 1516 | + if (verify_area (VERIFY_READ, fpu, sizeof(*fpu))) | |
| 1517 | + return -EFAULT; | |
| 1518 | +#endif | |
| 1519 | + | |
| 1520 | + err = __copy_from_user(&env->fpr[0], &fpu->si_float_regs[0], | |
| 1521 | + (sizeof(unsigned long) * 32)); | |
| 1522 | + err |= __get_user(env->fsr, &fpu->si_fsr); | |
| 1523 | +#if 0 | |
| 1524 | + err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth); | |
| 1525 | + if (current->thread.fpqdepth != 0) | |
| 1526 | + err |= __copy_from_user(¤t->thread.fpqueue[0], | |
| 1527 | + &fpu->si_fpqueue[0], | |
| 1528 | + ((sizeof(unsigned long) + | |
| 1529 | + (sizeof(unsigned long *)))*16)); | |
| 1530 | +#endif | |
| 1531 | + return err; | |
| 1532 | +} | |
| 1533 | + | |
| 1534 | + | |
| 1535 | +static void setup_rt_frame(int sig, struct emulated_sigaction *ka, | |
| 1536 | + target_siginfo_t *info, | |
| 1537 | + target_sigset_t *set, CPUState *env) | |
| 1538 | +{ | |
| 1539 | + fprintf(stderr, "setup_rt_frame: not implemented\n"); | |
| 1540 | +} | |
| 1541 | + | |
| 1542 | +long do_sigreturn(CPUState *env) | |
| 1543 | +{ | |
| 1544 | + struct target_signal_frame *sf; | |
| 1545 | + unsigned long up_psr, pc, npc; | |
| 1546 | + target_sigset_t set; | |
| 1547 | + __siginfo_fpu_t *fpu_save; | |
| 1548 | + int err; | |
| 1549 | + | |
| 1550 | + sf = (struct new_signal_frame *) env->regwptr[UREG_FP]; | |
| 1551 | + fprintf(stderr, "sigreturn sf: %lx\n", &sf); | |
| 1552 | + | |
| 1553 | + /* 1. Make sure we are not getting garbage from the user */ | |
| 1554 | +#if 0 | |
| 1555 | + if (verify_area (VERIFY_READ, sf, sizeof (*sf))) | |
| 1556 | + goto segv_and_exit; | |
| 1557 | +#endif | |
| 1558 | + | |
| 1559 | + if (((uint) sf) & 3) | |
| 1560 | + goto segv_and_exit; | |
| 1561 | + | |
| 1562 | + err = __get_user(pc, &sf->info.si_regs.pc); | |
| 1563 | + err |= __get_user(npc, &sf->info.si_regs.npc); | |
| 1564 | + | |
| 1565 | + fprintf(stderr, "pc: %lx npc %lx\n", pc, npc); | |
| 1566 | + if ((pc | npc) & 3) | |
| 1567 | + goto segv_and_exit; | |
| 1568 | + | |
| 1569 | + /* 2. Restore the state */ | |
| 1570 | + up_psr = env->psr; | |
| 1571 | + //err |= __copy_from_user(regs, &sf->info.si_regs, sizeof (struct pt_regs) | |
| 1572 | + //); | |
| 1573 | + /* User can only change condition codes and FPU enabling in %psr. */ | |
| 1574 | + env->psr = (up_psr & ~(PSR_ICC /* | PSR_EF */)) | |
| 1575 | + | (env->psr & (PSR_ICC /* | PSR_EF */)); | |
| 1576 | + fprintf(stderr, "psr: %lx\n", env->psr); | |
| 1577 | + | |
| 1578 | + err |= __get_user(fpu_save, &sf->fpu_save); | |
| 1579 | + | |
| 1580 | + if (fpu_save) | |
| 1581 | + err |= restore_fpu_state(env, fpu_save); | |
| 1582 | + | |
| 1583 | + /* This is pretty much atomic, no amount locking would prevent | |
| 1584 | + * the races which exist anyways. | |
| 1585 | + */ | |
| 1586 | + err |= __get_user(set.sig[0], &sf->info.si_mask); | |
| 1587 | + //err |= __copy_from_user(&set.sig[1], &sf->extramask, | |
| 1588 | + // (_NSIG_WORDS-1) * sizeof(unsigned int)); | |
| 1589 | + | |
| 1590 | + if (err) | |
| 1591 | + goto segv_and_exit; | |
| 1592 | + | |
| 1593 | +#if 0 | |
| 1594 | + sigdelsetmask(&set, ~_BLOCKABLE); | |
| 1595 | + spin_lock_irq(¤t->sigmask_lock); | |
| 1596 | + current->blocked = set; | |
| 1597 | + recalc_sigpending(current); | |
| 1598 | + spin_unlock_irq(¤t->sigmask_lock); | |
| 1599 | +#endif | |
| 1600 | + fprintf(stderr, "returning %lx\n", env->regwptr[0]); | |
| 1601 | + return env->regwptr[0]; | |
| 1602 | + | |
| 1603 | +segv_and_exit: | |
| 1604 | + force_sig(TARGET_SIGSEGV); | |
| 1605 | +} | |
| 1606 | + | |
| 1607 | +long do_rt_sigreturn(CPUState *env) | |
| 1608 | +{ | |
| 1609 | + fprintf(stderr, "do_rt_sigreturn: not implemented\n"); | |
| 1610 | + return -ENOSYS; | |
| 1611 | +} | |
| 1612 | + | |
| 1613 | + | |
| 1274 | 1614 | #else |
| 1275 | 1615 | |
| 1276 | 1616 | static void setup_frame(int sig, struct emulated_sigaction *ka, | ... | ... |
linux-user/syscall_defs.h
| ... | ... | @@ -294,6 +294,7 @@ int do_sigaction(int sig, const struct target_sigaction *act, |
| 294 | 294 | |
| 295 | 295 | #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_PPC) |
| 296 | 296 | |
| 297 | +#if !defined(TARGET_SPARC) | |
| 297 | 298 | #define TARGET_SA_NOCLDSTOP 0x00000001 |
| 298 | 299 | #define TARGET_SA_NOCLDWAIT 0x00000002 /* not supported yet */ |
| 299 | 300 | #define TARGET_SA_SIGINFO 0x00000004 |
| ... | ... | @@ -302,6 +303,57 @@ int do_sigaction(int sig, const struct target_sigaction *act, |
| 302 | 303 | #define TARGET_SA_NODEFER 0x40000000 |
| 303 | 304 | #define TARGET_SA_RESETHAND 0x80000000 |
| 304 | 305 | #define TARGET_SA_RESTORER 0x04000000 |
| 306 | +#else /* TARGET_SPARC */ | |
| 307 | +#define TARGET_SA_NOCLDSTOP 8u | |
| 308 | +#define TARGET_SA_NOCLDWAIT 0x100u | |
| 309 | +#define TARGET_SA_SIGINFO 0x200u | |
| 310 | +#define TARGET_SA_ONSTACK 1u | |
| 311 | +#define TARGET_SA_RESTART 2u | |
| 312 | +#define TARGET_SA_NODEFER 0x20u | |
| 313 | +#define TARGET_SA_RESETHAND 4u | |
| 314 | +#endif | |
| 315 | + | |
| 316 | +#if defined(TARGET_SPARC) | |
| 317 | + | |
| 318 | +#define TARGET_SIGHUP 1 | |
| 319 | +#define TARGET_SIGINT 2 | |
| 320 | +#define TARGET_SIGQUIT 3 | |
| 321 | +#define TARGET_SIGILL 4 | |
| 322 | +#define TARGET_SIGTRAP 5 | |
| 323 | +#define TARGET_SIGABRT 6 | |
| 324 | +#define TARGET_SIGIOT 6 | |
| 325 | +#define TARGET_SIGSTKFLT 7 /* actually EMT */ | |
| 326 | +#define TARGET_SIGFPE 8 | |
| 327 | +#define TARGET_SIGKILL 9 | |
| 328 | +#define TARGET_SIGBUS 10 | |
| 329 | +#define TARGET_SIGSEGV 11 | |
| 330 | +#define TARGET_SIGSYS 12 | |
| 331 | +#define TARGET_SIGPIPE 13 | |
| 332 | +#define TARGET_SIGALRM 14 | |
| 333 | +#define TARGET_SIGTERM 15 | |
| 334 | +#define TARGET_SIGURG 16 | |
| 335 | +#define TARGET_SIGSTOP 17 | |
| 336 | +#define TARGET_SIGTSTP 18 | |
| 337 | +#define TARGET_SIGCONT 19 | |
| 338 | +#define TARGET_SIGCHLD 20 | |
| 339 | +#define TARGET_SIGTTIN 21 | |
| 340 | +#define TARGET_SIGTTOU 22 | |
| 341 | +#define TARGET_SIGIO 23 | |
| 342 | +#define TARGET_SIGXCPU 24 | |
| 343 | +#define TARGET_SIGXFSZ 25 | |
| 344 | +#define TARGET_SIGVTALRM 26 | |
| 345 | +#define TARGET_SIGPROF 27 | |
| 346 | +#define TARGET_SIGWINCH 28 | |
| 347 | +#define TARGET_SIGPWR 29 | |
| 348 | +#define TARGET_SIGUSR1 30 | |
| 349 | +#define TARGET_SIGUSR2 31 | |
| 350 | +#define TARGET_SIGRTMIN 32 | |
| 351 | + | |
| 352 | +#define TARGET_SIG_BLOCK 0x01 /* for blocking signals */ | |
| 353 | +#define TARGET_SIG_UNBLOCK 0x02 /* for unblocking signals */ | |
| 354 | +#define TARGET_SIG_SETMASK 0x04 /* for setting the signal mask */ | |
| 355 | + | |
| 356 | +#else | |
| 305 | 357 | |
| 306 | 358 | #define TARGET_SIGHUP 1 |
| 307 | 359 | #define TARGET_SIGINT 2 |
| ... | ... | @@ -341,6 +393,8 @@ int do_sigaction(int sig, const struct target_sigaction *act, |
| 341 | 393 | #define TARGET_SIG_UNBLOCK 1 /* for unblocking signals */ |
| 342 | 394 | #define TARGET_SIG_SETMASK 2 /* for setting the signal mask */ |
| 343 | 395 | |
| 396 | +#endif | |
| 397 | + | |
| 344 | 398 | struct target_old_sigaction { |
| 345 | 399 | target_ulong _sa_handler; |
| 346 | 400 | target_ulong sa_mask; |
| ... | ... | @@ -359,6 +413,30 @@ typedef union target_sigval { |
| 359 | 413 | int sival_int; |
| 360 | 414 | target_ulong sival_ptr; |
| 361 | 415 | } target_sigval_t; |
| 416 | +#if 0 | |
| 417 | +#if defined (TARGET_SPARC) | |
| 418 | +typedef struct { | |
| 419 | + struct { | |
| 420 | + target_ulong psr; | |
| 421 | + target_ulong pc; | |
| 422 | + target_ulong npc; | |
| 423 | + target_ulong y; | |
| 424 | + target_ulong u_regs[16]; /* globals and ins */ | |
| 425 | + } si_regs; | |
| 426 | + int si_mask; | |
| 427 | +} __siginfo_t; | |
| 428 | + | |
| 429 | +typedef struct { | |
| 430 | + unsigned long si_float_regs [32]; | |
| 431 | + unsigned long si_fsr; | |
| 432 | + unsigned long si_fpqdepth; | |
| 433 | + struct { | |
| 434 | + unsigned long *insn_addr; | |
| 435 | + unsigned long insn; | |
| 436 | + } si_fpqueue [16]; | |
| 437 | +} __siginfo_fpu_t; | |
| 438 | +#endif | |
| 439 | +#endif | |
| 362 | 440 | |
| 363 | 441 | #define TARGET_SI_MAX_SIZE 128 |
| 364 | 442 | #define TARGET_SI_PAD_SIZE ((TARGET_SI_MAX_SIZE/sizeof(int)) - 3) |
| ... | ... | @@ -954,6 +1032,24 @@ struct target_stat64 { |
| 954 | 1032 | #define TARGET_O_NOFOLLOW 0100000 /* don't follow links */ |
| 955 | 1033 | #define TARGET_O_LARGEFILE 0200000 |
| 956 | 1034 | #define TARGET_O_DIRECT 0400000 /* direct disk access hint */ |
| 1035 | +#elif defined (TARGET_SPARC) | |
| 1036 | +#define TARGET_O_RDONLY 0x0000 | |
| 1037 | +#define TARGET_O_WRONLY 0x0001 | |
| 1038 | +#define TARGET_O_RDWR 0x0002 | |
| 1039 | +#define TARGET_O_ACCMODE 0x0003 | |
| 1040 | +#define TARGET_O_APPEND 0x0008 | |
| 1041 | +#define TARGET_FASYNC 0x0040 /* fcntl, for BSD compatibility */ | |
| 1042 | +#define TARGET_O_CREAT 0x0200 /* not fcntl */ | |
| 1043 | +#define TARGET_O_TRUNC 0x0400 /* not fcntl */ | |
| 1044 | +#define TARGET_O_EXCL 0x0800 /* not fcntl */ | |
| 1045 | +#define TARGET_O_SYNC 0x2000 | |
| 1046 | +#define TARGET_O_NONBLOCK 0x4000 | |
| 1047 | +#define TARGET_O_NDELAY (0x0004 | O_NONBLOCK) | |
| 1048 | +#define TARGET_O_NOCTTY 0x8000 /* not fcntl */ | |
| 1049 | +#define TARGET_O_DIRECTORY 0x10000 /* must be a directory */ | |
| 1050 | +#define TARGET_O_NOFOLLOW 0x20000 /* don't follow links */ | |
| 1051 | +#define TARGET_O_LARGEFILE 0x40000 | |
| 1052 | +#define TARGET_O_DIRECT 0x100000 /* direct disk access hint */ | |
| 957 | 1053 | #else |
| 958 | 1054 | #define TARGET_O_ACCMODE 0003 |
| 959 | 1055 | #define TARGET_O_RDONLY 00 | ... | ... |