gelf_mips64el.c revision 338478
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 37338478Sjhb return (e->e_kind == ELF_K_ELF && e->e_byteorder == ELFDATA2LSB && 38338478Sjhb e->e_u.e_elf.e_ehdr.e_ehdr64->e_machine == EM_MIPS); 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