12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx -O0 %s -o %t && %run %t
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: arm-linux-gnueabi
3341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
4341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <assert.h>
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <signal.h>
6341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <stdio.h>
7341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/ptrace.h>
8341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/types.h>
9341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/user.h>
10341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/wait.h>
11341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <unistd.h>
12341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
13341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanovint main(void) {
14341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid_t pid;
15341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid = fork();
16341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  if (pid == 0) { // child
17341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_TRACEME, 0, NULL, NULL);
18341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    execl("/bin/true", "true", NULL);
19341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  } else {
20341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
21341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_regs_struct regs;
22341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    int res;
23341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETREGS, pid, NULL, &regs);
24341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
25341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    if (regs.rip)
26341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov      printf("%zx\n", regs.rip);
27341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
28341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_fpregs_struct fpregs;
29341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETFPREGS, pid, NULL, &fpregs);
30341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
31341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    if (fpregs.mxcsr)
32341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov      printf("%x\n", fpregs.mxcsr);
33341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    siginfo_t siginfo;
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    res = ptrace(PTRACE_GETSIGINFO, pid, NULL, &siginfo);
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    assert(!res);
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    assert(siginfo.si_pid == pid);
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
39341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_CONT, pid, NULL, NULL);
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
41341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
42341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  }
43341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  return 0;
44341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov}
45