Import lots of ia64 related changes from David Mosberger
diff --git a/ChangeLog b/ChangeLog
index 807c38d..7884935 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,70 @@
+2001-10-03  David Mosberger  <davidm@hpl.hp.com>
+
+	* process.c (internal_clone): Avoid race condition by clearing
+	breakpoint after attaching to child.
+
+2001-10-02  David Mosberger  <davidm@hpl.hp.com>
+
+	* linux/ia64/syscallent.h: Define ia32 syscall numbers (originally
+	by Don Dugger, with my refinements).
+
+	* linux/ia64/ioctlent.h: Regenerate and manually merge conflicting
+	ioctls (TCGETS & SNDCTL_TMR_TIMEBASE, etc.).
+
+	* linux/ia64/Makefile.in (ioctldefs.h ioctls.h): Update for
+	new ioctlent.h generation scheme.
+
+	* linux/syscall.h (sys_clone2): Declare.
+	[IA64] Define ia32 socket, ipc, and extra syscall numbers.
+
+	* linux/ioctlent.sh (regexp): Also handle <asm/ioctls.h> so we
+	don't miss the tty ioctls (unfortunately, some of the sound timer
+	ioctls are in conflict with them!).
+
+	* util.c (setbpt) [IA64]: Add ia32 support (by Don Dugger).
+	(clrbpt) [IA64]: Ditto.
+
+	* syscall.c (internal_syscall): Handle SYS_clone2, SYS32_wait4,
+	and SYS32_exit.
+	(get_scno): Get ia32 syscall number from r1 (orig eax) instead of
+	r8 (eax).  Handle TCB_WAITEXECVE.
+	(syscall_fixup): Handle ia64.
+	(syscall_enter): Fix argument fetching for ia64.
+
+	* strace.c [IA64 && LINUX]: Include <asm/ptrace_offsets.h>.
+	(trace) [PT_GETSIGINFO]: Print signal address and pc if possible.
+
+	* process.c (tcp): New function.
+	(change_syscall): Add support for ia64 linux.
+	(sys_execve): Turn on TCB_WAITEXECVE for ia64 linux.
+
+	* desc.c (getlk): Cast l_len to "long long" to avoid warnings when
+	type is narrower.
+	* resource.c (sprintrlim64): Ditto.
+
+	* defs.h (TCB_WAITEXECVE) [IA64]: Define.
+	[IA64]: Declare "ia32" variable.
+
+	* bjm.c: Do not include <linux/module.h>.  It's not safe to include
+	kernel headers.  Declare the necessary constants and structures
+	directly instead.
+
+2001-10-01  David Mosberger  <davidm@hpl.hp.com>
+
+	* signal.c (parse_sigset_t): New function.
+	(sigishandled): Fix off-by-one bug by using parse_sigset_t() and
+	avoiding relying on internal layout of sigset_t datastructure.
+
+2001-04-26  David Mosberger  <davidm@hpl.hp.com>
+
+	* linux/ia64/syscallent.h: Add getunwind().
+
+2001-04-11  David Mosberger  <davidm@hpl.hp.com>
+
+	* syscall.c (syscall_enter): Use PT_RBS_END instead of deprecated
+	PT_AR_BSP.  Pick up arguments starting with out0, which is not
+	always the same as r32 (e.g., consider inlined syscalls).
+
 2001-09-28   John Hughes <john@Calva.COM>
 
   * process.c: FreeBSD-CURRENT no longer has PT_READ_U, and anyway we
diff --git a/bjm.c b/bjm.c
index 66cbb85..b9ebd5a 100644
--- a/bjm.c
+++ b/bjm.c
@@ -42,7 +42,39 @@
 #include <sys/user.h>
 #include <sys/syscall.h>
 #include <signal.h>
-#include <linux/module.h>
+
+/* Bits of module.flags.  */
+
+#define MOD_UNINITIALIZED	0
+#define MOD_RUNNING		1
+#define MOD_DELETED		2
+#define MOD_AUTOCLEAN		4
+#define MOD_VISITED  		8
+#define MOD_USED_ONCE		16
+#define MOD_JUST_FREED		32
+#define MOD_INITIALIZING	64
+
+/* Values for query_module's which.  */
+
+#define QM_MODULES	1
+#define QM_DEPS		2
+#define QM_REFS		3
+#define QM_SYMBOLS	4
+#define QM_INFO		5
+
+struct module_symbol
+{
+	unsigned long value;
+	const char *name;
+};
+
+struct module_info
+{
+	unsigned long addr;
+	unsigned long size;
+	unsigned long flags;
+	long usecount;
+};
 
 static struct xlat which[] = {
 	{ 0,		"0"		},
diff --git a/defs.h b/defs.h
index 07b1a1a..85e2edc 100644
--- a/defs.h
+++ b/defs.h
@@ -176,7 +176,6 @@
 #define SUPPORTED_PERSONALITIES 2
 #endif /* LINUXSPARC */
 
-
 #ifdef SVR4
 #ifdef HAVE_MP_PROCFS
 extern int mp_ioctl (int f, int c, void *a, int s);
@@ -284,9 +283,9 @@
 #define TCB_FOLLOWFORK	00400	/* Process should have forks followed */
 #define TCB_REPRINT	01000	/* We should reprint this syscall on exit */
 #ifdef LINUX
-#if defined(ALPHA) || defined(SPARC) || defined(POWERPC) || defined(HPPA)
-#define TCB_WAITEXECVE	02000	/* ignore SIGTRAP after exceve */
-#endif /* ALPHA */
+# if defined(ALPHA) || defined(SPARC) || defined(POWERPC) || defined(IA64) || defined(HPPA)
+#  define TCB_WAITEXECVE 02000	/* ignore SIGTRAP after exceve */
+# endif
 #endif /* LINUX */
 
 /* qualifier flags */
@@ -532,3 +531,7 @@
     ((long long)((unsigned long long)(_h) | ((unsigned long long)(_l)<<32)))
 #endif
 #endif
+
+#ifdef IA64
+extern long ia32;
+#endif
diff --git a/desc.c b/desc.c
index 5cc1c3b..7430fee 100644
--- a/desc.c
+++ b/desc.c
@@ -225,7 +225,7 @@
 	printxval(lockfcmds, fl.l_type, "F_???");
 	tprintf(", whence=");
 	printxval(whence, fl.l_whence, "SEEK_???");
-	tprintf(", start=%lld, len=%lld", fl.l_start, fl.l_len);
+	tprintf(", start=%lld, len=%lld", (long long) fl.l_start, (long long) fl.l_len);
 	if (getlk)
 		tprintf(", pid=%lu}", (unsigned long) fl.l_pid);
 	else
diff --git a/file.c b/file.c
index da3b8a2..f72ad48 100644
--- a/file.c
+++ b/file.c
@@ -990,7 +990,7 @@
 	}
 	return 0;
 }
-# endif /* !IA64 */
+# endif /* !IA64 && !HPPA*/
 #endif /* linux */
 
 #ifndef HAVE_LONG_LONG_OFF_T
@@ -1036,7 +1036,7 @@
 	}
 	return 0;
 }
-# endif /* !IA64 */
+# endif /* !IA64 && !HPPA*/
 #endif
 
 #ifndef HAVE_LONG_LONG_OFF_T
@@ -1085,7 +1085,7 @@
 	}
 	return 0;
 }
-# endif /* !IA64 */
+# endif /* !IA64 && !HPPA */
 #endif
 
 
diff --git a/linux/ia64/Makefile.in b/linux/ia64/Makefile.in
index 4c5344d..72b0383 100644
--- a/linux/ia64/Makefile.in
+++ b/linux/ia64/Makefile.in
@@ -23,19 +23,17 @@
 
 all: ioctlent.h errnoent.h signalent.h syscallent.h
 
-ioctlent.raw: ioctlent.sh
-	$(SHELL) $(srcdir)/ioctlent.sh $(includedir) >$@
-
-ioctlent.h: ioctlent.raw ioctlsort
+ioctlent.h: ioctlsort
 	./ioctlsort >$@
 
 ioctlsort: ioctlsort.o
 	$(CC) $(LDFLAGS) ioctlsort.o -o ioctlsort
 
-ioctlsort.o: ../../ioctlsort.c
-	$(CC) $(WARNFLAGS) $(DEFS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) -c $(srcdir)/../../ioctlsort.c
+ioctlsort.o: ../ioctlsort.c ioctldefs.h ioctls.h
+	$(CC) $(WARNFLAGS) $(DEFS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) -c $<
 
-ioctlsort.o: ioctlent.raw
+ioctldefs.h ioctls.h: $(srcdir)/../ioctlent.sh
+	sh $(srcdir)/../ioctlent.sh
 
 errnoent.h: ../../errnoent.sh $(includedir)/asm/errno.h
 	$(SHELL) $(srcdir)/../../errnoent.sh $(includedir)/asm/errno.h >$@
diff --git a/linux/ia64/ioctlent.h b/linux/ia64/ioctlent.h
index 7b78080..7574bc3 100644
--- a/linux/ia64/ioctlent.h
+++ b/linux/ia64/ioctlent.h
@@ -54,6 +54,8 @@
 	{"linux/fs.h",	"BLKELVGET",	0x126a},
 	{"linux/elevator.h",	"BLKELVSET",	0x126b},
 	{"linux/fs.h",	"BLKELVSET",	0x126b},
+	{"linux/fs.h",	"BLKGETLASTSECT",	0x126c},
+	{"linux/fs.h",	"BLKSETLASTSECT",	0x126d},
 	{"linux/agpgart.h",	"AGPIOC_INFO",	0x4100},
 	{"linux/agpgart.h",	"AGPIOC_ACQUIRE",	0x4101},
 	{"linux/apm_bios.h",	"APM_IOC_STANDBY",	0x4101},
@@ -82,11 +84,21 @@
 	{"linux/cciss_ioctl.h",	"CCISS_GETDRIVVER",	0x4209},
 	{"linux/cciss_ioctl.h",	"CCISS_REVALIDVOLS",	0x420a},
 	{"linux/cciss_ioctl.h",	"CCISS_PASSTHRU",	0x420b},
+	{"linux/soundcard.h",	"SNDCTL_COPR_RESET",	0x4300},
 	{"linux/capi.h",	"CAPI_REGISTER",	0x4301},
+	{"linux/soundcard.h",	"SNDCTL_COPR_LOAD",	0x4301},
+	{"linux/soundcard.h",	"SNDCTL_COPR_RDATA",	0x4302},
+	{"linux/soundcard.h",	"SNDCTL_COPR_RCODE",	0x4303},
+	{"linux/soundcard.h",	"SNDCTL_COPR_WDATA",	0x4304},
+	{"linux/soundcard.h",	"SNDCTL_COPR_WCODE",	0x4305},
 	{"linux/capi.h",	"CAPI_GET_MANUFACTURER",	0x4306},
+	{"linux/soundcard.h",	"SNDCTL_COPR_RUN",	0x4306},
 	{"linux/capi.h",	"CAPI_GET_VERSION",	0x4307},
+	{"linux/soundcard.h",	"SNDCTL_COPR_HALT",	0x4307},
 	{"linux/capi.h",	"CAPI_GET_SERIAL",	0x4308},
+	{"linux/soundcard.h",	"SNDCTL_COPR_SENDMSG",	0x4308},
 	{"linux/capi.h",	"CAPI_GET_PROFILE",	0x4309},
+	{"linux/soundcard.h",	"SNDCTL_COPR_RCVMSG",	0x4309},
 	{"linux/capi.h",	"CAPI_MANUFACTURER_CMD",	0x4320},
 	{"linux/capi.h",	"CAPI_GET_ERRCODE",	0x4321},
 	{"linux/capi.h",	"CAPI_INSTALLED",	0x4322},
@@ -132,14 +144,139 @@
 	{"linux/isdn.h",	"IIOCNETGPN",	0x4922},
 	{"linux/isdn.h",	"IIOCDBGVAR",	0x497f},
 	{"linux/isdn.h",	"IIOCDRVCTL",	0x4980},
+	{"linux/soundcard.h",	"SOUND_MIXER_INFO",	0x4d65},
+	{"linux/soundcard.h",	"SOUND_OLD_MIXER_INFO",	0x4d65},
+	{"linux/soundcard.h",	"SOUND_MIXER_ACCESS",	0x4d66},
+	{"linux/soundcard.h",	"SOUND_MIXER_AGC",	0x4d67},
+	{"linux/soundcard.h",	"SOUND_MIXER_3DSE",	0x4d68},
+	{"linux/soundcard.h",	"SOUND_MIXER_PRIVATE1",	0x4d6f},
+	{"linux/soundcard.h",	"SOUND_MIXER_PRIVATE2",	0x4d70},
+	{"linux/soundcard.h",	"SOUND_MIXER_PRIVATE3",	0x4d71},
+	{"linux/soundcard.h",	"SOUND_MIXER_PRIVATE4",	0x4d72},
+	{"linux/soundcard.h",	"SOUND_MIXER_PRIVATE5",	0x4d73},
+	{"linux/soundcard.h",	"SOUND_MIXER_GETLEVELS",	0x4d74},
+	{"linux/soundcard.h",	"SOUND_MIXER_SETLEVELS",	0x4d75},
+	{"linux/soundcard.h",	"OSS_GETVERSION",	0x4d76},
+	{"linux/soundcard.h",	"SNDCTL_DSP_RESET",	0x5000},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SYNC",	0x5001},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SPEED",	0x5002},
+	{"linux/soundcard.h",	"SOUND_PCM_READ_RATE",	0x5002},
+	{"linux/soundcard.h",	"SNDCTL_DSP_STEREO",	0x5003},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETBLKSIZE",	0x5004},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SETFMT",	0x5005},
+	{"linux/soundcard.h",	"SOUND_PCM_READ_BITS",	0x5005},
+	{"linux/soundcard.h",	"SNDCTL_DSP_CHANNELS",	0x5006},
+	{"linux/soundcard.h",	"SOUND_PCM_READ_CHANNELS",	0x5006},
+	{"linux/soundcard.h",	"SOUND_PCM_WRITE_FILTER",	0x5007},
+	{"linux/soundcard.h",	"SOUND_PCM_READ_FILTER",	0x5007},
+	{"linux/soundcard.h",	"SNDCTL_DSP_POST",	0x5008},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SUBDIVIDE",	0x5009},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SETFRAGMENT",	0x500a},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETFMTS",	0x500b},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETOSPACE",	0x500c},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETISPACE",	0x500d},
+	{"linux/soundcard.h",	"SNDCTL_DSP_NONBLOCK",	0x500e},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETCAPS",	0x500f},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETTRIGGER",	0x5010},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SETTRIGGER",	0x5010},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETIPTR",	0x5011},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETOPTR",	0x5012},
+	{"linux/soundcard.h",	"SNDCTL_DSP_MAPINBUF",	0x5013},
+	{"linux/soundcard.h",	"SNDCTL_DSP_MAPOUTBUF",	0x5014},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SETSYNCRO",	0x5015},
+	{"linux/soundcard.h",	"SNDCTL_DSP_SETDUPLEX",	0x5016},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETODELAY",	0x5017},
+	{"linux/soundcard.h",	"SNDCTL_DSP_PROFILE",	0x5017},
+	{"linux/soundcard.h",	"SNDCTL_DSP_GETCHANNELMASK",	0x5040},
+	{"linux/soundcard.h",	"SNDCTL_DSP_BIND_CHANNEL",	0x5041},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_RESET",	0x5100},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_SYNC",	0x5101},
+	{"linux/soundcard.h",	"SNDCTL_SYNTH_INFO",	0x5102},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_CTRLRATE",	0x5103},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_GETOUTCOUNT",	0x5104},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_GETINCOUNT",	0x5105},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_PERCMODE",	0x5106},
+	{"linux/soundcard.h",	"SNDCTL_FM_LOAD_INSTR",	0x5107},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_TESTMIDI",	0x5108},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_RESETSAMPLES",	0x5109},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_NRSYNTHS",	0x510a},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_NRMIDIS",	0x510b},
+	{"linux/soundcard.h",	"SNDCTL_MIDI_INFO",	0x510c},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_THRESHOLD",	0x510d},
+	{"linux/soundcard.h",	"SNDCTL_SYNTH_MEMAVL",	0x510e},
+	{"linux/soundcard.h",	"SNDCTL_FM_4OP_ENABLE",	0x510f},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_PANIC",	0x5111},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_OUTOFBAND",	0x5112},
+	{"linux/soundcard.h",	"SNDCTL_SEQ_GETTIME",	0x5113},
+	{"linux/soundcard.h",	"SNDCTL_SYNTH_ID",	0x5114},
+	{"linux/soundcard.h",	"SNDCTL_SYNTH_CONTROL",	0x5115},
+	{"linux/soundcard.h",	"SNDCTL_SYNTH_REMOVESAMPLE",	0x5116},
 	{"linux/random.h",	"RNDGETENTCNT",	0x5200},
 	{"linux/random.h",	"RNDADDTOENTCNT",	0x5201},
 	{"linux/random.h",	"RNDGETPOOL",	0x5202},
 	{"linux/random.h",	"RNDADDENTROPY",	0x5203},
 	{"linux/random.h",	"RNDZAPENTCNT",	0x5204},
 	{"linux/random.h",	"RNDCLEARPOOL",	0x5206},
+	{"asm/ioctls.h",	"TCGETS|SNDCTL_TMR_TIMEBASE",	0x5401},
+	{"asm/ioctls.h",	"TCSETS|SNDCTL_TMR_START",	0x5402},
+	{"asm/ioctls.h",	"TCSETSW|SNDCTL_TMR_STOP",	0x5403},
+	{"asm/ioctls.h",	"TCSETSF|SNDCTL_TMR_CONTINUE",	0x5404},
+	{"asm/ioctls.h",	"TCGETA|SNDCTL_TMR_TEMPO",	0x5405},
+	{"asm/ioctls.h",	"TCSETA|SNDCTL_TMR_SOURCE",	0x5406},
+	{"asm/ioctls.h",	"TCSETAW|SNDCTL_TMR_METRONOME",	0x5407},
+	{"asm/ioctls.h",	"TCSETAF|SNDCTL_TMR_SELECT",	0x5408},
+	{"asm/ioctls.h",	"TCSBRK",	0x5409},
+	{"asm/ioctls.h",	"TCXONC",	0x540a},
+	{"asm/ioctls.h",	"TCFLSH",	0x540b},
+	{"asm/ioctls.h",	"TIOCEXCL",	0x540c},
+	{"asm/ioctls.h",	"TIOCNXCL",	0x540d},
+	{"asm/ioctls.h",	"TIOCSCTTY",	0x540e},
+	{"asm/ioctls.h",	"TIOCGPGRP",	0x540f},
+	{"asm/ioctls.h",	"TIOCSPGRP",	0x5410},
+	{"asm/ioctls.h",	"TIOCOUTQ",	0x5411},
+	{"asm/ioctls.h",	"TIOCSTI",	0x5412},
+	{"asm/ioctls.h",	"TIOCGWINSZ",	0x5413},
+	{"asm/ioctls.h",	"TIOCSWINSZ",	0x5414},
+	{"asm/ioctls.h",	"TIOCMGET",	0x5415},
+	{"asm/ioctls.h",	"TIOCMBIS",	0x5416},
+	{"asm/ioctls.h",	"TIOCMBIC",	0x5417},
+	{"asm/ioctls.h",	"TIOCMSET",	0x5418},
+	{"asm/ioctls.h",	"TIOCGSOFTCAR",	0x5419},
+	{"asm/ioctls.h",	"TIOCSSOFTCAR",	0x541a},
+	{"asm/ioctls.h",	"FIONREAD",	0x541b},
+	{"asm/ioctls.h",	"TIOCLINUX",	0x541c},
+	{"asm/ioctls.h",	"TIOCCONS",	0x541d},
+	{"asm/ioctls.h",	"TIOCGSERIAL",	0x541e},
+	{"asm/ioctls.h",	"TIOCSSERIAL",	0x541f},
+	{"asm/ioctls.h",	"TIOCPKT",	0x5420},
+	{"asm/ioctls.h",	"FIONBIO",	0x5421},
+	{"asm/ioctls.h",	"TIOCNOTTY",	0x5422},
+	{"asm/ioctls.h",	"TIOCSETD",	0x5423},
+	{"asm/ioctls.h",	"TIOCGETD",	0x5424},
+	{"asm/ioctls.h",	"TCSBRKP",	0x5425},
+	{"asm/ioctls.h",	"TIOCTTYGSTRUCT",	0x5426},
+	{"asm/ioctls.h",	"TIOCSBRK",	0x5427},
+	{"asm/ioctls.h",	"TIOCCBRK",	0x5428},
+	{"asm/ioctls.h",	"TIOCGSID",	0x5429},
 	{"asm/ioctls.h",	"TIOCGPTN",	0x5430},
 	{"asm/ioctls.h",	"TIOCSPTLCK",	0x5431},
+	{"asm/ioctls.h",	"FIONCLEX",	0x5450},
+	{"asm/ioctls.h",	"FIOCLEX",	0x5451},
+	{"asm/ioctls.h",	"FIOASYNC",	0x5452},
+	{"asm/ioctls.h",	"TIOCSERCONFIG",	0x5453},
+	{"asm/ioctls.h",	"TIOCSERGWILD",	0x5454},
+	{"asm/ioctls.h",	"TIOCSERSWILD",	0x5455},
+	{"asm/ioctls.h",	"TIOCGLCKTRMIOS",	0x5456},
+	{"asm/ioctls.h",	"TIOCSLCKTRMIOS",	0x5457},
+	{"asm/ioctls.h",	"TIOCSERGSTRUCT",	0x5458},
+	{"asm/ioctls.h",	"TIOCSERGETLSR",	0x5459},
+	{"asm/ioctls.h",	"TIOCSERGETMULTI",	0x545a},
+	{"asm/ioctls.h",	"TIOCSERSETMULTI",	0x545b},
+	{"asm/ioctls.h",	"TIOCMIWAIT",	0x545c},
+	{"asm/ioctls.h",	"TIOCGICOUNT",	0x545d},
+	{"asm/ioctls.h",	"TIOCGHAYESESP",	0x545e},
+	{"asm/ioctls.h",	"TIOCSHAYESESP",	0x545f},
+	{"asm/ioctls.h",	"FIOQSIZE",	0x5460},
 	{"linux/usbdevice_fs.h",	"USBDEVFS_CONTROL",	0x5500},
 	{"linux/usbdevice_fs.h",	"USBDEVFS_BULK",	0x5502},
 	{"linux/usbdevice_fs.h",	"USBDEVFS_RESETEP",	0x5503},
@@ -265,10 +402,13 @@
 	{"linux/udf_fs_i.h",	"UDF_GETEASIZE",	0x6c40},
 	{"linux/udf_fs_i.h",	"UDF_GETEABLOCK",	0x6c41},
 	{"linux/udf_fs_i.h",	"UDF_GETVOLIDENT",	0x6c42},
+	{"linux/soundcard.h",	"SNDCTL_MIDI_PRETIME",	0x6d00},
 	{"linux/synclink.h",	"MGSL_IOCSPARAMS",	0x6d00},
 	{"linux/mtio.h",	"MTIOCTOP",	0x6d01},
+	{"linux/soundcard.h",	"SNDCTL_MIDI_MPUMODE",	0x6d01},
 	{"linux/synclink.h",	"MGSL_IOCGPARAMS",	0x6d01},
 	{"linux/mtio.h",	"MTIOCGET",	0x6d02},
+	{"linux/soundcard.h",	"SNDCTL_MIDI_MPUCMD",	0x6d02},
 	{"linux/synclink.h",	"MGSL_IOCSTXIDLE",	0x6d02},
 	{"linux/mtio.h",	"MTIOCPOS",	0x6d03},
 	{"linux/synclink.h",	"MGSL_IOCGTXIDLE",	0x6d03},
@@ -541,7 +681,7 @@
 	{"linux/if_pppox.h",	"PPPOEIOCSFWD",	0xb100},
 	{"linux/if_pppox.h",	"PPPOEIOCDFWD",	0xb101},
 	{"linux/reiserfs_fs.h",	"REISERFS_IOC_UNPACK",	0xcd01},
-	{"linux/lvm.h",	"VG_CREATE_OLD",	0xfe00},
+	{"linux/lvm.h",	"VG_CREATE",	0xfe00},
 	{"linux/lvm.h",	"VG_REMOVE",	0xfe01},
 	{"linux/lvm.h",	"VG_EXTEND",	0xfe03},
 	{"linux/lvm.h",	"VG_REDUCE",	0xfe04},
@@ -550,7 +690,6 @@
 	{"linux/lvm.h",	"VG_STATUS_GET_NAMELIST",	0xfe07},
 	{"linux/lvm.h",	"VG_SET_EXTENDABLE",	0xfe08},
 	{"linux/lvm.h",	"VG_RENAME",	0xfe09},
-	{"linux/lvm.h",	"VG_CREATE",	0xfe0a},
 	{"linux/lvm.h",	"LV_CREATE",	0xfe20},
 	{"linux/lvm.h",	"LV_REMOVE",	0xfe21},
 	{"linux/lvm.h",	"LV_ACTIVATE",	0xfe22},
diff --git a/linux/ia64/syscallent.h b/linux/ia64/syscallent.h
index 85bb3db..3bf3b82 100644
--- a/linux/ia64/syscallent.h
+++ b/linux/ia64/syscallent.h
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 1999 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (c) 1999, 2001 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,284 +27,223 @@
  *
  *	$Id$
  */
-	{ 0,	0,	sys_setup,		"setup"		}, /* 0 */
-	{ 1,	TP,	sys_exit,		"_exit"		}, /* 1 */
-	{ 0,	TP,	sys_fork,		"fork"		}, /* 2 */
-	{ 3,	0,	sys_read,		"read"		}, /* 3 */
-	{ 3,	0,	sys_write,		"write"		}, /* 4 */
-	{ 3,	TF,	sys_open,		"open"		}, /* 5 */
-	{ 1,	0,	sys_close,		"close"		}, /* 6 */
-	{ 3,	TP,	sys_waitpid,		"waitpid"	}, /* 7 */
-	{ 2,	TF,	sys_creat,		"creat"		}, /* 8 */
-	{ 2,	TF,	sys_link,		"link"		}, /* 9 */
-	{ 1,	TF,	sys_unlink,		"unlink"	}, /* 10 */
-	{ 3,	TF|TP,	sys_execve,		"execve"	}, /* 11 */
-	{ 1,	TF,	sys_chdir,		"chdir"		}, /* 12 */
-	{ 8,	0,	printargs,		"SYS_13"	}, /* 13 */
-	{ 3,	TF,	sys_mknod,		"mknod"		}, /* 14 */
-	{ 2,	TF,	sys_chmod,		"chmod"		}, /* 15 */
-	{ 3,	TF,	sys_chown,		"lchown"	}, /* 16 */
-	{ 8,	0,	printargs,		"SYS_17"	}, /* 17 */
-	{ 8,	0,	printargs,		"SYS_18"	}, /* 18 */
-	{ 3,	0,	sys_lseek,		"lseek"		}, /* 19 */
-	{ 0,	0,	sys_getpid,		"getpid"	}, /* 20 */
-	{ 5,	TF,	sys_mount,		"mount"		}, /* 21 */
-	{ 1,	TF,	sys_umount,		"oldumount"	}, /* 22 */
-	{ 1,	0,	sys_setuid,		"setuid"	}, /* 23 */
-	{ 0,	0,	sys_getuid,		"getuid"	}, /* 24 */
-	{ 8,	0,	printargs,		"SYS_25"	}, /* 25 */
-	{ 4,	0,	sys_ptrace,		"ptrace"	}, /* 26 */
-	{ 1,	0,	sys_alarm,		"alarm"		}, /* 27 */
-	{ 8,	0,	printargs,		"SYS_28"	}, /* 28 */
-	{ 8,	0,	printargs,		"SYS_29"	}, /* 29 */
-	{ 8,	0,	printargs,		"SYS_30"	}, /* 30 */
-	{ 8,	0,	printargs,		"SYS_31"	}, /* 31 */
-	{ 8,	0,	printargs,		"SYS_32"	}, /* 32 */
-	{ 2,	TF,	sys_access,		"access"	}, /* 33 */
-	{ 1,	0,	sys_nice,		"nice"		}, /* 34 */
-	{ 8,	0,	printargs,		"SYS_35"	}, /* 35 */
-	{ 0,	0,	sys_sync,		"sync"		}, /* 36 */
-	{ 2,	TS,	sys_kill,		"kill"		}, /* 37 */
-	{ 2,	TF,	sys_rename,		"rename"	}, /* 38 */
-	{ 2,	TF,	sys_mkdir,		"mkdir"		}, /* 39 */
-	{ 1,	TF,	sys_rmdir,		"rmdir"		}, /* 40 */
-	{ 1,	0,	sys_dup,		"dup"		}, /* 41 */
-	{ 1,	0,	sys_pipe,		"pipe"		}, /* 42 */
-	{ 1,	0,	sys_times,		"times"		}, /* 43 */
-	{ 8,	0,	printargs,		"SYS_44"	}, /* 44 */
-	{ 1,	0,	sys_brk,		"brk"		}, /* 45 */
-	{ 1,	0,	sys_setgid,		"setgid"	}, /* 46 */
-	{ 0,	0,	sys_getgid,		"getgid"	}, /* 47 */
-	{ 3,	TS,	sys_signal,		"signal"	}, /* 48 */
-	{ 0,	0,	sys_geteuid,		"geteuid"	}, /* 49 */
-	{ 0,	0,	sys_getegid,		"getegid"	}, /* 50 */
-	{ 1,	TF,	sys_acct,		"acct"		}, /* 51 */
-	{ 2,	TF,	sys_umount2,		"umount"	}, /* 52 */
-	{ 8,	0,	printargs,		"SYS_53"	}, /* 53 */
-	{ 3,	0,	sys_ioctl,		"ioctl"		}, /* 54 */
-	{ 3,	0,	sys_fcntl,		"fcntl"		}, /* 55 */
-	{ 8,	0,	printargs,		"SYS_56"	}, /* 56 */
-	{ 2,	0,	sys_setpgid,		"setpgid"	}, /* 57 */
-	{ 8,	0,	printargs,		"SYS_58"	}, /* 58 */
-	{ 8,	0,	printargs,		"SYS_59"	}, /* 59 */
-	{ 1,	0,	sys_umask,		"umask"		}, /* 60 */
-	{ 1,	TF,	sys_chroot,		"chroot"	}, /* 61 */
-	{ 2,	0,	sys_ustat,		"ustat"		}, /* 62 */
-	{ 2,	0,	sys_dup2,		"dup2"		}, /* 63 */
-	{ 0,	0,	sys_getppid,		"getppid"	}, /* 64 */
-	{ 0,	0,	sys_getpgrp,		"getpgrp"	}, /* 65 */
-	{ 0,	0,	sys_setsid,		"setsid"	}, /* 66 */
-	{ 8,	0,	printargs,		"SYS_67"	}, /* 67 */
-	{ 8,	0,	printargs,		"SYS_68"	}, /* 68 */
-	{ 8,	0,	printargs,		"SYS_69"	}, /* 69 */
-	{ 2,	0,	sys_setreuid,		"setreuid"	}, /* 70 */
-	{ 2,	0,	sys_setregid,		"setregid"	}, /* 71 */
-	{ 8,	0,	printargs,		"SYS_72"	}, /* 72 */
-	{ 1,	TS,	sys_sigpending,		"sigpending"	}, /* 73 */
-	{ 2,	0,	sys_sethostname,	"sethostname"	}, /* 74 */
-	{ 2,	0,	sys_setrlimit,		"setrlimit"	}, /* 75 */
-	{ 2,	0,	sys_getrlimit,		"getrlimit"	}, /* 76 */
-	{ 2,	0,	sys_getrusage,		"getrusage"	}, /* 77 */
-	{ 2,	0,	sys_gettimeofday,	"gettimeofday"	}, /* 78 */
-	{ 2,	0,	sys_settimeofday,	"settimeofday"	}, /* 79 */
-	{ 2,	0,	sys_getgroups,		"getgroups"	}, /* 80 */
-	{ 2,	0,	sys_setgroups,		"setgroups"	}, /* 81 */
-	{ 8,	0,	printargs,		"SYS_82"	}, /* 82 */
-	{ 2,	TF,	sys_symlink,		"symlink"	}, /* 83 */
-	{ 8,	0,	printargs,		"SYS_84"	}, /* 84 */
-	{ 3,	TF,	sys_readlink,		"readlink"	}, /* 85 */
-	{ 1,	TF,	sys_uselib,		"uselib"	}, /* 86 */
-	{ 1,	TF,	sys_swapon,		"swapon"	}, /* 87 */
-	{ 3,	0,	sys_reboot,		"reboot"	}, /* 88 */
-	{ 3,	0,	sys_readdir,		"readdir"	}, /* 89 */
-	{ 6,	0,	sys_old_mmap,		"mmap"		}, /* 90 */
-	{ 2,	0,	sys_munmap,		"munmap"	}, /* 91 */
-	{ 2,	TF,	sys_truncate,		"truncate"	}, /* 92 */
-	{ 2,	0,	sys_ftruncate,		"ftruncate"	}, /* 93 */
-	{ 2,	0,	sys_fchmod,		"fchmod"	}, /* 94 */
-	{ 3,	0,	sys_fchown,		"fchown"	}, /* 95 */
-	{ 2,	0,	sys_getpriority,	"getpriority"	}, /* 96 */
-	{ 3,	0,	sys_setpriority,	"setpriority"	}, /* 97 */
-	{ 8,	0,	printargs,		"SYS_98"	}, /* 98 */
-	{ 2,	TF,	sys_statfs,		"statfs"	}, /* 99 */
-	{ 2,	0,	sys_fstatfs,		"fstatfs"	}, /* 100 */
-	{ 3,	0,	sys_ioperm,		"ioperm"	}, /* 101 */
-	{ 2,	0,	sys_socketcall,		"socketcall"	}, /* 102 */
-	{ 3,	0,	sys_syslog,		"syslog"	}, /* 103 */
-	{ 3,	0,	sys_setitimer,		"setitimer"	}, /* 104 */
-	{ 2,	0,	sys_getitimer,		"getitimer"	}, /* 105 */
-	{ 2,	TF,	sys_stat,		"stat"		}, /* 106 */
-	{ 2,	TF,	sys_lstat,		"lstat"		}, /* 107 */
-	{ 2,	0,	sys_fstat,		"fstat"		}, /* 108 */
-	{ 8,	0,	printargs,		"SYS_109"	}, /* 109 */
-	{ 1,	0,	sys_iopl,		"iopl"		}, /* 110 */
-	{ 0,	0,	sys_vhangup,		"vhangup"	}, /* 111 */
-	{ 8,	0,	printargs,		"SYS_112"	}, /* 112 */
-	{ 8,	0,	printargs,		"SYS_113"	}, /* 113 */
-	{ 4,	TP,	sys_wait4,		"wait4"		}, /* 114 */
-	{ 1,	0,	sys_swapoff,		"swapoff"	}, /* 115 */
-	{ 1,	0,	sys_sysinfo,		"sysinfo"	}, /* 116 */
-	{ 8,	0,	printargs,		"SYS_117"	}, /* 117 */
-	{ 1,	0,	sys_fsync,		"fsync"		}, /* 118 */
-	{ 1,	TS,	sys_sigreturn,		"sigreturn"	}, /* 119 */
-	{ 2,	TP,	sys_clone,		"clone"		}, /* 120 */
-	{ 2,	0,	sys_setdomainname,	"setdomainname"	}, /* 121 */
-	{ 1,	0,	sys_uname,		"uname"		}, /* 122 */
-	{ 3,	0,	sys_modify_ldt,		"modify_ldt"	}, /* 123 */
-	{ 1,	0,	sys_adjtimex,		"adjtimex"	}, /* 124 */
-	{ 3,	0,	sys_mprotect,		"mprotect"	}, /* 125 */
-	{ 3,	TS,	sys_sigprocmask,	"sigprocmask"	}, /* 126 */
-	{ 2,	0,	sys_create_module,	"create_module"	}, /* 127 */
-	{ 2,	0,	sys_init_module,	"init_module"	}, /* 128 */
-	{ 1,	0,	sys_delete_module,	"delete_module"	}, /* 129 */
-	{ 1,	0,	sys_get_kernel_syms,	"get_kernel_syms"}, /* 130 */
-	{ 4,	0,	sys_quotactl,		"quotactl"	}, /* 131 */
-	{ 1,	0,	sys_getpgid,		"getpgid"	}, /* 132 */
-	{ 1,	0,	sys_fchdir,		"fchdir"	}, /* 133 */
-	{ 0,	0,	sys_bdflush,		"bdflush"	}, /* 134 */
-	{ 3,	0,	sys_sysfs,		"sysfs"		}, /* 135 */
-	{ 1,	0,	sys_personality,	"personality"	}, /* 136 */
-	{ 8,	0,	printargs,		"SYS_137"	}, /* 137 */
-	{ 1,	0,	sys_setfsuid,		"setfsuid"	}, /* 138 */
-	{ 1,	0,	sys_setfsgid,		"setfsgid"	}, /* 139 */
-	{ 5,	0,	sys_llseek,		"_llseek"	}, /* 140 */
-	{ 3,	0,	sys_getdents,		"getdents"	}, /* 141 */
-	{ 5,	0,	sys_select,		"select"	}, /* 142 */
-	{ 2,	0,	sys_flock,		"flock"		}, /* 143 */
-	{ 3,	0,	sys_msync,		"msync"		}, /* 144 */
-	{ 3,	0,	sys_readv,		"readv"		}, /* 145 */
-	{ 3,	0,	sys_writev,		"writev"	}, /* 146 */
-	{ 1,	0,	sys_getsid,		"getsid"	}, /* 147 */
-	{ 1,	0,	sys_fdatasync,		"fdatasync"	}, /* 148 */
-	{ 1,	0,	sys_sysctl,		"_sysctl"	}, /* 149 */
-	{ 1,	0,	sys_mlock,		"mlock"		}, /* 150 */
-	{ 2,	0,	sys_munlock,		"munlock"	}, /* 151 */
-	{ 2,	0,	sys_mlockall,		"mlockall"	}, /* 152 */
-	{ 1,	0,	sys_munlockall,		"munlockall"	}, /* 153 */
-	{ 0,	0,	sys_sched_setparam,	"sched_setparam"}, /* 154 */
-	{ 2,	0,	sys_sched_getparam,	"sched_getparam"}, /* 155 */
-	{ 3,	0,	sys_sched_setscheduler,	"sched_setscheduler"}, /* 156 */
-	{ 1,	0,	sys_sched_getscheduler,	"sched_getscheduler"}, /* 157 */
-	{ 0,	0,	sys_sched_yield,	"sched_yield"}, /* 158 */
-	{ 1,	0,	sys_sched_get_priority_max,"sched_get_priority_max"}, /* 159 */
-	{ 1,	0,	sys_sched_get_priority_min,"sched_get_priority_min"}, /* 160 */
-	{ 2,	0,	sys_sched_rr_get_interval,"sched_rr_get_interval"}, /* 161 */
-	{ 2,	0,	sys_nanosleep,		"nanosleep"	}, /* 162 */
-	{ 4,	0,	sys_mremap,		"mremap"	}, /* 163 */
-	{ 3,	0,	sys_setresuid,		"setresuid"	}, /* 164 */
-	{ 3,	0,	sys_getresuid,		"getresuid"	}, /* 165 */
-	{ 5,	0,	printargs,		"vm86"		}, /* 166 */
-	{ 5,	0,	sys_query_module,	"query_module"	}, /* 167 */
-	{ 3,	0,	sys_poll,		"poll"		}, /* 168 */
-	{ 3,	0,	printargs,		"nfsservctl"	}, /* 169 */
-	{ 3,	0,	sys_setresgid,		"setresgid"	}, /* 170 */
-	{ 3,	0,	sys_getresgid,		"getresgid"	}, /* 171 */
-	{ 5,	0,	sys_prctl,		"prctl"		}, /* 172 */
-	{ 1,	TS,	printargs,		"rt_sigreturn"	}, /* 173 */
-	{ 4,	TS,	sys_rt_sigaction,	"rt_sigaction"  }, /* 174 */
-	{ 4,	TS,	sys_rt_sigprocmask,	"rt_sigprocmask"}, /* 175 */
-	{ 2,	TS,	sys_rt_sigpending,	"rt_sigpending"	}, /* 176 */
-	{ 4,	TS,	sys_rt_sigtimedwait,	"rt_sigtimedwait"}, /* 177 */
-	{ 3,	TS,	sys_rt_sigqueueinfo,    "rt_sigqueueinfo"}, /* 178 */
-	{ 2,	TS,	sys_rt_sigsuspend,	"rt_sigsuspend"	}, /* 179 */
 
-	{ 5,	TF,	sys_pread,		"pread"		}, /* 180 */
-	{ 5,	TF,	sys_pwrite,		"pwrite"	}, /* 181 */
-	{ 3,	TF,	sys_chown,		"chown"		}, /* 182 */
-	{ 2,	0,	sys_getcwd,		"getcwd"	}, /* 183 */
-	{ 2,	0,	sys_capget,		"capget"	}, /* 184 */
-	{ 2,	0,	sys_capset,		"capset"	}, /* 185 */
-	{ 2,	TS,	sys_sigaltstack,	"sigaltstack"	}, /* 186 */
-	{ 4,	TF,	sys_sendfile,		"sendfile"	}, /* 187 */
-	{ 5,	0,	printargs,		"SYS_188"	}, /* 188 */
-	{ 5,	0,	printargs,		"SYS_189"	}, /* 189 */
-	{ 0,	TP,	sys_vfork,		"vfork"		}, /* 190 */
-	{ 5,	0,	printargs,		"getrlimit"	}, /* 191 */
-	{ 6,	0,	sys_mmap,		"mmap2"		}, /* 192 */
-	{ 5,	0,	printargs,		"truncate64"	}, /* 193 */
-	{ 5,	0,	printargs,		"ftruncate64"	}, /* 194 */
-	{ 2,	TF,	sys_stat64,		"stat64"	}, /* 195 */
-	{ 2,	TF,	sys_lstat64,		"lstat64"	}, /* 196 */
-	{ 2,	TF,	sys_fstat64,		"fstat64"	}, /* 197 */
-	{ 5,	0,	printargs,		"SYS_198"	}, /* 198 */
-	{ 5,	0,	printargs,		"SYS_199"	}, /* 199 */
+/*
+ * IA-32 syscalls that have pointer arguments which are incompatible
+ * with 64-bit layout get redirected to printargs.
+ */
+#define sys_getrlimit		printargs
+#define sys_afs_syscall		printargs
+#define sys_getpmsg		printargs
+#define sys_putpmsg		printargs
+#define sys_ugetrlimit		printargs
+#define sys_fork		printargs
+#define sys_waitpid		printargs
+#define sys_time		printargs
+#define sys_break		printargs
+#define sys_oldstat		printargs
+#define sys_lseek		printargs
+#define sys_stime		printargs
+#define sys_ptrace		printargs
+#define sys_alarm		printargs
+#define sys_oldfstat		printargs
+#define sys_pause		printargs
+#define sys_utime		printargs
+#define sys_stty		printargs
+#define sys_gtty		printargs
+#define sys_ftime		printargs
+#define sys_pipe		printargs
+#define sys_times		printargs
+#define sys_prof		printargs
+#define sys_signal		printargs
+#define sys_lock		printargs
+#define sys_ioctl		printargs
+#define sys_fcntl		printargs
+#define sys_mpx			printargs
+#define sys_ulimit		printargs
+#define sys_oldolduname		printargs
+#define sys_sigaction		printargs
+#define sys_sgetmask		printargs
+#define sys_ssetmask		printargs
+#define sys_sigsuspend		printargs
+#define sys_sigpending		printargs
+#define sys_setrlimit		printargs
+#define sys_getrusage		printargs
+#define sys_gettimeofday	printargs
+#define sys_settimeofday	printargs
+#define sys_getgroups		printargs
+#define sys_setgroups		printargs
+#define sys_select		printargs
+#define sys_oldlstat		printargs
+#define sys_readdir		printargs
+#define sys_profil		printargs
+#define sys_statfs		printargs
+#define sys_fstatfs		printargs
+#define sys_ioperm		printargs
+#define sys_socketcall		printargs
+#define sys_setitimer		printargs
+#define sys_getitimer		printargs
+#define sys_stat		printargs
+#define sys_lstat		printargs
+#define sys_fstat		printargs
+#define sys_olduname		printargs
+#define sys_iopl		printargs
+#define sys_idle		printargs
+#define sys_vm86old		printargs
+#define sys_wait4		printargs
+#define sys_sysinfo		printargs
+#define sys_ipc			printargs
+#define sys_sigreturn		printargs
+#define sys_uname		printargs
+#define sys_modify_ldt		printargs
+#define sys_adjtimex		printargs
+#define sys_sigprocmask		printargs
+#define sys_create_module	printargs
+#define sys_init_module		printargs
+#define sys_delete_module	printargs
+#define sys_get_kernel_syms	printargs
+#define sys_quotactl		printargs
+#define sys_bdflush		printargs
+#define sys_personality		printargs
+#define sys_getdents		printargs
+#define sys__newselect		printargs
+#define sys_msync		printargs
+#define sys_readv		printargs
+#define sys_writev		printargs
+#define sys__sysctl		printargs
+#define sys_sched_rr_get_interval printargs
+#define sys_nanosleep		printargs
+#define sys_getresuid		printargs
+#define sys_vm86		printargs
+#define sys_query_module	printargs
+#define sys_nfsservctl		printargs
+#define sys_getresgid		printargs
+#define sys_rt_sigreturn	printargs
+#define sys_rt_sigaction	printargs
+#define sys_rt_sigprocmask	printargs
+#define sys_rt_sigtimedwait	printargs
+#define sys_rt_sigqueueinfo	printargs
+#define sys_rt_sigsuspend	printargs
+#define sys_pread		printargs
+#define sys_pwrite		printargs
+#define sys_sigaltstack		printargs
+#define sys_sendfile		printargs
+#define sys_vfork		printargs
+#define sys_truncate64		printargs
+#define sys_ftruncate64		printargs
+#define sys_stat64		printargs
+#define sys_lstat64		printargs
+#define sys_fstat64		printargs
+#define sys_fcntl64		printargs
 
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 200 */
-	{ 4,	TI,	sys_semop,		"semop"		}, /* 201 */
-	{ 4,	TI,	sys_semget,		"semget"	}, /* 202 */
-	{ 4,	TI,	sys_semctl,		"semctl"	}, /* 203 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 204 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 205 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 206 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 207 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 208 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 209 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 210 */
-	{ 4,	TI,	sys_msgsnd,		"msgsnd"	}, /* 211 */
-	{ 4,	TI,	sys_msgrcv,		"msgrcv"	}, /* 212 */
-	{ 4,	TI,	sys_msgget,		"msgget"	}, /* 213 */
-	{ 4,	TI,	sys_msgctl,		"msgctl"	}, /* 214 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 215 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 216 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 217 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 218 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 219 */
-	{ 4,	0,	printargs,		"ipc_subcall"	}, /* 220 */
-	{ 4,	TI,	sys_shmat,		"shmat"		}, /* 221 */
-	{ 4,	TI,	sys_shmdt,		"shmdt"		}, /* 222 */
-	{ 4,	TI,	sys_shmget,		"shmget"	}, /* 223 */
-	{ 4,	TI,	sys_shmctl,		"shmctl"	}, /* 224 */
-	{ 5,	0,	printargs,		"SYS_225"	}, /* 225 */
-	{ 5,	0,	printargs,		"SYS_226"	}, /* 226 */
-	{ 5,	0,	printargs,		"SYS_227"	}, /* 227 */
-	{ 5,	0,	printargs,		"SYS_228"	}, /* 228 */
-	{ 5,	0,	printargs,		"SYS_229"	}, /* 229 */
+#include "../syscallent.h"
 
-	{ 8,	0,	printargs,		"socket_subcall"}, /* 230 */
-	{ 3,	TN,	sys_socket,		"socket"	}, /* 231 */
-	{ 3,	TN,	sys_bind,		"bind"		}, /* 232 */
-	{ 3,	TN,	sys_connect,		"connect"	}, /* 233 */
-	{ 2,	TN,	sys_listen,		"listen"	}, /* 234 */
-	{ 3,	TN,	sys_accept,		"accept"	}, /* 235 */
-	{ 3,	TN,	sys_getsockname,	"getsockname"	}, /* 236 */
-	{ 3,	TN,	sys_getpeername,	"getpeername"	}, /* 237 */
-	{ 4,	TN,	sys_socketpair,		"socketpair"	}, /* 238 */
-	{ 4,	TN,	sys_send,		"send"		}, /* 239 */
-	{ 4,	TN,	sys_recv,		"recv"		}, /* 240 */
-	{ 6,	TN,	sys_sendto,		"sendto"	}, /* 241 */
-	{ 6,	TN,	sys_recvfrom,		"recvfrom"	}, /* 242 */
-	{ 2,	TN,	sys_shutdown,		"shutdown"	}, /* 243 */
-	{ 5,	TN,	sys_setsockopt,		"setsockopt"	}, /* 244 */
-	{ 5,	TN,	sys_getsockopt,		"getsockopt"	}, /* 245 */
-	{ 5,	TN,	sys_sendmsg,		"sendmsg"	}, /* 246 */
-	{ 5,	TN,	sys_recvmsg,		"recvmsg"	}, /* 247 */
-	{ 5,	0,	printargs,		"SYS_248"	}, /* 248 */
-	{ 5,	0,	printargs,		"SYS_249"	}, /* 249 */
-	{ 8,	0,	printargs,		"SYS_250"	}, /* 250 */
-	{ 8,	0,	printargs,		"SYS_251"	}, /* 251 */
-	{ 8,	0,	printargs,		"SYS_252"	}, /* 252 */
-	{ 8,	0,	printargs,		"SYS_253"	}, /* 253 */
-	{ 8,	0,	printargs,		"SYS_254"	}, /* 254 */
-	{ 8,	0,	printargs,		"SYS_255"	}, /* 255 */
-	{ 8,	0,	printargs,		"SYS_256"	}, /* 256 */
-	{ 8,	0,	printargs,		"SYS_257"	}, /* 257 */
-	{ 8,	0,	printargs,		"SYS_258"	}, /* 258 */
-	{ 8,	0,	printargs,		"SYS_259"	}, /* 259 */
-	{ 8,	0,	printargs,		"SYS_260"	}, /* 260 */
-	{ 8,	0,	printargs,		"SYS_261"	}, /* 261 */
-	{ 8,	0,	printargs,		"SYS_262"	}, /* 262 */
-	{ 8,	0,	printargs,		"SYS_263"	}, /* 263 */
-	{ 8,	0,	printargs,		"SYS_264"	}, /* 264 */
-	{ 8,	0,	printargs,		"SYS_265"	}, /* 265 */
-	{ 8,	0,	printargs,		"SYS_266"	}, /* 266 */
-	{ 8,	0,	printargs,		"SYS_267"	}, /* 267 */
-	{ 8,	0,	printargs,		"SYS_268"	}, /* 268 */
-	{ 8,	0,	printargs,		"SYS_269"	}, /* 269 */
-	{ 8,	0,	printargs,		"SYS_270"	}, /* 270 */
-	{ 8,	0,	printargs,		"SYS_271"	}, /* 271 */
-	{ 8,	0,	printargs,		"SYS_272"	}, /* 272 */
-	{ 8,	0,	printargs,		"SYS_273"	}, /* 273 */
-	{ 8,	0,	printargs,		"SYS_274"	}, /* 274 */
+#undef sys_getrlimit
+#undef sys_afs_syscall
+#undef sys_getpmsg
+#undef sys_putpmsg
+#undef sys_ugetrlimit
+#undef sys_fork
+#undef sys_waitpid
+#undef sys_time
+#undef sys_break
+#undef sys_oldstat
+#undef sys_lseek
+#undef sys_stime
+#undef sys_ptrace
+#undef sys_alarm
+#undef sys_oldfstat
+#undef sys_pause
+#undef sys_utime
+#undef sys_stty
+#undef sys_gtty
+#undef sys_ftime
+#undef sys_pipe
+#undef sys_times
+#undef sys_prof
+#undef sys_signal
+#undef sys_lock
+#undef sys_ioctl
+#undef sys_fcntl
+#undef sys_mpx
+#undef sys_ulimit
+#undef sys_oldolduname
+#undef sys_sigaction
+#undef sys_sgetmask
+#undef sys_ssetmask
+#undef sys_sigsuspend
+#undef sys_sigpending
+#undef sys_setrlimit
+#undef sys_getrusage
+#undef sys_gettimeofday
+#undef sys_settimeofday
+#undef sys_getgroups
+#undef sys_setgroups
+#undef sys_select
+#undef sys_oldlstat
+#undef sys_readdir
+#undef sys_profil
+#undef sys_statfs
+#undef sys_fstatfs
+#undef sys_ioperm
+#undef sys_socketcall
+#undef sys_setitimer
+#undef sys_getitimer
+#undef sys_stat
+#undef sys_lstat
+#undef sys_fstat
+#undef sys_olduname
+#undef sys_iopl
+#undef sys_idle
+#undef sys_vm86old
+#undef sys_wait4
+#undef sys_sysinfo
+#undef sys_ipc
+#undef sys_sigreturn
+#undef sys_uname
+#undef sys_modify_ldt
+#undef sys_adjtimex
+#undef sys_sigprocmask
+#undef sys_create_module
+#undef sys_init_module
+#undef sys_delete_module
+#undef sys_get_kernel_syms
+#undef sys_quotactl
+#undef sys_bdflush
+#undef sys_personality
+#undef sys_getdents
+#undef sys__newselect
+#undef sys_msync
+#undef sys_readv
+#undef sys_writev
+#undef sys__sysctl
+#undef sys_sched_rr_get_interval
+#undef sys_nanosleep
+#undef sys_getresuid
+#undef sys_vm86
+#undef sys_query_module
+#undef sys_nfsservctl
+#undef sys_getresgid
+#undef sys_rt_sigreturn
+#undef sys_rt_sigaction
+#undef sys_rt_sigprocmask
+#undef sys_rt_sigtimedwait
+#undef sys_rt_sigqueueinfo
+#undef sys_rt_sigsuspend
+#undef sys_pread
+#undef sys_pwrite
+#undef sys_sigaltstack
+#undef sys_sendfile
+#undef sys_vfork
+#undef sys_truncate64
+#undef sys_ftruncate64
+#undef sys_stat64
+#undef sys_lstat64
+#undef sys_fstat64
+#undef sys_fcntl64
+
+#include "../dummy.h"
+
 	{ 8,	0,	printargs,		"SYS_275"	}, /* 275 */
 	{ 8,	0,	printargs,		"SYS_276"	}, /* 276 */
 	{ 8,	0,	printargs,		"SYS_277"	}, /* 277 */
@@ -1239,12 +1179,12 @@
 	{ 2,	TF,	sys_pivotroot,		"pivot_root"	}, /* 1207 */
 	{ 3,	0,	printargs,		"mincore"	}, /* 1208 */
 	{ 3,	0,	sys_madvise,		"madvise"	}, /* 1209 */
-	{ 8,	0,	printargs,		"SYS_1210"	}, /* 1210 */
-	{ 8,	0,	printargs,		"SYS_1211"	}, /* 1211 */
-	{ 8,	0,	printargs,		"SYS_1212"	}, /* 1212 */
-	{ 8,	0,	printargs,		"SYS_1213"	}, /* 1213 */
-	{ 8,	0,	printargs,		"SYS_1214"	}, /* 1214 */
-	{ 8,	0,	printargs,		"SYS_1215"	}, /* 1215 */
+	{ 2,	TF,	sys_stat,		"stat"		}, /* 1210 */
+	{ 2,	0,	sys_lstat,		"lstat"		}, /* 1211 */
+	{ 2,	TF,	sys_fstat,		"fstat"		}, /* 1212 */
+	{ 2,	TP,	sys_clone2,		"clone2"	}, /* 1213 */
+	{ 3,	0,	printargs,		"getdents64"	}, /* 1214 */
+	{ 2,	0,	printargs,		"getunwind"	}, /* 1215 */
 	{ 8,	0,	printargs,		"SYS_1216"	}, /* 1216 */
 	{ 8,	0,	printargs,		"SYS_1217"	}, /* 1217 */
 	{ 8,	0,	printargs,		"SYS_1218"	}, /* 1218 */
diff --git a/linux/ioctlent.sh b/linux/ioctlent.sh
index b1aa026..b55d224 100644
--- a/linux/ioctlent.sh
+++ b/linux/ioctlent.sh
@@ -29,13 +29,21 @@
 #
 
 dir="/usr/include"
+
+files="asm/ioctls.h /dev/null"
+# Build the list of all ioctls
+regexp='^[[:space:]]*#[[:space:]]*define[[:space:]]\+[A-Z][A-Z0-9_]*[[:space:]]\+0x54..\>'
+(cd $dir ; grep $regexp $files 2>/dev/null ) | \
+	sed -ne 's/^\(.*\):[[:space:]]*#[[:space:]]*define[[:space:]]*\([A-Z0-9_]*\)[[:space:]]*\(0x54..\).*/	{ "\1",	"\2",	\3	},/p' \
+	> ioctls.h
+
 files="linux/* asm/* scsi/*"
 
 # Build the list of all ioctls
 regexp='^[[:space:]]*#[[:space:]]*define[[:space:]]\+[A-Z][A-Z0-9_]*[[:space:]]\+_S\?\(IO\|IOW\|IOR\|IOWR\)\>'
 (cd $dir ; grep $regexp $files 2>/dev/null ) | \
 	sed -ne 's/^\(.*\):[[:space:]]*#[[:space:]]*define[[:space:]]*\([A-Z0-9_]*\)[[:space:]]*_S\?I.*(\([^[,]*\)[[:space:]]*,[[:space:]]*\([^,)]*\).*/	{ "\1",	"\2",	_IOC(_IOC_NONE,\3,\4,0)	},/p' \
-	> ioctls.h
+	>> ioctls.h
 
 # Some use a special base to offset their ioctls on. Extract that as well.
 : > ioctldefs.h
diff --git a/linux/syscall.h b/linux/syscall.h
index 8efa8ae..15eb87b 100644
--- a/linux/syscall.h
+++ b/linux/syscall.h
@@ -83,6 +83,7 @@
 int sys_rt_sigtimedwait(), sys_prctl(), sys_poll(), sys_vfork();
 int sys_sendfile(), sys_old_mmap(), sys_stat64(), sys_lstat64(), sys_fstat64();
 int sys_truncate64(), sys_ftruncate64(), sys_pivotroot();
+int sys_clone2();
 
 
 /* sys_socketcall subcalls */
@@ -109,7 +110,33 @@
 #endif
 
 
-#if !defined(ALPHA) && !defined(IA64) && !defined(MIPS) &&!defined(HPPA)
+#if !defined(ALPHA) && !defined(MIPS) &&!defined(HPPA)
+# ifdef	IA64
+/*
+ *  IA64 syscall numbers (the only ones available from standard header
+ *  files) are disjoint from IA32 syscall numbers.  We need to define
+ *  the IA32 socket call number here.
+ */
+#  define SYS_socketcall	102
+
+#  undef SYS_socket
+#  undef SYS_bind
+#  undef SYS_connect
+#  undef SYS_listen
+#  undef SYS_accept
+#  undef SYS_getsockname
+#  undef SYS_getpeername
+#  undef SYS_socketpair
+#  undef SYS_send
+#  undef SYS_recv
+#  undef SYS_sendto
+#  undef SYS_recvfrom
+#  undef SYS_shutdown
+#  undef SYS_setsockopt
+#  undef SYS_getsockopt
+#  undef SYS_sendmsg
+#  undef SYS_recvmsg
+#endif /* IA64 */
 #ifdef POWERPC
 #  define SYS_socket_subcall	256
 #else
@@ -134,7 +161,7 @@
 #define SYS_recvmsg		(SYS_socket_subcall + 17)
 
 #define SYS_socket_nsubcalls	18
-#endif /* !(ALPHA || IA64 || MIPS || HPPA) */
+#endif /* !(ALPHA || MIPS || HPPA) */
 
 /* sys_ipc subcalls */
 
@@ -142,7 +169,29 @@
 int sys_msgsnd(), sys_msgrcv(), sys_msgget(), sys_msgctl();
 int sys_shmat(), sys_shmdt(), sys_shmget(), sys_shmctl();
 
-#if !defined(ALPHA) && !defined(IA64) && !defined(MIPS) && !defined(SPARC) &&!defined(HPPA)
+#if !defined(ALPHA) && !defined(MIPS) && !defined(SPARC) &&!defined(HPPA)
+# ifdef	IA64
+   /*
+    * IA64 syscall numbers (the only ones available from standard
+    * header files) are disjoint from IA32 syscall numbers.  We need
+    * to define the IA32 socket call number here.  Fortunately, this
+    * symbol, `SYS_ipc', is not used by any of the IA64 code so
+    * re-defining this symbol will not cause a problem.
+   */
+#  undef SYS_ipc
+#  define SYS_ipc		117
+#  undef SYS_semop
+#  undef SYS_semget
+#  undef SYS_semctl
+#  undef SYS_msgsnd
+#  undef SYS_msgrcv
+#  undef SYS_msgget
+#  undef SYS_msgctl
+#  undef SYS_shmat
+#  undef SYS_shmdt
+#  undef SYS_shmget
+#  undef SYS_shmctl
+# endif /* IA64 */
 #ifdef POWERPC
 #  define SYS_ipc_subcall		((SYS_socket_subcall)+(SYS_socket_nsubcalls))
 #else
@@ -161,7 +210,21 @@
 #define SYS_shmctl		(SYS_ipc_subcall + 24)
 
 #define SYS_ipc_nsubcalls	25
-#endif /* !(ALPHA || IA64 || MIPS || HPPA) */
+#endif /* !(ALPHA || MIPS || HPPA) */
+
+#ifdef IA64
+  /*
+   * IA64 syscall numbers (the only ones available from standard header
+   * files) are disjoint from IA32 syscall numbers.  We need to define
+   * some IA32 specific syscalls here.
+   */
+# define SYS_fork	2
+# define SYS_vfork	190
+# define SYS32_exit	1
+# define SYS_waitpid	7
+# define SYS32_wait4	114
+# define SYS32_execve	11
+#endif /* IA64 */
 
 #if defined(ALPHA) || defined(IA64)
 int sys_getpagesize();
diff --git a/process.c b/process.c
index a736dd0..e03be2d 100644
--- a/process.c
+++ b/process.c
@@ -457,6 +457,19 @@
 	return 0;
 }
 
+int
+sys_clone2(tcp)
+struct tcb *tcp;
+{
+       if (exiting(tcp)) {
+               tprintf("child_stack=%#lx, stack_size=%#lx, flags=",
+                       tcp->u_arg[1], tcp->u_arg[2]);
+               if (printflags(clone_flags, tcp->u_arg[0]) == 0)
+                       tprintf("0");
+       }
+       return 0;
+}
+
 #endif
 
 int
@@ -509,6 +522,10 @@
 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
 	    	return -1;
 	return 0;
+#elif defined(IA64)
+	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
+		return -1;
+	return 0;
 #elif defined(HPPA)
 	if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
 	    	return -1;
@@ -534,7 +551,7 @@
 
 		ap = ia64_rse_skip_regs(bsp, argnum);
 		errno = 0;
-		ptrace(PTRACE_POKEDATA, tcp->pid, ap, tcp->u_arg[argnum]);
+		ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
 		if (errno)
 			return -1;
 
@@ -595,14 +612,16 @@
 		if (!(tcp->flags & TCB_FOLLOWFORK))
 			return 0;
 
-		if (bpt)
-			clearbpt(tcp);
-
-		if (syserror(tcp))
+		if (syserror(tcp)) {
+			if (bpt)
+				clearbpt(tcp);
 			return 0;
+		}
 
 		pid = tcp->u_rval;
 		if ((tcpchild = alloctcb(pid)) == NULL) {
+			if (bpt)
+				clearbpt(tcp);
 			fprintf(stderr, " [tcb table full]\n");
 			kill(pid, SIGKILL); /* XXX */
 			return 0;
@@ -610,12 +629,17 @@
 
 		/* Attach to the new child */
 		if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
+			if (bpt)
+				clearbpt(tcp);
 			perror("PTRACE_ATTACH");
 			fprintf(stderr, "Too late?\n");
 			droptcb(tcpchild);
 			return 0;
 		}
 
+		if (bpt)
+			clearbpt(tcp);
+
 		tcpchild->flags |= TCB_ATTACHED;
 		if (bpt) {
 			tcpchild->flags |= TCB_BPTSET;
@@ -624,6 +648,7 @@
 				sizeof tcpchild->inst);
 		}
 		newoutf(tcpchild);
+		tcpchild->parent = tcp;
 		tcp->nchildren++;
 		if (!qflag)
 			fprintf(stderr, "Process %d attached\n", pid);
@@ -1198,7 +1223,7 @@
 		}
 	}
 #ifdef LINUX
-#if defined(ALPHA) || defined(SPARC) || defined(POWERPC) || defined(HPPA)
+#if defined(ALPHA) || defined(SPARC) || defined(POWERPC) || defined(IA64) || defined(HPPA)
 	tcp->flags |= TCB_WAITEXECVE;
 #endif /* ALPHA || SPARC || POWERPC */
 #endif /* LINUX */
diff --git a/resource.c b/resource.c
index 75e0bd8..3de9fba 100644
--- a/resource.c
+++ b/resource.c
@@ -167,9 +167,9 @@
 	if (lim == RLIM64_INFINITY)
 		sprintf(buf, "RLIM64_INFINITY");
 	else if (lim > 1024 && lim%1024 == 0)
-		sprintf(buf, "%lld*1024", lim/1024);
+		sprintf(buf, "%lld*1024", (long long) lim/1024);
 	else
-		sprintf(buf, "%lld", lim);
+		sprintf(buf, "%lld", (long long) lim);
 	return buf;
 }
 
diff --git a/signal.c b/signal.c
index 8e3e378..d4c6293 100644
--- a/signal.c
+++ b/signal.c
@@ -365,6 +365,34 @@
 	tprintf(signame(nr));
 }
 
+#ifdef LINUX
+
+static void
+parse_sigset_t (const char *str, sigset_t *set)
+{
+	unsigned int digit;
+	int i;
+
+	sigemptyset(set);
+
+	for (i = _NSIG - 4; i >= 0; i -= 4, ++str) {
+		if (*str >= 'a')
+			digit = (*str - 'a') + 10;
+		else
+			digit = *str - '0';
+		if (digit & 1)
+			sigaddset(set, i + 1);
+		if (digit & 2)
+			sigaddset(set, i + 2);
+		if (digit & 4)
+			sigaddset(set, i + 3);
+		if (digit & 8)
+			sigaddset(set, i + 4);
+	}
+}
+
+#endif
+
 /*
  * Check process TCP for the disposition of signal SIG.
  * Return 1 if the process would somehow manage to  survive signal SIG,
@@ -381,8 +409,7 @@
 	char buf[2048];
 	char *s;
 	int i;
-	/* We also need to handle RT signals */
-	unsigned long long signalled, blocked, ignored, caught;
+	sigset_t ignored, caught;
 #endif
 #ifdef SVR4
 	/*
@@ -427,32 +454,27 @@
 	 * Skip the extraneous fields. We need to skip
 	 * command name has any spaces in it.  So be it.
 	 */
-	s = strstr(buf, "SigPnd:\t");
-
+	s = strstr(buf, "SigIgn:\t");
 	if (!s)
 	{
 		fprintf(stderr, "/proc/pid/status format error\n");
 		return 1;
 	}
+	parse_sigset_t(s + 8, &ignored);
 
-	while (*s && *s++ != '\t')
-		;
-	s += sscanf(s, "%qx", &signalled);
-	while (*s && *s++ != '\t')
-		;
-	s += sscanf(s, "%qx", &blocked);
-	while (*s && *s++ != '\t')
-		;
-	s += sscanf(s, "%qx", &ignored);
-	while (*s && *s++ != '\t')
-		;
-	s += sscanf(s, "%qx", &caught);
+	s = strstr(buf, "SigCgt:\t");
+	if (!s)
+	{
+		fprintf(stderr, "/proc/pid/status format error\n");
+		return 1;
+	}
+	parse_sigset_t(s + 8, &caught);
 
 #ifdef DEBUG
-	fprintf(stderr, "sigs: %08x %08x %08x %08x\n",
-		signalled, blocked, ignored, caught);
+	fprintf(stderr, "sigs: %016qx %016qx (sig=%d)\n",
+		*(long long *) &ignored, *(long long *) &caught, sig);
 #endif
-	if ((ignored & (1ULL << sig)) || (caught & (1ULL << sig)))
+	if (sigismember(&ignored, sig) || sigismember(&caught, sig))
 		return 1;
 #endif /* LINUX */
 
diff --git a/strace.c b/strace.c
index dd3e935..56f6c1b 100644
--- a/strace.c
+++ b/strace.c
@@ -44,6 +44,10 @@
 #include <grp.h>
 #include <string.h>
 
+#if defined(IA64) && defined(LINUX)
+# include <asm/ptrace_offsets.h>
+#endif
+
 #ifdef USE_PROCFS
 #include <poll.h>
 #endif
@@ -1805,10 +1809,23 @@
 			}
 			if (!cflag
 			    && (qual_flags[WSTOPSIG(status)] & QUAL_SIGNAL)) {
+				unsigned long addr = 0, pc = 0;
+#ifdef PT_GETSIGINFO
+#				define PSR_RI	41
+				struct siginfo si;
+				unsigned long psr;
+
+				upeek(pid, PT_CR_IPSR, &psr);
+				upeek(pid, PT_CR_IIP, &pc);
+
+				pc += (psr >> PSR_RI) & 0x3;
+				ptrace(PT_GETSIGINFO, pid, 0, (long) &si);
+				addr = (unsigned long) si.si_addr;
+#endif
 				printleader(tcp);
-				tprintf("--- %s (%s) ---",
+				tprintf("--- %s (%s) @ %lx (%lx) ---",
 					signame(WSTOPSIG(status)),
-					strsignal(WSTOPSIG(status)));
+					strsignal(WSTOPSIG(status)), pc, addr);
 				printtrailer(tcp);
 			}
 			if ((tcp->flags & TCB_ATTACHED) &&
diff --git a/syscall.c b/syscall.c
index dcd3504..308080a 100644
--- a/syscall.c
+++ b/syscall.c
@@ -455,7 +455,7 @@
 };
 #endif /* FREEBSD */
 
-#if !(defined(LINUX) && ( defined(ALPHA) || defined(IA64) || defined(MIPS) ))
+#if !(defined(LINUX) && ( defined(ALPHA) || defined(MIPS) ))
 
 const int socket_map [] = {
 	       /* SYS_SOCKET      */ 97,
@@ -610,6 +610,11 @@
 		internal_clone(tcp);
 		break;
 #endif
+#ifdef SYS_clone2
+	case SYS_clone2:
+		internal_clone(tcp);
+		break;
+#endif
 #ifdef SYS_execv
 	case SYS_execv:
 #endif
@@ -628,6 +633,9 @@
 #ifdef SYS_wait4
 	case SYS_wait4:
 #endif
+#ifdef SYS32_wait4
+	case SYS32_wait4:
+#endif
 #ifdef SYS_waitpid
 	case SYS_waitpid:
 #endif
@@ -640,6 +648,9 @@
 #ifdef SYS_exit
 	case SYS_exit:
 #endif
+#ifdef SYS32_exit
+	case SYS32_exit:
+#endif
 		internal_exit(tcp);
 		break;
 	}
@@ -710,13 +721,14 @@
 	if (upeek(pid, 4*ORIG_EAX, &scno) < 0)
 		return -1;
 #elif defined(IA64)
-#define IA64_PSR_IS	((long)1 << 34)
+#	define IA64_PSR_IS	((long)1 << 34)
 	if (upeek (pid, PT_CR_IPSR, &psr) >= 0)
-		ia32 = (psr & IA64_PSR_IS);
+		ia32 = (psr & IA64_PSR_IS) != 0;
 	if (!(tcp->flags & TCB_INSYSCALL)) {
 		if (ia32) {
-			if (upeek(pid, PT_R8, &scno) < 0)
+			if (upeek(pid, PT_R1, &scno) < 0)	/* orig eax */
 				return -1;
+			/* Check if we return from execve. */
 		} else {
 			if (upeek (pid, PT_R15, &scno) < 0)
 				return -1;
@@ -728,6 +740,11 @@
 		if (upeek (pid, PT_R10, &r10) < 0)
 			return -1;
 	}
+	if (tcp->flags & TCB_WAITEXECVE) {
+		tcp->flags &= ~TCB_WAITEXECVE;
+		return 0;
+	}
+
 #elif defined (ARM)
 	{ 
 	    long pc;
@@ -1003,6 +1020,16 @@
 #elif defined (HPPA)
 	if (upeek(pid, PT_GR28, &r28) < 0)
 		return -1;
+#elif defined(IA64)
+	if (upeek(pid, PT_R10, &r10) < 0)
+		return -1;
+	if (upeek(pid, PT_R8, &r8) < 0)
+		return -1;
+	if (ia32 && r8 != -ENOSYS && !(tcp->flags & TCB_INSYSCALL)) {
+		if (debug)
+			fprintf(stderr, "stray syscall exit: r8 = %ld\n", r8);
+		return 0;
+	}
 #endif
 #endif /* LINUX */
 	return 1;
@@ -1236,24 +1263,58 @@
 	}
 #elif defined (IA64)
 	{
-		unsigned long *bsp, cfm, i;
+		if (!ia32) {
+			unsigned long *out0, *rbs_end, cfm, sof, sol, i;
+			/* be backwards compatible with kernel < 2.4.4... */
+#			ifndef PT_RBS_END
+#			  define PT_RBS_END	PT_AR_BSP
+#			endif
 
-		if (upeek(pid, PT_AR_BSP, (long *) &bsp) < 0)
-			return -1;
-		if (upeek(pid, PT_CFM, (long *) &cfm) < 0)
-			return -1;
-
-		bsp = ia64_rse_skip_regs(bsp, -(cfm & 0x7f));
-
-		if (tcp->scno >= 0 && tcp->scno < nsyscalls && sysent[tcp->scno].nargs != -1)
-			tcp->u_nargs = sysent[tcp->scno].nargs;
-		else 
-     	        	tcp->u_nargs = MAX_ARGS;
-		for (i = 0; i < tcp->u_nargs; ++i) {
-			if (umoven(tcp, (unsigned long) ia64_rse_skip_regs(bsp, i), sizeof(long),
-				   (char *) &tcp->u_arg[i])
-			    < 0)
+			if (upeek(pid, PT_RBS_END, (long *) &rbs_end) < 0)
 				return -1;
+			if (upeek(pid, PT_CFM, (long *) &cfm) < 0)
+				return -1;
+
+			sof = (cfm >> 0) & 0x7f;
+			sol = (cfm >> 7) & 0x7f;
+			out0 = ia64_rse_skip_regs(rbs_end, -sof + sol);
+
+			if (tcp->scno >= 0 && tcp->scno < nsyscalls
+			    && sysent[tcp->scno].nargs != -1)
+				tcp->u_nargs = sysent[tcp->scno].nargs;
+			else
+				tcp->u_nargs = MAX_ARGS;
+			for (i = 0; i < tcp->u_nargs; ++i) {
+				if (umoven(tcp, (unsigned long) ia64_rse_skip_regs(out0, i),
+					   sizeof(long), (char *) &tcp->u_arg[i]) < 0)
+					return -1;
+			}
+		} else {
+			int i;
+
+			if (/* EBX = out0 */
+			    upeek(pid, PT_R11, (long *) &tcp->u_arg[0]) < 0
+			    /* ECX = out1 */
+			    || upeek(pid, PT_R9,  (long *) &tcp->u_arg[1]) < 0
+			    /* EDX = out2 */
+			    || upeek(pid, PT_R10, (long *) &tcp->u_arg[2]) < 0
+			    /* ESI = out3 */
+			    || upeek(pid, PT_R14, (long *) &tcp->u_arg[3]) < 0
+			    /* EDI = out4 */
+			    || upeek(pid, PT_R15, (long *) &tcp->u_arg[4]) < 0
+			    /* EBP = out5 */
+			    || upeek(pid, PT_R13, (long *) &tcp->u_arg[5]) < 0)
+				return -1;
+
+			for (i = 0; i < 6; ++i)
+				/* truncate away IVE sign-extension */
+				tcp->u_arg[i] &= 0xffffffff;
+
+			if (tcp->scno >= 0 && tcp->scno < nsyscalls
+			    && sysent[tcp->scno].nargs != -1)
+				tcp->u_nargs = sysent[tcp->scno].nargs;
+			else
+				tcp->u_nargs = 5;
 		}
 	}
 #elif defined (MIPS)
@@ -1604,7 +1665,7 @@
 
 	switch (tcp->scno + NR_SYSCALL_BASE) {
 #ifdef LINUX
-#if !defined (ALPHA) && !defined(IA64) && !defined(SPARC) && !defined(MIPS) && !defined(HPPA)
+#if !defined (ALPHA) && !defined(SPARC) && !defined(MIPS) && !defined(HPPA)
 	case SYS_socketcall:
 		decode_subcall(tcp, SYS_socket_subcall,
 			SYS_socket_nsubcalls, deref_style);
@@ -1613,7 +1674,7 @@
 		decode_subcall(tcp, SYS_ipc_subcall,
 			SYS_ipc_nsubcalls, shift_style);
 		break;
-#endif /* !ALPHA && !IA64 && !MIPS && !SPARC */
+#endif /* !ALPHA && !MIPS && !SPARC */
 #ifdef SPARC
 	case SYS_socketcall:
 		sparc_socket_decode (tcp);
@@ -1676,7 +1737,7 @@
 		decode_subcall(tcp, SYS_kaio_subcall,
 			SYS_kaio_nsubcalls, shift_style);
 		break;
-#endif	
+#endif
 #endif /* SVR4 */
 #ifdef FREEBSD
 	case SYS_msgsys:
@@ -1684,7 +1745,7 @@
 	case SYS_semsys:
 		decode_subcall(tcp, 0, 0, table_style);
 		break;
-#endif		
+#endif
 #ifdef SUNOS4
 	case SYS_semsys:
 		decode_subcall(tcp, SYS_semsys_subcall,
diff --git a/util.c b/util.c
index 5aedec6..595b847 100644
--- a/util.c
+++ b/util.c
@@ -1130,16 +1130,43 @@
 
 #else /* !SPARC */
 #ifdef IA64
-	/*
-	 * Our strategy here is to replace the bundle that contained
-	 * the clone() syscall with a bundle of the form:
-	 *
-	 *	{ 1: br 1b; br 1b; br 1b }
-	 *
-	 * This ensures that the newly forked child will loop
-	 * endlessly until we've got a chance to attach to it.
-	 */
-	{
+	if (ia32) {
+#		define LOOP	0x0000feeb
+		if (tcp->flags & TCB_BPTSET) {
+			fprintf(stderr, "PANIC: bpt already set in pid %u\n",
+				tcp->pid);
+			return -1;
+		}
+		if (upeek(tcp->pid, PT_CR_IIP, &tcp->baddr) < 0)
+			return -1;
+		if (debug)
+			fprintf(stderr, "[%d] setting bpt at %lx\n",
+				tcp->pid, tcp->baddr);
+		tcp->inst[0] = ptrace(PTRACE_PEEKTEXT, tcp->pid,
+				      (char *) tcp->baddr, 0);
+		if (errno) {
+			perror("setbpt: ptrace(PTRACE_PEEKTEXT, ...)");
+			return -1;
+		}
+		ptrace(PTRACE_POKETEXT, tcp->pid, (char *) tcp->baddr, LOOP);
+		if (errno) {
+			perror("setbpt: ptrace(PTRACE_POKETEXT, ...)");
+			return -1;
+		}
+		tcp->flags |= TCB_BPTSET;
+	} else {
+		/*
+		 * XXX Use break instead!
+		 *
+		 * Our strategy here is to replace the bundle that
+		 * contained the clone() syscall with a bundle of the
+		 * form:
+		 *
+		 *	{ 1: br 1b; br 1b; br 1b }
+		 *
+		 * This ensures that the newly forked child will loop
+		 * endlessly until we've got a chance to attach to it.
+		 */
 #		define LOOP0	0x0000100000000017
 #		define LOOP1	0x4000000000200000
 		unsigned long addr, ipsr;
@@ -1150,11 +1177,14 @@
 			return -1;
 		if (upeek(pid, PT_CR_IIP, &addr) < 0)
 			return -1;
-		tcp->baddr = addr | ((ipsr >> 41) & 0x3);	/* store "ri" in low two bits */
+		/* store "ri" in low two bits */
+		tcp->baddr = addr | ((ipsr >> 41) & 0x3);
 
 		errno = 0;
-		tcp->inst[0] = ptrace(PTRACE_PEEKTEXT, pid, (char *) addr + 0, 0);
-		tcp->inst[1] = ptrace(PTRACE_PEEKTEXT, pid, (char *) addr + 8, 0);
+		tcp->inst[0] = ptrace(PTRACE_PEEKTEXT, pid, (char *) addr + 0,
+				      0);
+		tcp->inst[1] = ptrace(PTRACE_PEEKTEXT, pid, (char *) addr + 8,
+				      0);
 		if (errno) {
 			perror("setbpt: ptrace(PTRACE_PEEKTEXT, ...)");
 			return -1;
@@ -1322,7 +1352,34 @@
 	}
 	tcp->flags &= ~TCB_BPTSET;
 #elif defined(IA64)
-	{
+	if (ia32) {
+		unsigned long addr;
+
+		if (debug)
+			fprintf(stderr, "[%d] clearing bpt\n", tcp->pid);
+		if (!(tcp->flags & TCB_BPTSET)) {
+			fprintf(stderr, "PANIC: TCB not set in pid %u\n", tcp->pid);
+			return -1;
+		}
+		errno = 0;
+		ptrace(PTRACE_POKETEXT, tcp->pid, (char *) tcp->baddr, tcp->inst[0]);
+		if (errno) {
+			perror("clearbtp: ptrace(PTRACE_POKETEXT, ...)");
+			return -1;
+		}
+		tcp->flags &= ~TCB_BPTSET;
+
+		if (upeek(tcp->pid, PT_CR_IIP, &addr) < 0)
+			return -1;
+		if (addr != tcp->baddr) {
+			/* The breakpoint has not been reached yet.  */
+			if (debug)
+				fprintf(stderr,
+					"NOTE: PC not at bpt (pc %#lx baddr %#lx)\n",
+						addr, tcp->baddr);
+			return 0;
+		}
+	} else {
 		unsigned long addr, ipsr;
 		pid_t pid;