xref: /netbsd-src/sys/arch/amd64/include/ptrace.h (revision eb82852fbea0e6d8dccfadbfcf61128ced92d3ac)
1*eb82852fSsimonb /*	$NetBSD: ptrace.h,v 1.23 2023/11/20 03:05:48 simonb Exp $	*/
281918bf8Sfvdl 
381918bf8Sfvdl /*
481918bf8Sfvdl  * Copyright (c) 1993 Christopher G. Demetriou
581918bf8Sfvdl  * All rights reserved.
681918bf8Sfvdl  *
781918bf8Sfvdl  * Redistribution and use in source and binary forms, with or without
881918bf8Sfvdl  * modification, are permitted provided that the following conditions
981918bf8Sfvdl  * are met:
1081918bf8Sfvdl  * 1. Redistributions of source code must retain the above copyright
1181918bf8Sfvdl  *    notice, this list of conditions and the following disclaimer.
1281918bf8Sfvdl  * 2. Redistributions in binary form must reproduce the above copyright
1381918bf8Sfvdl  *    notice, this list of conditions and the following disclaimer in the
1481918bf8Sfvdl  *    documentation and/or other materials provided with the distribution.
1581918bf8Sfvdl  * 3. All advertising materials mentioning features or use of this software
1681918bf8Sfvdl  *    must display the following acknowledgement:
1781918bf8Sfvdl  *      This product includes software developed by Christopher G. Demetriou.
1881918bf8Sfvdl  * 4. The name of the author may not be used to endorse or promote products
1981918bf8Sfvdl  *    derived from this software without specific prior written permission
2081918bf8Sfvdl  *
2181918bf8Sfvdl  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2281918bf8Sfvdl  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2381918bf8Sfvdl  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2481918bf8Sfvdl  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2581918bf8Sfvdl  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2681918bf8Sfvdl  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2781918bf8Sfvdl  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2881918bf8Sfvdl  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2981918bf8Sfvdl  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3081918bf8Sfvdl  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3181918bf8Sfvdl  */
32dbf39764Schristos #ifndef _AMD64_PTRACE_H_
33dbf39764Schristos #define _AMD64_PTRACE_H_
3481918bf8Sfvdl 
35dbf39764Schristos #ifdef __x86_64__
3681918bf8Sfvdl /*
371e413be5Srin  * amd64-dependent ptrace definitions
3881918bf8Sfvdl  */
3981918bf8Sfvdl #define	PT_STEP			(PT_FIRSTMACH + 0)
4081918bf8Sfvdl #define	PT_GETREGS		(PT_FIRSTMACH + 1)
4181918bf8Sfvdl #define	PT_SETREGS		(PT_FIRSTMACH + 2)
4281918bf8Sfvdl #define	PT_GETFPREGS		(PT_FIRSTMACH + 3)
4381918bf8Sfvdl #define	PT_SETFPREGS		(PT_FIRSTMACH + 4)
44988eb7edSkamil #define	PT_GETDBREGS		(PT_FIRSTMACH + 5)
45988eb7edSkamil #define	PT_SETDBREGS		(PT_FIRSTMACH + 6)
4605ffc73cSkamil #define	PT_SETSTEP		(PT_FIRSTMACH + 7)
4705ffc73cSkamil #define	PT_CLEARSTEP		(PT_FIRSTMACH + 8)
48c2ad96ffSmgorny #define	PT_GETXSTATE		(PT_FIRSTMACH + 9)
49c2ad96ffSmgorny #define	PT_SETXSTATE		(PT_FIRSTMACH + 10)
50cad5caa8Srin #ifdef _KERNEL
51cad5caa8Srin /*
52cad5caa8Srin  * Only used internally for COMPAT_NETBSD32
53cad5caa8Srin  */
54cad5caa8Srin #define	PT_GETXMMREGS		(PT_FIRSTMACH + 11)
55cad5caa8Srin #define	PT_SETXMMREGS		(PT_FIRSTMACH + 12)
56cad5caa8Srin #endif
57c2ad96ffSmgorny 
58c2ad96ffSmgorny /* We have machine-dependent process tracing needs. */
59c2ad96ffSmgorny #define	__HAVE_PTRACE_MACHDEP
60209be910Scube 
61052dae8cSnjoly #define PT_MACHDEP_STRINGS \
62052dae8cSnjoly 	"PT_STEP", \
63052dae8cSnjoly 	"PT_GETREGS", \
64052dae8cSnjoly 	"PT_SETREGS", \
65052dae8cSnjoly 	"PT_GETFPREGS", \
66241cf91dSkamil 	"PT_SETFPREGS", \
67988eb7edSkamil 	"PT_GETDBREGS", \
6805ffc73cSkamil 	"PT_SETDBREGS", \
6905ffc73cSkamil 	"PT_SETSTEP", \
70c2ad96ffSmgorny 	"PT_CLEARSTEP", \
71c2ad96ffSmgorny 	"PT_GETXSTATE", \
72c75bb36cSkamil 	"PT_SETXSTATE", \
73c75bb36cSkamil 	"PT_GETXMMREGS", \
74c75bb36cSkamil 	"PT_SETXMMREGS"
75052dae8cSnjoly 
765020ab68Schristos #include <machine/reg.h>
775020ab68Schristos #define PTRACE_REG_PC(r)	(r)->regs[_REG_RIP]
78a8778fd7Skamil #define PTRACE_REG_FP(r)	(r)->regs[_REG_RBP]
795020ab68Schristos #define PTRACE_REG_SET_PC(r, v)	(r)->regs[_REG_RIP] = (v)
805020ab68Schristos #define PTRACE_REG_SP(r)	(r)->regs[_REG_RSP]
815020ab68Schristos #define PTRACE_REG_INTRV(r)	(r)->regs[_REG_RAX]
825020ab68Schristos 
83f5e781bdSkamil #define PTRACE_ILLEGAL_ASM	__asm __volatile ("ud2" : : : "memory")
84f5e781bdSkamil 
85b88569ceSchristos #define PTRACE_BREAKPOINT	((const uint8_t[]) { 0xcc })
8612cbcbd0Skamil #define PTRACE_BREAKPOINT_ASM	__asm __volatile ("int3" : : : "memory")
87b88569ceSchristos #define PTRACE_BREAKPOINT_SIZE	1
88b88569ceSchristos #define PTRACE_BREAKPOINT_ADJ	1
89b88569ceSchristos 
90c2ad96ffSmgorny #ifdef _KERNEL
91c2ad96ffSmgorny 
92c2ad96ffSmgorny /*
93c2ad96ffSmgorny  * These are used in sys_ptrace() to find good ptrace(2) requests.
94c2ad96ffSmgorny  */
95c2ad96ffSmgorny #define	PTRACE_MACHDEP_REQUEST_CASES					\
96c2ad96ffSmgorny 	case PT_GETXSTATE:						\
97cad5caa8Srin 	case PT_SETXSTATE:						\
98cad5caa8Srin 	case PT_GETXMMREGS:						\
99cad5caa8Srin 	case PT_SETXMMREGS:
100c2ad96ffSmgorny 
101c2ad96ffSmgorny int process_machdep_doxstate(struct lwp *, struct lwp *, struct uio *);
1025c7b5181Srin int process_machdep_validfpu(struct proc *);
103c2ad96ffSmgorny 
1044660020bSmaxv /*
1054660020bSmaxv  * The fpregs structure contains an fxsave area, which must have 16-byte
1064660020bSmaxv  * alignment.
1074660020bSmaxv  */
1084660020bSmaxv #define PTRACE_REGS_ALIGN __aligned(16)
1094660020bSmaxv 
110cad5caa8Srin #include <sys/module_hook.h>
111cad5caa8Srin MODULE_HOOK(netbsd32_process_doxmmregs_hook, int,
112cad5caa8Srin     (struct lwp *, struct lwp *, void *, bool));
113cad5caa8Srin 
11477791248Smgorny #ifdef EXEC_ELF32
11577791248Smgorny #include <machine/netbsd32_machdep.h>
11677791248Smgorny #endif
11777791248Smgorny #define PT64_GETXSTATE		PT_GETXSTATE
11877791248Smgorny #define COREDUMP_MACHDEP_LWP_NOTES(l, ns, name)				\
11977791248Smgorny {									\
120*eb82852fSsimonb 	struct xstate xstate;	/* XXX FIXME big stack object */	\
12177791248Smgorny 	memset(&xstate, 0, sizeof(xstate));				\
12277791248Smgorny 	if (!process_read_xstate(l, &xstate))				\
12377791248Smgorny 	{								\
12477791248Smgorny 		ELFNAMEEND(coredump_savenote)(ns,			\
12577791248Smgorny 		    CONCAT(CONCAT(PT, ELFSIZE), _GETXSTATE), name,	\
12677791248Smgorny 		    &xstate, sizeof(xstate));				\
12777791248Smgorny 	}								\
12877791248Smgorny }
12977791248Smgorny 
130c2ad96ffSmgorny #endif /* _KERNEL */
131c2ad96ffSmgorny 
132209be910Scube #ifdef _KERNEL_OPT
133209be910Scube #include "opt_compat_netbsd32.h"
134209be910Scube 
135209be910Scube #ifdef COMPAT_NETBSD32
136209be910Scube #include <machine/netbsd32_machdep.h>
137209be910Scube 
138209be910Scube #define process_read_regs32	netbsd32_process_read_regs
139209be910Scube #define process_read_fpregs32	netbsd32_process_read_fpregs
140988eb7edSkamil #define process_read_dbregs32	netbsd32_process_read_dbregs
141209be910Scube 
142f2ef31cbSskrll #define process_write_regs32	netbsd32_process_write_regs
143f2ef31cbSskrll #define process_write_fpregs32	netbsd32_process_write_fpregs
144988eb7edSkamil #define process_write_dbregs32	netbsd32_process_write_dbregs
145241cf91dSkamil 
146209be910Scube #define process_reg32		struct reg32
147209be910Scube #define process_fpreg32		struct fpreg32
148988eb7edSkamil #define process_dbreg32		struct dbreg32
14901cfb8b6Smgorny 
15001cfb8b6Smgorny #define PTRACE_TRANSLATE_REQUEST32(x) netbsd32_ptrace_translate_request(x)
151dbf39764Schristos #endif	/* COMPAT_NETBSD32 */
152dbf39764Schristos #endif	/* _KERNEL_OPT */
153dbf39764Schristos 
154dbf39764Schristos #else	/* !__x86_64__ */
155dbf39764Schristos 
156dbf39764Schristos #include <i386/ptrace.h>
157dbf39764Schristos 
158dbf39764Schristos #endif	/* __x86_64__ */
159dbf39764Schristos 
160dbf39764Schristos #endif	/* _AMD64_PTRACE_H_ */
161