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