Home | History | Annotate | Download | only in common
      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