@@ -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
*/
@@ -1819,10 +1805,8 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
1819
1805
}
1820
1806
}
1821
1807
1822
- /* lgrl %w1,func */
1823
- EMIT6_PCREL_RILB (0xc4080000 , REG_W1 , _EMIT_CONST_U64 (func ));
1824
- /* %r1() */
1825
- call_r1 (jit );
1808
+ /* brasl %r14,func */
1809
+ EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 , (void * )func );
1826
1810
/* lgr %b0,%r2: load return value into %b0 */
1827
1811
EMIT4 (0xb9040000 , BPF_REG_0 , REG_2 );
1828
1812
break ;
@@ -2517,14 +2501,12 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
2517
2501
* goto skip;
2518
2502
*/
2519
2503
2520
- /* %r1 = __bpf_prog_enter */
2521
- load_imm64 (jit , REG_1 , (u64 )bpf_trampoline_enter (p ));
2522
2504
/* %r2 = p */
2523
2505
load_imm64 (jit , REG_2 , (u64 )p );
2524
2506
/* la %r3,run_ctx_off(%r15) */
2525
2507
EMIT4_DISP (0x41000000 , REG_3 , REG_15 , tjit -> run_ctx_off );
2526
- /* %r1() */
2527
- call_r1 ( jit );
2508
+ /* brasl %r14,__bpf_prog_enter */
2509
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , bpf_trampoline_enter ( p ) );
2528
2510
/* ltgr %r7,%r2 */
2529
2511
EMIT4 (0xb9020000 , REG_7 , REG_2 );
2530
2512
/* brcl 8,skip */
@@ -2535,15 +2517,13 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
2535
2517
* retval = bpf_func(args, p->insnsi);
2536
2518
*/
2537
2519
2538
- /* %r1 = p->bpf_func */
2539
- load_imm64 (jit , REG_1 , (u64 )p -> bpf_func );
2540
2520
/* la %r2,bpf_args_off(%r15) */
2541
2521
EMIT4_DISP (0x41000000 , REG_2 , REG_15 , tjit -> bpf_args_off );
2542
2522
/* %r3 = p->insnsi */
2543
2523
if (!p -> jited )
2544
2524
load_imm64 (jit , REG_3 , (u64 )p -> insnsi );
2545
- /* %r1() */
2546
- call_r1 ( jit );
2525
+ /* brasl %r14,p->bpf_func */
2526
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , p -> bpf_func );
2547
2527
/* stg %r2,retval_off(%r15) */
2548
2528
if (save_ret ) {
2549
2529
if (sign_extend (jit , REG_2 , m -> ret_size , m -> ret_flags ))
@@ -2560,16 +2540,14 @@ static int invoke_bpf_prog(struct bpf_tramp_jit *tjit,
2560
2540
* __bpf_prog_exit(p, start, &run_ctx);
2561
2541
*/
2562
2542
2563
- /* %r1 = __bpf_prog_exit */
2564
- load_imm64 (jit , REG_1 , (u64 )bpf_trampoline_exit (p ));
2565
2543
/* %r2 = p */
2566
2544
load_imm64 (jit , REG_2 , (u64 )p );
2567
2545
/* lgr %r3,%r7 */
2568
2546
EMIT4 (0xb9040000 , REG_3 , REG_7 );
2569
2547
/* la %r4,run_ctx_off(%r15) */
2570
2548
EMIT4_DISP (0x41000000 , REG_4 , REG_15 , tjit -> run_ctx_off );
2571
- /* %r1() */
2572
- call_r1 ( jit );
2549
+ /* brasl %r14,__bpf_prog_exit */
2550
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , bpf_trampoline_exit ( p ) );
2573
2551
2574
2552
return 0 ;
2575
2553
}
@@ -2729,9 +2707,6 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2729
2707
2730
2708
/* lgr %r8,%r0 */
2731
2709
EMIT4 (0xb9040000 , REG_8 , REG_0 );
2732
- } else {
2733
- /* %r8 = func_addr + S390X_PATCH_SIZE */
2734
- load_imm64 (jit , REG_8 , (u64 )func_addr + S390X_PATCH_SIZE );
2735
2710
}
2736
2711
2737
2712
/*
@@ -2757,12 +2732,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2757
2732
* __bpf_tramp_enter(im);
2758
2733
*/
2759
2734
2760
- /* %r1 = __bpf_tramp_enter */
2761
- load_imm64 (jit , REG_1 , (u64 )__bpf_tramp_enter );
2762
2735
/* %r2 = im */
2763
2736
load_imm64 (jit , REG_2 , (u64 )im );
2764
- /* %r1() */
2765
- call_r1 ( jit );
2737
+ /* brasl %r14,__bpf_tramp_enter */
2738
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , __bpf_tramp_enter );
2766
2739
}
2767
2740
2768
2741
for (i = 0 ; i < fentry -> nr_links ; i ++ )
@@ -2815,10 +2788,19 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2815
2788
/* mvc tail_call_cnt(4,%r15),tccnt_off(%r15) */
2816
2789
_EMIT6 (0xd203f000 | offsetof(struct prog_frame , tail_call_cnt ),
2817
2790
0xf000 | tjit -> tccnt_off );
2818
- /* lgr %r1,%r8 */
2819
- EMIT4 (0xb9040000 , REG_1 , REG_8 );
2820
- /* %r1() */
2821
- call_r1 (jit );
2791
+ if (flags & BPF_TRAMP_F_ORIG_STACK ) {
2792
+ if (nospec_uses_trampoline ())
2793
+ /* brasl %r14,__s390_indirect_jump_r8 */
2794
+ EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 ,
2795
+ __s390_indirect_jump_r8 );
2796
+ else
2797
+ /* basr %r14,%r8 */
2798
+ EMIT2 (0x0d00 , REG_14 , REG_8 );
2799
+ } else {
2800
+ /* brasl %r14,func_addr+S390X_PATCH_SIZE */
2801
+ EMIT6_PCREL_RILB_PTR (0xc0050000 , REG_14 ,
2802
+ func_addr + S390X_PATCH_SIZE );
2803
+ }
2822
2804
/* stg %r2,retval_off(%r15) */
2823
2805
EMIT6_DISP_LH (0xe3000000 , 0x0024 , REG_2 , REG_0 , REG_15 ,
2824
2806
tjit -> retval_off );
@@ -2846,12 +2828,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2846
2828
* __bpf_tramp_exit(im);
2847
2829
*/
2848
2830
2849
- /* %r1 = __bpf_tramp_exit */
2850
- load_imm64 (jit , REG_1 , (u64 )__bpf_tramp_exit );
2851
2831
/* %r2 = im */
2852
2832
load_imm64 (jit , REG_2 , (u64 )im );
2853
- /* %r1() */
2854
- call_r1 ( jit );
2833
+ /* brasl %r14,__bpf_tramp_exit */
2834
+ EMIT6_PCREL_RILB_PTR ( 0xc0050000 , REG_14 , __bpf_tramp_exit );
2855
2835
}
2856
2836
2857
2837
/* lmg %r2,%rN,reg_args_off(%r15) */
@@ -2860,7 +2840,8 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2860
2840
REG_2 + (nr_reg_args - 1 ), REG_15 ,
2861
2841
tjit -> reg_args_off );
2862
2842
/* lgr %r1,%r8 */
2863
- if (!(flags & BPF_TRAMP_F_SKIP_FRAME ))
2843
+ if (!(flags & BPF_TRAMP_F_SKIP_FRAME ) &&
2844
+ (flags & BPF_TRAMP_F_ORIG_STACK ))
2864
2845
EMIT4 (0xb9040000 , REG_1 , REG_8 );
2865
2846
/* lmg %r7,%r8,r7_r8_off(%r15) */
2866
2847
EMIT6_DISP_LH (0xeb000000 , 0x0004 , REG_7 , REG_8 , REG_15 ,
@@ -2879,9 +2860,12 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
2879
2860
EMIT4_IMM (0xa70b0000 , REG_15 , tjit -> stack_size );
2880
2861
if (flags & BPF_TRAMP_F_SKIP_FRAME )
2881
2862
EMIT_JUMP_REG (14 );
2882
- else
2863
+ else if ( flags & BPF_TRAMP_F_ORIG_STACK )
2883
2864
EMIT_JUMP_REG (1 );
2884
-
2865
+ else
2866
+ /* brcl 0xf,func_addr+S390X_PATCH_SIZE */
2867
+ EMIT6_PCREL_RILC_PTR (0xc0040000 , 0xf ,
2868
+ func_addr + S390X_PATCH_SIZE );
2885
2869
return 0 ;
2886
2870
}
2887
2871
0 commit comments