1ba2be530Sab196087 /* 2ba2be530Sab196087 * CDDL HEADER START 3ba2be530Sab196087 * 4ba2be530Sab196087 * The contents of this file are subject to the terms of the 5ba2be530Sab196087 * Common Development and Distribution License (the "License"). 6ba2be530Sab196087 * You may not use this file except in compliance with the License. 7ba2be530Sab196087 * 8ba2be530Sab196087 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9ba2be530Sab196087 * or http://www.opensolaris.org/os/licensing. 10ba2be530Sab196087 * See the License for the specific language governing permissions 11ba2be530Sab196087 * and limitations under the License. 12ba2be530Sab196087 * 13ba2be530Sab196087 * When distributing Covered Code, include this CDDL HEADER in each 14ba2be530Sab196087 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15ba2be530Sab196087 * If applicable, add the following below this CDDL HEADER, with the 16ba2be530Sab196087 * fields enclosed by brackets "[]" replaced with your own identifying 17ba2be530Sab196087 * information: Portions Copyright [yyyy] [name of copyright owner] 18ba2be530Sab196087 * 19ba2be530Sab196087 * CDDL HEADER END 20ba2be530Sab196087 */ 21ba2be530Sab196087 22ba2be530Sab196087 /* 23ba2be530Sab196087 * Copyright (c) 1988 AT&T 24ba2be530Sab196087 * All Rights Reserved 25ba2be530Sab196087 * 26*94c044f4SRod Evans * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. 27ba2be530Sab196087 * 28ba2be530Sab196087 * Global include file for all sgs SPARC machine dependent macros, constants 29ba2be530Sab196087 * and declarations. 30ba2be530Sab196087 */ 31ba2be530Sab196087 32ba2be530Sab196087 #ifndef _MACHDEP_SPARC_H 33ba2be530Sab196087 #define _MACHDEP_SPARC_H 34ba2be530Sab196087 35ba2be530Sab196087 #include <link.h> 36ba2be530Sab196087 #include <sys/machelf.h> 37ba2be530Sab196087 38ba2be530Sab196087 #ifdef __cplusplus 39ba2be530Sab196087 extern "C" { 40ba2be530Sab196087 #endif 41ba2be530Sab196087 42ba2be530Sab196087 /* 43ba2be530Sab196087 * Elf header information. 44ba2be530Sab196087 */ 45ba2be530Sab196087 #define M_MACH_32 EM_SPARC 46ba2be530Sab196087 #define M_MACH_64 EM_SPARCV9 47ba2be530Sab196087 48ba2be530Sab196087 #ifdef _ELF64 49ba2be530Sab196087 #define M_MACH EM_SPARCV9 50ba2be530Sab196087 #define M_CLASS ELFCLASS64 51ba2be530Sab196087 #else 52ba2be530Sab196087 #define M_MACH EM_SPARC 53ba2be530Sab196087 #define M_CLASS ELFCLASS32 54ba2be530Sab196087 #endif 55ba2be530Sab196087 #define M_MACHPLUS EM_SPARC32PLUS 56ba2be530Sab196087 #define M_DATA ELFDATA2MSB 57ba2be530Sab196087 #define M_FLAGSPLUS EF_SPARC_32PLUS 58ba2be530Sab196087 59ba2be530Sab196087 /* 60ba2be530Sab196087 * Page boundary Macros: truncate to previous page boundary and round to 61ba2be530Sab196087 * next page boundary (refer to generic macros in ../sgs.h also). 62ba2be530Sab196087 */ 63ba2be530Sab196087 #define M_PTRUNC(X) ((X) & ~(syspagsz - 1)) 64ba2be530Sab196087 #define M_PROUND(X) (((X) + syspagsz - 1) & ~(syspagsz - 1)) 65ba2be530Sab196087 66ba2be530Sab196087 /* 67ba2be530Sab196087 * Segment boundary macros: truncate to previous segment boundary and round 68ba2be530Sab196087 * to next page boundary. 69ba2be530Sab196087 */ 70ba2be530Sab196087 #ifndef M_SEGSIZE 71ba2be530Sab196087 #define M_SEGSIZE ELF_SPARC_MAXPGSZ 72ba2be530Sab196087 #endif 73ba2be530Sab196087 #define M_STRUNC(X) ((X) & ~(M_SEGSIZE - 1)) 74ba2be530Sab196087 #define M_SROUND(X) (((X) + M_SEGSIZE - 1) & ~(M_SEGSIZE - 1)) 75ba2be530Sab196087 7656deab07SRod Evans /* 7756deab07SRod Evans * Relocation type macro. 7856deab07SRod Evans */ 7956deab07SRod Evans #define M_RELOC Rela 80ba2be530Sab196087 81ba2be530Sab196087 /* 82ba2be530Sab196087 * TLS static segments must be rounded to the following requirements, 83ba2be530Sab196087 * due to libthread stack allocation. 84ba2be530Sab196087 */ 85ba2be530Sab196087 #if defined(_ELF64) 86ba2be530Sab196087 #define M_TLSSTATALIGN 0x10 87ba2be530Sab196087 #else 88ba2be530Sab196087 #define M_TLSSTATALIGN 0x08 89ba2be530Sab196087 #endif 90ba2be530Sab196087 91ba2be530Sab196087 /* 92ba2be530Sab196087 * Instruction encodings. 93ba2be530Sab196087 */ 94ba2be530Sab196087 #define M_SAVESP64 0x9de3bfc0 /* save %sp, -64, %sp */ 95ba2be530Sab196087 #define M_CALL 0x40000000 96ba2be530Sab196087 #define M_JMPL 0x81c06000 /* jmpl %g1 + simm13, %g0 */ 97ba2be530Sab196087 #define M_SETHIG0 0x01000000 /* sethi %hi(val), %g0 */ 98ba2be530Sab196087 #define M_SETHIG1 0x03000000 /* sethi %hi(val), %g1 */ 99ba2be530Sab196087 #define M_STO7G1IM 0xde206000 /* st %o7,[%g1 + %lo(val)] */ 100ba2be530Sab196087 #define M_SUBFPSPG1 0x8227800e /* sub %fp,%sp,%g1 */ 101ba2be530Sab196087 #define M_NOP 0x01000000 /* sethi 0, %o0 (nop) */ 102ba2be530Sab196087 #define M_BA_A 0x30800000 /* ba,a */ 103ba2be530Sab196087 #define M_BA_A_PT 0x30480000 /* ba,a %icc, <dst> */ 104ba2be530Sab196087 #define M_MOVO7TOG1 0x8210000f /* mov %o7, %g1 */ 105ba2be530Sab196087 #define M_MOVO7TOG5 0x8a10000f /* mov %o7, %g5 */ 106ba2be530Sab196087 #define M_MOVI7TOG1 0x8210001f /* mov %i7, %g1 */ 107ba2be530Sab196087 #define M_BA_A_XCC 0x30680000 /* ba,a %xcc */ 108ba2be530Sab196087 #define M_JMPL_G5G0 0x81c16000 /* jmpl %g5 + 0, %g0 */ 109ba2be530Sab196087 #define M_XNOR_G5G1 0x82396000 /* xnor %g5, 0, %g1 */ 110ba2be530Sab196087 111ba2be530Sab196087 112ba2be530Sab196087 #define M_BIND_ADJ 4 /* adjustment for end of */ 113ba2be530Sab196087 /* elf_rtbndr() address */ 114ba2be530Sab196087 115ba2be530Sab196087 /* transition flags for got sizing */ 116ba2be530Sab196087 #define M_GOT_LARGE (Sword)(-M_GOT_MAXSMALL - 1) 117ba2be530Sab196087 #define M_GOT_SMALL (Sword)(-M_GOT_MAXSMALL - 2) 118ba2be530Sab196087 #define M_GOT_MIXED (Sword)(-M_GOT_MAXSMALL - 3) 119ba2be530Sab196087 120ba2be530Sab196087 /* 121ba2be530Sab196087 * Other machine dependent entities 122ba2be530Sab196087 */ 123ba2be530Sab196087 #ifdef _ELF64 124ba2be530Sab196087 #define M_SEGM_ALIGN ELF_SPARCV9_MAXPGSZ 125ba2be530Sab196087 /* 126bb3b4f6cSRod Evans * Put default 64-bit programs above 4 gigabytes to help insure correctness, so 127bb3b4f6cSRod Evans * that any 64-bit programs that truncate pointers will fault now instead of 128bb3b4f6cSRod Evans * corrupting itself and dying mysteriously. 64-bit programs can also be 129bb3b4f6cSRod Evans * restricted to a 32-bit address space (SF1_SUNW_ADDR32), and these programs 130bb3b4f6cSRod Evans * provide an alternative origin. 131ba2be530Sab196087 */ 132bb3b4f6cSRod Evans #define M_SEGM_ORIGIN (Addr)0x100000000ULL /* default 1st segment origin */ 133bb3b4f6cSRod Evans #define M_SEGM_AORIGIN (Addr)0x100000ULL /* alternative 1st segment */ 134bb3b4f6cSRod Evans /* origin */ 135ba2be530Sab196087 #else 136ba2be530Sab196087 #define M_SEGM_ALIGN ELF_SPARC_MAXPGSZ 137bb3b4f6cSRod Evans #define M_SEGM_ORIGIN (Addr)0x10000 /* default 1st segment origin */ 138bb3b4f6cSRod Evans #define M_SEGM_AORIGIN M_SEGM_ORIGIN /* alternative 1st segment */ 139bb3b4f6cSRod Evans /* origin */ 140ba2be530Sab196087 #endif 141ba2be530Sab196087 142ba2be530Sab196087 /* 143ba2be530Sab196087 * Make common relocation information transparent to the common code 144ba2be530Sab196087 */ 145ba2be530Sab196087 #define M_REL_DT_TYPE DT_RELA /* .dynamic entry */ 146ba2be530Sab196087 #define M_REL_DT_SIZE DT_RELASZ /* .dynamic entry */ 147ba2be530Sab196087 #define M_REL_DT_ENT DT_RELAENT /* .dynamic entry */ 148ba2be530Sab196087 #define M_REL_DT_COUNT DT_RELACOUNT /* .dynamic entry */ 149ba2be530Sab196087 #define M_REL_SHT_TYPE SHT_RELA /* section header type */ 150ba2be530Sab196087 #define M_REL_ELF_TYPE ELF_T_RELA /* data buffer type */ 151ba2be530Sab196087 152ba2be530Sab196087 /* 153ba2be530Sab196087 * Make common relocation types transparent to the common code 154ba2be530Sab196087 */ 155ba2be530Sab196087 #define M_R_NONE R_SPARC_NONE 156ba2be530Sab196087 #define M_R_GLOB_DAT R_SPARC_GLOB_DAT 157ba2be530Sab196087 #define M_R_COPY R_SPARC_COPY 158ba2be530Sab196087 #define M_R_RELATIVE R_SPARC_RELATIVE 159ba2be530Sab196087 #define M_R_JMP_SLOT R_SPARC_JMP_SLOT 160ba2be530Sab196087 #define M_R_REGISTER R_SPARC_REGISTER 161ba2be530Sab196087 #define M_R_FPTR R_SPARC_NONE 162ba2be530Sab196087 #define M_R_NUM R_SPARC_NUM 163ba2be530Sab196087 164ba2be530Sab196087 #ifdef _ELF64 165ba2be530Sab196087 #define M_R_ARRAYADDR R_SPARC_64 166ba2be530Sab196087 #define M_R_DTPMOD R_SPARC_TLS_DTPMOD64 167ba2be530Sab196087 #define M_R_DTPOFF R_SPARC_TLS_DTPOFF64 168ba2be530Sab196087 #define M_R_TPOFF R_SPARC_TLS_TPOFF64 169ba2be530Sab196087 #else /* _ELF32 */ 170ba2be530Sab196087 #define M_R_ARRAYADDR R_SPARC_32 171ba2be530Sab196087 #define M_R_DTPMOD R_SPARC_TLS_DTPMOD32 172ba2be530Sab196087 #define M_R_DTPOFF R_SPARC_TLS_DTPOFF32 173ba2be530Sab196087 #define M_R_TPOFF R_SPARC_TLS_TPOFF32 174ba2be530Sab196087 #endif /* _ELF64 */ 175ba2be530Sab196087 176ba2be530Sab196087 177ba2be530Sab196087 /* 178ba2be530Sab196087 * Make register symbols transparent to common code 179ba2be530Sab196087 */ 180ba2be530Sab196087 #define M_DT_REGISTER DT_SPARC_REGISTER 181ba2be530Sab196087 182ba2be530Sab196087 /* 183ba2be530Sab196087 * Make plt section information transparent to the common code. 184ba2be530Sab196087 */ 185ba2be530Sab196087 #define M_PLT_SHF_FLAGS (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR) 186ba2be530Sab196087 187ba2be530Sab196087 /* 18869112eddSAli Bahrami * Make default data segment and stack flags transparent to the common code. 189ba2be530Sab196087 */ 190ba2be530Sab196087 #define M_DATASEG_PERM (PF_R | PF_W | PF_X) 19169112eddSAli Bahrami #ifdef _ELF64 19269112eddSAli Bahrami #define M_STACK_PERM (PF_R | PF_W) 19369112eddSAli Bahrami #else 19469112eddSAli Bahrami #define M_STACK_PERM (PF_R | PF_W | PF_X) 19569112eddSAli Bahrami #endif 19669112eddSAli Bahrami 197ba2be530Sab196087 /* 198ba2be530Sab196087 * Define a set of identifies for special sections. These allow the sections 199ba2be530Sab196087 * to be ordered within the output file image. These values should be 200ba2be530Sab196087 * maintained consistently, where appropriate, in each platform specific header 201ba2be530Sab196087 * file. 202ba2be530Sab196087 * 203*94c044f4SRod Evans * - null identifies that this section does not need to be added to the 204ba2be530Sab196087 * output image (ie. shared object sections or sections we're going to 205ba2be530Sab196087 * recreate (sym tables, string tables, relocations, etc.)). 206ba2be530Sab196087 * 207*94c044f4SRod Evans * - any user defined section will be first in the associated segment. 208ba2be530Sab196087 * 209*94c044f4SRod Evans * - interp and capabilities sections are next, as these are accessed 210ba2be530Sab196087 * immediately the first page of the image is mapped. 211ba2be530Sab196087 * 212*94c044f4SRod Evans * - objects that do not provide an interp normally have a read-only 213*94c044f4SRod Evans * .dynamic section that comes next (in this case, there is no need to 214*94c044f4SRod Evans * update a DT_DEBUG entry at runtime). 215ba2be530Sab196087 * 216*94c044f4SRod Evans * - the syminfo, hash, dynsym, dynstr and rel's are grouped together as 217*94c044f4SRod Evans * these will all be accessed together by ld.so.1 to perform relocations. 218*94c044f4SRod Evans * 219*94c044f4SRod Evans * - the got, dynamic, and plt are grouped together as these may also be 220ba2be530Sab196087 * accessed first by ld.so.1 to perform relocations, fill in DT_DEBUG 221ba2be530Sab196087 * (executables only), and .plt[0]. 222ba2be530Sab196087 * 223*94c044f4SRod Evans * - unknown sections (stabs, comments, etc.) go at the end. 224ba2be530Sab196087 * 225ba2be530Sab196087 * Note that .tlsbss/.bss are given the largest identifiers. This insures that 226ba2be530Sab196087 * if any unknown sections become associated to the same segment as the .bss, 227ba2be530Sab196087 * the .bss sections are always the last section in the segment. 228ba2be530Sab196087 */ 229ba2be530Sab196087 #define M_ID_NULL 0x00 230ba2be530Sab196087 #define M_ID_USER 0x01 231ba2be530Sab196087 232ba2be530Sab196087 #define M_ID_INTERP 0x02 /* SHF_ALLOC */ 233ba2be530Sab196087 #define M_ID_CAP 0x03 234*94c044f4SRod Evans #define M_ID_CAPINFO 0x04 235*94c044f4SRod Evans #define M_ID_CAPCHAIN 0x05 23608278a5eSRod Evans 237*94c044f4SRod Evans #define M_ID_DYNAMIC 0x06 /* if no .interp, then no */ 238*94c044f4SRod Evans /* DT_DEBUG is required */ 239*94c044f4SRod Evans #define M_ID_UNWINDHDR 0x07 240*94c044f4SRod Evans #define M_ID_UNWIND 0x08 241*94c044f4SRod Evans 242*94c044f4SRod Evans #define M_ID_SYMINFO 0x09 243*94c044f4SRod Evans #define M_ID_HASH 0x0a 244*94c044f4SRod Evans #define M_ID_LDYNSYM 0x0b /* always right before DYNSYM */ 245*94c044f4SRod Evans #define M_ID_DYNSYM 0x0c 246*94c044f4SRod Evans #define M_ID_DYNSTR 0x0d 247*94c044f4SRod Evans #define M_ID_VERSION 0x0e 248*94c044f4SRod Evans #define M_ID_DYNSORT 0x0f 249*94c044f4SRod Evans #define M_ID_REL 0x10 250*94c044f4SRod Evans #define M_ID_ARRAY 0x11 25108278a5eSRod Evans #define M_ID_TEXT 0x12 /* SHF_ALLOC + SHF_EXECINSTR */ 2527e16fca0SAli Bahrami #define M_ID_DATA 0x20 253ba2be530Sab196087 254ba2be530Sab196087 /* M_ID_USER 0x01 dual entry - listed above */ 255ba2be530Sab196087 #define M_ID_GOTDATA 0x02 /* SHF_ALLOC + SHF_WRITE */ 256ba2be530Sab196087 #define M_ID_GOT 0x03 257ba2be530Sab196087 #define M_ID_PLT 0x04 258*94c044f4SRod Evans /* M_ID_DYNAMIC 0x06 dual entry - listed above */ 259*94c044f4SRod Evans /* M_ID_UNWIND 0x08 dual entry - listed above */ 260ba2be530Sab196087 261ba2be530Sab196087 #define M_ID_UNKNOWN 0xfc /* just before TLS */ 262ba2be530Sab196087 263ba2be530Sab196087 #define M_ID_TLS 0xfd /* just before bss */ 264ba2be530Sab196087 #define M_ID_TLSBSS 0xfe 265ba2be530Sab196087 #define M_ID_BSS 0xff 266ba2be530Sab196087 267ba2be530Sab196087 #define M_ID_SYMTAB_NDX 0x02 /* ! SHF_ALLOC */ 268ba2be530Sab196087 #define M_ID_SYMTAB 0x03 269ba2be530Sab196087 #define M_ID_STRTAB 0x04 270ba2be530Sab196087 #define M_ID_DYNSYM_NDX 0x05 271ba2be530Sab196087 #define M_ID_NOTE 0x06 272ba2be530Sab196087 273ba2be530Sab196087 274ba2be530Sab196087 #ifdef __cplusplus 275ba2be530Sab196087 } 276ba2be530Sab196087 #endif 277ba2be530Sab196087 278ba2be530Sab196087 #endif /* _MACHDEP_SPARC_H */ 279