d847d51 PowerPC PLT speculative execution barriers

Authored and Committed by Alan Modra 6 years ago
    PowerPC PLT speculative execution barriers
    
    Spectre variant 2 mitigation for PowerPC and PowerPC64.
    
    bfd/
    	* elf32-ppc.c (GLINK_ENTRY_SIZE): Handle speculation barrier.
    	(CRSETEQ, BEQCTRM): Define.
    	(is_nonpic_glink_stub): Don't check bctr.
    	(ppc_elf_link_hash_table_create): Init new ppc_elf_params field.
    	(ppc_elf_relax_section): Size speculation barrier.
    	(output_bctr): New function.
    	(write_glink_stub): Use output_bctr.
    	(ppc_elf_relocate_section): Use output_bctr for long branch stub.
    	(ppc_elf_finish_dynamic_symbol): Likewise.
    	(ppc_elf_finish_dynamic_sections): Use output_bctr.
    	* elf32-ppc.h (struct ppc_elf_params): Add speculate_indirect_jumps.
    	* elf64-ppc.c (CRSETEQ, BEQCTRM, BEQCTRLM): Define.
    	(GLINK_PLTRESOLVE_SIZE): Size speculation barrier.
    	(size_global_entry_stubs): Handle speculation barrier sizing.
    	(plt_stub_size): Likewise.
    	(output_bctr): New function.
    	(build_plt_stub, build_tls_get_addr_stub): Output speculation
    	barrier.
    	(ppc_build_one_stub): Likewise for ppc_stub_plt_branch.
    	(ppc_size_one_stub): Size speculation barrier in ppc_stub_plt_branch.
    	(build_global_entry_stubs): Output speculation barrier.
    	(ppc64_elf_build_stubs): Likewise in __glink_PLTresolve stub.
    	* elf64-ppc.h (struct ppc64_elf_params): Add speculate_indirect_jumps.
    gold/
    	* options.h (speculate_indirect_jumps): New option.
    	* powerpc.cc (beqctrm, beqctrlm, crseteq): New insn constants.
    	(output_bctr): New function.
    	(Stub_table::plt_call_size): Add space for speculation barrier.
    	(Stub_table::branch_stub_size): Likewise.
    	(Output_data_glink::pltresolve_size): Likewise.
    	(Stub_table::do_write): Output speculation barriers.
    ld/
    	* emultempl/ppc32elf.em (params): Init new field.
    	(OPTION_SPECULATE_INDIRECT_JUMPS): Define.
    	(OPTION_NO_SPECULATE_INDIRECT_JUMPS): Define.
    	(PARSE_AND_LIST_LONGOPTS): Handle new options.
    	(PARSE_AND_LIST_ARGS_CASES): Likewise.
    	(PARSE_AND_LIST_OPTIONS): Likewise.
    	* emultempl/ppc64elf.em (params): Init new field.
    	(OPTION_SPECULATE_INDIRECT_JUMPS): Define.
    	(OPTION_NO_SPECULATE_INDIRECT_JUMPS): Define.
    	(PARSE_AND_LIST_LONGOPTS): Handle --speculate-indirect-jumps.
    	(PARSE_AND_LIST_OPTIONS): Likewise.
    	(PARSE_AND_LIST_ARGS_CASES): Likewise.
    	* ld.texinfo (--no-plt-thread-safe): Correct itemx.
    	(--speculate-indirect-jumps): Document.
    	* testsuite/ld-powerpc/elfv2exe.d,
    	* testsuite/ld-powerpc/elfv2so.d,
    	* testsuite/ld-powerpc/relbrlt.d,
    	* testsuite/ld-powerpc/powerpc.exp: Disable plt alignment and
    	speculation barriers on various tests.
    
    (cherry picked from commit 1be5d8d3bbec4c9a112114993ac5c85b2b26c4c4)
    
        
file modified
+26 -0
file modified
+32 -9
file modified
+3 -0
file modified
+49 -9
file modified
+3 -0
file modified
+10 -0
file modified
+4 -0
file modified
+50 -13
file modified
+22 -0
file modified
+19 -1
file modified
+20 -2
file modified
+10 -1