~ubuntu-branches/ubuntu/saucy/strace/saucy-proposed

« back to all changes in this revision

Viewing changes to process.c

  • Committer: Bazaar Package Importer
  • Author(s): Pedro Fragoso, Pedro Fragoso, Martin Pitt
  • Date: 2008-12-09 11:06:58 UTC
  • mfrom: (0.1.5 upstream) (2.1.2 lenny)
  • Revision ID: james.westby@ubuntu.com-20081209110658-4oy0si4bs8yerqg1
Tags: 4.5.17+cvs080723-2ubuntu1
[ Pedro Fragoso ]
* Merge from Debian unstable (LP: #259933), Ubuntu remaining changes:
  - Add lpia as supported architecture

[ Martin Pitt ]
* file.c: Apply patch from upstream CVS to build on current kernels,
  which don't have linux/dirent.h any more.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35
35
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
36
 *
37
 
 *      $Id: process.c,v 1.104 2007/01/11 22:05:05 ldv Exp $
 
37
 *      $Id: process.c,v 1.113 2008/07/18 02:16:47 roland Exp $
38
38
 */
39
39
 
40
40
#include "defs.h"
216
216
#ifdef PR_SET_KEEPCAPS
217
217
        { PR_SET_KEEPCAPS,      "PR_SET_KEEP_CAPS"      },
218
218
#endif
 
219
#ifdef PR_GET_FPEMU
 
220
        { PR_GET_FPEMU,         "PR_GET_FPEMU"          },
 
221
#endif
 
222
#ifdef PR_SET_FPEMU
 
223
        { PR_SET_FPEMU,         "PR_SET_FPEMU"          },
 
224
#endif
 
225
#ifdef PR_GET_FPEXC
 
226
        { PR_GET_FPEXC,         "PR_GET_FPEXC"          },
 
227
#endif
 
228
#ifdef PR_SET_FPEXC
 
229
        { PR_SET_FPEXC,         "PR_SET_FPEXC"          },
 
230
#endif
 
231
#ifdef PR_GET_TIMING
 
232
        { PR_GET_TIMING,        "PR_GET_TIMING"         },
 
233
#endif
 
234
#ifdef PR_SET_TIMING
 
235
        { PR_SET_TIMING,        "PR_SET_TIMING"         },
 
236
#endif
 
237
#ifdef PR_SET_NAME
 
238
        { PR_SET_NAME,          "PR_SET_NAME"           },
 
239
#endif
 
240
#ifdef PR_GET_NAME
 
241
        { PR_GET_NAME,          "PR_GET_NAME"           },
 
242
#endif
 
243
#ifdef PR_GET_ENDIAN
 
244
        { PR_GET_ENDIAN,        "PR_GET_ENDIAN"         },
 
245
#endif
 
246
#ifdef PR_SET_ENDIAN
 
247
        { PR_SET_ENDIAN,        "PR_SET_ENDIAN"         },
 
248
#endif
 
249
#ifdef PR_GET_SECCOMP
 
250
        { PR_GET_SECCOMP,       "PR_GET_SECCOMP"        },
 
251
#endif
 
252
#ifdef PR_SET_SECCOMP
 
253
        { PR_SET_SECCOMP,       "PR_SET_SECCOMP"        },
 
254
#endif
219
255
        { 0,                    NULL                    },
220
256
};
221
257
 
953
989
#ifdef SYS_vfork
954
990
        if (known_scno(tcp) == SYS_vfork) {
955
991
                /* Attempt to make vfork into fork, which we can follow. */
956
 
                if (!followvfork ||
957
 
                    change_syscall(tcp, SYS_fork) < 0)
 
992
                if (change_syscall(tcp, SYS_fork) < 0)
958
993
                        dont_follow = 1;
959
994
        }
960
995
#endif
1677
1712
struct tcb *tcp;
1678
1713
long addr;
1679
1714
{
1680
 
        char *cp;
 
1715
        union {
 
1716
                int p32;
 
1717
                long p64;
 
1718
                char data[sizeof(long)];
 
1719
        } cp;
1681
1720
        char *sep;
1682
 
        int max = max_strlen / 2;
 
1721
        int n = 0;
1683
1722
 
1684
 
        for (sep = ""; --max >= 0; sep = ", ") {
1685
 
                if (!abbrev(tcp))
1686
 
                        max++;
1687
 
                if (umove(tcp, addr, &cp) < 0) {
 
1723
        cp.p64 = 1;
 
1724
        for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
 
1725
                if (umoven(tcp, addr, personality_wordsize[current_personality],
 
1726
                           cp.data) < 0) {
1688
1727
                        tprintf("%#lx", addr);
1689
1728
                        return;
1690
1729
                }
1691
 
                if (cp == 0)
 
1730
                if (personality_wordsize[current_personality] == 4)
 
1731
                        cp.p64 = cp.p32;
 
1732
                if (cp.p64 == 0)
1692
1733
                        break;
1693
1734
                tprintf(sep);
1694
 
                printstr(tcp, (long) cp, -1);
1695
 
                addr += sizeof(char *);
 
1735
                printstr(tcp, cp.p64, -1);
 
1736
                addr += personality_wordsize[current_personality];
1696
1737
        }
1697
 
        if (cp)
1698
 
                tprintf(", ...");
 
1738
        if (cp.p64)
 
1739
                tprintf("%s...", sep);
1699
1740
}
1700
1741
 
1701
1742
static void
1906
1947
        int exited = 0;
1907
1948
 
1908
1949
        if (entering(tcp)) {
1909
 
                tprintf("%ld, ", tcp->u_arg[0]);
 
1950
                /*
 
1951
                 * Sign-extend a 32-bit value when that's what it is.
 
1952
                 */
 
1953
                long pid = tcp->u_arg[0];
 
1954
                if (personality_wordsize[current_personality] < sizeof pid)
 
1955
                        pid = (long) (int) pid;
 
1956
                tprintf("%ld, ", pid);
1910
1957
        } else {
1911
1958
                /* status */
1912
1959
                if (!tcp->u_arg[1])
2883
2930
        { uoff(regs.ARM_cpsr),  "cpsr"                                  },
2884
2931
#endif
2885
2932
 
 
2933
#ifdef MIPS
 
2934
        { 0,                    "r0"                                    },
 
2935
        { 1,                    "r1"                                    },
 
2936
        { 2,                    "r2"                                    },
 
2937
        { 3,                    "r3"                                    },
 
2938
        { 4,                    "r4"                                    },
 
2939
        { 5,                    "r5"                                    },
 
2940
        { 6,                    "r6"                                    },
 
2941
        { 7,                    "r7"                                    },
 
2942
        { 8,                    "r8"                                    },
 
2943
        { 9,                    "r9"                                    },
 
2944
        { 10,                   "r10"                                   },
 
2945
        { 11,                   "r11"                                   },
 
2946
        { 12,                   "r12"                                   },
 
2947
        { 13,                   "r13"                                   },
 
2948
        { 14,                   "r14"                                   },
 
2949
        { 15,                   "r15"                                   },
 
2950
        { 16,                   "r16"                                   },
 
2951
        { 17,                   "r17"                                   },
 
2952
        { 18,                   "r18"                                   },
 
2953
        { 19,                   "r19"                                   },
 
2954
        { 20,                   "r20"                                   },
 
2955
        { 21,                   "r21"                                   },
 
2956
        { 22,                   "r22"                                   },
 
2957
        { 23,                   "r23"                                   },
 
2958
        { 24,                   "r24"                                   },
 
2959
        { 25,                   "r25"                                   },
 
2960
        { 26,                   "r26"                                   },
 
2961
        { 27,                   "r27"                                   },
 
2962
        { 28,                   "r28"                                   },
 
2963
        { 29,                   "r29"                                   },
 
2964
        { 30,                   "r30"                                   },
 
2965
        { 31,                   "r31"                                   },
 
2966
        { 32,                   "f0"                                    },
 
2967
        { 33,                   "f1"                                    },
 
2968
        { 34,                   "f2"                                    },
 
2969
        { 35,                   "f3"                                    },
 
2970
        { 36,                   "f4"                                    },
 
2971
        { 37,                   "f5"                                    },
 
2972
        { 38,                   "f6"                                    },
 
2973
        { 39,                   "f7"                                    },
 
2974
        { 40,                   "f8"                                    },
 
2975
        { 41,                   "f9"                                    },
 
2976
        { 42,                   "f10"                                   },
 
2977
        { 43,                   "f11"                                   },
 
2978
        { 44,                   "f12"                                   },
 
2979
        { 45,                   "f13"                                   },
 
2980
        { 46,                   "f14"                                   },
 
2981
        { 47,                   "f15"                                   },
 
2982
        { 48,                   "f16"                                   },
 
2983
        { 49,                   "f17"                                   },
 
2984
        { 50,                   "f18"                                   },
 
2985
        { 51,                   "f19"                                   },
 
2986
        { 52,                   "f20"                                   },
 
2987
        { 53,                   "f21"                                   },
 
2988
        { 54,                   "f22"                                   },
 
2989
        { 55,                   "f23"                                   },
 
2990
        { 56,                   "f24"                                   },
 
2991
        { 57,                   "f25"                                   },
 
2992
        { 58,                   "f26"                                   },
 
2993
        { 59,                   "f27"                                   },
 
2994
        { 60,                   "f28"                                   },
 
2995
        { 61,                   "f29"                                   },
 
2996
        { 62,                   "f30"                                   },
 
2997
        { 63,                   "f31"                                   },
 
2998
        { 64,                   "pc"                                    },
 
2999
        { 65,                   "cause"                                 },
 
3000
        { 66,                   "badvaddr"                              },
 
3001
        { 67,                   "mmhi"                                  },
 
3002
        { 68,                   "mmlo"                                  },
 
3003
        { 69,                   "fpcsr"                                 },
 
3004
        { 70,                   "fpeir"                                 },
 
3005
#endif
 
3006
 
2886
3007
#if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64)
2887
3008
        { uoff(u_fpvalid),      "offsetof(struct user, u_fpvalid)"      },
2888
3009
#endif
3016
3137
                        tprintf("%#lx, ", tcp->u_arg[2]);
3017
3138
#ifdef LINUX
3018
3139
                switch (tcp->u_arg[0]) {
 
3140
#ifndef IA64
3019
3141
                case PTRACE_PEEKDATA:
3020
3142
                case PTRACE_PEEKTEXT:
3021
3143
                case PTRACE_PEEKUSER:
3022
3144
                        break;
 
3145
#endif
3023
3146
                case PTRACE_CONT:
3024
3147
                case PTRACE_SINGLESTEP:
3025
3148
                case PTRACE_SYSCALL:
3035
3158
                case PTRACE_PEEKDATA:
3036
3159
                case PTRACE_PEEKTEXT:
3037
3160
                case PTRACE_PEEKUSER:
 
3161
#ifdef IA64
 
3162
                        return RVAL_HEX;
 
3163
#else
3038
3164
                        printnum(tcp, tcp->u_arg[3], "%#lx");
3039
3165
                        break;
 
3166
#endif
3040
3167
                }
3041
3168
        }
3042
3169
#endif /* LINUX */
3067
3194
#endif /* !SVR4 */
3068
3195
 
3069
3196
#ifdef LINUX
 
3197
# ifndef FUTEX_CMP_REQUEUE
 
3198
#  define FUTEX_CMP_REQUEUE 4
 
3199
# endif
 
3200
# ifndef FUTEX_WAKE_OP
 
3201
#  define FUTEX_WAKE_OP 5
 
3202
# endif
 
3203
# ifndef FUTEX_LOCK_PI
 
3204
#  define FUTEX_LOCK_PI 6
 
3205
#  define FUTEX_UNLOCK_PI 7
 
3206
#  define FUTEX_TRYLOCK_PI 8
 
3207
# endif
 
3208
# ifndef FUTEX_WAIT_BITSET
 
3209
#  define FUTEX_WAIT_BITSET 9
 
3210
# endif
 
3211
# ifndef FUTEX_WAKE_BITSET
 
3212
#  define FUTEX_WAKE_BITSET 10
 
3213
# endif
 
3214
# ifndef FUTEX_PRIVATE_FLAG
 
3215
#  define FUTEX_PRIVATE_FLAG 128
 
3216
# endif
3070
3217
static const struct xlat futexops[] = {
3071
 
        { FUTEX_WAIT,   "FUTEX_WAIT" },
3072
 
        { FUTEX_WAKE,   "FUTEX_WAKE" },
3073
 
        { FUTEX_FD,     "FUTEX_FD" },
3074
 
        { FUTEX_REQUEUE,"FUTEX_REQUEUE" },
3075
 
        { 0,            NULL }
 
3218
        { FUTEX_WAIT,                                   "FUTEX_WAIT" },
 
3219
        { FUTEX_WAKE,                                   "FUTEX_WAKE" },
 
3220
        { FUTEX_FD,                                     "FUTEX_FD" },
 
3221
        { FUTEX_REQUEUE,                                "FUTEX_REQUEUE" },
 
3222
        { FUTEX_CMP_REQUEUE,                            "FUTEX_CMP_REQUEUE" },
 
3223
        { FUTEX_WAKE_OP,                                "FUTEX_WAKE_OP" },
 
3224
        { FUTEX_LOCK_PI,                                "FUTEX_LOCK_PI" },
 
3225
        { FUTEX_UNLOCK_PI,                              "FUTEX_UNLOCK_PI" },
 
3226
        { FUTEX_TRYLOCK_PI,                             "FUTEX_TRYLOCK_PI" },
 
3227
        { FUTEX_WAIT_BITSET,                            "FUTEX_WAIT_BITSET" },
 
3228
        { FUTEX_WAKE_BITSET,                            "FUTEX_WAKE_BITSET" },
 
3229
        { FUTEX_WAIT|FUTEX_PRIVATE_FLAG,                "FUTEX_WAIT_PRIVATE" },
 
3230
        { FUTEX_WAKE|FUTEX_PRIVATE_FLAG,                "FUTEX_WAKE_PRIVATE" },
 
3231
        { FUTEX_FD|FUTEX_PRIVATE_FLAG,                  "FUTEX_FD_PRIVATE" },
 
3232
        { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG,             "FUTEX_REQUEUE_PRIVATE" },
 
3233
        { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG,         "FUTEX_CMP_REQUEUE_PRIVATE" },
 
3234
        { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG,             "FUTEX_WAKE_OP_PRIVATE" },
 
3235
        { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG,             "FUTEX_LOCK_PI_PRIVATE" },
 
3236
        { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG,           "FUTEX_UNLOCK_PI_PRIVATE" },
 
3237
        { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG,          "FUTEX_TRYLOCK_PI_PRIVATE" },
 
3238
        { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG,         "FUTEX_WAIT_BITSET_PRIVATE" },
 
3239
        { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG,         "FUTEX_WAKE_BITSET_PRIVATE" },
 
3240
        { 0,                                            NULL }
 
3241
};
 
3242
#ifndef FUTEX_OP_SET
 
3243
# define FUTEX_OP_SET           0
 
3244
# define FUTEX_OP_ADD           1
 
3245
# define FUTEX_OP_OR            2
 
3246
# define FUTEX_OP_ANDN          3
 
3247
# define FUTEX_OP_XOR           4
 
3248
# define FUTEX_OP_CMP_EQ        0
 
3249
# define FUTEX_OP_CMP_NE        1
 
3250
# define FUTEX_OP_CMP_LT        2
 
3251
# define FUTEX_OP_CMP_LE        3
 
3252
# define FUTEX_OP_CMP_GT        4
 
3253
# define FUTEX_OP_CMP_GE        5
 
3254
#endif
 
3255
static const struct xlat futexwakeops[] = {
 
3256
        { FUTEX_OP_SET,         "FUTEX_OP_SET" },
 
3257
        { FUTEX_OP_ADD,         "FUTEX_OP_ADD" },
 
3258
        { FUTEX_OP_OR,          "FUTEX_OP_OR" },
 
3259
        { FUTEX_OP_ANDN,        "FUTEX_OP_ANDN" },
 
3260
        { FUTEX_OP_XOR,         "FUTEX_OP_XOR" },
 
3261
        { 0,                    NULL }
 
3262
};
 
3263
static const struct xlat futexwakecmps[] = {
 
3264
        { FUTEX_OP_CMP_EQ,      "FUTEX_OP_CMP_EQ" },
 
3265
        { FUTEX_OP_CMP_NE,      "FUTEX_OP_CMP_NE" },
 
3266
        { FUTEX_OP_CMP_LT,      "FUTEX_OP_CMP_LT" },
 
3267
        { FUTEX_OP_CMP_LE,      "FUTEX_OP_CMP_LE" },
 
3268
        { FUTEX_OP_CMP_GT,      "FUTEX_OP_CMP_GT" },
 
3269
        { FUTEX_OP_CMP_GE,      "FUTEX_OP_CMP_GE" },
 
3270
        { 0,                    NULL }
3076
3271
};
3077
3272
 
3078
3273
int
3080
3275
struct tcb *tcp;
3081
3276
{
3082
3277
    if (entering(tcp)) {
 
3278
        long int cmd = tcp->u_arg[1] & 127;
3083
3279
        tprintf("%p, ", (void *) tcp->u_arg[0]);
3084
3280
        printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3085
3281
        tprintf(", %ld", tcp->u_arg[2]);
3086
 
        if (tcp->u_arg[1] == FUTEX_WAIT) {
3087
 
                tprintf(", ");
3088
 
                printtv(tcp, tcp->u_arg[3]);
3089
 
        } else if (tcp->u_arg[1] == FUTEX_REQUEUE)
 
3282
        if (cmd == FUTEX_WAKE_BITSET)
 
3283
                tprintf(", %lx", tcp->u_arg[5]);
 
3284
        else if (cmd == FUTEX_WAIT) {
 
3285
                tprintf(", ");
 
3286
                printtv(tcp, tcp->u_arg[3]);
 
3287
        } else if (cmd == FUTEX_WAIT_BITSET) {
 
3288
                tprintf(", ");
 
3289
                printtv(tcp, tcp->u_arg[3]);
 
3290
                tprintf(", %lx", tcp->u_arg[5]);
 
3291
        } else if (cmd == FUTEX_REQUEUE)
3090
3292
                tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
 
3293
        else if (cmd == FUTEX_CMP_REQUEUE)
 
3294
                tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
 
3295
        else if (cmd == FUTEX_WAKE_OP) {
 
3296
                tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
 
3297
                if ((tcp->u_arg[5] >> 28) & 8)
 
3298
                        tprintf("FUTEX_OP_OPARG_SHIFT|");
 
3299
                printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
 
3300
                tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
 
3301
                if ((tcp->u_arg[5] >> 24) & 8)
 
3302
                        tprintf("FUTEX_OP_OPARG_SHIFT|");
 
3303
                printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
 
3304
                tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
 
3305
        }
3091
3306
    }
3092
3307
    return 0;
3093
3308
}
3248
3463
}
3249
3464
#endif
3250
3465
 
 
3466
 
 
3467
int
 
3468
sys_getcpu(tcp)
 
3469
struct tcb *tcp;
 
3470
{
 
3471
        if (exiting(tcp)) {
 
3472
                unsigned u;
 
3473
                if (tcp->u_arg[0] == 0)
 
3474
                        tprintf("NULL, ");
 
3475
                else if (umove(tcp, tcp->u_arg[0], &u) < 0)
 
3476
                        tprintf("%#lx, ", tcp->u_arg[0]);
 
3477
                else
 
3478
                        tprintf("[%u], ", u);
 
3479
                if (tcp->u_arg[1] == 0)
 
3480
                        tprintf("NULL, ");
 
3481
                else if (umove(tcp, tcp->u_arg[1], &u) < 0)
 
3482
                        tprintf("%#lx, ", tcp->u_arg[1]);
 
3483
                else
 
3484
                        tprintf("[%u], ", u);
 
3485
                tprintf("%#lx", tcp->u_arg[2]);
 
3486
        }
 
3487
        return 0;
 
3488
}
 
3489
 
3251
3490
#endif