rust/kernel/bitfield.rs

Source file repositories/reference/linux-study-clean/rust/kernel/bitfield.rs

File Facts

System
Linux kernel
Corpus path
rust/kernel/bitfield.rs
Extension
.rs
Size
27699 bytes
Lines
863
Domain
Rust Kernel Layer
Bucket
Rust API Membrane
Inferred role
Rust Kernel Layer: implementation source
Status
source implementation candidate

Why This File Exists

Rust-side wrappers and abstractions around kernel C APIs, ownership contracts, allocation, synchronization, and module integration.

Dependency Surface

Detected Declarations

Annotated Snippet

struct TestU64(u64) {
            63:63     field_63;
            61:52     field_61_52;
            51:16     field_51_16;
            15:12     field_15_12 ?=> MemoryType;
            11:9      field_11_9;
            1:1       field_1;
            0:0       field_0;
        }
    }

    bitfield! {
        struct TestU16(u16) {
            15:8      field_15_8;
            7:4       field_7_4; // Partial overlap with `field_5_4`.
            5:4       field_5_4 => Priority;
            3:1       field_3_1;
            0:0       field_0;
        }
    }

    bitfield! {
        struct TestU8(u8) {
            7:0       field_7_0; // Full byte overlap.
            7:4       field_7_4;
            3:2       field_3_2;
            1:1       field_1;
            0:0       field_0;
        }
    }

    // Single and multi-bit fields basic access.
    #[test]
    fn test_basic_access() {
        // `TestU64`.
        let mut val = TestU64::zeroed();
        assert_eq!(val.into_raw(), 0x0);

        val = val.with_field_0(true);
        assert!(val.field_0().into_bool());
        assert_eq!(val.into_raw(), 0x1);

        val = val.with_field_1(true);
        assert!(val.field_1().into_bool());
        val = val.with_field_1(false);
        assert!(!val.field_1().into_bool());
        assert_eq!(val.into_raw(), 0x1);

        val = val.with_const_field_11_9::<0x5>();
        assert_eq!(val.field_11_9(), 0x5);
        assert_eq!(val.into_raw(), 0xA01);

        val = val.with_const_field_51_16::<0x123456>();
        assert_eq!(val.field_51_16(), 0x123456);
        assert_eq!(val.into_raw(), 0x0012_3456_0A01);

        const MAX_FIELD_51_16: u64 = ::kernel::bits::genmask_u64(0..=35);
        val = val.with_const_field_51_16::<{ MAX_FIELD_51_16 }>();
        assert_eq!(val.field_51_16(), MAX_FIELD_51_16);

        val = val.with_const_field_61_52::<0x3FF>();
        assert_eq!(val.field_61_52(), 0x3FF);

        val = val.with_field_63(true);
        assert!(val.field_63().into_bool());

        // `TestU16`.
        let mut val = TestU16::zeroed();
        assert_eq!(val.into_raw(), 0x0);

        val = val.with_field_0(true);
        assert!(val.field_0().into_bool());
        assert_eq!(val.into_raw(), 0x1);

        val = val.with_const_field_3_1::<0x5>();
        assert_eq!(val.field_3_1(), 0x5);
        assert_eq!(val.into_raw(), 0xB);

        val = val.with_const_field_7_4::<0xA>();
        assert_eq!(val.field_7_4(), 0xA);
        assert_eq!(val.into_raw(), 0xAB);

        val = val.with_const_field_15_8::<0x42>();
        assert_eq!(val.field_15_8(), 0x42);
        assert_eq!(val.into_raw(), 0x42AB);

        // `TestU8`.
        let mut val = TestU8::zeroed();
        assert_eq!(val.into_raw(), 0x0);

Annotation

Implementation Notes