The LE and BE code here is the same, except the BE has the old-style function descriptor. So, we use the LE code on ELFv2 to fix build errors. --- valgrind-3.13.0/coregrind/m_libcsetjmp.c 2017-05-31 10:14:45.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_libcsetjmp.c 2018-05-25 20:07:37.007835735 -0500 @@ -149,7 +149,7 @@ /* ------------ ppc64-linux ------------ */ -#if defined(VGP_ppc64be_linux) +#if defined(VGP_ppc64be_linux) && (!defined(_CALL_ELF) || _CALL_ELF == 1) __asm__( ".section \".toc\",\"aw\"" "\n" @@ -268,7 +268,8 @@ ".previous" "\n" ); -#elif defined(VGP_ppc64le_linux) +#elif (defined(VGP_ppc64le_linux)) || \ + (defined(VGP_ppc64be_linux) && defined(_CALL_ELF) && _CALL_ELF == 2) __asm__( ".section \".toc\",\"aw\"" "\n" --- valgrind-3.13.0/coregrind/m_main.c.old 2017-05-31 10:14:52.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_main.c 2018-05-30 19:01:00.534083618 -0500 @@ -2585,7 +2585,7 @@ "\ttrap\n" ".previous\n" ); -#elif defined(VGP_ppc64be_linux) +#elif defined(VGP_ppc64be_linux) && (!defined(_CALL_ELF) || _CALL_ELF == 1) asm("\n" /* PPC64 ELF ABI says '_start' points to a function descriptor. So we must have one, and that is what goes into the .opd section. */ @@ -2631,9 +2631,9 @@ "\tnop\n" "\ttrap\n" ); -#elif defined(VGP_ppc64le_linux) -/* Little Endian uses ELF version 2 but in the future may also - * support other ELF versions. +#elif defined(VGP_ppc64le_linux) || \ + (defined(VGP_ppc64be_linux) && defined(_CALL_ELF) && _CALL_ELF == 2) +/* PowerPC 64 ELF version 2 does not use function descriptors. */ asm("\n" "\t.align 2\n" --- valgrind-3.13.0/coregrind/m_syscall.c.old 2017-05-31 10:14:29.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_syscall.c 2018-05-30 19:02:00.984023769 -0500 @@ -470,7 +470,7 @@ ".previous\n" ); -#elif defined(VGP_ppc64be_linux) +#elif defined(VGP_ppc64be_linux) && (!defined(_CALL_ELF) || _CALL_ELF == 1) /* Due to the need to return 65 bits of result, this is completely different from the ppc32 case. The single arg register points to a 7-word block containing the syscall # and the 6 args. The syscall @@ -506,7 +506,8 @@ " blr\n" ); -#elif defined(VGP_ppc64le_linux) +#elif defined(VGP_ppc64le_linux) || \ + (defined(VGP_ppc64be_linux) && defined(_CALL_ELF) && _CALL_ELF == 2) /* Due to the need to return 65 bits of result, this is completely different from the ppc32 case. The single arg register points to a 7-word block containing the syscall # and the 6 args. The syscall --- valgrind-3.13.0/coregrind/m_signals.c.old 2017-05-31 10:14:52.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_signals.c 2018-05-30 22:12:46.082692356 -0500 @@ -889,7 +889,7 @@ " sc\n" \ ".previous\n" -#elif defined(VGP_ppc64be_linux) +#elif defined(VGP_ppc64be_linux) && (!defined(_CALL_ELF) || _CALL_ELF == 1) # define _MY_SIGRETURN(name) \ ".align 2\n" \ ".globl my_sigreturn\n" \ @@ -904,7 +904,8 @@ " li 0, " #name "\n" \ " sc\n" -#elif defined(VGP_ppc64le_linux) +#elif defined(VGP_ppc64le_linux) || \ + (defined(VGP_ppc64be_linux) && defined(_CALL_ELF) && _CALL_ELF == 2) /* Little Endian supports ELF version 2. In the future, it may * support other versions. */ --- valgrind-3.13.0/coregrind/m_syswrap/syswrap-ppc64-linux.c.old 2017-05-31 10:14:39.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_syswrap/syswrap-ppc64-linux.c 2018-05-30 22:15:42.112518074 -0500 @@ -71,12 +71,12 @@ // r4 = retaddr // r5 = function descriptor // r6 = arg1 -/* On PPC64, a func ptr is represented by a TOC entry ptr. +/* On ELFv1, a func ptr is represented by a TOC entry ptr. This TOC entry contains three words; the first word is the function address, the second word is the TOC ptr (r2), and the third word is the static chain value. */ asm( -#if defined(VGP_ppc64be_linux) +#if defined(VGP_ppc64be_linux) && (!defined(_CALL_ELF) || _CALL_ELF == 1) " .align 2\n" " .globl vgModuleLocal_call_on_new_stack_0_1\n" " .section \".opd\",\"aw\"\n" @@ -126,7 +126,7 @@ " bctr\n\t" // jump to dst " trap\n" // should never get here #else -// ppc64le_linux +// ppc64le_linux, or ELFv2 ABI on BE " .align 2\n" " .globl vgModuleLocal_call_on_new_stack_0_1\n" "vgModuleLocal_call_on_new_stack_0_1:\n" @@ -211,7 +211,7 @@ // See priv_syswrap-linux.h for arg profile. asm( -#if defined(VGP_ppc64be_linux) +#if defined(VGP_ppc64be_linux) && (!defined(_CALL_ELF) || _CALL_ELF == 1) " .align 2\n" " .globl do_syscall_clone_ppc64_linux\n" " .section \".opd\",\"aw\"\n" --- valgrind-3.13.0/coregrind/m_syswrap/syscall-ppc64be-linux.S.old 2017-05-31 10:14:39.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_syswrap/syscall-ppc64be-linux.S 2018-05-30 22:18:31.742350130 -0500 @@ -29,7 +29,7 @@ #include "pub_core_basics_asm.h" -#if defined(VGP_ppc64be_linux) +#if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) #include "pub_core_vkiscnums_asm.h" #include "libvex_guest_offsets.h" @@ -76,12 +76,25 @@ .align 2 .globl ML_(do_syscall_for_client_WRK) +#if _CALL_ELF == 2 +.type .ML_(do_syscall_for_client_WRK),@function +ML_(do_syscall_for_client_WRK): +0: addis 2,12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry ML_(do_syscall_for_client_WRK), .-ML_(do_syscall_for_client_WRK) +#else .section ".opd","aw" .align 3 -ML_(do_syscall_for_client_WRK): +ML_(do_syscall_for_client_WRK): .quad .ML_(do_syscall_for_client_WRK),.TOC.@tocbase,0 .previous -.type .ML_(do_syscall_for_client_WRK),@function +#endif +#if _CALL_ELF == 2 +0: addis 2,12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry ML_(do_syscall_for_client_WRK), .-ML_(do_syscall_for_client_WRK) +#endif +.type .ML_(do_syscall_for_client_WRK),@function .globl .ML_(do_syscall_for_client_WRK) .ML_(do_syscall_for_client_WRK): /* make a stack frame */ @@ -145,7 +158,11 @@ /* failure: return 0x8000 | error code */ 7: ori 3,3,0x8000 /* FAILURE -- ensure return value is nonzero */ b 5b - +#if _CALL_ELF == 2 + .size .ML_(do_syscall_for_client_WRK),.-.ML_(do_syscall_for_client_WRK) +#else + .size .ML_(do_syscall_for_client_WRK),.-.ML_(do_syscall_for_client_WRK) +#endif .section .rodata /* export the ranges so that VG_(fixup_guest_state_after_syscall_interrupted) can do the @@ -162,7 +179,7 @@ ML_(blksys_committed): .quad 4b ML_(blksys_finished): .quad 5b -#endif // defined(VGP_ppc64be_linux) +#endif // defined(VGP_ppc64le_linux) /* Let the linker know we don't need an executable stack */ MARK_STACK_NO_EXEC --- valgrind-3.13.0/coregrind/m_dispatch/dispatch-ppc64be-linux.S.old 2017-05-31 10:14:33.000000000 -0500 +++ valgrind-3.13.0/coregrind/m_dispatch/dispatch-ppc64be-linux.S 2018-05-30 22:39:37.951096498 -0500 @@ -30,12 +30,21 @@ #include "pub_core_basics_asm.h" -#if defined(VGP_ppc64be_linux) +#if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) #include "pub_core_dispatch_asm.h" #include "pub_core_transtab_asm.h" #include "libvex_guest_offsets.h" /* for OFFSET_ppc64_CIA */ +/* NOTE: PPC64 supports Big Endian and Little Endian. It also supports the + ELF version 1 and ELF version 2 APIs. + + Currently LE uses ELF version 2 and BE uses ELF version 1. However, + BE and LE may support the other ELF version in the future. So, the + _CALL_ELF is used in the assembly function to enable code for a + specific ELF version independently of the endianness of the machine. + The test "#if _CALL_ELF == 2" checks if ELF version 2 is being used. +*/ /* References to globals via the TOC */ @@ -75,14 +84,26 @@ .section ".text" .align 2 .globl VG_(disp_run_translations) +#if _CALL_ELF == 2 +.type VG_(disp_run_translations),@function +VG_(disp_run_translations): +.type .VG_(disp_run_translations),@function +#else .section ".opd","aw" .align 3 VG_(disp_run_translations): .quad .VG_(disp_run_translations),.TOC.@tocbase,0 .previous .type .VG_(disp_run_translations),@function +#endif .globl .VG_(disp_run_translations) .VG_(disp_run_translations): +#if _CALL_ELF == 2 +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry VG_(disp_run_translations), .-VG_(disp_run_translations) +#endif + /* r3 holds two_words */ /* r4 holds guest_state */ /* r5 holds host_addr */ @@ -229,8 +250,13 @@ /* make a stack frame for the code we are calling */ stdu 1,-48(1) - /* Set up the guest state ptr */ + /* Set up the guest state ptr */ mr 31,4 /* r31 (generated code gsp) = r4 */ +#if _CALL_ELF == 2 +/* for the LE ABI need to setup r2 and r12 */ +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l +#endif /* and jump into the code cache. Chained translations in the code cache run, until for whatever reason, they can't @@ -385,6 +411,9 @@ mtlr 0 addi 1,1,624 /* stack_size */ blr +#if _CALL_ELF == 2 + .size VG_(disp_run_translations),.-VG_(disp_run_translations) +#endif /*----------------------------------------------------*/ @@ -395,15 +424,25 @@ .section ".text" .align 2 .globl VG_(disp_cp_chain_me_to_slowEP) - .section ".opd","aw" +#if _CALL_ELF == 2 + .type VG_(disp_cp_chain_me_to_slowEP),@function + VG_(disp_cp_chain_me_to_slowEP): +#else + .section ".opd","aw" .align 3 VG_(disp_cp_chain_me_to_slowEP): .quad .VG_(disp_cp_chain_me_to_slowEP),.TOC.@tocbase,0 .previous +#endif .type .VG_(disp_cp_chain_me_to_slowEP),@function .globl .VG_(disp_cp_chain_me_to_slowEP) .VG_(disp_cp_chain_me_to_slowEP): - /* We got called. The return address indicates +#if _CALL_ELF == 2 +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry VG_(disp_cp_chain_me_to_slowEP), .-VG_(disp_cp_chain_me_to_slowEP) +#endif + /* We got called. The return address indicates where the patching needs to happen. Collect the return address and, exit back to C land, handing the caller the pair (Chain_me_S, RA) */ @@ -415,20 +454,33 @@ */ subi 7,7,20+4+4 b .postamble +#if _CALL_ELF == 2 + .size VG_(disp_cp_chain_me_to_slowEP),.-VG_(disp_cp_chain_me_to_slowEP) +#endif /* ------ Chain me to fast entry point ------ */ .section ".text" .align 2 .globl VG_(disp_cp_chain_me_to_fastEP) - .section ".opd","aw" +#if _CALL_ELF == 2 + .type VG_(disp_cp_chain_me_to_fastEP),@function +VG_(disp_cp_chain_me_to_fastEP): +#else + .section ".opd","aw" .align 3 VG_(disp_cp_chain_me_to_fastEP): .quad .VG_(disp_cp_chain_me_to_fastEP),.TOC.@tocbase,0 .previous +#endif .type .VG_(disp_cp_chain_me_to_fastEP),@function .globl .VG_(disp_cp_chain_me_to_fastEP) .VG_(disp_cp_chain_me_to_fastEP): - /* We got called. The return address indicates +#if _CALL_ELF == 2 +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry VG_(disp_cp_chain_me_to_fastEP), .-VG_(disp_cp_chain_me_to_fastEP) +#endif + /* We got called. The return address indicates where the patching needs to happen. Collect the return address and, exit back to C land, handing the caller the pair (Chain_me_S, RA) */ @@ -440,20 +492,33 @@ */ subi 7,7,20+4+4 b .postamble +#if _CALL_ELF == 2 + .size VG_(disp_cp_chain_me_to_fastEP),.-VG_(disp_cp_chain_me_to_fastEP) +#endif /* ------ Indirect but boring jump ------ */ .section ".text" .align 2 .globl VG_(disp_cp_xindir) - .section ".opd","aw" +#if _CALL_ELF == 2 + .type VG_(disp_cp_xindir),@function +VG_(disp_cp_xindir): +#else + .section ".opd","aw" .align 3 VG_(disp_cp_xindir): .quad .VG_(disp_cp_xindir),.TOC.@tocbase,0 .previous +#endif .type .VG_(disp_cp_xindir),@function .globl .VG_(disp_cp_xindir) .VG_(disp_cp_xindir): - /* Where are we going? */ +#if _CALL_ELF == 2 +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry VG_(disp_cp_xindir), .-VG_(disp_cp_xindir) +#endif + /* Where are we going? */ ld 3,OFFSET_ppc64_CIA(31) /* stats only */ @@ -479,6 +544,9 @@ /* Found a match. Jump to .host. */ mtctr 7 bctr +#if _CALL_ELF == 2 + .size VG_(disp_cp_xindir),.-VG_(disp_cp_xindir) +#endif .fast_lookup_failed: /* stats only */ @@ -496,39 +564,64 @@ .section ".text" .align 2 .globl VG_(disp_cp_xassisted) - .section ".opd","aw" +#if _CALL_ELF == 2 + .type VG_(disp_cp_xassisted),@function +VG_(disp_cp_xassisted): +#else + .section ".opd","aw" .align 3 VG_(disp_cp_xassisted): .quad .VG_(disp_cp_xassisted),.TOC.@tocbase,0 .previous - .type .VG_(disp_cp_xassisted),@function +#endif +#if _CALL_ELF == 2 +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry VG_(disp_cp_xassisted), .-VG_(disp_cp_xassisted) +#endif + .type .VG_(disp_cp_xassisted),@function .globl .VG_(disp_cp_xassisted) .VG_(disp_cp_xassisted): /* r31 contains the TRC */ mr 6,31 li 7,0 b .postamble +#if _CALL_ELF == 2 + .size VG_(disp_cp_xassisted),.-VG_(disp_cp_xassisted) +#endif /* ------ Event check failed ------ */ .section ".text" .align 2 .globl VG_(disp_cp_evcheck_fail) - .section ".opd","aw" +#if _CALL_ELF == 2 + .type VG_(disp_cp_evcheck_fail),@function +VG_(disp_cp_evcheck_fail): +#else + .section ".opd","aw" .align 3 VG_(disp_cp_evcheck_fail): .quad .VG_(disp_cp_evcheck_fail),.TOC.@tocbase,0 .previous +#endif +#if _CALL_ELF == 2 +0: addis 2, 12,.TOC.-0b@ha + addi 2,2,.TOC.-0b@l + .localentry VG_(disp_cp_evcheck_fail), .-VG_(disp_cp_evcheck_fail) +#endif .type .VG_(disp_cp_evcheck_fail),@function .globl .VG_(disp_cp_evcheck_fail) .VG_(disp_cp_evcheck_fail): li 6,VG_TRC_INNER_COUNTERZERO li 7,0 b .postamble +#if _CALL_ELF == 2 + .size VG_(disp_cp_evcheck_fail),.-VG_(disp_cp_evcheck_fail) +#endif - .size .VG_(disp_run_translations), .-.VG_(disp_run_translations) -#endif // defined(VGP_ppc64be_linux) +#endif // defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux) /* Let the linker know we don't need an executable stack */ MARK_STACK_NO_EXEC