diff options
author | Roland McGrath <roland@redhat.com> | 2003-08-21 09:58:00 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2003-08-21 09:58:00 +0000 |
commit | c0f8bbda62139da801bb761d8c66724e12638087 (patch) | |
tree | 5e9052b2542e5e2c9a60986b7b136808ebafc62a | |
parent | 4d8130c85990fdf24e355366475854f26d91f1c8 (diff) | |
download | strace-c0f8bbda62139da801bb761d8c66724e12638087.tar.gz strace-c0f8bbda62139da801bb761d8c66724e12638087.tar.bz2 strace-c0f8bbda62139da801bb761d8c66724e12638087.tar.xz |
2003-07-28 Daniel Jacobowitz <drow@mvista.com>
* defs.h (ALIGN64): Define for MIPS.
* io.c (PREAD_OFFSET_ARG): Define.
(sys_pread, sys_pwrite): Use it.
* process.c (struct_user_offsets) [SH]: Check whether REG_XDREG0
is defined.
* linux/sh/syscallent.h (pread, pwrite): Take six arguments.
(truncate64, ftruncate64): Pretty-print.
* linux/mips/syscallent.h (pread, pwrite): Take six arguments.
(truncate64, ftruncate64): Take four arguments.
-rw-r--r-- | defs.h | 3 | ||||
-rw-r--r-- | io.c | 20 | ||||
-rw-r--r-- | linux/mips/syscallent.h | 8 | ||||
-rw-r--r-- | linux/sh/syscallent.h | 8 | ||||
-rw-r--r-- | process.c | 2 |
5 files changed, 28 insertions, 13 deletions
@@ -562,7 +562,8 @@ extern int nsignals2; #endif /* SUPPORTED_PERSONALITIES >= 3 */ #if defined(FREEBSD) || (defined(LINUX) \ - && defined(POWERPC) && !defined(__powerpc64__)) + && defined(POWERPC) && !defined(__powerpc64__)) \ + || (defined (LINUX) && defined (MIPS) && !defined(__mips64)) /* ARRGH! off_t args are aligned on 64 bit boundaries! */ #define ALIGN64(tcp,arg) \ do { \ @@ -231,6 +231,18 @@ struct tcb *tcp; #endif /* FREEBSD */ #ifdef LINUX + +/* The SH4 ABI does allow long longs in odd-numbered registers, but + does not allow them to be split between registers and memory - and + there are only four argument registers for normal functions. As a + result pread takes an extra padding argument before the offset. This + was changed late in the 2.4 series (around 2.4.20). */ +#if defined(SH) +#define PREAD_OFFSET_ARG 4 +#else +#define PREAD_OFFSET_ARG 3 +#endif + int sys_pread(tcp) struct tcb *tcp; @@ -242,9 +254,9 @@ struct tcb *tcp; tprintf("%#lx", tcp->u_arg[1]); else printstr(tcp, tcp->u_arg[1], tcp->u_rval); - ALIGN64 (tcp, 3); /* PowerPC alignment restriction */ + ALIGN64 (tcp, PREAD_OFFSET_ARG); /* PowerPC alignment restriction */ tprintf(", %lu, %llu", tcp->u_arg[2], - *(unsigned long long *)&tcp->u_arg[3]); + *(unsigned long long *)&tcp->u_arg[PREAD_OFFSET_ARG]); } return 0; } @@ -256,9 +268,9 @@ struct tcb *tcp; if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); - ALIGN64 (tcp, 3); /* PowerPC alignment restriction */ + ALIGN64 (tcp, PREAD_OFFSET_ARG); /* PowerPC alignment restriction */ tprintf(", %lu, %llu", tcp->u_arg[2], - *(unsigned long long *)&tcp->u_arg[3]); + *(unsigned long long *)&tcp->u_arg[PREAD_OFFSET_ARG]); } return 0; } diff --git a/linux/mips/syscallent.h b/linux/mips/syscallent.h index be6ed70..8f41314 100644 --- a/linux/mips/syscallent.h +++ b/linux/mips/syscallent.h @@ -4198,8 +4198,8 @@ { 4, TS, sys_rt_sigtimedwait, "rt_sigtimedwait"},/* 4197 */ { 3, TS, sys_rt_sigqueueinfo, "rt_sigqueueinfo"},/* 4198 */ { 2, TS, sys_rt_sigsuspend, "rt_siguspend" }, /* 4199 */ - { 5, TF, sys_pread, "pread" }, /* 4200 */ - { 5, TF, sys_pwrite, "pwrite" }, /* 4201 */ + { 6, TF, sys_pread, "pread" }, /* 4200 */ + { 6, TF, sys_pwrite, "pwrite" }, /* 4201 */ { 3, TF, sys_chown, "chown" }, /* 4202 */ { 2, TF, sys_getcwd, "getcwd" }, /* 4203 */ { 2, 0, sys_capget, "capget" }, /* 4204 */ @@ -4209,8 +4209,8 @@ { 0, 0, printargs, "SYS_4208" }, /* 4208 */ { 0, 0, printargs, "SYS_4209" }, /* 4209 */ { 6, 0, sys_mmap, "mmap" }, /* 4210 */ - { 2, TF, sys_truncate64, "truncate64" }, /* 4211 */ - { 2, TF, sys_ftruncate64, "ftruncate64" }, /* 4212 */ + { 4, TF, sys_truncate64, "truncate64" }, /* 4211 */ + { 4, TF, sys_ftruncate64, "ftruncate64" }, /* 4212 */ { 2, TF, printargs, "stat64" }, /* 4213 */ { 2, TF, sys_lstat64, "lstat64" }, /* 4214 */ { 2, TF, sys_fstat64, "fstat64" }, /* 4215 */ diff --git a/linux/sh/syscallent.h b/linux/sh/syscallent.h index 2b83dda..f6a01a6 100644 --- a/linux/sh/syscallent.h +++ b/linux/sh/syscallent.h @@ -211,8 +211,8 @@ { 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 */ + { 6, TF, sys_pread, "pread" }, /* 180 */ + { 6, TF, sys_pwrite, "pwrite" }, /* 181 */ { 3, TF, sys_chown, "chown" }, /* 182 */ { 2, 0, sys_getcwd, "getcwd" }, /* 183 */ { 2, 0, sys_capget, "capget" }, /* 184 */ @@ -224,8 +224,8 @@ { 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 */ + { 5, 0, sys_truncate64, "truncate64" }, /* 193 */ + { 5, 0, sys_ftruncate64, "ftruncate64" }, /* 194 */ { 2, TF, sys_stat64, "stat64" }, /* 195 */ { 2, TF, sys_lstat64, "lstat64" }, /* 196 */ { 2, TF, sys_fstat64, "fstat64" }, /* 197 */ @@ -2465,6 +2465,7 @@ struct xlat struct_user_offsets[] = { { 4*(REG_FPREG0+13), "4*REG_FPREG13" }, { 4*(REG_FPREG0+14), "4*REG_FPREG14" }, { 4*REG_FPREG15, "4*REG_FPREG15" }, +#ifdef REG_XDREG0 { 4*REG_XDREG0, "4*REG_XDREG0" }, { 4*(REG_XDREG0+2), "4*REG_XDREG2" }, { 4*(REG_XDREG0+4), "4*REG_XDREG4" }, @@ -2473,6 +2474,7 @@ struct xlat struct_user_offsets[] = { { 4*(REG_XDREG0+10), "4*REG_XDREG10" }, { 4*(REG_XDREG0+12), "4*REG_XDREG12" }, { 4*REG_XDREG14, "4*REG_XDREG14" }, +#endif { 4*REG_FPSCR, "4*REG_FPSCR" }, #endif /* SH */ #ifdef SH64 |