123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- /* Mach-O compact unwind encoding.
- Copyright (C) 2014-2015 Free Software Foundation, Inc.
- This file is part of BFD, the Binary File Descriptor library.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
- #ifndef _MACH_O_UNWIND_H
- #define _MACH_O_UNWIND_H
- /* Encodings bits for all cpus. */
- #define MACH_O_UNWIND_IS_NOT_FUNCTION_START 0x80000000
- #define MACH_O_UNWIND_HAS_LSDA 0x40000000
- #define MACH_O_UNWIND_PERSONALITY_MASK 0x30000000
- #define MACH_O_UNWIND_PERSONALITY_SHIFT 28
- /* Encodings for x86-64. */
- /* Kind of encoding (4 bits). */
- #define MACH_O_UNWIND_X86_64_MODE_MASK 0x0f000000
- /* Frame is RBP based, using the standard sequence: push %rbp; mov %rsp, %rbp.
- Non-volatile registers must be saved in the stack starting at %rbp-8 to
- %rbp-2040 (offset is encoded in offset bits * 8). Registers saved are
- encoded in registers bits, 3 bits per register. */
- #define MACH_O_UNWIND_X86_64_MODE_RBP_FRAME 0x01000000
- #define MACH_O_UNWIND_X86_64_RBP_FRAME_REGSITERS 0x00007FFF
- #define MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET 0x00FF0000
- /* Frameless function, with a small stack size. */
- #define MACH_O_UNWIND_X86_64_MODE_STACK_IMMD 0x02000000
- #define MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE 0x00FF0000
- #define MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT 0x00001C00
- #define MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION 0x000003FF
- /* Frameless function, with a larger stack size. The stack size is the sum
- of the X in subq $X,%rsp (address of X is at function + stack size bits)
- and stack adjust. */
- #define MACH_O_UNWIND_X86_64_MODE_STACK_IND 0x03000000
- #define MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST 0x0000E000
- /* Use dwarf. */
- #define MACH_O_UNWIND_X86_64_MODE_DWARF 0x04000000
- #define MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET 0x00ffffff
- /* Registers. */
- #define MACH_O_UNWIND_X86_64_REG_NONE 0
- #define MACH_O_UNWIND_X86_64_REG_RBX 1
- #define MACH_O_UNWIND_X86_64_REG_R12 2
- #define MACH_O_UNWIND_X86_64_REG_R13 3
- #define MACH_O_UNWIND_X86_64_REG_R14 4
- #define MACH_O_UNWIND_X86_64_REG_R15 5
- #define MACH_O_UNWIND_X86_64_REG_RBP 6
- /* Encodings for x86 (almot the same as x86-64). */
- /* Kind of encoding (4 bits). */
- #define MACH_O_UNWIND_X86_MODE_MASK 0x0f000000
- /* Frame is EBP based, using the standard sequence: push %ebp; mov %esp, %ebp.
- Non-volatile registers must be saved in the stack starting at %ebp-4 to
- %ebp-240 (offset is encoded in offset bits * 4). Registers saved are
- encoded in registers bits, 3 bits per register. */
- #define MACH_O_UNWIND_X86_MODE_EBP_FRAME 0x01000000
- #define MACH_O_UNWIND_X86_EBP_FRAME_REGSITERS 0x00007FFF
- #define MACH_O_UNWIND_X86_EBP_FRAME_OFFSET 0x00FF0000
- /* Frameless function, with a small stack size. */
- #define MACH_O_UNWIND_X86_MODE_STACK_IMMD 0x02000000
- #define MACH_O_UNWIND_X86_FRAMELESS_STACK_SIZE 0x00FF0000
- #define MACH_O_UNWIND_X86_FRAMELESS_REG_COUNT 0x00001C00
- #define MACH_O_UNWIND_X86_FRAMELESS_REG_PERMUTATION 0x000003FF
- /* Frameless function, with a larger stack size. The stack size is the sum
- of the X in subq $X,%esp (address of X is at function + stack size bits)
- and stack adjust. */
- #define MACH_O_UNWIND_X86_MODE_STACK_IND 0x03000000
- #define MACH_O_UNWIND_X86_FRAMELESS_STACK_ADJUST 0x0000E000
- /* Use dwarf. */
- #define MACH_O_UNWIND_X86_MODE_DWARF 0x04000000
- #define MACH_O_UNWIND_X86_DWARF_SECTION_OFFSET 0x00ffffff
- /* Registers. */
- #define MACH_O_UNWIND_X86_REG_NONE 0
- #define MACH_O_UNWIND_X86_REG_EBX 1
- #define MACH_O_UNWIND_X86_REG_ECX 2
- #define MACH_O_UNWIND_X86_REG_EDX 3
- #define MACH_O_UNWIND_X86_REG_EDI 4
- #define MACH_O_UNWIND_X86_REG_ESI 5
- #define MACH_O_UNWIND_X86_REG_EBP 6
- /* Entry in object file (in __LD,__compact_unwind section). */
- struct mach_o_compact_unwind_32
- {
- unsigned char start[4];
- unsigned char length[4];
- unsigned char encoding[4];
- unsigned char personality[4];
- unsigned char lsda[4];
- };
- struct mach_o_compact_unwind_64
- {
- unsigned char start[8];
- unsigned char length[4];
- unsigned char encoding[4];
- unsigned char personality[8];
- unsigned char lsda[8];
- };
- /* Header in images (in __TEXT,__unwind_info). */
- #define MACH_O_UNWIND_SECTION_VERSION 1 /* Current verion in header. */
- struct mach_o_unwind_info_header
- {
- unsigned char version[4]; /* Currently MACH_O_UNWIND_SECTION_VERSION. */
- unsigned char encodings_array_offset[4];
- unsigned char encodings_array_count[4];
- unsigned char personality_array_offset[4];
- unsigned char personality_array_count[4];
- unsigned char index_offset[4];
- unsigned char index_count[4];
- /* Followed by:
- - encodings array
- These are the encodings shared, for index < encoding_array_count
- - personality array
- count given by personality_array_count
- - index entries
- count given by index_count
- - lsda index entries
- last offset given by lsda offset of last index_entry.
- */
- };
- struct mach_o_unwind_index_entry
- {
- unsigned char function_offset[4];
- unsigned char second_level_offset[4];
- unsigned char lsda_index_offset[4];
- };
- struct mach_o_unwind_lsda_index_entry
- {
- unsigned char function_offset[4];
- unsigned char lsda_offset[4];
- };
- /* Second level index pages. */
- #define MACH_O_UNWIND_SECOND_LEVEL_REGULAR 2
- struct mach_o_unwind_regular_second_level_page_header
- {
- unsigned char kind[4];
- unsigned char entry_page_offset[2];
- unsigned char entry_count[2];
- /* Array of entries. */
- };
- struct mach_o_unwind_regular_second_level_entry
- {
- unsigned char function_offset[4];
- unsigned char encoding[4];
- };
- #define MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED 3
- struct mach_o_unwind_compressed_second_level_page_header
- {
- unsigned char kind[4];
- unsigned char entry_page_offset[2];
- unsigned char entry_count[2];
- unsigned char encodings_offset[2];
- unsigned char encodings_count[2];
- /* Followed by entries array (one word, see below). */
- /* Followed by (non-common) encodings array. */
- };
- /* Compressed entries are one word, containing function offset and encoding
- index. */
- #define MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(en) \
- ((en) & 0x00FFFFFF)
- #define MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(en) \
- (((en) >> 24) & 0xFF)
- #endif /* _MACH_O_UNWIND_H */
|