static int bpf_jit_emit_func_call_hlp(u32 *image, struct codegen_context *ctx, u64 func)
 {
        unsigned long func_addr = func ? ppc_function_entry((void *)func) : 0;
+       long reladdr;
 
        if (WARN_ON_ONCE(!core_kernel_text(func_addr)))
                return -EINVAL;
 
-#ifdef PPC64_ELF_ABI_v1
-       /* func points to the function descriptor */
-       PPC_LI64(b2p[TMP_REG_2], func);
-       /* Load actual entry point from function descriptor */
-       PPC_BPF_LL(b2p[TMP_REG_1], b2p[TMP_REG_2], 0);
-       /* ... and move it to CTR */
-       EMIT(PPC_RAW_MTCTR(b2p[TMP_REG_1]));
-#else
-       /* We can clobber r12 */
-       PPC_FUNC_ADDR(12, func);
-       EMIT(PPC_RAW_MTCTR(12));
-#endif
+       reladdr = func_addr - kernel_toc_addr();
+       if (reladdr > 0x7FFFFFFF || reladdr < -(0x80000000L)) {
+               pr_err("eBPF: address of %ps out of range of kernel_toc.\n", (void *)func);
+               return -ERANGE;
+       }
+
+       EMIT(PPC_RAW_ADDIS(_R12, _R2, PPC_HA(reladdr)));
+       EMIT(PPC_RAW_ADDI(_R12, _R12, PPC_LO(reladdr)));
+       EMIT(PPC_RAW_MTCTR(_R12));
        EMIT(PPC_RAW_BCTRL());
 
        return 0;
        if (WARN_ON_ONCE(func && is_module_text_address(func)))
                return -EINVAL;
 
+       /* skip past descriptor if elf v1 */
+       func += FUNCTION_DESCR_SIZE;
+
        /* Load function address into r12 */
        PPC_LI64(12, func);
 
        for (i = ctx->idx - ctx_idx; i < 5; i++)
                EMIT(PPC_RAW_NOP());
 
-#ifdef PPC64_ELF_ABI_v1
-       /* Load actual entry point from function descriptor */
-       PPC_BPF_LL(12, 12, 0);
-#endif
-
        EMIT(PPC_RAW_MTCTR(12));
        EMIT(PPC_RAW_BCTRL());