xref: /aosp_15_r20/external/strace/linux/sh/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 	/*
8*cf84ac9aSAndroid Build Coastguard Worker 	 * In the new syscall ABI, the system call number is in R3.
9*cf84ac9aSAndroid Build Coastguard Worker 	 */
10*cf84ac9aSAndroid Build Coastguard Worker 	if (upeek(tcp, 4*(REG_REG0+3), &scno) < 0)
11*cf84ac9aSAndroid Build Coastguard Worker 		return -1;
12*cf84ac9aSAndroid Build Coastguard Worker 
13*cf84ac9aSAndroid Build Coastguard Worker 	if ((long) scno < 0) {
14*cf84ac9aSAndroid Build Coastguard Worker 		/* Odd as it may seem, a glibc bug has been known to cause
15*cf84ac9aSAndroid Build Coastguard Worker 		   glibc to issue bogus negative syscall numbers.  So for
16*cf84ac9aSAndroid Build Coastguard Worker 		   our purposes, make strace print what it *should* have been */
17*cf84ac9aSAndroid Build Coastguard Worker 		kernel_ulong_t correct_scno = (scno & 0xff);
18*cf84ac9aSAndroid Build Coastguard Worker 		if (debug_flag)
19*cf84ac9aSAndroid Build Coastguard Worker 			error_msg("Detected glibc bug: bogus system call"
20*cf84ac9aSAndroid Build Coastguard Worker 				  " number = %ld, correcting to %ld",
21*cf84ac9aSAndroid Build Coastguard Worker 				  scno, correct_scno);
22*cf84ac9aSAndroid Build Coastguard Worker 		scno = correct_scno;
23*cf84ac9aSAndroid Build Coastguard Worker 	}
24*cf84ac9aSAndroid Build Coastguard Worker 
25*cf84ac9aSAndroid Build Coastguard Worker 	tcp->scno = scno;
26*cf84ac9aSAndroid Build Coastguard Worker 	return 1;
27*cf84ac9aSAndroid Build Coastguard Worker }
28