1eb81f38aSJohn Baldwin /*- 2eb81f38aSJohn Baldwin * Copyright (c) 2018 John Baldwin 3eb81f38aSJohn Baldwin * All rights reserved. 4eb81f38aSJohn Baldwin * 5eb81f38aSJohn Baldwin * Redistribution and use in source and binary forms, with or without 6eb81f38aSJohn Baldwin * modification, are permitted provided that the following conditions 7eb81f38aSJohn Baldwin * are met: 8eb81f38aSJohn Baldwin * 1. Redistributions of source code must retain the above copyright 9eb81f38aSJohn Baldwin * notice, this list of conditions and the following disclaimer. 10eb81f38aSJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 11eb81f38aSJohn Baldwin * notice, this list of conditions and the following disclaimer in the 12eb81f38aSJohn Baldwin * documentation and/or other materials provided with the distribution. 13eb81f38aSJohn Baldwin * 14eb81f38aSJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15eb81f38aSJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16eb81f38aSJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17eb81f38aSJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18eb81f38aSJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19eb81f38aSJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20eb81f38aSJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21eb81f38aSJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22eb81f38aSJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23eb81f38aSJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24eb81f38aSJohn Baldwin * SUCH DAMAGE. 25eb81f38aSJohn Baldwin */ 26eb81f38aSJohn Baldwin 27eb81f38aSJohn Baldwin #include <gelf.h> 28eb81f38aSJohn Baldwin 29eb81f38aSJohn Baldwin #include "_libelf.h" 30eb81f38aSJohn Baldwin 31eb81f38aSJohn Baldwin ELFTC_VCSID("$Id$"); 32eb81f38aSJohn Baldwin 33eb81f38aSJohn Baldwin int 34eb81f38aSJohn Baldwin _libelf_is_mips64el(Elf *e) 35eb81f38aSJohn Baldwin { 36eb81f38aSJohn Baldwin 371c45d770SEd Maste return (e->e_kind == ELF_K_ELF && 381c45d770SEd Maste e->e_u.e_elf.e_ehdr.e_ehdr64->e_machine == EM_MIPS && 391c45d770SEd Maste e->e_u.e_elf.e_ehdr.e_ehdr64->e_ident[EI_DATA] == ELFDATA2LSB); 40eb81f38aSJohn Baldwin } 41eb81f38aSJohn Baldwin 42eb81f38aSJohn Baldwin /* 43eb81f38aSJohn Baldwin * For MIPS64, the r_info field is actually stored as a 32-bit symbol 44eb81f38aSJohn Baldwin * index (r_sym) followed by four single-byte fields (r_ssym, r_type3, 45eb81f38aSJohn Baldwin * r_type2, and r_type). The byte-swap for the little-endian case 46eb81f38aSJohn Baldwin * jumbles this incorrectly so compensate. 47eb81f38aSJohn Baldwin */ 48eb81f38aSJohn Baldwin Elf64_Xword 49eb81f38aSJohn Baldwin _libelf_mips64el_r_info_tof(Elf64_Xword r_info) 50eb81f38aSJohn Baldwin { 51eb81f38aSJohn Baldwin Elf64_Xword new_info; 52eb81f38aSJohn Baldwin uint8_t ssym, type3, type2, type; 53eb81f38aSJohn Baldwin 54eb81f38aSJohn Baldwin ssym = r_info >> 24; 55eb81f38aSJohn Baldwin type3 = r_info >> 16; 56eb81f38aSJohn Baldwin type2 = r_info >> 8; 57eb81f38aSJohn Baldwin type = r_info; 58eb81f38aSJohn Baldwin new_info = r_info >> 32; 59eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)ssym << 32; 60eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type3 << 40; 61eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type2 << 48; 62eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type << 56; 63eb81f38aSJohn Baldwin return (new_info); 64eb81f38aSJohn Baldwin } 65eb81f38aSJohn Baldwin 66eb81f38aSJohn Baldwin Elf64_Xword 67eb81f38aSJohn Baldwin _libelf_mips64el_r_info_tom(Elf64_Xword r_info) 68eb81f38aSJohn Baldwin { 69eb81f38aSJohn Baldwin Elf64_Xword new_info; 70eb81f38aSJohn Baldwin uint8_t ssym, type3, type2, type; 71eb81f38aSJohn Baldwin 72eb81f38aSJohn Baldwin ssym = r_info >> 32; 73eb81f38aSJohn Baldwin type3 = r_info >> 40; 74eb81f38aSJohn Baldwin type2 = r_info >> 48; 75eb81f38aSJohn Baldwin type = r_info >> 56; 76eb81f38aSJohn Baldwin new_info = (r_info & 0xffffffff) << 32; 77eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)ssym << 24; 78eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type3 << 16; 79eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type2 << 8; 80eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type; 81eb81f38aSJohn Baldwin return (new_info); 82eb81f38aSJohn Baldwin } 83