bpf_jit.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Just-In-Time compiler for BPF filters on MIPS
  3. *
  4. * Copyright (c) 2014 Imagination Technologies Ltd.
  5. * Author: Markos Chandras <markos.chandras@imgtec.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the
  9. * Free Software Foundation; version 2 of the License.
  10. */
  11. #ifndef BPF_JIT_MIPS_OP_H
  12. #define BPF_JIT_MIPS_OP_H
  13. /* Registers used by JIT */
  14. #define MIPS_R_ZERO 0
  15. #define MIPS_R_V0 2
  16. #define MIPS_R_A0 4
  17. #define MIPS_R_A1 5
  18. #define MIPS_R_T4 12
  19. #define MIPS_R_T5 13
  20. #define MIPS_R_T6 14
  21. #define MIPS_R_T7 15
  22. #define MIPS_R_S0 16
  23. #define MIPS_R_S1 17
  24. #define MIPS_R_S2 18
  25. #define MIPS_R_S3 19
  26. #define MIPS_R_S4 20
  27. #define MIPS_R_S5 21
  28. #define MIPS_R_S6 22
  29. #define MIPS_R_S7 23
  30. #define MIPS_R_SP 29
  31. #define MIPS_R_RA 31
  32. /* Conditional codes */
  33. #define MIPS_COND_EQ 0x1
  34. #define MIPS_COND_GE (0x1 << 1)
  35. #define MIPS_COND_GT (0x1 << 2)
  36. #define MIPS_COND_NE (0x1 << 3)
  37. #define MIPS_COND_ALL (0x1 << 4)
  38. /* Conditionals on X register or K immediate */
  39. #define MIPS_COND_X (0x1 << 5)
  40. #define MIPS_COND_K (0x1 << 6)
  41. #define r_ret MIPS_R_V0
  42. /*
  43. * Use 2 scratch registers to avoid pipeline interlocks.
  44. * There is no overhead during epilogue and prologue since
  45. * any of the $s0-$s6 registers will only be preserved if
  46. * they are going to actually be used.
  47. */
  48. #define r_skb_hl MIPS_R_S0 /* skb header length */
  49. #define r_skb_data MIPS_R_S1 /* skb actual data */
  50. #define r_off MIPS_R_S2
  51. #define r_A MIPS_R_S3
  52. #define r_X MIPS_R_S4
  53. #define r_skb MIPS_R_S5
  54. #define r_M MIPS_R_S6
  55. #define r_skb_len MIPS_R_S7
  56. #define r_s0 MIPS_R_T4 /* scratch reg 1 */
  57. #define r_s1 MIPS_R_T5 /* scratch reg 2 */
  58. #define r_tmp_imm MIPS_R_T6 /* No need to preserve this */
  59. #define r_tmp MIPS_R_T7 /* No need to preserve this */
  60. #define r_zero MIPS_R_ZERO
  61. #define r_sp MIPS_R_SP
  62. #define r_ra MIPS_R_RA
  63. #ifndef __ASSEMBLY__
  64. /* Declare ASM helpers */
  65. #define DECLARE_LOAD_FUNC(func) \
  66. extern u8 func(unsigned long *skb, int offset); \
  67. extern u8 func##_negative(unsigned long *skb, int offset); \
  68. extern u8 func##_positive(unsigned long *skb, int offset)
  69. DECLARE_LOAD_FUNC(sk_load_word);
  70. DECLARE_LOAD_FUNC(sk_load_half);
  71. DECLARE_LOAD_FUNC(sk_load_byte);
  72. #endif
  73. #endif /* BPF_JIT_MIPS_OP_H */