From c0f82ef9d37e7f343a3c4971d5166d0c6599db4c Mon Sep 17 00:00:00 2001 From: Ishan Jain Date: Sun, 8 Jan 2023 14:38:59 +0530 Subject: [PATCH] Added MIPS bindings 1. Updated xtask scripts to generated bindings for MIPS alongside other architectures. 2. Updated `aya-obj/src/generated/mod.rs` and `bpf/aya-bpf-bindings/src/lib.rs` to use the mips bindings. 3. Update `write_to_file` method to create parent directories if they don't exist already. --- aya-obj/src/generated/mod.rs | 5 +++++ aya-tool/src/lib.rs | 9 ++++++++- bpf/aya-bpf-bindings/src/lib.rs | 6 ++++++ xtask/src/codegen/aya.rs | 2 ++ xtask/src/codegen/aya_bpf_bindings.rs | 3 +++ xtask/src/codegen/mod.rs | 7 +++++++ 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/aya-obj/src/generated/mod.rs b/aya-obj/src/generated/mod.rs index 0a64f088..c10f924e 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 = "riscv64")] mod linux_bindings_riscv64; #[cfg(target_arch = "x86_64")] @@ -31,3 +33,6 @@ pub use linux_bindings_aarch64::*; #[cfg(target_arch = "riscv64")] pub use linux_bindings_riscv64::*; + +#[cfg(target_arch = "mips")] +pub use linux_bindings_mips::*; diff --git a/aya-tool/src/lib.rs b/aya-tool/src/lib.rs index c220e524..91bf6885 100644 --- a/aya-tool/src/lib.rs +++ b/aya-tool/src/lib.rs @@ -1,5 +1,5 @@ use std::{ - fs::File, + fs::{create_dir_all, File}, io::{self, Write}, path::Path, }; @@ -11,6 +11,13 @@ pub mod rustfmt; pub use generate::{generate, InputFile}; pub fn write_to_file>(path: T, code: &str) -> Result<(), io::Error> { + // Create parent directories if they don't exist already + if let Some(parent) = path.as_ref().parent() { + if !parent.exists() { + create_dir_all(parent)?; + } + } + let mut file = File::create(path)?; file.write_all(code.as_bytes()) } diff --git a/bpf/aya-bpf-bindings/src/lib.rs b/bpf/aya-bpf-bindings/src/lib.rs index 1528e4f8..aa856809 100644 --- a/bpf/aya-bpf-bindings/src/lib.rs +++ b/bpf/aya-bpf-bindings/src/lib.rs @@ -13,6 +13,9 @@ mod aarch64; #[cfg(bpf_target_arch = "riscv64")] mod riscv64; +#[cfg(bpf_target_arch = "mips")] +mod mips; + mod gen { #[cfg(bpf_target_arch = "x86_64")] pub use super::x86_64::*; @@ -25,6 +28,9 @@ mod gen { #[cfg(bpf_target_arch = "riscv64")] pub use super::riscv64::*; + + #[cfg(bpf_target_arch = "mips")] + pub use super::mips::*; } pub use gen::helpers; diff --git a/xtask/src/codegen/aya.rs b/xtask/src/codegen/aya.rs index 6628e772..6b3a8fa6 100644 --- a/xtask/src/codegen/aya.rs +++ b/xtask/src/codegen/aya.rs @@ -173,6 +173,7 @@ fn codegen_bindings(opts: &Options) -> Result<(), anyhow::Error> { // Set target triple. This will set the right flags (which you can see // running clang -target=X -E - -dM "mips-unknown-linux-gnu", Architecture::X86_64 => "x86_64-unknown-linux-gnu", Architecture::ARMv7 => "armv7-unknown-linux-gnu", Architecture::AArch64 => "aarch64-unknown-linux-gnu", @@ -183,6 +184,7 @@ fn codegen_bindings(opts: &Options) -> Result<(), anyhow::Error> { // Set the sysroot. This is needed to ensure that the correct arch // specific headers are imported. let sysroot = match arch { + Architecture::Mips => &opts.mips_sysroot, Architecture::X86_64 => &opts.x86_64_sysroot, Architecture::ARMv7 => &opts.armv7_sysroot, Architecture::AArch64 => &opts.aarch64_sysroot, diff --git a/xtask/src/codegen/aya_bpf_bindings.rs b/xtask/src/codegen/aya_bpf_bindings.rs index bcd7d44c..3c3e71d3 100644 --- a/xtask/src/codegen/aya_bpf_bindings.rs +++ b/xtask/src/codegen/aya_bpf_bindings.rs @@ -71,6 +71,7 @@ pub fn codegen(opts: &Options) -> Result<(), anyhow::Error> { // Set target triple. This will set the right flags (which you can see // running clang -target=X -E - -dM "mips-unknown-linux-gnu", Architecture::X86_64 => "x86_64-unknown-linux-gnu", Architecture::ARMv7 => "armv7-unknown-linux-gnu", Architecture::AArch64 => "aarch64-unknown-linux-gnu", @@ -81,6 +82,7 @@ pub fn codegen(opts: &Options) -> Result<(), anyhow::Error> { // Set the sysroot. This is needed to ensure that the correct arch // specific headers are imported. let sysroot = match arch { + Architecture::Mips => &opts.mips_sysroot, Architecture::X86_64 => &opts.x86_64_sysroot, Architecture::ARMv7 => &opts.armv7_sysroot, Architecture::AArch64 => &opts.aarch64_sysroot, @@ -94,6 +96,7 @@ pub fn codegen(opts: &Options) -> Result<(), anyhow::Error> { .to_string(); let mut tree = parse_str::(&bindings).unwrap(); + let (indexes, helpers) = extract_helpers(&tree.items); let helpers = expand_helpers(&helpers); for index in indexes { diff --git a/xtask/src/codegen/mod.rs b/xtask/src/codegen/mod.rs index ab3fa96f..bbd4d139 100644 --- a/xtask/src/codegen/mod.rs +++ b/xtask/src/codegen/mod.rs @@ -7,6 +7,7 @@ use std::path::PathBuf; use clap::Parser; const SUPPORTED_ARCHS: &[Architecture] = &[ + Architecture::Mips, Architecture::X86_64, Architecture::ARMv7, Architecture::AArch64, @@ -19,6 +20,7 @@ pub enum Architecture { ARMv7, AArch64, RISCV64, + Mips, } impl Architecture { @@ -32,6 +34,7 @@ impl std::str::FromStr for Architecture { fn from_str(s: &str) -> Result { Ok(match s { + "mips" => Architecture::Mips, "x86_64" => Architecture::X86_64, "armv7" => Architecture::ARMv7, "aarch64" => Architecture::AArch64, @@ -44,6 +47,7 @@ impl std::str::FromStr for Architecture { impl std::fmt::Display for Architecture { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(match self { + Architecture::Mips => "mips", Architecture::X86_64 => "x86_64", Architecture::ARMv7 => "armv7", Architecture::AArch64 => "aarch64", @@ -71,6 +75,9 @@ pub struct Options { #[arg(long, default_value = "/usr/riscv64-linux-gnu/include", action)] riscv64_sysroot: PathBuf, + #[arg(long, default_value = "/usr/mips-linux-gnu/include", action)] + mips_sysroot: PathBuf, + #[command(subcommand)] command: Option, }