diff options
Diffstat (limited to 'arch/powerpc/net/bpf_jit.h')
| -rw-r--r-- | arch/powerpc/net/bpf_jit.h | 11 | 
1 files changed, 11 insertions, 0 deletions
diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h index 8a5dfaf5c6b..9aee27c582d 100644 --- a/arch/powerpc/net/bpf_jit.h +++ b/arch/powerpc/net/bpf_jit.h @@ -39,6 +39,7 @@  #define r_X		5  #define r_addr		6  #define r_scratch1	7 +#define r_scratch2	8  #define r_D		14  #define r_HL		15  #define r_M		16 @@ -92,6 +93,8 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);  				     ___PPC_RA(base) | IMM_L(i))  #define PPC_LHZ(r, base, i)	EMIT(PPC_INST_LHZ | ___PPC_RT(r) |	      \  				     ___PPC_RA(base) | IMM_L(i)) +#define PPC_LHBRX(r, base, b)	EMIT(PPC_INST_LHBRX | ___PPC_RT(r) |	      \ +				     ___PPC_RA(base) | ___PPC_RB(b))  /* Convenience helpers for the above with 'far' offsets: */  #define PPC_LD_OFFS(r, base, i) do { if ((i) < 32768) PPC_LD(r, base, i);     \  		else {	PPC_ADDIS(r, base, IMM_HA(i));			      \ @@ -186,6 +189,14 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);  				PPC_ORI(d, d, (uintptr_t)(i) & 0xffff);	      \  		} } while (0); +#define PPC_LHBRX_OFFS(r, base, i) \ +		do { PPC_LI32(r, i); PPC_LHBRX(r, r, base); } while(0) +#ifdef __LITTLE_ENDIAN__ +#define PPC_NTOHS_OFFS(r, base, i)	PPC_LHBRX_OFFS(r, base, i) +#else +#define PPC_NTOHS_OFFS(r, base, i)	PPC_LHZ_OFFS(r, base, i) +#endif +  static inline bool is_nearbranch(int offset)  {  	return (offset < 32768) && (offset >= -32768);  | 
