2005-06-06 Roland McGrath <roland@redhat.com>

* 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.
This commit is contained in:
Roland McGrath 2005-06-07 23:21:31 +00:00
parent e69b627099
commit 76989d7a16
3 changed files with 17 additions and 3 deletions

2
defs.h
View File

@ -424,6 +424,7 @@ extern void set_overhead P((int));
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 *));
@ -526,6 +527,7 @@ struct sysent {
int sys_flags;
int (*sys_func)();
const char *sys_name;
long native_scno; /* Match against SYS_* constants. */
};
extern const struct sysent *sysent;

View File

@ -1002,7 +1002,7 @@ int attaching;
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. */

16
util.c
View File

@ -1205,6 +1205,9 @@ struct tcb *tcp;
#ifndef CLONE_PTRACE
# define CLONE_PTRACE 0x00002000
#endif
#ifndef CLONE_STOPPED
# define CLONE_STOPPED 0x02000000
#endif
#ifdef IA64
@ -1369,7 +1372,16 @@ typedef int arg_setup_state;
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
@ -1404,7 +1416,7 @@ struct tcb *tcp;
return -1;
}
switch (tcp->scno) {
switch (known_scno(tcp)) {
#ifdef SYS_vfork
case SYS_vfork:
#endif