#ifndef __ASSEMBLY__
 
 /* BPF register usage */
-#define SKB_HLEN_REG   (MAX_BPF_REG + 0)
-#define SKB_DATA_REG   (MAX_BPF_REG + 1)
-#define TMP_REG_1      (MAX_BPF_REG + 2)
-#define TMP_REG_2      (MAX_BPF_REG + 3)
+#define SKB_HLEN_REG   (MAX_BPF_JIT_REG + 0)
+#define SKB_DATA_REG   (MAX_BPF_JIT_REG + 1)
+#define TMP_REG_1      (MAX_BPF_JIT_REG + 2)
+#define TMP_REG_2      (MAX_BPF_JIT_REG + 3)
 
 /* BPF to ppc register mappings */
 static const int b2p[] = {
        /* frame pointer aka BPF_REG_10 */
        [BPF_REG_FP] = 31,
        /* eBPF jit internal registers */
+       [BPF_REG_AX] = 2,
        [SKB_HLEN_REG] = 25,
        [SKB_DATA_REG] = 26,
        [TMP_REG_1] = 9,
 
        int pass;
        int flen;
        struct bpf_binary_header *bpf_hdr;
+       struct bpf_prog *org_fp = fp;
+       struct bpf_prog *tmp_fp;
+       bool bpf_blinded = false;
 
        if (!bpf_jit_enable)
-               return fp;
+               return org_fp;
+
+       tmp_fp = bpf_jit_blind_constants(org_fp);
+       if (IS_ERR(tmp_fp))
+               return org_fp;
+
+       if (tmp_fp != org_fp) {
+               bpf_blinded = true;
+               fp = tmp_fp;
+       }
 
        flen = fp->len;
        addrs = kzalloc((flen+1) * sizeof(*addrs), GFP_KERNEL);
-       if (addrs == NULL)
-               return fp;
+       if (addrs == NULL) {
+               fp = org_fp;
+               goto out;
+       }
+
+       memset(&cgctx, 0, sizeof(struct codegen_context));
 
-       cgctx.idx = 0;
-       cgctx.seen = 0;
        /* Scouting faux-generate pass 0 */
-       if (bpf_jit_build_body(fp, 0, &cgctx, addrs))
+       if (bpf_jit_build_body(fp, 0, &cgctx, addrs)) {
                /* We hit something illegal or unsupported. */
+               fp = org_fp;
                goto out;
+       }
 
        /*
         * Pretend to build prologue, given the features we've seen.  This will
 
        bpf_hdr = bpf_jit_binary_alloc(alloclen, &image, 4,
                        bpf_jit_fill_ill_insns);
-       if (!bpf_hdr)
+       if (!bpf_hdr) {
+               fp = org_fp;
                goto out;
+       }
 
        code_base = (u32 *)(image + FUNCTION_DESCR_SIZE);
 
 
 out:
        kfree(addrs);
+
+       if (bpf_blinded)
+               bpf_jit_prog_release_other(fp, fp == org_fp ? tmp_fp : org_fp);
+
        return fp;
 }