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