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 _SYS_STACK_H 28 #define _SYS_STACK_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #if !defined(_ASM) 33 34 #include <sys/types.h> 35 36 #endif 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 /* 43 * A stack frame looks like: 44 * 45 * %fp->| | 46 * |-------------------------------| 47 * | Locals, temps, saved floats | 48 * |-------------------------------| 49 * | outgoing parameters past 6 | 50 * |-------------------------------|-\ 51 * | 6 words for callee to dump | | 52 * | register arguments | | 53 * |-------------------------------| > minimum stack frame 54 * | One word struct-ret address | | 55 * |-------------------------------| | 56 * | 16 words to save IN and | | 57 * %sp->| LOCAL register on overflow | | 58 * |-------------------------------|-/ 59 */ 60 61 /* 62 * Constants defining a 32-bit stack frame. 63 */ 64 #define WINDOWSIZE32 (16*4) /* size of window save area */ 65 #define ARGPUSHSIZE32 (6*4) /* size of arg dump area */ 66 #define ARGPUSH32 (WINDOWSIZE32 + 4) /* arg dump area offset */ 67 #define MINFRAME32 (WINDOWSIZE32 + ARGPUSHSIZE32 + 4) /* min frame */ 68 69 #define STACK_GROWTH_DOWN /* stacks grow from high to low addresses */ 70 71 /* 72 * Stack alignment macros. 73 */ 74 #define STACK_ALIGN32 8 75 #define STACK_ENTRY_ALIGN32 8 76 #define SA32(X) (((X)+(STACK_ALIGN32-1)) & ~(STACK_ALIGN32-1)) 77 78 #if defined(__sparcv9) 79 /* 80 * The 64-bit C ABI uses a stack frame that looks like: 81 * 82 * | | 83 * |-------------------------------| 84 * | Locals, temps, saved floats | 85 * |-------------------------------| 86 * | outgoing parameters past 6 | 87 * |-------------------------------|-\ 88 * | outgoing parameters thru 6 | | 89 * |-------------------------------| > minimum stack frame 90 * | 16 xwords to save IN and | | 91 * | LOCAL register on overflow | | 92 * |-------------------------------|-/-\ 93 * | | | 94 * | | > v9 abi bias 95 * | | | 96 * %sp->|-------------------------------|---/ 97 */ 98 99 /* 100 * Constants defining a stack frame. 101 */ 102 #define WINDOWSIZE64 (16*8) /* size of window save area */ 103 #define ARGPUSHSIZE64 (6*8) /* size of arg dump area */ 104 #define MINFRAME64 (WINDOWSIZE64 + 48) /* min frame */ 105 #define ARGPUSH64 (WINDOWSIZE64) /* arg dump area offset */ 106 #define V9BIAS64 (2048-1) /* v9 abi stack bias */ 107 108 #define STACK_ALIGN64 16 109 #define STACK_ENTRY_ALIGN64 16 110 #define SA64(X) (((X)+(STACK_ALIGN64-1)) & ~(STACK_ALIGN64-1)) 111 112 #define IS_V9STACK(x) ((((uintptr_t)(x) + V9BIAS64) & \ 113 (STACK_ALIGN64-1)) == 0) 114 115 #define WINDOWSIZE WINDOWSIZE64 116 #define ARGPUSHSIZE ARGPUSHSIZE64 117 #define ARGPUSH ARGPUSH64 118 #define MINFRAME MINFRAME64 119 #define STACK_ALIGN STACK_ALIGN64 120 #define STACK_ENTRY_ALIGN STACK_ENTRY_ALIGN64 121 #define STACK_BIAS V9BIAS64 122 #define SA(x) SA64(x) 123 124 #else 125 126 #define WINDOWSIZE WINDOWSIZE32 127 #define ARGPUSHSIZE ARGPUSHSIZE32 128 #define ARGPUSH ARGPUSH32 129 #define MINFRAME MINFRAME32 130 #define STACK_ALIGN STACK_ALIGN32 131 #define STACK_ENTRY_ALIGN STACK_ENTRY_ALIGN32 132 #define STACK_BIAS 0 133 #define SA(x) SA32(x) 134 #define STACK_V9BIAS64 (2048-1) /* v9 abi stack bias */ 135 136 #endif /* __sparcv9 */ 137 138 #if defined(_KERNEL) && !defined(_ASM) 139 140 #if defined(DEBUG) 141 #if STACK_ALIGN == 8 142 #define ASSERT_STACK_ALIGNED() \ 143 { \ 144 uint64_t __tmp; \ 145 ASSERT((((uintptr_t)&__tmp) & (STACK_ALIGN - 1)) == 0); \ 146 } 147 #elif (STACK_ALIGN == 16) && (_LONG_DOUBLE_ALIGNMENT == 16) 148 #define ASSERT_STACK_ALIGNED() \ 149 { \ 150 long double __tmp; \ 151 ASSERT((((uintptr_t)&__tmp) & (STACK_ALIGN - 1)) == 0); \ 152 } 153 #endif 154 #else /* DEBUG */ 155 #define ASSERT_STACK_ALIGNED() 156 #endif /* DEBUG */ 157 158 struct regs; 159 160 void flush_windows(void); 161 void flush_user_windows(void); 162 int flush_user_windows_to_stack(caddr_t *); 163 void trash_user_windows(void); 164 void traceregs(struct regs *); 165 void traceback(caddr_t); 166 167 #endif /* defined(_KERNEL) && !defined(_ASM) */ 168 169 #ifdef __cplusplus 170 } 171 #endif 172 173 #endif /* _SYS_STACK_H */ 174