xref: /aosp_15_r20/external/strace/linux/alpha/get_scno.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /* Return codes: 1 - ok, 0 - ignore, other - error. */
2*cf84ac9aSAndroid Build Coastguard Worker static int
arch_get_scno(struct tcb * tcp)3*cf84ac9aSAndroid Build Coastguard Worker arch_get_scno(struct tcb *tcp)
4*cf84ac9aSAndroid Build Coastguard Worker {
5*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t scno = 0;
6*cf84ac9aSAndroid Build Coastguard Worker 
7*cf84ac9aSAndroid Build Coastguard Worker 	if (upeek(tcp, REG_A3, &alpha_a3) < 0)
8*cf84ac9aSAndroid Build Coastguard Worker 		return -1;
9*cf84ac9aSAndroid Build Coastguard Worker 	if (upeek(tcp, REG_R0, &scno) < 0)
10*cf84ac9aSAndroid Build Coastguard Worker 		return -1;
11*cf84ac9aSAndroid Build Coastguard Worker 
12*cf84ac9aSAndroid Build Coastguard Worker 	/*
13*cf84ac9aSAndroid Build Coastguard Worker 	 * Do some sanity checks to figure out if it's
14*cf84ac9aSAndroid Build Coastguard Worker 	 * really a syscall entry
15*cf84ac9aSAndroid Build Coastguard Worker 	 */
16*cf84ac9aSAndroid Build Coastguard Worker 	if (!scno_in_range(scno)) {
17*cf84ac9aSAndroid Build Coastguard Worker 		if (alpha_a3 == 0 || alpha_a3 == -1UL) {
18*cf84ac9aSAndroid Build Coastguard Worker 			if (debug_flag)
19*cf84ac9aSAndroid Build Coastguard Worker 				error_msg("stray syscall exit: r0 = %lu", scno);
20*cf84ac9aSAndroid Build Coastguard Worker 			return 0;
21*cf84ac9aSAndroid Build Coastguard Worker 		}
22*cf84ac9aSAndroid Build Coastguard Worker 	}
23*cf84ac9aSAndroid Build Coastguard Worker 
24*cf84ac9aSAndroid Build Coastguard Worker 	tcp->scno = scno;
25*cf84ac9aSAndroid Build Coastguard Worker 	return 1;
26*cf84ac9aSAndroid Build Coastguard Worker }
27