* defs.h (struct sysent): New member `native_scno'.
(known_scno): Declare new function.
* linux/syscallent.h: Add new final field to interesting syscalls.
* syscall.c (known_scno): New function.
(dumpio, internal_syscall, syscall_fixup, trace_syscall): Use it.
* process.c (internal_fork, internal_exit): Likewise.
[IA64] (ARG_STACKSIZE, ARG_PTID, ARG_CTID, ARG_TLS): Likewise.
* strace.c (proc_open): Likewise.
* util.c [LINUX] (setbpt): Likewise.
* linux/syscall.h: Remove [!defined(X86_64)] from conditional
for defining SYS_socket_subcall et al.
* linux/syscallent.h: Likewise for #error check.
* syscall.c (trace_syscall): Likewise for SYS_{socketcall,ipc} cases.
Fixes RH#158934.
extern void qualify P((char *));
extern void newoutf P((struct tcb *));
extern int get_scno P((struct tcb *));
+extern long known_scno P((struct tcb *));
extern int trace_syscall P((struct tcb *));
extern void printxval P((const struct xlat *, int, const char *));
extern int printargs P((struct tcb *));
int sys_flags;
int (*sys_func)();
const char *sys_name;
+ long native_scno; /* Match against SYS_* constants. */
};
extern const struct sysent *sysent;
if (tcp->status.PR_WHY == PR_SYSENTRY) {
tcp->flags &= ~TCB_INSYSCALL;
get_scno(tcp);
- if (tcp->scno == SYS_execve)
+ if (known_scno(tcp) == SYS_execve)
break;
}
/* Set it running: maybe execve will be next. */
#ifndef CLONE_PTRACE
# define CLONE_PTRACE 0x00002000
#endif
+#ifndef CLONE_STOPPED
+# define CLONE_STOPPED 0x02000000
+#endif
#ifdef IA64
static int
set_arg0 (struct tcb *tcp, void *cookie, long val)
{
- return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val);
+ long oldval,newval;
+ if (get_arg0(tcp, cookie, &oldval) < 0)
+ abort ();
+ if (ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg0_offset, val) < 0)
+ return -1;
+ if (get_arg0(tcp, cookie, &newval) < 0)
+ abort ();
+ fprintf(stderr, "XXX old %lx set %lx new %lx\n",
+ oldval,val,newval);
+ return 0;
}
static int
return -1;
}
- switch (tcp->scno) {
+ switch (known_scno(tcp)) {
#ifdef SYS_vfork
case SYS_vfork:
#endif