| /* |
| * This file is part of ltrace. |
| * Copyright (C) 2012,2013,2014 Petr Machata |
| * Copyright (C) 2006 Paul Gilliam |
| * Copyright (C) 2002,2004 Juan Cespedes |
| * |
| * 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 2 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 St, Fifth Floor, Boston, MA |
| * 02110-1301 USA |
| */ |
| #ifndef LTRACE_PPC_ARCH_H |
| #define LTRACE_PPC_ARCH_H |
| |
| #include <gelf.h> |
| |
| #define BREAKPOINT_VALUE { 0x7f, 0xe0, 0x00, 0x08 } |
| #define BREAKPOINT_LENGTH 4 |
| #define DECR_PC_AFTER_BREAK 0 |
| |
| #define LT_ELFCLASS ELFCLASS32 |
| #define LT_ELF_MACHINE EM_PPC |
| |
| #ifdef __powerpc64__ // Says 'ltrace' is 64 bits, says nothing about target. |
| #define LT_ELFCLASS2 ELFCLASS64 |
| #define LT_ELF_MACHINE2 EM_PPC64 |
| #define ARCH_SUPPORTS_OPD |
| #endif |
| |
| #define ARCH_HAVE_SW_SINGLESTEP |
| #define ARCH_HAVE_ADD_PLT_ENTRY |
| #define ARCH_HAVE_ADD_FUNC_ENTRY |
| #define ARCH_HAVE_TRANSLATE_ADDRESS |
| #define ARCH_HAVE_DYNLINK_DONE |
| #define ARCH_HAVE_FETCH_ARG |
| #define ARCH_ENDIAN_BIG |
| #define ARCH_HAVE_SIZEOF |
| #define ARCH_HAVE_ALIGNOF |
| |
| struct library_symbol; |
| |
| #define ARCH_HAVE_LTELF_DATA |
| struct arch_ltelf_data { |
| GElf_Addr plt_stub_vma; |
| struct library_symbol *stubs; |
| Elf_Data *opd_data; |
| GElf_Addr opd_base; |
| GElf_Xword opd_size; |
| int secure_plt; |
| |
| Elf_Data *reladyn; |
| size_t reladyn_count; |
| }; |
| |
| #define ARCH_HAVE_LIBRARY_DATA |
| struct arch_library_data { |
| GElf_Addr pltgot_addr; |
| int bss_plt_prelinked; |
| }; |
| |
| enum ppc64_plt_type { |
| /* Either a non-PLT symbol, or PPC32 symbol. */ |
| PPC_DEFAULT = 0, |
| |
| /* PPC64 STUB, never resolved. */ |
| PPC64_PLT_STUB, |
| |
| /* Unresolved PLT symbol (.plt contains PLT address). */ |
| PPC_PLT_UNRESOLVED, |
| |
| /* Resolved PLT symbol. The corresponding .plt slot contained |
| * target address, which was changed to the address of |
| * corresponding PLT entry. The original is now saved in |
| * RESOLVED_VALUE. */ |
| PPC_PLT_RESOLVED, |
| |
| /* Very similar to PPC_PLT_UNRESOLVED, but for JMP_IREL |
| * slots. */ |
| PPC_PLT_IRELATIVE, |
| |
| /* Transitional state before the breakpoint is enabled. */ |
| PPC_PLT_NEED_UNRESOLVE, |
| }; |
| |
| #define ARCH_HAVE_LIBRARY_SYMBOL_DATA |
| struct ppc_unresolve_data; |
| struct arch_library_symbol_data { |
| enum ppc64_plt_type type; |
| |
| /* State Contents |
| * |
| * PPC_DEFAULT N/A |
| * PPC64_PLT_STUB N/A |
| * PPC_PLT_UNRESOLVED PLT entry address. |
| * PPC_PLT_IRELATIVE Likewise. |
| * PPC_PLT_RESOLVED The original value the slot was resolved to. |
| * PPC_PLT_NEED_UNRESOLVE DATA. |
| */ |
| union { |
| GElf_Addr resolved_value; |
| struct ppc_unresolve_data *data; |
| }; |
| |
| /* Address of corresponding slot in .plt. */ |
| GElf_Addr plt_slot_addr; |
| }; |
| |
| #define ARCH_HAVE_BREAKPOINT_DATA |
| struct arch_breakpoint_data { |
| /* This is where we hide symbol for IRELATIVE breakpoint for |
| * the first time that it hits. This is NULL for normal |
| * breakpoints. */ |
| struct library_symbol *irel_libsym; |
| }; |
| |
| #define ARCH_HAVE_PROCESS_DATA |
| struct arch_process_data { |
| /* Breakpoint that hits when the dynamic linker is about to |
| * update a .plt slot. NULL before that address is known. */ |
| struct breakpoint *dl_plt_update_bp; |
| |
| /* PLT update breakpoint looks here for the handler. */ |
| struct process_stopping_handler *handler; |
| }; |
| |
| #endif /* LTRACE_PPC_ARCH_H */ |