aya.rs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. use anyhow::anyhow;
  2. use std::path::PathBuf;
  3. use aya_gen::{bindgen, write_to_file};
  4. use crate::codegen::{Architecture, Options};
  5. pub fn codegen(opts: &Options) -> Result<(), anyhow::Error> {
  6. codegen_internal_btf_bindings(opts)?;
  7. codegen_bindings(opts)
  8. }
  9. fn codegen_internal_btf_bindings(opts: &Options) -> Result<(), anyhow::Error> {
  10. let dir = PathBuf::from("aya");
  11. let generated = dir.join("src/generated");
  12. let mut bindgen = bindgen::user_builder()
  13. .clang_arg(format!(
  14. "-I{}",
  15. opts.libbpf_dir
  16. .join("include/uapi")
  17. .canonicalize()
  18. .unwrap()
  19. .to_string_lossy()
  20. ))
  21. .clang_arg(format!(
  22. "-I{}",
  23. opts.libbpf_dir
  24. .join("include")
  25. .canonicalize()
  26. .unwrap()
  27. .to_string_lossy()
  28. ))
  29. .header(
  30. opts.libbpf_dir
  31. .join("src/libbpf_internal.h")
  32. .to_string_lossy(),
  33. )
  34. .constified_enum_module("bpf_core_relo_kind");
  35. let types = ["bpf_core_relo", "btf_ext_header"];
  36. for x in &types {
  37. bindgen = bindgen.allowlist_type(x);
  38. }
  39. let bindings = bindgen
  40. .generate()
  41. .map_err(|_| anyhow!("bindgen failed"))?
  42. .to_string();
  43. // write the bindings, with the original helpers removed
  44. write_to_file(&generated.join("btf_internal_bindings.rs"), &bindings)?;
  45. Ok(())
  46. }
  47. fn codegen_bindings(opts: &Options) -> Result<(), anyhow::Error> {
  48. let types = [
  49. // BPF
  50. "BPF_TYPES",
  51. "bpf_cmd",
  52. "bpf_insn",
  53. "bpf_attr",
  54. "bpf_map_type",
  55. "bpf_prog_type",
  56. "bpf_attach_type",
  57. "bpf_prog_info",
  58. // BTF
  59. "btf_header",
  60. "btf_ext_info",
  61. "btf_ext_info_sec",
  62. "btf_type",
  63. "btf_enum",
  64. "btf_array",
  65. "btf_member",
  66. "btf_param",
  67. "btf_var",
  68. "btf_var_secinfo",
  69. // PERF
  70. "perf_event_attr",
  71. "perf_sw_ids",
  72. "perf_hw_id",
  73. "perf_hw_cache_id",
  74. "perf_hw_cache_op_id",
  75. "perf_hw_cache_op_result_id",
  76. "perf_event_sample_format",
  77. "perf_event_mmap_page",
  78. "perf_event_header",
  79. "perf_type_id",
  80. "perf_event_type",
  81. // NETLINK
  82. "ifinfomsg",
  83. "tcmsg",
  84. ];
  85. let vars = [
  86. // BPF
  87. "BPF_PSEUDO_.*",
  88. "BPF_ALU",
  89. "BPF_ALU64",
  90. "BPF_LDX",
  91. "BPF_ST",
  92. "BPF_STX",
  93. "BPF_LD",
  94. "BPF_K",
  95. "BPF_DW",
  96. "BPF_W",
  97. "BPF_H",
  98. "BPF_B",
  99. "BPF_JMP",
  100. "BPF_CALL",
  101. "SO_ATTACH_BPF",
  102. "SO_DETACH_BPF",
  103. // BTF
  104. "BTF_INT_.*",
  105. "BTF_KIND_.*",
  106. // PERF
  107. "PERF_FLAG_.*",
  108. "PERF_EVENT_.*",
  109. "PERF_MAX_.*",
  110. // see linux_wrapper.h, these are to workaround the IOC macros
  111. "AYA_PERF_EVENT_.*",
  112. // NETLINK
  113. "NLMSG_ALIGNTO",
  114. "IFLA_XDP_FD",
  115. "TCA_KIND",
  116. "TCA_OPTIONS",
  117. "TCA_BPF_FD",
  118. "TCA_BPF_NAME",
  119. "TCA_BPF_FLAGS",
  120. "TCA_BPF_FLAG_ACT_DIRECT",
  121. "XDP_FLAGS_.*",
  122. "TC_H_MAJ_MASK",
  123. "TC_H_MIN_MASK",
  124. "TC_H_UNSPEC",
  125. "TC_H_ROOT",
  126. "TC_H_INGRESS",
  127. "TC_H_CLSACT",
  128. "TC_H_MIN_PRIORITY",
  129. "TC_H_MIN_INGRESS",
  130. "TC_H_MIN_EGRESS",
  131. ];
  132. let dir = PathBuf::from("aya");
  133. let generated = dir.join("src/generated");
  134. let builder = || {
  135. bindgen::user_builder()
  136. .header(dir.join("include/linux_wrapper.h").to_string_lossy())
  137. .clang_args(&[
  138. "-I",
  139. &*opts.libbpf_dir.join("include/uapi").to_string_lossy(),
  140. ])
  141. .clang_args(&["-I", &*opts.libbpf_dir.join("include").to_string_lossy()])
  142. };
  143. for arch in Architecture::supported() {
  144. let mut bindgen = builder();
  145. for x in &types {
  146. bindgen = bindgen.allowlist_type(x);
  147. }
  148. for x in &vars {
  149. bindgen = bindgen.allowlist_var(x).constified_enum("BTF_KIND_.*");
  150. }
  151. // FIXME: this stuff is probably debian/ubuntu specific
  152. match arch {
  153. Architecture::X86_64 => {
  154. bindgen = bindgen.clang_args(&["-I", "/usr/include/x86_64-linux-gnu"]);
  155. }
  156. Architecture::ARMv7 => {
  157. bindgen = bindgen.clang_args(&["-I", "/usr/arm-linux-gnueabi/include"]);
  158. }
  159. Architecture::AArch64 => {
  160. bindgen = bindgen.clang_args(&["-I", "/usr/aarch64-linux-gnu/include"]);
  161. }
  162. };
  163. for x in &types {
  164. bindgen = bindgen.allowlist_type(x);
  165. }
  166. for x in &vars {
  167. bindgen = bindgen.allowlist_var(x);
  168. }
  169. let bindings = bindgen
  170. .generate()
  171. .map_err(|_| anyhow!("bindgen failed"))?
  172. .to_string();
  173. // write the bindings, with the original helpers removed
  174. write_to_file(
  175. &generated.join(format!("linux_bindings_{}.rs", arch)),
  176. &bindings.to_string(),
  177. )?;
  178. }
  179. Ok(())
  180. }