uint64_t i386_linux_core_read_xcr0 (struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd) { asection *xstate = bfd_get_section_by_name (abfd, ".reg-xstate"); uint64_t xcr0; if (xstate) { size_t size = bfd_section_size (abfd, xstate); /* Check extended state size. */ if (size < I386_XSTATE_AVX_SIZE) xcr0 = I386_XSTATE_SSE_MASK; else { char contents[8]; if (! bfd_get_section_contents (abfd, xstate, contents, I386_LINUX_XSAVE_XCR0_OFFSET, 8)) { warning (_("Couldn't read `xcr0' bytes from " "`.reg-xstate' section in core file.")); return 0; } xcr0 = bfd_get_64 (abfd, contents); } } else xcr0 = 0; return xcr0; }
static bfd_vma read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed) { bfd_vma value; switch (width) { case 2: if (is_signed) value = bfd_get_signed_16 (abfd, buf); else value = bfd_get_16 (abfd, buf); break; case 4: if (is_signed) value = bfd_get_signed_32 (abfd, buf); else value = bfd_get_32 (abfd, buf); break; case 8: if (is_signed) value = bfd_get_signed_64 (abfd, buf); else value = bfd_get_64 (abfd, buf); break; default: BFD_FAIL (); return 0; } return value; }
uint64_t i386fbsd_core_read_xcr0 (bfd *abfd) { asection *xstate = bfd_get_section_by_name (abfd, ".reg-xstate"); uint64_t xcr0; if (xstate) { size_t size = bfd_section_size (abfd, xstate); /* Check extended state size. */ if (size < X86_XSTATE_AVX_SIZE) xcr0 = X86_XSTATE_SSE_MASK; else { char contents[8]; if (! bfd_get_section_contents (abfd, xstate, contents, I386_FBSD_XSAVE_XCR0_OFFSET, 8)) { warning (_("Couldn't read `xcr0' bytes from " "`.reg-xstate' section in core file.")); return X86_XSTATE_SSE_MASK; } xcr0 = bfd_get_64 (abfd, contents); } } else xcr0 = X86_XSTATE_SSE_MASK; return xcr0; }
/* Insert the addend/value into the instruction or data object being relocated. */ bfd_reloc_status_type _bfd_aarch64_elf_put_addend (bfd *abfd, bfd_byte *address, bfd_reloc_code_real_type r_type, reloc_howto_type *howto, bfd_signed_vma addend) { bfd_reloc_status_type status = bfd_reloc_ok; bfd_signed_vma old_addend = addend; bfd_vma contents; int size; size = bfd_get_reloc_size (howto); switch (size) { case 2: contents = bfd_get_16 (abfd, address); break; case 4: if (howto->src_mask != 0xffffffff) /* Must be 32-bit instruction, always little-endian. */ contents = bfd_getl32 (address); else /* Must be 32-bit data (endianness dependent). */ contents = bfd_get_32 (abfd, address); break; case 8: contents = bfd_get_64 (abfd, address); break; default: abort (); } switch (howto->complain_on_overflow) { case complain_overflow_dont: break; case complain_overflow_signed: status = aarch64_signed_overflow (addend, howto->bitsize + howto->rightshift); break; case complain_overflow_unsigned: status = aarch64_unsigned_overflow (addend, howto->bitsize + howto->rightshift); break; case complain_overflow_bitfield: default: abort (); } addend >>= howto->rightshift; switch (r_type) { case BFD_RELOC_AARCH64_JUMP26: case BFD_RELOC_AARCH64_CALL26: contents = reencode_branch_ofs_26 (contents, addend); break; case BFD_RELOC_AARCH64_BRANCH19: contents = reencode_cond_branch_ofs_19 (contents, addend); break; case BFD_RELOC_AARCH64_TSTBR14: contents = reencode_tst_branch_ofs_14 (contents, addend); break; case BFD_RELOC_AARCH64_LD_LO19_PCREL: case BFD_RELOC_AARCH64_GOT_LD_PREL19: if (old_addend & ((1 << howto->rightshift) - 1)) return bfd_reloc_overflow; contents = reencode_ld_lit_ofs_19 (contents, addend); break; case BFD_RELOC_AARCH64_TLSDESC_CALL: break; case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21: case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21: case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21: case BFD_RELOC_AARCH64_ADR_GOT_PAGE: case BFD_RELOC_AARCH64_ADR_LO21_PCREL: case BFD_RELOC_AARCH64_ADR_HI21_PCREL: case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: contents = reencode_adr_imm (contents, addend); break; case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12: case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC: case BFD_RELOC_AARCH64_ADD_LO12: /* Corresponds to: add rd, rn, #uimm12 to provide the low order 12 bits of the page offset following BFD_RELOC_AARCH64_ADR_HI21_PCREL which computes the (pc-relative) page base. */ contents = reencode_add_imm (contents, addend); break; case BFD_RELOC_AARCH64_LDST8_LO12: case BFD_RELOC_AARCH64_LDST16_LO12: case BFD_RELOC_AARCH64_LDST32_LO12: case BFD_RELOC_AARCH64_LDST64_LO12: case BFD_RELOC_AARCH64_LDST128_LO12: case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC: case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC: case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC: case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC: case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC: case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC: if (old_addend & ((1 << howto->rightshift) - 1)) return bfd_reloc_overflow; /* Used for ldr*|str* rt, [rn, #uimm12] to provide the low order 12 bits of the page offset following BFD_RELOC_AARCH64_ADR_HI21_PCREL which computes the (pc-relative) page base. */ contents = reencode_ldst_pos_imm (contents, addend); break; /* Group relocations to create high bits of a 16, 32, 48 or 64 bit signed data or abs address inline. Will change instruction to MOVN or MOVZ depending on sign of calculated value. */ case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2: case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1: case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC: case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0: case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC: case BFD_RELOC_AARCH64_MOVW_G0_S: case BFD_RELOC_AARCH64_MOVW_G1_S: case BFD_RELOC_AARCH64_MOVW_G2_S: /* NOTE: We can only come here with movz or movn. */ if (addend < 0) { /* Force use of MOVN. */ addend = ~addend; contents = reencode_movzn_to_movn (contents); } else { /* Force use of MOVZ. */ contents = reencode_movzn_to_movz (contents); } /* fall through */ /* Group relocations to create a 16, 32, 48 or 64 bit unsigned data or abs address inline. */ case BFD_RELOC_AARCH64_MOVW_G0: case BFD_RELOC_AARCH64_MOVW_G0_NC: case BFD_RELOC_AARCH64_MOVW_G1: case BFD_RELOC_AARCH64_MOVW_G1_NC: case BFD_RELOC_AARCH64_MOVW_G2: case BFD_RELOC_AARCH64_MOVW_G2_NC: case BFD_RELOC_AARCH64_MOVW_G3: contents = reencode_movw_imm (contents, addend); break; default: /* Repack simple data */ if (howto->dst_mask & (howto->dst_mask + 1)) return bfd_reloc_notsupported; contents = ((contents & ~howto->dst_mask) | (addend & howto->dst_mask)); break; } switch (size) { case 2: bfd_put_16 (abfd, contents, address); break; case 4: if (howto->dst_mask != 0xffffffff) /* must be 32-bit instruction, always little-endian */ bfd_putl32 (contents, address); else /* must be 32-bit data (endianness dependent) */ bfd_put_32 (abfd, contents, address); break; case 8: bfd_put_64 (abfd, contents, address); break; default: abort (); } return status; }