17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 23*f0089e39SRichard Lowe * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #ifndef _SYS_STACK_H 287c478bd9Sstevel@tonic-gate #define _SYS_STACK_H 297c478bd9Sstevel@tonic-gate 30*f0089e39SRichard Lowe #if !defined(_ASM) 317c478bd9Sstevel@tonic-gate 32*f0089e39SRichard Lowe #include <sys/types.h> 337c478bd9Sstevel@tonic-gate 34*f0089e39SRichard Lowe #endif 35*f0089e39SRichard Lowe 36*f0089e39SRichard Lowe #ifdef __cplusplus 37*f0089e39SRichard Lowe extern "C" { 38*f0089e39SRichard Lowe #endif 39*f0089e39SRichard Lowe 40*f0089e39SRichard Lowe /* 41*f0089e39SRichard Lowe * In the x86 world, a stack frame looks like this: 42*f0089e39SRichard Lowe * 43*f0089e39SRichard Lowe * |--------------------------| 44*f0089e39SRichard Lowe * 4n+8(%ebp) ->| argument word n | 45*f0089e39SRichard Lowe * | ... | (Previous frame) 46*f0089e39SRichard Lowe * 8(%ebp) ->| argument word 0 | 47*f0089e39SRichard Lowe * |--------------------------|-------------------- 48*f0089e39SRichard Lowe * 4(%ebp) ->| return address | 49*f0089e39SRichard Lowe * |--------------------------| 50*f0089e39SRichard Lowe * 0(%ebp) ->| previous %ebp (optional) | 51*f0089e39SRichard Lowe * |--------------------------| 52*f0089e39SRichard Lowe * -4(%ebp) ->| unspecified | (Current frame) 53*f0089e39SRichard Lowe * | ... | 54*f0089e39SRichard Lowe * 0(%esp) ->| variable size | 55*f0089e39SRichard Lowe * |--------------------------| 56*f0089e39SRichard Lowe */ 57*f0089e39SRichard Lowe 58*f0089e39SRichard Lowe /* 59*f0089e39SRichard Lowe * Stack alignment macros. 60*f0089e39SRichard Lowe */ 61*f0089e39SRichard Lowe 62*f0089e39SRichard Lowe #define STACK_ALIGN32 4 63*f0089e39SRichard Lowe #define STACK_ENTRY_ALIGN32 4 64*f0089e39SRichard Lowe #define STACK_BIAS32 0 65*f0089e39SRichard Lowe #define SA32(x) (((x)+(STACK_ALIGN32-1)) & ~(STACK_ALIGN32-1)) 66*f0089e39SRichard Lowe #define STACK_RESERVE32 0 67*f0089e39SRichard Lowe #define MINFRAME32 0 68*f0089e39SRichard Lowe 69*f0089e39SRichard Lowe #if defined(__amd64) 70*f0089e39SRichard Lowe 71*f0089e39SRichard Lowe /* 72*f0089e39SRichard Lowe * In the amd64 world, a stack frame looks like this: 73*f0089e39SRichard Lowe * 74*f0089e39SRichard Lowe * |--------------------------| 75*f0089e39SRichard Lowe * 8n+16(%rbp)->| argument word n | 76*f0089e39SRichard Lowe * | ... | (Previous frame) 77*f0089e39SRichard Lowe * 16(%rbp) ->| argument word 0 | 78*f0089e39SRichard Lowe * |--------------------------|-------------------- 79*f0089e39SRichard Lowe * 8(%rbp) ->| return address | 80*f0089e39SRichard Lowe * |--------------------------| 81*f0089e39SRichard Lowe * 0(%rbp) ->| previous %rbp | 82*f0089e39SRichard Lowe * |--------------------------| 83*f0089e39SRichard Lowe * -8(%rbp) ->| unspecified | (Current frame) 84*f0089e39SRichard Lowe * | ... | 85*f0089e39SRichard Lowe * 0(%rsp) ->| variable size | 86*f0089e39SRichard Lowe * |--------------------------| 87*f0089e39SRichard Lowe * -128(%rsp) ->| reserved for function | 88*f0089e39SRichard Lowe * |--------------------------| 89*f0089e39SRichard Lowe * 90*f0089e39SRichard Lowe * The end of the input argument area must be aligned on a 16-byte 91*f0089e39SRichard Lowe * boundary; i.e. (%rsp - 8) % 16 == 0 at function entry. 92*f0089e39SRichard Lowe * 93*f0089e39SRichard Lowe * The 128-byte location beyond %rsp is considered to be reserved for 94*f0089e39SRichard Lowe * functions and is NOT modified by signal handlers. It can be used 95*f0089e39SRichard Lowe * to store temporary data that is not needed across function calls. 96*f0089e39SRichard Lowe */ 97*f0089e39SRichard Lowe 98*f0089e39SRichard Lowe /* 99*f0089e39SRichard Lowe * Stack alignment macros. 100*f0089e39SRichard Lowe */ 101*f0089e39SRichard Lowe 102*f0089e39SRichard Lowe #define STACK_ALIGN64 16 103*f0089e39SRichard Lowe #define STACK_ENTRY_ALIGN64 8 104*f0089e39SRichard Lowe #define STACK_BIAS64 0 105*f0089e39SRichard Lowe #define SA64(x) (((x)+(STACK_ALIGN64-1)) & ~(STACK_ALIGN64-1)) 106*f0089e39SRichard Lowe #define STACK_RESERVE64 128 107*f0089e39SRichard Lowe #define MINFRAME64 0 108*f0089e39SRichard Lowe 109*f0089e39SRichard Lowe #define STACK_ALIGN STACK_ALIGN64 110*f0089e39SRichard Lowe #define STACK_ENTRY_ALIGN STACK_ENTRY_ALIGN64 111*f0089e39SRichard Lowe #define STACK_BIAS STACK_BIAS64 112*f0089e39SRichard Lowe #define SA(x) SA64(x) 113*f0089e39SRichard Lowe #define STACK_RESERVE STACK_RESERVE64 114*f0089e39SRichard Lowe #define MINFRAME MINFRAME64 115*f0089e39SRichard Lowe 116*f0089e39SRichard Lowe #elif defined(__i386) 117*f0089e39SRichard Lowe 118*f0089e39SRichard Lowe #define STACK_ALIGN STACK_ALIGN32 119*f0089e39SRichard Lowe #define STACK_ENTRY_ALIGN STACK_ENTRY_ALIGN32 120*f0089e39SRichard Lowe #define STACK_BIAS STACK_BIAS32 121*f0089e39SRichard Lowe #define SA(x) SA32(x) 122*f0089e39SRichard Lowe #define STACK_RESERVE STACK_RESERVE32 123*f0089e39SRichard Lowe #define MINFRAME MINFRAME32 124*f0089e39SRichard Lowe 125*f0089e39SRichard Lowe #endif /* __i386 */ 126*f0089e39SRichard Lowe 127*f0089e39SRichard Lowe #if defined(_KERNEL) && !defined(_ASM) 128*f0089e39SRichard Lowe 129*f0089e39SRichard Lowe #if defined(DEBUG) 130*f0089e39SRichard Lowe #if STACK_ALIGN == 4 131*f0089e39SRichard Lowe #define ASSERT_STACK_ALIGNED() \ 132*f0089e39SRichard Lowe { \ 133*f0089e39SRichard Lowe uint32_t __tmp; \ 134*f0089e39SRichard Lowe ASSERT((((uintptr_t)&__tmp) & (STACK_ALIGN - 1)) == 0); \ 135*f0089e39SRichard Lowe } 136*f0089e39SRichard Lowe #elif (STACK_ALIGN == 16) && (_LONG_DOUBLE_ALIGNMENT == 16) 137*f0089e39SRichard Lowe #define ASSERT_STACK_ALIGNED() \ 138*f0089e39SRichard Lowe { \ 139*f0089e39SRichard Lowe long double __tmp; \ 140*f0089e39SRichard Lowe ASSERT((((uintptr_t)&__tmp) & (STACK_ALIGN - 1)) == 0); \ 141*f0089e39SRichard Lowe } 142*f0089e39SRichard Lowe #endif 143*f0089e39SRichard Lowe #else /* DEBUG */ 144*f0089e39SRichard Lowe #define ASSERT_STACK_ALIGNED() 145*f0089e39SRichard Lowe #endif /* DEBUG */ 146*f0089e39SRichard Lowe 147*f0089e39SRichard Lowe struct regs; 148*f0089e39SRichard Lowe 149*f0089e39SRichard Lowe void traceregs(struct regs *); 150*f0089e39SRichard Lowe void traceback(caddr_t); 151*f0089e39SRichard Lowe 152*f0089e39SRichard Lowe #endif /* defined(_KERNEL) && !defined(_ASM) */ 153*f0089e39SRichard Lowe 154*f0089e39SRichard Lowe #define STACK_GROWTH_DOWN /* stacks grow from high to low addresses */ 1557c478bd9Sstevel@tonic-gate 156*f0089e39SRichard Lowe #ifdef __cplusplus 157*f0089e39SRichard Lowe } 1587c478bd9Sstevel@tonic-gate #endif 1597c478bd9Sstevel@tonic-gate 1607c478bd9Sstevel@tonic-gate #endif /* _SYS_STACK_H */ 161