arch.h revision af9e30ec852a24f52a36775154ff79cc4be0193d
1/* 2 * This file is part of ltrace. 3 * Copyright (C) 2012 Petr Machata 4 * Copyright (C) 2006 Paul Gilliam 5 * Copyright (C) 2002,2004 Juan Cespedes 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation; either version 2 of the 10 * License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 20 * 02110-1301 USA 21 */ 22#ifndef LTRACE_PPC_ARCH_H 23#define LTRACE_PPC_ARCH_H 24 25#include <gelf.h> 26 27#define BREAKPOINT_VALUE { 0x7f, 0xe0, 0x00, 0x08 } 28#define BREAKPOINT_LENGTH 4 29#define DECR_PC_AFTER_BREAK 0 30 31#define LT_ELFCLASS ELFCLASS32 32#define LT_ELF_MACHINE EM_PPC 33 34#ifdef __powerpc64__ // Says 'ltrace' is 64 bits, says nothing about target. 35#define LT_ELFCLASS2 ELFCLASS64 36#define LT_ELF_MACHINE2 EM_PPC64 37#define ARCH_SUPPORTS_OPD 38#endif 39 40#define PLT_REINITALISATION_BP "_start" 41 42#define ARCH_HAVE_ATOMIC_SINGLESTEP 43#define ARCH_HAVE_ADD_PLT_ENTRY 44#define ARCH_HAVE_TRANSLATE_ADDRESS 45#define ARCH_HAVE_DYNLINK_DONE 46#define ARCH_HAVE_FETCH_ARG 47#define ARCH_ENDIAN_BIG 48#define ARCH_HAVE_SIZEOF 49#define ARCH_HAVE_ALIGNOF 50 51struct library_symbol; 52 53#define ARCH_HAVE_LTELF_DATA 54struct arch_ltelf_data { 55 GElf_Addr plt_stub_vma; 56 struct library_symbol *stubs; 57 Elf_Data *opd_data; 58 GElf_Addr opd_base; 59 GElf_Xword opd_size; 60 int secure_plt; 61}; 62 63#define ARCH_HAVE_LIBRARY_DATA 64struct arch_library_data { 65 int bss_plt_prelinked; 66}; 67 68enum ppc64_plt_type { 69 /* Either a non-PLT symbol, or PPC32 symbol. */ 70 PPC_DEFAULT = 0, 71 72 /* PPC64 STUB, never resolved. */ 73 PPC64_PLT_STUB, 74 75 /* Unresolved PLT symbol (.plt contains PLT address). */ 76 PPC_PLT_UNRESOLVED, 77 78 /* Resolved PLT symbol. The corresponding .plt slot contained 79 * target address, which was changed to the address of 80 * corresponding PLT entry. The original is now saved in 81 * RESOLVED_VALUE. */ 82 PPC_PLT_RESOLVED, 83}; 84 85#define ARCH_HAVE_LIBRARY_SYMBOL_DATA 86struct arch_library_symbol_data { 87 enum ppc64_plt_type type; 88 GElf_Addr resolved_value; 89 90 /* Address of corresponding slot in .plt. */ 91 GElf_Addr plt_slot_addr; 92}; 93 94#define ARCH_HAVE_BREAKPOINT_DATA 95struct arch_breakpoint_data { 96 /* We need this just for arch_breakpoint_init. */ 97}; 98 99#define ARCH_HAVE_PROCESS_DATA 100struct arch_process_data { 101 /* Breakpoint that hits when the dynamic linker is about to 102 * update a .plt slot. NULL before that address is known. */ 103 struct breakpoint *dl_plt_update_bp; 104 105 /* PLT update breakpoint looks here for the handler. */ 106 struct process_stopping_handler *handler; 107}; 108 109#endif /* LTRACE_PPC_ARCH_H */ 110