1338478Sjhb/*- 2338478Sjhb * Copyright (c) 2018 John Baldwin 3338478Sjhb * 4338478Sjhb * Redistribution and use in source and binary forms, with or without 5338478Sjhb * modification, are permitted provided that the following conditions 6338478Sjhb * are met: 7338478Sjhb * 1. Redistributions of source code must retain the above copyright 8338478Sjhb * notice, this list of conditions and the following disclaimer. 9338478Sjhb * 2. Redistributions in binary form must reproduce the above copyright 10338478Sjhb * notice, this list of conditions and the following disclaimer in the 11338478Sjhb * documentation and/or other materials provided with the distribution. 12338478Sjhb * 13338478Sjhb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14338478Sjhb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15338478Sjhb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16338478Sjhb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17338478Sjhb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18338478Sjhb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19338478Sjhb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20338478Sjhb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21338478Sjhb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22338478Sjhb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23338478Sjhb * SUCH DAMAGE. 24338478Sjhb */ 25338478Sjhb 26338478Sjhb#include <gelf.h> 27338478Sjhb 28338478Sjhb#include "_libelf.h" 29338478Sjhb 30338478SjhbELFTC_VCSID("$Id$"); 31338478Sjhb 32338478Sjhbint 33338478Sjhb_libelf_is_mips64el(Elf *e) 34338478Sjhb{ 35338478Sjhb 36340309Semaste return (e->e_kind == ELF_K_ELF && e->e_class == ELFCLASS64 && 37340309Semaste e->e_u.e_elf.e_ehdr.e_ehdr64->e_machine == EM_MIPS && 38340309Semaste e->e_u.e_elf.e_ehdr.e_ehdr64->e_ident[EI_DATA] == ELFDATA2LSB); 39338478Sjhb} 40338478Sjhb 41338478Sjhb/* 42338478Sjhb * For MIPS64, the r_info field is actually stored as a 32-bit symbol 43338478Sjhb * index (r_sym) followed by four single-byte fields (r_ssym, r_type3, 44338478Sjhb * r_type2, and r_type). The byte-swap for the little-endian case 45338478Sjhb * jumbles this incorrectly so compensate. 46338478Sjhb */ 47338478SjhbElf64_Xword 48338478Sjhb_libelf_mips64el_r_info_tof(Elf64_Xword r_info) 49338478Sjhb{ 50338478Sjhb Elf64_Xword new_info; 51338478Sjhb uint8_t ssym, type3, type2, type; 52338478Sjhb 53338478Sjhb ssym = r_info >> 24; 54338478Sjhb type3 = r_info >> 16; 55338478Sjhb type2 = r_info >> 8; 56338478Sjhb type = r_info; 57338478Sjhb new_info = r_info >> 32; 58338478Sjhb new_info |= (Elf64_Xword)ssym << 32; 59338478Sjhb new_info |= (Elf64_Xword)type3 << 40; 60338478Sjhb new_info |= (Elf64_Xword)type2 << 48; 61338478Sjhb new_info |= (Elf64_Xword)type << 56; 62338478Sjhb return (new_info); 63338478Sjhb} 64338478Sjhb 65338478SjhbElf64_Xword 66338478Sjhb_libelf_mips64el_r_info_tom(Elf64_Xword r_info) 67338478Sjhb{ 68338478Sjhb Elf64_Xword new_info; 69338478Sjhb uint8_t ssym, type3, type2, type; 70338478Sjhb 71338478Sjhb ssym = r_info >> 32; 72338478Sjhb type3 = r_info >> 40; 73338478Sjhb type2 = r_info >> 48; 74338478Sjhb type = r_info >> 56; 75338478Sjhb new_info = (r_info & 0xffffffff) << 32; 76338478Sjhb new_info |= (Elf64_Xword)ssym << 24; 77338478Sjhb new_info |= (Elf64_Xword)type3 << 16; 78338478Sjhb new_info |= (Elf64_Xword)type2 << 8; 79338478Sjhb new_info |= (Elf64_Xword)type; 80338478Sjhb return (new_info); 81338478Sjhb} 82