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 37eb81f38aSJohn Baldwin return (e->e_kind == ELF_K_ELF && e->e_byteorder == ELFDATA2LSB && 38eb81f38aSJohn Baldwin e->e_u.e_elf.e_ehdr.e_ehdr64->e_machine == EM_MIPS); 39eb81f38aSJohn Baldwin } 40eb81f38aSJohn Baldwin 41eb81f38aSJohn Baldwin /* 42eb81f38aSJohn Baldwin * For MIPS64, the r_info field is actually stored as a 32-bit symbol 43eb81f38aSJohn Baldwin * index (r_sym) followed by four single-byte fields (r_ssym, r_type3, 44eb81f38aSJohn Baldwin * r_type2, and r_type). The byte-swap for the little-endian case 45eb81f38aSJohn Baldwin * jumbles this incorrectly so compensate. 46eb81f38aSJohn Baldwin */ 47eb81f38aSJohn Baldwin Elf64_Xword 48eb81f38aSJohn Baldwin _libelf_mips64el_r_info_tof(Elf64_Xword r_info) 49eb81f38aSJohn Baldwin { 50eb81f38aSJohn Baldwin Elf64_Xword new_info; 51eb81f38aSJohn Baldwin uint8_t ssym, type3, type2, type; 52eb81f38aSJohn Baldwin 53eb81f38aSJohn Baldwin ssym = r_info >> 24; 54eb81f38aSJohn Baldwin type3 = r_info >> 16; 55eb81f38aSJohn Baldwin type2 = r_info >> 8; 56eb81f38aSJohn Baldwin type = r_info; 57eb81f38aSJohn Baldwin new_info = r_info >> 32; 58eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)ssym << 32; 59eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type3 << 40; 60eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type2 << 48; 61eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type << 56; 62eb81f38aSJohn Baldwin return (new_info); 63eb81f38aSJohn Baldwin } 64eb81f38aSJohn Baldwin 65eb81f38aSJohn Baldwin Elf64_Xword 66eb81f38aSJohn Baldwin _libelf_mips64el_r_info_tom(Elf64_Xword r_info) 67eb81f38aSJohn Baldwin { 68eb81f38aSJohn Baldwin Elf64_Xword new_info; 69eb81f38aSJohn Baldwin uint8_t ssym, type3, type2, type; 70eb81f38aSJohn Baldwin 71eb81f38aSJohn Baldwin ssym = r_info >> 32; 72eb81f38aSJohn Baldwin type3 = r_info >> 40; 73eb81f38aSJohn Baldwin type2 = r_info >> 48; 74eb81f38aSJohn Baldwin type = r_info >> 56; 75eb81f38aSJohn Baldwin new_info = (r_info & 0xffffffff) << 32; 76eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)ssym << 24; 77eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type3 << 16; 78eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type2 << 8; 79eb81f38aSJohn Baldwin new_info |= (Elf64_Xword)type; 80eb81f38aSJohn Baldwin return (new_info); 81eb81f38aSJohn Baldwin } 82