| /* Return codes: 1 - ok, 0 - ignore, other - error. */ |
| static int |
| arch_get_scno(struct tcb *tcp) |
| { |
| kernel_ulong_t scno = 0; |
| |
| /* |
| * In the new syscall ABI, the system call number is in R3. |
| */ |
| if (upeek(tcp, 4*(REG_REG0+3), &scno) < 0) |
| return -1; |
| |
| if ((long) scno < 0) { |
| /* Odd as it may seem, a glibc bug has been known to cause |
| glibc to issue bogus negative syscall numbers. So for |
| our purposes, make strace print what it *should* have been */ |
| kernel_ulong_t correct_scno = (scno & 0xff); |
| if (debug_flag) |
| error_msg("Detected glibc bug: bogus system call" |
| " number = %ld, correcting to %ld", |
| scno, correct_scno); |
| scno = correct_scno; |
| } |
| |
| tcp->scno = scno; |
| return 1; |
| } |