1/* $NetBSD: ptrace.S,v 1.6 2011/01/16 02:43:10 matt Exp $ */ 2 3#include "SYS.h" 4#include "assym.h" 5 6#if defined(LIBC_SCCS) && !defined(lint) 7__RCSID("$NetBSD: ptrace.S,v 1.6 2011/01/16 02:43:10 matt Exp $") 8#endif /* LIBC_SCCS && !lint */ 9 10#define XCALLFRAMELEN ((((2+5)*SZREG) + CALLFRAMELEN - 1) & -CALLFRAMELEN) 11#define XCALLFRAME_DATA (XCALLFRAMELEN - 1*SZREG) 12#define XCALLFRAME_ADDR (XCALLFRAMELEN - 2*SZREG) 13#define XCALLFRAME_PID (XCALLFRAMELEN - 3*SZREG) 14#define XCALLFRAME_REQUEST (XCALLFRAMELEN - 4*SZREG) 15#define XCALLFRAME_R30 (XCALLFRAMELEN - 5*SZREG) 16 17ENTRY(ptrace) 18#ifdef _REENTRANT 19 mflr %r0 20 stw %r0,CALLFRAME_LR(%r1) 21 stwu %r1,-XCALLFRAMELEN(%r1) 22 stw %r3,XCALLFRAME_REQUEST(%r1) 23 stw %r4,XCALLFRAME_PID(%r1) 24 stw %r5,XCALLFRAME_ADDR(%r1) 25 stw %r6,XCALLFRAME_DATA(%r1) 26#ifdef PIC 27 stw %r30,XCALLFRAME_R30(%r1) 28 PIC_TOCSETUP(ptrace, %r30) 29#endif 30 31 bl PIC_PLT(_C_LABEL(__errno)) 32 li %r7,0 33 stw %r7,0(%r3) 34 35#ifdef PIC 36 lwz %r30,XCALLFRAME_R30(%r1) 37#endif 38 lwz %r6,XCALLFRAME_DATA(%r1) 39 lwz %r4,XCALLFRAME_PID(%r1) 40 lwz %r5,XCALLFRAME_ADDR(%r1) 41 lwz %r3,XCALLFRAME_REQUEST(%r1) 42 addi %r1,%r1,XCALLFRAMELEN 43 lwz %r0,CALLFRAME_LR(%r1) 44 mtlr %r0 45#else 46#ifdef PIC 47 mflr %r0 48 PIC_GOTSETUP(%r7) 49 lwz %r7,_C_LABEL(errno)@got(%r7) 50 li %r8,0 51 stw %r8,0(%r7) 52 mtlr 0 53#else 54 lis %r7,_C_LABEL(errno)@ha 55 li %r8,0 56 stw %r8,_C_LABEL(errno)@l(%r7) 57#endif /* PIC */ 58#endif /* _REENTRANT */ 59 _DOSYSCALL(ptrace) 60 bnslr 61 b _C_LABEL(__cerror) 62