116510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin/* Return codes: 1 - ok, 0 - ignore, other - error. */
216510517f10757355944ee5c07285ba2a8b61affDmitry V. Levinstatic int
316510517f10757355944ee5c07285ba2a8b61affDmitry V. Levinarch_get_scno(struct tcb *tcp)
416510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin{
516510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	/* Retrieve the syscall trap instruction. */
616510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	unsigned long trap;
716510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	errno = 0;
882ffa78acd7ce9b593b5bbb3e89a519a1edff297Dmitry V. Levin	trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *) sparc_regs.tpc, 0);
916510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	if (errno)
1016510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin		return -1;
1116510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	trap >>= 32;
1216510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	switch (trap) {
1316510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	case 0x91d02010:
1416510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin		/* Linux/SPARC syscall trap. */
15aebfe832b832a865d0f78c33299c65e5caf22d01Dmitry V. Levin		update_personality(tcp, 1);
1616510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin		break;
1716510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	case 0x91d0206d:
1816510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin		/* Linux/SPARC64 syscall trap. */
19aebfe832b832a865d0f78c33299c65e5caf22d01Dmitry V. Levin		update_personality(tcp, 0);
2016510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin		break;
2116510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	}
22b6ef71b6f487062689f320161ce7c1966dd2ac65Denys Vlasenko
2316510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	tcp->scno = sparc_regs.u_regs[U_REG_G1];
2416510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin	return 1;
2516510517f10757355944ee5c07285ba2a8b61affDmitry V. Levin}
26