From 3ff609114e9be9ba029072bd9d86ef48beb03b9c Mon Sep 17 00:00:00 2001 From: Ishan Jain Date: Sun, 8 Jan 2023 14:38:59 +0530 Subject: [PATCH 1/4] feat(aya): Added MIPS bindings Updated `aya-obj/src/generated/mod.rs` and `bpf/aya-bpf-bindings/src/lib.rs to use the mips bindings. --- aya-obj/src/generated/mod.rs | 4 ++++ ebpf/aya-ebpf-bindings/build.rs | 2 +- ebpf/aya-ebpf-bindings/src/lib.rs | 5 +++++ ebpf/aya-ebpf-bindings/src/mips/mod.rs | 3 +++ 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 ebpf/aya-ebpf-bindings/src/mips/mod.rs diff --git a/aya-obj/src/generated/mod.rs b/aya-obj/src/generated/mod.rs index bbb693b3..809c3313 100644 --- a/aya-obj/src/generated/mod.rs +++ b/aya-obj/src/generated/mod.rs @@ -13,6 +13,8 @@ mod btf_internal_bindings; mod linux_bindings_aarch64; #[cfg(target_arch = "arm")] mod linux_bindings_armv7; +#[cfg(target_arch = "mips")] +mod linux_bindings_mips; #[cfg(target_arch = "powerpc64")] mod linux_bindings_powerpc64; #[cfg(target_arch = "riscv64")] @@ -29,6 +31,8 @@ pub use btf_internal_bindings::{bpf_core_relo, bpf_core_relo_kind, btf_ext_heade pub use linux_bindings_aarch64::*; #[cfg(target_arch = "arm")] pub use linux_bindings_armv7::*; +#[cfg(target_arch = "mips")] +pub use linux_bindings_mips::*; #[cfg(target_arch = "powerpc64")] pub use linux_bindings_powerpc64::*; #[cfg(target_arch = "riscv64")] diff --git a/ebpf/aya-ebpf-bindings/build.rs b/ebpf/aya-ebpf-bindings/build.rs index f61e0146..720e89da 100644 --- a/ebpf/aya-ebpf-bindings/build.rs +++ b/ebpf/aya-ebpf-bindings/build.rs @@ -12,5 +12,5 @@ fn main() { } println!("cargo:rustc-cfg=bpf_target_arch=\"{arch}\""); } - println!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(\"x86_64\",\"arm\",\"aarch64\",\"riscv64\",\"powerpc64\",\"s390x\"))"); + println!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(\"x86_64\",\"arm\",\"aarch64\",\"riscv64\",\"powerpc64\",\"s390x\",\"mips\"))"); } diff --git a/ebpf/aya-ebpf-bindings/src/lib.rs b/ebpf/aya-ebpf-bindings/src/lib.rs index 0add58d9..90c24f46 100644 --- a/ebpf/aya-ebpf-bindings/src/lib.rs +++ b/ebpf/aya-ebpf-bindings/src/lib.rs @@ -20,11 +20,16 @@ mod powerpc64; #[cfg(bpf_target_arch = "s390x")] mod s390x; +#[cfg(bpf_target_arch = "mips")] +mod mips; + mod gen { #[cfg(bpf_target_arch = "aarch64")] pub use super::aarch64::*; #[cfg(bpf_target_arch = "arm")] pub use super::armv7::*; + #[cfg(bpf_target_arch = "mips")] + pub use super::mips::*; #[cfg(bpf_target_arch = "powerpc64")] pub use super::powerpc64::*; #[cfg(bpf_target_arch = "riscv64")] diff --git a/ebpf/aya-ebpf-bindings/src/mips/mod.rs b/ebpf/aya-ebpf-bindings/src/mips/mod.rs new file mode 100644 index 00000000..226884ea --- /dev/null +++ b/ebpf/aya-ebpf-bindings/src/mips/mod.rs @@ -0,0 +1,3 @@ +#![allow(clippy::all, dead_code)] +pub mod bindings; +pub mod helpers; From 1ccac3c135f280eead50ff18cd4c4340001018c6 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Fri, 31 Jan 2025 18:04:54 +0000 Subject: [PATCH 2/4] feat(ebpf): Implement FromPtRegs for mips Signed-off-by: Dave Tucker --- ebpf/aya-ebpf/build.rs | 2 +- ebpf/aya-ebpf/src/args.rs | 50 +++++++++++++++++++++++++- ebpf/aya-ebpf/src/programs/probe.rs | 3 +- ebpf/aya-ebpf/src/programs/retprobe.rs | 3 +- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/ebpf/aya-ebpf/build.rs b/ebpf/aya-ebpf/build.rs index fbbdc19f..d5033614 100644 --- a/ebpf/aya-ebpf/build.rs +++ b/ebpf/aya-ebpf/build.rs @@ -13,7 +13,7 @@ fn main() { } println!("cargo:rustc-cfg=bpf_target_arch=\"{arch}\""); } - println!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(\"x86_64\",\"arm\",\"aarch64\",\"riscv64\",\"powerpc64\",\"s390x\"))"); + println!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(\"x86_64\",\"arm\",\"aarch64\",\"riscv64\",\"powerpc64\",\"s390x\",\"mips\"))"); println!("cargo::rustc-check-cfg=cfg(unstable)"); } diff --git a/ebpf/aya-ebpf/src/args.rs b/ebpf/aya-ebpf/src/args.rs index 9d8cbddc..d7c4793e 100644 --- a/ebpf/aya-ebpf/src/args.rs +++ b/ebpf/aya-ebpf/src/args.rs @@ -1,7 +1,8 @@ #[cfg(any( bpf_target_arch = "x86_64", bpf_target_arch = "arm", - bpf_target_arch = "powerpc64" + bpf_target_arch = "powerpc64", + bpf_target_arch = "mips", ))] use crate::bindings::pt_regs; // aarch64 uses user_pt_regs instead of pt_regs @@ -203,6 +204,22 @@ impl FromPtRegs for *const T { } } +#[cfg(bpf_target_arch = "mips")] +impl FromPtRegs for *const T { + fn from_argument(ctx: &pt_regs, n: usize) -> Option { + // Assume N64 ABI like libbpf does. + if n <= 7 { + unsafe { bpf_probe_read(&ctx.regs[n + 4]).map(|v| v as *const _).ok() } + } else { + None + } + } + + fn from_retval(ctx: &pt_regs) -> Option { + unsafe { bpf_probe_read(&ctx.regs[31]).map(|v| v as *const _).ok() } + } +} + #[cfg(bpf_target_arch = "x86_64")] impl FromPtRegs for *mut T { fn from_argument(ctx: &pt_regs, n: usize) -> Option { @@ -303,6 +320,22 @@ impl FromPtRegs for *mut T { } } +#[cfg(bpf_target_arch = "mips")] +impl FromPtRegs for *mut T { + fn from_argument(ctx: &pt_regs, n: usize) -> Option { + // Assume N64 ABI like libbpf does. + if n <= 7 { + unsafe { bpf_probe_read(&ctx.regs[n + 4]).map(|v| v as *mut _).ok() } + } else { + None + } + } + + fn from_retval(ctx: &pt_regs) -> Option { + unsafe { bpf_probe_read(&ctx.regs[31]).map(|v| v as *mut _).ok() } + } +} + /// Helper macro to implement [`FromPtRegs`] for a primitive type. macro_rules! impl_from_pt_regs { ($type:ident) => { @@ -405,6 +438,21 @@ macro_rules! impl_from_pt_regs { Some(ctx.gprs[2] as *const $type as _) } } + + #[cfg(bpf_target_arch = "mips")] + impl FromPtRegs for $type { + fn from_argument(ctx: &pt_regs, n: usize) -> Option { + if n <= 7 { + Some(ctx.regs[n + 4] as *const $type as _) + } else { + None + } + } + + fn from_retval(ctx: &pt_regs) -> Option { + Some(ctx.regs[31] as *const $type as _) + } + } }; } diff --git a/ebpf/aya-ebpf/src/programs/probe.rs b/ebpf/aya-ebpf/src/programs/probe.rs index 8507c0be..a2932e68 100644 --- a/ebpf/aya-ebpf/src/programs/probe.rs +++ b/ebpf/aya-ebpf/src/programs/probe.rs @@ -3,7 +3,8 @@ use core::ffi::c_void; #[cfg(any( bpf_target_arch = "x86_64", bpf_target_arch = "arm", - bpf_target_arch = "powerpc64" + bpf_target_arch = "powerpc64", + bpf_target_arch = "mips" ))] use crate::bindings::pt_regs; // aarch64 uses user_pt_regs instead of pt_regs diff --git a/ebpf/aya-ebpf/src/programs/retprobe.rs b/ebpf/aya-ebpf/src/programs/retprobe.rs index f271473b..0b6f3e57 100644 --- a/ebpf/aya-ebpf/src/programs/retprobe.rs +++ b/ebpf/aya-ebpf/src/programs/retprobe.rs @@ -3,7 +3,8 @@ use core::ffi::c_void; #[cfg(any( bpf_target_arch = "x86_64", bpf_target_arch = "arm", - bpf_target_arch = "powerpc64" + bpf_target_arch = "powerpc64", + bpf_target_arch = "mips" ))] use crate::bindings::pt_regs; // aarch64 uses user_pt_regs instead of pt_regs From 1495a93c45403550d6a1c9f21f3f3e24da1398a5 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Fri, 31 Jan 2025 18:08:20 +0000 Subject: [PATCH 3/4] ci: Include mips architecture in tests Signed-off-by: Dave Tucker --- .cargo/config.toml | 3 +++ .github/workflows/ci.yml | 2 ++ Cargo.toml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 674071ff..a21a5f44 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -15,3 +15,6 @@ linker = "powerpc64le-linux-gnu-gcc" [target.s390x-unknown-linux-gnu] linker = "s390x-linux-gnu-gcc" + +[target.mips-unknown-linux-gnu] +linker = "mips-linux-gnu-gcc" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index efbd8950..dd8942eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,6 +83,7 @@ jobs: - riscv64gc-unknown-linux-gnu - powerpc64le-unknown-linux-gnu - s390x-unknown-linux-gnu + - mips-unknown-linux-gnu runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -141,6 +142,7 @@ jobs: - riscv64 - powerpc64 - s390x + - mips target: - bpfel-unknown-none - bpfeb-unknown-none diff --git a/Cargo.toml b/Cargo.toml index ae881f36..6809beaa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,7 @@ default-members = [ # ebpf crates are omitted; they must be built with: # --target bpfe{b,l}-unknown-none - # CARGO_CFG_BPF_TARGET_ARCH={x86_64,aarch64,arm,riscv64,powerpc64,s390x} + # CARGO_CFG_BPF_TARGET_ARCH={x86_64,aarch64,arm,riscv64,powerpc64,s390x,mips} ] [workspace.package] From 2eaae09c31add79103331aa551e8f74de86cd037 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Fri, 31 Jan 2025 18:23:54 +0000 Subject: [PATCH 4/4] chore(aya-ebpf-cty): Add mips support Signed-off-by: Dave Tucker --- ebpf/aya-ebpf-cty/build.rs | 2 +- ebpf/aya-ebpf-cty/src/lib.rs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ebpf/aya-ebpf-cty/build.rs b/ebpf/aya-ebpf-cty/build.rs index 9567a0dc..7272a315 100644 --- a/ebpf/aya-ebpf-cty/build.rs +++ b/ebpf/aya-ebpf-cty/build.rs @@ -12,6 +12,6 @@ fn main() { } println!("cargo:rustc-cfg=bpf_target_arch=\"{arch}\""); } - println!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(\"x86_64\",\"arm\",\"aarch64\",\"riscv64\",\"powerpc64\",\"s390x\"))"); + println!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(\"x86_64\",\"arm\",\"aarch64\",\"riscv64\",\"powerpc64\",\"s390x\",\"mips\"))"); println!("cargo::rustc-check-cfg=cfg(target_arch, values(\"asmjs\",\"nvptx\",\"xtensa\"))"); } diff --git a/ebpf/aya-ebpf-cty/src/lib.rs b/ebpf/aya-ebpf-cty/src/lib.rs index d25b8505..6b0dd37d 100644 --- a/ebpf/aya-ebpf-cty/src/lib.rs +++ b/ebpf/aya-ebpf-cty/src/lib.rs @@ -33,6 +33,9 @@ mod ad { #[cfg(bpf_target_arch = "s390x")] pub type c_char = super::c_uchar; + #[cfg(bpf_target_arch = "mips")] + pub type c_char = super::c_uchar; + #[cfg(bpf_target_arch = "x86_64")] pub type c_char = super::c_schar; }