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
33extern "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 */
54extern int Pissyscall(struct ps_prochandle *, uintptr_t);
55/*
56 * Works the same way as Pissyscall(), except operates on an in-memory buffer.
57 */
58extern 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 */
83extern 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 */
88extern int Psyscall_copyinargs(struct ps_prochandle *, int, argdes_t *,
89    uintptr_t);
90
91/*
92 * Copies out arguments to their original values.
93 */
94extern 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