diff options
Diffstat (limited to 'src/linux/alpha/get_scno.c')
-rw-r--r-- | src/linux/alpha/get_scno.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/linux/alpha/get_scno.c b/src/linux/alpha/get_scno.c new file mode 100644 index 000000000..7cb61fa18 --- /dev/null +++ b/src/linux/alpha/get_scno.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015-2019 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +/* Return codes: 1 - ok, 0 - ignore, other - error. */ +static int +arch_get_scno(struct tcb *tcp) +{ + kernel_ulong_t scno = 0; + + if (upeek(tcp, REG_A3, &alpha_a3) < 0) + return -1; + if (upeek(tcp, REG_R0, &scno) < 0) + return -1; + + /* + * Do some sanity checks to figure out if it's + * really a syscall entry + */ + if (!scno_in_range(scno)) { + if (alpha_a3 == 0 || alpha_a3 == -1UL) { + debug_msg("stray syscall exit: r0 = %lu", scno); + return 0; + } + } + + tcp->scno = scno; + return 1; +} |