xref: /illumos-gate/usr/src/lib/libproc/common/Pisadep.h (revision 355b4669e025ff377602b6fc7caaf30dbc218371)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_PISADEP_H
28 #define	_PISADEP_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * Internal ISA-dependent functions.
38  *
39  * Note that some ISA-dependent functions are exposed to applications, and found
40  * in libproc.h:
41  *
42  * 	Ppltdest()
43  * 	Pissyscall_prev()
44  * 	Pstack_iter()
45  */
46 
47 /*
48  * ISA dependent function to determine if the instruction at the given address
49  * is a syscall instruction.  On x86, we have multiple system call instructions.
50  * this function returns 1 if there is a system call at the given address, 2 if
51  * there is a less preferred system call, and 0 if there is no system call
52  * there.
53  */
54 extern int Pissyscall(struct ps_prochandle *, uintptr_t);
55 /*
56  * Works the same way as Pissyscall(), except operates on an in-memory buffer.
57  */
58 extern int Pissyscall_text(struct ps_prochandle *, const void *buf,
59     size_t buflen);
60 
61 #if defined(__amd64)
62 /* amd64 stack doubleword aligned, unaligned in 32-bit mode  */
63 #define	PSTACK_ALIGN32(sp)	((sp) & ~(2 * sizeof (int64_t) - 1))
64 #define	PSTACK_ALIGN64(sp)	(sp)
65 #elif defined(__i386)
66 /* i386 stack is unaligned */
67 #define	PSTACK_ALIGN32(sp)	(sp)
68 #define	PSTACK_ALIGN64(sp)	ALIGN32(sp)
69 #elif defined(__sparc)
70 /* sparc stack is doubleword aligned for 64-bit values */
71 #define	PSTACK_ALIGN32(sp)	((sp) & ~(2 * sizeof (int32_t) - 1))
72 #define	PSTACK_ALIGN64(sp)	((sp) & ~(2 * sizeof (int64_t) - 1))
73 #else
74 #error	Unknown ISA
75 #endif
76 
77 /*
78  * Given an argument count, stack pointer, and syscall index, sets up the stack
79  * and appropriate registers.  The stack pointer should be the top of the stack
80  * area, after any space reserved for arguments passed by reference.  Returns a
81  * pointer which is later passed to Psyscall_copyargs().
82  */
83 extern uintptr_t Psyscall_setup(struct ps_prochandle *, int, int, uintptr_t);
84 
85 /*
86  * Copies all arguments out to the stack once we're stopped before the syscall.
87  */
88 extern int Psyscall_copyinargs(struct ps_prochandle *, int, argdes_t *,
89     uintptr_t);
90 
91 /*
92  * Copies out arguments to their original values.
93  */
94 extern int Psyscall_copyoutargs(struct ps_prochandle *, int, argdes_t *,
95     uintptr_t);
96 
97 #ifdef	__cplusplus
98 }
99 #endif
100 
101 #endif	/* _PISADEP_H */
102