@@ -674,20 +674,6 @@ static void bpf_jit_prologue(struct bpf_jit *jit, struct bpf_prog *fp)
674
674
_EMIT2 (0x07f0 | reg ); \
675
675
} while (0 )
676
676
677
- /*
678
- * Call r1 either directly or via __s390_indirect_jump_r1 thunk
679
- */
680
- static void call_r1 (struct bpf_jit * jit )
681
- {
682
- if (nospec_uses_trampoline ())
683
- /* brasl %r14,__s390_indirect_jump_r1 */
684
- EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 ,
685
- __s390_indirect_jump_r1 );
686
- else
687
- /* basr %r14,%r1 */
688
- EMIT2 (0x0d00 , REG_14 , REG_1 );
689
- }
690
-
691
677
/*
692
678
* Function epilogue
693
679
*/
@@ -1820,10 +1806,8 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
1820
1806
}
1821
1807
}
1822
1808
1823
- /* lgrl %w1,func */
1824
- EMIT6_PCREL_RILB (0xc4080000 , REG_W1 , _EMIT_CONST_U64 (func ));
1825
- /* %r1() */
1826
- call_r1 (jit );
1809
+ /* brasl %r14,func */
1810
+ EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 , (void * )func );
1827
1811
/* lgr %b0,%r2: load return value into %b0 */
1828
1812
EMIT4 (0xb9040000 , BPF_REG_0 , REG_2 );
1829
1813
@@ -2534,14 +2518,12 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
2534
2518
* goto skip;
2535
2519
*/
2536
2520
2537
- /* %r1 = __bpf_prog_enter */
2538
- load_imm64 (jit , REG_1 , (u64 )bpf_trampoline_enter (p ));
2539
2521
/* %r2 = p */
2540
2522
load_imm64 (jit , REG_2 , (u64 )p );
2541
2523
/* la %r3,run_ctx_off(%r15) */
2542
2524
EMIT4_DISP (0x41000000 , REG_3 , REG_15 , tjit -> run_ctx_off );
2543
- /* %r1() */
2544
- call_r1 ( jit );
2525
+ /* brasl %r14,__bpf_prog_enter */
2526
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , bpf_trampoline_enter ( p ) );
2545
2527
/* ltgr %r7,%r2 */
2546
2528
EMIT4 (0xb9020000 , REG_7 , REG_2 );
2547
2529
/* brcl 8,skip */
@@ -2552,15 +2534,13 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
2552
2534
* retval = bpf_func(args, p->insnsi);
2553
2535
*/
2554
2536
2555
- /* %r1 = p->bpf_func */
2556
- load_imm64 (jit , REG_1 , (u64 )p -> bpf_func );
2557
2537
/* la %r2,bpf_args_off(%r15) */
2558
2538
EMIT4_DISP (0x41000000 , REG_2 , REG_15 , tjit -> bpf_args_off );
2559
2539
/* %r3 = p->insnsi */
2560
2540
if (!p -> jited )
2561
2541
load_imm64 (jit , REG_3 , (u64 )p -> insnsi );
2562
- /* %r1() */
2563
- call_r1 ( jit );
2542
+ /* brasl %r14,p->bpf_func */
2543
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , p -> bpf_func );
2564
2544
/* stg %r2,retval_off(%r15) */
2565
2545
if (save_ret ) {
2566
2546
if (sign_extend (jit , REG_2 , m -> ret_size , m -> ret_flags ))
@@ -2577,16 +2557,14 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
2577
2557
* __bpf_prog_exit(p, start, &run_ctx);
2578
2558
*/
2579
2559
2580
- /* %r1 = __bpf_prog_exit */
2581
- load_imm64 (jit , REG_1 , (u64 )bpf_trampoline_exit (p ));
2582
2560
/* %r2 = p */
2583
2561
load_imm64 (jit , REG_2 , (u64 )p );
2584
2562
/* lgr %r3,%r7 */
2585
2563
EMIT4 (0xb9040000 , REG_3 , REG_7 );
2586
2564
/* la %r4,run_ctx_off(%r15) */
2587
2565
EMIT4_DISP (0x41000000 , REG_4 , REG_15 , tjit -> run_ctx_off );
2588
- /* %r1() */
2589
- call_r1 ( jit );
2566
+ /* brasl %r14,__bpf_prog_exit */
2567
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , bpf_trampoline_exit ( p ) );
2590
2568
2591
2569
return 0 ;
2592
2570
}
@@ -2746,9 +2724,6 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2746
2724
2747
2725
/* lgr %r8,%r0 */
2748
2726
EMIT4 (0xb9040000 , REG_8 , REG_0 );
2749
- } else {
2750
- /* %r8 = func_addr + S390X_PATCH_SIZE */
2751
- load_imm64 (jit , REG_8 , (u64 )func_addr + S390X_PATCH_SIZE );
2752
2727
}
2753
2728
2754
2729
/*
@@ -2774,12 +2749,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2774
2749
* __bpf_tramp_enter(im);
2775
2750
*/
2776
2751
2777
- /* %r1 = __bpf_tramp_enter */
2778
- load_imm64 (jit , REG_1 , (u64 )__bpf_tramp_enter );
2779
2752
/* %r2 = im */
2780
2753
load_imm64 (jit , REG_2 , (u64 )im );
2781
- /* %r1() */
2782
- call_r1 ( jit );
2754
+ /* brasl %r14,__bpf_tramp_enter */
2755
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , __bpf_tramp_enter );
2783
2756
}
2784
2757
2785
2758
for (i = 0 ; i < fentry -> nr_links ; i ++ )
@@ -2832,10 +2805,19 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2832
2805
/* mvc tail_call_cnt(4,%r15),tccnt_off(%r15) */
2833
2806
_EMIT6 (0xd203f000 | offsetof(struct prog_frame , tail_call_cnt ),
2834
2807
0xf000 | tjit -> tccnt_off );
2835
- /* lgr %r1,%r8 */
2836
- EMIT4 (0xb9040000 , REG_1 , REG_8 );
2837
- /* %r1() */
2838
- call_r1 (jit );
2808
+ if (flags & BPF_TRAMP_F_ORIG_STACK ) {
2809
+ if (nospec_uses_trampoline ())
2810
+ /* brasl %r14,__s390_indirect_jump_r8 */
2811
+ EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 ,
2812
+ __s390_indirect_jump_r8 );
2813
+ else
2814
+ /* basr %r14,%r8 */
2815
+ EMIT2 (0x0d00 , REG_14 , REG_8 );
2816
+ } else {
2817
+ /* brasl %r14,func_addr+S390X_PATCH_SIZE */
2818
+ EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 ,
2819
+ func_addr + S390X_PATCH_SIZE );
2820
+ }
2839
2821
/* stg %r2,retval_off(%r15) */
2840
2822
EMIT6_DISP_LH (0xe3000000 , 0x0024 , REG_2 , REG_0 , REG_15 ,
2841
2823
tjit -> retval_off );
@@ -2866,12 +2848,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2866
2848
* __bpf_tramp_exit(im);
2867
2849
*/
2868
2850
2869
- /* %r1 = __bpf_tramp_exit */
2870
- load_imm64 (jit , REG_1 , (u64 )__bpf_tramp_exit );
2871
2851
/* %r2 = im */
2872
2852
load_imm64 (jit , REG_2 , (u64 )im );
2873
- /* %r1() */
2874
- call_r1 ( jit );
2853
+ /* brasl %r14,__bpf_tramp_exit */
2854
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , __bpf_tramp_exit );
2875
2855
}
2876
2856
2877
2857
/* lmg %r2,%rN,reg_args_off(%r15) */
@@ -2880,7 +2860,8 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2880
2860
REG_2 + (nr_reg_args - 1 ), REG_15 ,
2881
2861
tjit -> reg_args_off );
2882
2862
/* lgr %r1,%r8 */
2883
- if (!(flags & BPF_TRAMP_F_SKIP_FRAME ))
2863
+ if (!(flags & BPF_TRAMP_F_SKIP_FRAME ) &&
2864
+ (flags & BPF_TRAMP_F_ORIG_STACK ))
2884
2865
EMIT4 (0xb9040000 , REG_1 , REG_8 );
2885
2866
/* lmg %r7,%r8,r7_r8_off(%r15) */
2886
2867
EMIT6_DISP_LH (0xeb000000 , 0x0004 , REG_7 , REG_8 , REG_15 ,
@@ -2899,9 +2880,12 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2899
2880
EMIT4_IMM (0xa70b0000 , REG_15 , tjit -> stack_size );
2900
2881
if (flags & BPF_TRAMP_F_SKIP_FRAME )
2901
2882
EMIT_JUMP_REG (14 );
2902
- else
2883
+ else if ( flags & BPF_TRAMP_F_ORIG_STACK )
2903
2884
EMIT_JUMP_REG (1 );
2904
-
2885
+ else
2886
+ /* brcl 0xf,func_addr+S390X_PATCH_SIZE */
2887
+ EMIT6_PCREL_RILC_PTR (0xc0040000 , 0xf ,
2888
+ func_addr + S390X_PATCH_SIZE );
2905
2889
return 0 ;
2906
2890
}
2907
2891
0 commit comments