diff options
author | Christian Svensson <blue@cmd.nu> | 2013-02-14 13:26:27 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-02-14 13:38:27 +0100 |
commit | 492f81f14cc86c13b0f67ac66a3d5ea9f6ccb673 (patch) | |
tree | 7bcafe96f0842056d441b5f04d05c70a24d7d67b /system.c | |
parent | eec8d5d6b028665a73169fda96e4e873cb8351f0 (diff) | |
download | strace-492f81f14cc86c13b0f67ac66a3d5ea9f6ccb673.tar.gz strace-492f81f14cc86c13b0f67ac66a3d5ea9f6ccb673.tar.bz2 strace-492f81f14cc86c13b0f67ac66a3d5ea9f6ccb673.tar.xz |
Add support for the OpenRISC 1000 platform
* configure.ac: Added or1k architecture..
* defs.h: Added or1k to use register reading system.
* linux/or1k/ioctlent.h.in: Use i386 ioctls.
* linux/or1k/syscallent.h: New file.
* process.c: Added or1k register defs to struct_user_offsets[].
* syscall.c: Added or1k_io iovec for or1k GETREGSET,
regset structure for or1k.
(printcall): Added handling for or1k.
(get_regs): Likewise.
(get_scno): Likewise.
(get_syscall_args): Likewise.
(get_syscall_result): Likewise.
(get_error): Likewise.
* util.c (change_syscall): Added dummy handling for or1k.
* system.c (sys_or1k_atomic): New function (or1k specific syscall).
Signed-off-by: Christian Svensson <blue@cmd.nu>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'system.c')
-rw-r--r-- | system.c | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -1026,3 +1026,63 @@ int sys_sysmips(struct tcb *tcp) } #endif /* MIPS */ + +#ifdef OR1K +#define OR1K_ATOMIC_SWAP 1 +#define OR1K_ATOMIC_CMPXCHG 2 +#define OR1K_ATOMIC_XCHG 3 +#define OR1K_ATOMIC_ADD 4 +#define OR1K_ATOMIC_DECPOS 5 +#define OR1K_ATOMIC_AND 6 +#define OR1K_ATOMIC_OR 7 +#define OR1K_ATOMIC_UMAX 8 +#define OR1K_ATOMIC_UMIN 9 + +static const struct xlat atomic_ops[] = { + { OR1K_ATOMIC_SWAP, "SWAP" }, + { OR1K_ATOMIC_CMPXCHG, "CMPXCHG" }, + { OR1K_ATOMIC_XCHG, "XCHG" }, + { OR1K_ATOMIC_ADD, "ADD" }, + { OR1K_ATOMIC_DECPOS, "DECPOS" }, + { OR1K_ATOMIC_AND, "AND" }, + { OR1K_ATOMIC_OR, "OR" }, + { OR1K_ATOMIC_UMAX, "UMAX" }, + { OR1K_ATOMIC_UMIN, "UMIN" }, + { 0, NULL } +}; + +int sys_or1k_atomic(struct tcb *tcp) +{ + if (entering(tcp)) { + printxval(atomic_ops, tcp->u_arg[0], "???"); + switch(tcp->u_arg[0]) { + case OR1K_ATOMIC_SWAP: + tprintf(", 0x%lx, 0x%lx", tcp->u_arg[1], tcp->u_arg[2]); + break; + case OR1K_ATOMIC_CMPXCHG: + tprintf(", 0x%lx, %#lx, %#lx", tcp->u_arg[1], tcp->u_arg[2], + tcp->u_arg[3]); + break; + + case OR1K_ATOMIC_XCHG: + case OR1K_ATOMIC_ADD: + case OR1K_ATOMIC_AND: + case OR1K_ATOMIC_OR: + case OR1K_ATOMIC_UMAX: + case OR1K_ATOMIC_UMIN: + tprintf(", 0x%lx, %#lx", tcp->u_arg[1], tcp->u_arg[2]); + break; + + case OR1K_ATOMIC_DECPOS: + tprintf(", 0x%lx", tcp->u_arg[1]); + break; + + default: + break; + } + } + + return RVAL_HEX; +} + +#endif /* OR1K */ |