xref: /aosp_15_r20/external/strace/linux/sparc64/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 	/* Retrieve the syscall trap instruction. */
6*cf84ac9aSAndroid Build Coastguard Worker 	unsigned long trap;
7*cf84ac9aSAndroid Build Coastguard Worker 	errno = 0;
8*cf84ac9aSAndroid Build Coastguard Worker 	trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *) sparc_regs.tpc, 0);
9*cf84ac9aSAndroid Build Coastguard Worker 	if (errno == 0) {
10*cf84ac9aSAndroid Build Coastguard Worker 		trap >>= 32;
11*cf84ac9aSAndroid Build Coastguard Worker 		switch (trap) {
12*cf84ac9aSAndroid Build Coastguard Worker 		case 0x91d02010:
13*cf84ac9aSAndroid Build Coastguard Worker 			/* Linux/SPARC syscall trap. */
14*cf84ac9aSAndroid Build Coastguard Worker 			update_personality(tcp, 1);
15*cf84ac9aSAndroid Build Coastguard Worker 			break;
16*cf84ac9aSAndroid Build Coastguard Worker 		case 0x91d0206d:
17*cf84ac9aSAndroid Build Coastguard Worker 			/* Linux/SPARC64 syscall trap. */
18*cf84ac9aSAndroid Build Coastguard Worker 			update_personality(tcp, 0);
19*cf84ac9aSAndroid Build Coastguard Worker 			break;
20*cf84ac9aSAndroid Build Coastguard Worker 		}
21*cf84ac9aSAndroid Build Coastguard Worker 	}
22*cf84ac9aSAndroid Build Coastguard Worker 
23*cf84ac9aSAndroid Build Coastguard Worker 	tcp->scno = sparc_regs.u_regs[U_REG_G1];
24*cf84ac9aSAndroid Build Coastguard Worker 	return 1;
25*cf84ac9aSAndroid Build Coastguard Worker }
26