From 4a80f0e5eb577fb01e2147dcf4ebc1e21c60699a Mon Sep 17 00:00:00 2001 From: jiangjianfeng Date: Tue, 27 Jan 2026 08:35:10 +0000 Subject: [PATCH] Replace Pod with zerocopy-backed Pod --- Cargo.lock | 67 +++++--------- Cargo.toml | 7 +- kernel/Cargo.toml | 2 + kernel/comps/block/Cargo.toml | 2 + kernel/comps/block/src/id.rs | 2 +- kernel/comps/block/src/lib.rs | 2 + kernel/comps/block/src/partition.rs | 3 +- kernel/comps/input/Cargo.toml | 2 + kernel/comps/input/src/input_dev.rs | 5 +- kernel/comps/input/src/lib.rs | 2 + kernel/comps/mlsdisk/Cargo.toml | 2 + .../src/layers/1-crypto/crypto_blob.rs | 2 +- .../src/layers/1-crypto/crypto_chain.rs | 2 +- .../mlsdisk/src/layers/1-crypto/crypto_log.rs | 13 ++- .../mlsdisk/src/layers/2-edit/journal.rs | 2 +- .../comps/mlsdisk/src/layers/3-log/tx_log.rs | 2 +- .../mlsdisk/src/layers/4-lsm/mem_table.rs | 4 +- .../comps/mlsdisk/src/layers/4-lsm/sstable.rs | 6 +- .../mlsdisk/src/layers/4-lsm/tx_lsm_tree.rs | 2 +- kernel/comps/mlsdisk/src/layers/4-lsm/wal.rs | 2 +- .../mlsdisk/src/layers/5-disk/block_alloc.rs | 2 +- .../mlsdisk/src/layers/5-disk/mlsdisk.rs | 6 +- kernel/comps/mlsdisk/src/lib.rs | 2 + kernel/comps/mlsdisk/src/os/mod.rs | 2 +- kernel/comps/network/Cargo.toml | 2 + kernel/comps/network/src/buffer.rs | 2 +- kernel/comps/network/src/lib.rs | 4 +- kernel/comps/virtio/Cargo.toml | 2 + .../comps/virtio/src/device/block/device.rs | 1 - kernel/comps/virtio/src/device/block/mod.rs | 7 +- .../comps/virtio/src/device/console/config.rs | 4 +- .../comps/virtio/src/device/input/device.rs | 2 +- kernel/comps/virtio/src/device/input/mod.rs | 2 +- .../comps/virtio/src/device/network/config.rs | 4 +- .../comps/virtio/src/device/network/header.rs | 1 - .../comps/virtio/src/device/socket/config.rs | 2 +- .../comps/virtio/src/device/socket/device.rs | 3 +- .../comps/virtio/src/device/socket/header.rs | 1 - kernel/comps/virtio/src/device/socket/mod.rs | 1 - kernel/comps/virtio/src/lib.rs | 4 +- kernel/comps/virtio/src/queue.rs | 6 +- .../comps/virtio/src/transport/mmio/layout.rs | 2 - kernel/comps/virtio/src/transport/mod.rs | 2 +- .../virtio/src/transport/pci/common_cfg.rs | 2 +- kernel/libs/aster-util/Cargo.toml | 2 + kernel/libs/aster-util/src/lib.rs | 1 - kernel/libs/aster-util/src/printer.rs | 9 +- kernel/libs/aster-util/src/safe_ptr.rs | 3 +- kernel/libs/aster-util/src/union_read_ptr.rs | 39 --------- kernel/src/arch/loongarch/cpu.rs | 2 +- kernel/src/arch/riscv/cpu.rs | 1 - kernel/src/arch/x86/cpu.rs | 1 - kernel/src/device/evdev/file.rs | 1 - kernel/src/device/fb.rs | 6 +- kernel/src/device/tty/mod.rs | 1 + kernel/src/device/tty/termio.rs | 3 +- kernel/src/fs/configfs/test.rs | 16 ++-- kernel/src/fs/exfat/super_block.rs | 2 - kernel/src/fs/ext2/block_ptr.rs | 2 +- kernel/src/fs/ext2/inode.rs | 2 +- kernel/src/fs/ext2/super_block.rs | 4 +- kernel/src/ipc/semaphore/system_v/sem_set.rs | 18 +++- kernel/src/lib.rs | 4 +- kernel/src/net/socket/netlink/table/mod.rs | 2 +- kernel/src/prelude.rs | 2 +- kernel/src/process/process_vm/heap.rs | 2 +- .../src/process/process_vm/init_stack/mod.rs | 2 +- .../process/program_loader/elf/load_elf.rs | 2 +- kernel/src/process/signal/c_types.rs | 87 ++++++++++++------- kernel/src/process/signal/sig_action.rs | 3 + kernel/src/process/signal/sig_stack.rs | 1 + kernel/src/syscall/epoll.rs | 5 +- kernel/src/syscall/fcntl.rs | 1 + kernel/src/syscall/sendmmsg.rs | 1 + kernel/src/syscall/sigaltstack.rs | 1 + kernel/src/syscall/sysinfo.rs | 3 +- kernel/src/util/copy_compact.rs | 4 +- kernel/src/util/iovec.rs | 2 +- kernel/src/util/net/addr/family.rs | 2 +- kernel/src/util/net/addr/unix.rs | 2 +- kernel/src/util/net/socket.rs | 1 + kernel/src/vdso.rs | 3 +- ostd/Cargo.toml | 1 + ostd/libs/linux-bzimage/builder/Cargo.toml | 3 +- ostd/libs/linux-bzimage/builder/src/lib.rs | 3 + .../linux-bzimage/builder/src/pe_header.rs | 20 ++--- ostd/libs/ostd-pod/Cargo.toml | 3 +- ostd/libs/ostd-pod/macros/src/pod_derive.rs | 2 +- ostd/src/arch/loongarch/mm/mod.rs | 15 ++-- ostd/src/arch/riscv/cpu/context.rs | 12 ++- ostd/src/arch/riscv/mm/mod.rs | 1 - ostd/src/arch/x86/cpu/context/mod.rs | 4 +- .../x86/iommu/dma_remapping/context_table.rs | 1 - .../x86/iommu/dma_remapping/second_stage.rs | 11 +-- ostd/src/arch/x86/kernel/acpi/remapping.rs | 1 + ostd/src/arch/x86/mm/mod.rs | 15 ++-- ostd/src/lib.rs | 3 +- ostd/src/mm/io.rs | 6 +- ostd/src/mm/page_table/boot_pt.rs | 2 +- ostd/src/mm/page_table/mod.rs | 3 +- ostd/src/mm/page_table/node/child.rs | 2 +- ostd/src/mm/page_table/test.rs | 2 + ostd/src/mm/test.rs | 6 +- ostd/src/util/id_set.rs | 1 - 104 files changed, 288 insertions(+), 269 deletions(-) delete mode 100644 kernel/libs/aster-util/src/union_read_ptr.rs diff --git a/Cargo.lock b/Cargo.lock index c1a52a15c..4efcb4046 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,7 +103,9 @@ dependencies = [ "int-to-c-enum", "log", "ostd", + "ostd-pod", "spin", + "zerocopy", ] [[package]] @@ -161,7 +163,9 @@ dependencies = [ "component", "log", "ostd", + "ostd-pod", "spin", + "zerocopy", ] [[package]] @@ -214,6 +218,7 @@ dependencies = [ "osdk-frame-allocator", "osdk-heap-allocator", "ostd", + "ostd-pod", "paste", "rand", "riscv", @@ -225,6 +230,7 @@ dependencies = [ "typeflags-util", "xarray", "xmas-elf", + "zerocopy", ] [[package]] @@ -254,8 +260,10 @@ dependencies = [ "log", "lru", "ostd", + "ostd-pod", "postcard", "serde", + "zerocopy", ] [[package]] @@ -267,7 +275,9 @@ dependencies = [ "bitvec", "component", "ostd", + "ostd-pod", "spin", + "zerocopy", ] [[package]] @@ -363,6 +373,7 @@ dependencies = [ "ostd", "ostd-pod", "typeflags-util", + "zerocopy", ] [[package]] @@ -386,9 +397,11 @@ dependencies = [ "int-to-c-enum", "log", "ostd", + "ostd-pod", "spin", "tdx-guest", "typeflags-util", + "zerocopy", ] [[package]] @@ -451,26 +464,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "bytemuck" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "byteorder" version = "1.5.0" @@ -1113,10 +1106,11 @@ version = "0.17.0" dependencies = [ "align_ext", "bitflags 1.3.2", - "bytemuck", "libflate", + "ostd-pod", "serde", "xmas-elf", + "zerocopy", ] [[package]] @@ -1351,7 +1345,7 @@ dependencies = [ "multiboot2", "num-traits", "ostd-macros", - "ostd-pod 0.1.1", + "ostd-pod", "ostd-test", "riscv", "sbi-rt", @@ -1362,6 +1356,7 @@ dependencies = [ "volatile 0.6.1", "x86", "x86_64", + "zerocopy", ] [[package]] @@ -1376,38 +1371,22 @@ dependencies = [ [[package]] name = "ostd-pod" -version = "0.1.1" -source = "git+https://github.com/asterinas/ostd-pod?rev=c4644be#c4644be401cae1e046a810574078b64e35924f5f" -dependencies = [ - "ostd-pod-derive", -] - -[[package]] -name = "ostd-pod" -version = "0.1.2" +version = "0.4.0" dependencies = [ "ostd-pod-macros", "padding-struct", "zerocopy", ] -[[package]] -name = "ostd-pod-derive" -version = "0.1.1" -source = "git+https://github.com/asterinas/ostd-pod?rev=c4644be#c4644be401cae1e046a810574078b64e35924f5f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "ostd-pod-macros" -version = "0.1.2" +version = "0.4.0" dependencies = [ + "ostd-pod", "proc-macro2", "quote", "syn 2.0.101", + "zerocopy", ] [[package]] @@ -1422,12 +1401,12 @@ checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "padding-struct" -version = "0.1.0" +version = "0.2.0" dependencies = [ - "bytemuck", "proc-macro2", "quote", "syn 2.0.101", + "zerocopy", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 486523b74..8e54766bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,6 +91,7 @@ id-alloc = { path = "ostd/libs/id-alloc", version = "0.1.0" } int-to-c-enum = { path = "ostd/libs/int-to-c-enum", version = "0.1.0" } linux-boot-params = { version = "0.17.0", path = "ostd/libs/linux-bzimage/boot-params" } ostd-macros = { version = "0.17.0", path = "ostd/libs/ostd-macros" } +ostd-pod = { path = "ostd/libs/ostd-pod", version = "0.4.0" } ostd-test = { version = "0.17.0", path = "ostd/libs/ostd-test" } # Crates under kernel/comps @@ -135,16 +136,13 @@ osdk-heap-allocator = { path = "osdk/deps/heap-allocator" } # External dependencies only for unsafe crates (i.e., crates under ostd directory) bit_field = "0.10.1" -bytemuck = { version = "1.17.0", features = ["derive"] } gimli = { version = "0.28", default-features = false, features = ["read-core"] } minicov = "0.3" num-traits = { version = "0.2", default-features = false } -ostd-pod = { git = "https://github.com/asterinas/ostd-pod", rev = "c4644be", version = "0.1.1" } serde = { version = "1.0.192", default-features = false, features = ["alloc", "derive"] } smallvec = "1.13.2" uart_16550 = "0.3.0" volatile = "0.6.1" -zerocopy = { version = "0.8.34", features = [ "derive" ] } # External dependencies only for safe crates (i.e., crates under kernel or osdk/deps directories) # @@ -191,6 +189,9 @@ log = "0.4" rand = { version = "0.9.2", default-features = false } spin = "0.9.4" xmas-elf = "0.10.0" +# Note: when updating the zerocopy version, +# also update it in `ostd/libs/ostd-pod/README.md`. +zerocopy = { version = "0.8.34", features = [ "derive" ] } # Proc-macro dependencies proc-macro2 = { version = "1.0.95", features = ["span-locations"] } diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index ad07fb28f..1a94cca48 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -51,6 +51,7 @@ lru.workspace = true osdk-frame-allocator.workspace = true osdk-heap-allocator.workspace = true ostd.workspace = true +ostd-pod.workspace = true paste.workspace = true rand = { workspace = true, features = [ "small_rng", @@ -63,6 +64,7 @@ typeflags.workspace = true typeflags-util.workspace = true xarray.workspace = true xmas-elf.workspace = true +zerocopy.workspace = true [target.x86_64-unknown-none.dependencies] tdx-guest = { version = "0.2.4", optional = true } diff --git a/kernel/comps/block/Cargo.toml b/kernel/comps/block/Cargo.toml index 4d0efccc9..00221bdb3 100644 --- a/kernel/comps/block/Cargo.toml +++ b/kernel/comps/block/Cargo.toml @@ -15,7 +15,9 @@ id-alloc.workspace = true int-to-c-enum.workspace = true log.workspace = true ostd.workspace = true +ostd-pod.workspace = true spin.workspace = true +zerocopy.workspace = true [lints] workspace = true diff --git a/kernel/comps/block/src/id.rs b/kernel/comps/block/src/id.rs index 4838bf4e1..3ee151534 100644 --- a/kernel/comps/block/src/id.rs +++ b/kernel/comps/block/src/id.rs @@ -5,7 +5,7 @@ use core::{ ops::{Add, Sub}, }; -use ostd::{Pod, const_assert}; +use ostd::const_assert; /// The block index used in the filesystem. pub type Bid = BlockId; diff --git a/kernel/comps/block/src/lib.rs b/kernel/comps/block/src/lib.rs index 6e8da811b..45af35faf 100644 --- a/kernel/comps/block/src/lib.rs +++ b/kernel/comps/block/src/lib.rs @@ -31,6 +31,8 @@ #![feature(step_trait)] extern crate alloc; +#[macro_use] +extern crate ostd_pod; pub mod bio; mod device_id; diff --git a/kernel/comps/block/src/partition.rs b/kernel/comps/block/src/partition.rs index 2fa756c16..cec09c395 100644 --- a/kernel/comps/block/src/partition.rs +++ b/kernel/comps/block/src/partition.rs @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MPL-2.0 use device_id::DeviceId; -use ostd::{Pod, mm::VmIo}; +use ostd::mm::VmIo; +use ostd_pod::Pod; use crate::{ BlockDevice, BlockDeviceMeta, SECTOR_SIZE, diff --git a/kernel/comps/input/Cargo.toml b/kernel/comps/input/Cargo.toml index e9bb246f6..986152e79 100644 --- a/kernel/comps/input/Cargo.toml +++ b/kernel/comps/input/Cargo.toml @@ -11,7 +11,9 @@ bitflags.workspace = true bitvec.workspace = true log.workspace = true ostd.workspace = true +ostd-pod.workspace = true spin.workspace = true +zerocopy.workspace = true [lints] workspace = true diff --git a/kernel/comps/input/src/input_dev.rs b/kernel/comps/input/src/input_dev.rs index 41ea19b0d..bc1c668ef 100644 --- a/kernel/comps/input/src/input_dev.rs +++ b/kernel/comps/input/src/input_dev.rs @@ -3,10 +3,7 @@ use alloc::{sync::Arc, vec::Vec}; use core::{any::Any, fmt::Debug}; -use ostd::{ - Pod, - sync::{RwLock, WriteIrqDisabled}, -}; +use ostd::sync::{RwLock, WriteIrqDisabled}; use crate::{ event_type_codes::{EventTypes, KeyCode, KeyCodeSet, KeyStatus, RelCode, RelCodeSet, SynEvent}, diff --git a/kernel/comps/input/src/lib.rs b/kernel/comps/input/src/lib.rs index 623c62b84..f9d469ce0 100644 --- a/kernel/comps/input/src/lib.rs +++ b/kernel/comps/input/src/lib.rs @@ -35,6 +35,8 @@ #![deny(unsafe_code)] extern crate alloc; +#[macro_use] +extern crate ostd_pod; pub mod event_type_codes; mod input_core; diff --git a/kernel/comps/mlsdisk/Cargo.toml b/kernel/comps/mlsdisk/Cargo.toml index 665e8353f..488c05d24 100644 --- a/kernel/comps/mlsdisk/Cargo.toml +++ b/kernel/comps/mlsdisk/Cargo.toml @@ -18,8 +18,10 @@ lending-iterator.workspace = true lru.workspace = true log.workspace = true ostd.workspace = true +ostd-pod.workspace = true postcard.workspace = true serde.workspace = true +zerocopy.workspace = true [lints] workspace = true diff --git a/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_blob.rs b/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_blob.rs index 402b23caa..05510cbe4 100644 --- a/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_blob.rs +++ b/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_blob.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MPL-2.0 -use ostd::Pod; +use ostd_pod::{FromZeros, IntoBytes, Pod}; use super::{Iv, Key, Mac, VersionId}; use crate::{ diff --git a/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_chain.rs b/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_chain.rs index 64150e935..27ce80f62 100644 --- a/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_chain.rs +++ b/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_chain.rs @@ -3,7 +3,7 @@ use core::ops::Range; use lending_iterator::prelude::*; -use ostd::Pod; +use ostd_pod::{IntoBytes, Pod}; use super::{Iv, Key, Mac}; use crate::{ diff --git a/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_log.rs b/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_log.rs index 3dda304b4..ef5fd2447 100644 --- a/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_log.rs +++ b/kernel/comps/mlsdisk/src/layers/1-crypto/crypto_log.rs @@ -3,7 +3,8 @@ use alloc::vec; use core::any::Any; -use ostd::{Pod, const_assert}; +use ostd::const_assert; +use ostd_pod::{FromZeros, IntoBytes, Pod}; use serde::{Deserialize, Serialize}; use super::{Iv, Key, Mac}; @@ -111,6 +112,7 @@ pub struct RootMhtMeta { /// The Merkle-Hash Tree (MHT) node (internal). /// It contains a header for node metadata and a bunch of entries for managing children nodes. #[repr(C)] +#[padding_struct] #[derive(Clone, Copy, Pod)] struct MhtNode { header: MhtNodeHeader, @@ -120,7 +122,8 @@ const_assert!(size_of::() <= BLOCK_SIZE); /// The header contains metadata of the current MHT node. #[repr(C)] -#[derive(Clone, Copy, Debug, Pod)] +#[padding_struct] +#[derive(Clone, Copy, Debug, Pod, Default)] struct MhtNodeHeader { // The height of the MHT whose root is this node height: Height, @@ -262,7 +265,7 @@ impl CryptoLog { let data_nodes: Vec> = buf .iter() .map(|block_buf| { - let mut node = DataNode::new_uninit(); + let mut node = DataNode::new_zeroed(); node.0.copy_from_slice(block_buf.as_slice()); Arc::new(node) }) @@ -743,6 +746,7 @@ impl LevelBuilder { height: self.height, num_data_nodes: MhtNode::max_num_data_nodes(self.height) as _, num_valid_entries: MHT_NBRANCHES as _, + ..Default::default() }; for (i, entry) in mht_node.entries.iter_mut().enumerate() { *entry = *entries_per_node[i]; @@ -772,13 +776,14 @@ impl LevelBuilder { height: self.height, num_data_nodes: num_data_nodes as _, num_valid_entries: num_valid_entries as _, + ..Default::default() }; for (i, entry) in last_mht_node.entries.iter_mut().enumerate() { *entry = if i < num_valid_entries { *entries[i] } else { // Padding invalid entries to the rest - MhtNodeEntry::new_uninit() + MhtNodeEntry::new_zeroed() }; } diff --git a/kernel/comps/mlsdisk/src/layers/2-edit/journal.rs b/kernel/comps/mlsdisk/src/layers/2-edit/journal.rs index 2d174a4ac..2aca0e0d0 100644 --- a/kernel/comps/mlsdisk/src/layers/2-edit/journal.rs +++ b/kernel/comps/mlsdisk/src/layers/2-edit/journal.rs @@ -3,7 +3,7 @@ use core::marker::PhantomData; use lending_iterator::LendingIterator; -use ostd::Pod; +use ostd_pod::{IntoBytes, Pod}; use serde::{ Deserialize, Serialize, de::{VariantAccess, Visitor}, diff --git a/kernel/comps/mlsdisk/src/layers/3-log/tx_log.rs b/kernel/comps/mlsdisk/src/layers/3-log/tx_log.rs index 59c4b81a5..211f42c82 100644 --- a/kernel/comps/mlsdisk/src/layers/3-log/tx_log.rs +++ b/kernel/comps/mlsdisk/src/layers/3-log/tx_log.rs @@ -66,7 +66,7 @@ use core::{ }; use lru::LruCache; -use ostd::Pod; +use ostd_pod::{FromZeros, IntoBytes, Pod}; use serde::{Deserialize, Serialize}; use self::journaling::{AllEdit, AllState, Journal, JournalCompactPolicy}; diff --git a/kernel/comps/mlsdisk/src/layers/4-lsm/mem_table.rs b/kernel/comps/mlsdisk/src/layers/4-lsm/mem_table.rs index ec5b78893..2ff348208 100644 --- a/kernel/comps/mlsdisk/src/layers/4-lsm/mem_table.rs +++ b/kernel/comps/mlsdisk/src/layers/4-lsm/mem_table.rs @@ -243,7 +243,7 @@ impl, V: RecordValue> MemTable { // Insert an empty range upon first sync let _ = self .unsynced_range - .get_or_insert_with(|| K::new_uninit()..K::new_uninit()); + .get_or_insert_with(|| K::new_zeroed()..K::new_zeroed()); } /// Return the sync ID of this table. @@ -343,7 +343,7 @@ impl ValueEx { impl Default for ValueEx { fn default() -> Self { - Self::Unsynced(V::new_uninit()) + Self::Unsynced(V::new_zeroed()) } } diff --git a/kernel/comps/mlsdisk/src/layers/4-lsm/sstable.rs b/kernel/comps/mlsdisk/src/layers/4-lsm/sstable.rs index a2170b991..f26466781 100644 --- a/kernel/comps/mlsdisk/src/layers/4-lsm/sstable.rs +++ b/kernel/comps/mlsdisk/src/layers/4-lsm/sstable.rs @@ -5,7 +5,7 @@ use alloc::vec; use core::{marker::PhantomData, num::NonZeroUsize, ops::RangeInclusive}; use lru::LruCache; -use ostd::Pod; +use ostd_pod::{IntoBytes, Pod}; use super::{ RangeQueryCtx, RecordKey, RecordValue, SyncId, TxEventListener, mem_table::ValueEx, @@ -42,7 +42,8 @@ struct Footer { /// Footer metadata to describe a `SSTable`. #[repr(C)] -#[derive(Copy, Clone, Pod, Debug)] +#[padding_struct] +#[derive(Copy, Clone, Pod, Debug, Default)] struct FooterMeta { num_index: u16, index_nblocks: u16, @@ -486,6 +487,7 @@ impl, V: RecordValue> SSTable { total_records: total_records as _, record_block_size: RECORD_BLOCK_SIZE as _, sync_id, + ..Default::default() }; append_buf[footer_buf_len - FOOTER_META_SIZE..].copy_from_slice(meta.as_bytes()); tx_log.append(BufRef::try_from(&append_buf[..]).unwrap())?; diff --git a/kernel/comps/mlsdisk/src/layers/4-lsm/tx_lsm_tree.rs b/kernel/comps/mlsdisk/src/layers/4-lsm/tx_lsm_tree.rs index 8a18037bc..860778720 100644 --- a/kernel/comps/mlsdisk/src/layers/4-lsm/tx_lsm_tree.rs +++ b/kernel/comps/mlsdisk/src/layers/4-lsm/tx_lsm_tree.rs @@ -14,7 +14,7 @@ use core::{ sync::atomic::{AtomicU64, Ordering}, }; -use ostd::Pod; +use ostd_pod::Pod; use super::{ compaction::Compactor, diff --git a/kernel/comps/mlsdisk/src/layers/4-lsm/wal.rs b/kernel/comps/mlsdisk/src/layers/4-lsm/wal.rs index 6f288c725..65b106d68 100644 --- a/kernel/comps/mlsdisk/src/layers/4-lsm/wal.rs +++ b/kernel/comps/mlsdisk/src/layers/4-lsm/wal.rs @@ -4,7 +4,7 @@ use alloc::vec; use core::fmt::Debug; -use ostd::Pod; +use ostd_pod::Pod; use super::{AsKV, SyncId}; use crate::{ diff --git a/kernel/comps/mlsdisk/src/layers/5-disk/block_alloc.rs b/kernel/comps/mlsdisk/src/layers/5-disk/block_alloc.rs index e6bee9fc4..9d3da09c8 100644 --- a/kernel/comps/mlsdisk/src/layers/5-disk/block_alloc.rs +++ b/kernel/comps/mlsdisk/src/layers/5-disk/block_alloc.rs @@ -7,7 +7,7 @@ use core::{ sync::atomic::{AtomicBool, AtomicUsize, Ordering}, }; -use ostd::Pod; +use ostd_pod::{IntoBytes, Pod}; use serde::{Deserialize, Serialize}; use super::mlsdisk::Hba; diff --git a/kernel/comps/mlsdisk/src/layers/5-disk/mlsdisk.rs b/kernel/comps/mlsdisk/src/layers/5-disk/mlsdisk.rs index da72ad700..d40b375f2 100644 --- a/kernel/comps/mlsdisk/src/layers/5-disk/mlsdisk.rs +++ b/kernel/comps/mlsdisk/src/layers/5-disk/mlsdisk.rs @@ -16,10 +16,8 @@ use core::{ }; use device_id::DeviceId; -use ostd::{ - Pod, - mm::{HasSize, VmIo}, -}; +use ostd::mm::{HasSize, VmIo}; +use ostd_pod::{FromZeros, Pod}; use super::{ bio::{BioReq, BioReqQueue, BioResp, BioType}, diff --git a/kernel/comps/mlsdisk/src/lib.rs b/kernel/comps/mlsdisk/src/lib.rs index a946122dc..72a859dc6 100644 --- a/kernel/comps/mlsdisk/src/lib.rs +++ b/kernel/comps/mlsdisk/src/lib.rs @@ -14,6 +14,8 @@ mod tx; mod util; extern crate alloc; +#[macro_use] +extern crate ostd_pod; use alloc::{string::ToString, sync::Arc, vec}; use core::ops::Range; diff --git a/kernel/comps/mlsdisk/src/os/mod.rs b/kernel/comps/mlsdisk/src/os/mod.rs index 98ee7fa8a..45c326504 100644 --- a/kernel/comps/mlsdisk/src/os/mod.rs +++ b/kernel/comps/mlsdisk/src/os/mod.rs @@ -23,11 +23,11 @@ use ctr::cipher::{NewCipher, StreamCipher}; pub use hashbrown::{HashMap, HashSet}; pub use ostd::sync::{Mutex, MutexGuard, RwLock, SpinLock}; use ostd::{ - Pod, arch::read_random, sync::{self, PreemptDisabled, WaitQueue}, task::{Task, TaskOptions}, }; +use ostd_pod::{FromZeros, IntoBytes, Pod}; use serde::{Deserialize, Serialize}; use crate::{ diff --git a/kernel/comps/network/Cargo.toml b/kernel/comps/network/Cargo.toml index e3482ab06..a56949a03 100644 --- a/kernel/comps/network/Cargo.toml +++ b/kernel/comps/network/Cargo.toml @@ -11,7 +11,9 @@ aster-softirq.workspace = true bitvec.workspace = true component.workspace = true ostd.workspace = true +ostd-pod.workspace = true spin.workspace = true +zerocopy.workspace = true [lints] workspace = true diff --git a/kernel/comps/network/src/buffer.rs b/kernel/comps/network/src/buffer.rs index 4c5439572..efd53ffb9 100644 --- a/kernel/comps/network/src/buffer.rs +++ b/kernel/comps/network/src/buffer.rs @@ -4,7 +4,6 @@ use alloc::{collections::linked_list::LinkedList, sync::Arc}; use aster_softirq::BottomHalfDisabled; use ostd::{ - Pod, mm::{ Daddr, FrameAllocOptions, HasDaddr, HasSize, Infallible, PAGE_SIZE, VmReader, VmWriter, dma::{DmaStream, FromDevice, ToDevice}, @@ -12,6 +11,7 @@ use ostd::{ }, sync::SpinLock, }; +use ostd_pod::Pod; use spin::Once; use crate::dma_pool::{DmaPool, DmaSegment}; diff --git a/kernel/comps/network/src/lib.rs b/kernel/comps/network/src/lib.rs index 360f77181..8ce40822b 100644 --- a/kernel/comps/network/src/lib.rs +++ b/kernel/comps/network/src/lib.rs @@ -9,6 +9,8 @@ pub mod dma_pool; mod driver; extern crate alloc; +#[macro_use] +extern crate ostd_pod; use alloc::{collections::BTreeMap, string::String, sync::Arc, vec::Vec}; use core::{any::Any, fmt::Debug}; @@ -21,7 +23,7 @@ use aster_softirq::{ pub use buffer::{RX_BUFFER_POOL, RxBuffer, TX_BUFFER_LEN, TxBuffer}; use component::{ComponentInitError, init_component}; pub use dma_pool::DmaSegment; -use ostd::{Pod, sync::SpinLock}; +use ostd::sync::SpinLock; use spin::Once; #[derive(Debug, Clone, Copy, Pod)] diff --git a/kernel/comps/virtio/Cargo.toml b/kernel/comps/virtio/Cargo.toml index dfbb3aa51..943bc81d7 100644 --- a/kernel/comps/virtio/Cargo.toml +++ b/kernel/comps/virtio/Cargo.toml @@ -24,7 +24,9 @@ device-id.workspace = true id-alloc.workspace = true log.workspace = true ostd.workspace = true +ostd-pod.workspace = true typeflags-util.workspace = true +zerocopy.workspace = true [target.x86_64-unknown-none.dependencies] tdx-guest = { version = "0.2.4", optional = true } diff --git a/kernel/comps/virtio/src/device/block/device.rs b/kernel/comps/virtio/src/device/block/device.rs index dd9472296..591a39e8f 100644 --- a/kernel/comps/virtio/src/device/block/device.rs +++ b/kernel/comps/virtio/src/device/block/device.rs @@ -22,7 +22,6 @@ use aster_util::mem_obj_slice::Slice; use device_id::{DeviceId, MinorId}; use log::{debug, info}; use ostd::{ - Pod, arch::trap::TrapFrame, mm::{HasSize, VmIo, dma::DmaStream}, sync::SpinLock, diff --git a/kernel/comps/virtio/src/device/block/mod.rs b/kernel/comps/virtio/src/device/block/mod.rs index bdbe72453..38e2f515c 100644 --- a/kernel/comps/virtio/src/device/block/mod.rs +++ b/kernel/comps/virtio/src/device/block/mod.rs @@ -8,7 +8,7 @@ use aster_block::SECTOR_SIZE; use aster_util::safe_ptr::SafePtr; use bitflags::bitflags; use int_to_c_enum::TryFromInt; -use ostd::Pod; +use ostd_pod::FromZeros; use crate::transport::{ConfigManager, VirtioTransport}; @@ -57,8 +57,9 @@ pub enum RespStatus { _NotReady = 3, } -#[derive(Debug, Copy, Clone, Pod)] #[repr(C)] +#[padding_struct] +#[derive(Debug, Copy, Clone, Pod)] pub struct VirtioBlockConfig { /// The number of 512-byte sectors. capacity: u64, @@ -138,7 +139,7 @@ impl VirtioBlockConfig { impl ConfigManager { pub(super) fn read_config(&self) -> VirtioBlockConfig { - let mut blk_config = VirtioBlockConfig::new_uninit(); + let mut blk_config = VirtioBlockConfig::new_zeroed(); // Only following fields are defined in legacy interface. let cap_low = self .read_once::(offset_of!(VirtioBlockConfig, capacity)) diff --git a/kernel/comps/virtio/src/device/console/config.rs b/kernel/comps/virtio/src/device/console/config.rs index e3843bebd..82afaf2e5 100644 --- a/kernel/comps/virtio/src/device/console/config.rs +++ b/kernel/comps/virtio/src/device/console/config.rs @@ -3,7 +3,7 @@ use core::mem::offset_of; use aster_util::safe_ptr::SafePtr; -use ostd::Pod; +use ostd_pod::FromZeros; use crate::transport::{ConfigManager, VirtioTransport}; @@ -41,7 +41,7 @@ impl VirtioConsoleConfig { impl ConfigManager { pub(super) fn read_config(&self) -> VirtioConsoleConfig { - let mut console_config = VirtioConsoleConfig::new_uninit(); + let mut console_config = VirtioConsoleConfig::new_zeroed(); // Only following fields are defined in legacy interface. console_config.cols = self .read_once::(offset_of!(VirtioConsoleConfig, cols)) diff --git a/kernel/comps/virtio/src/device/input/device.rs b/kernel/comps/virtio/src/device/input/device.rs index 75a018718..14db7b530 100644 --- a/kernel/comps/virtio/src/device/input/device.rs +++ b/kernel/comps/virtio/src/device/input/device.rs @@ -19,12 +19,12 @@ use aster_util::{field_ptr, safe_ptr::SafePtr}; use bitflags::bitflags; use log::{debug, info}; use ostd::{ - Pod, arch::trap::TrapFrame, io::IoMem, mm::{HasDaddr, PAGE_SIZE, dma::DmaStream}, sync::SpinLock, }; +use ostd_pod::IntoBytes; use super::{InputConfigSelect, QUEUE_EVENT, QUEUE_STATUS, VirtioInputConfig, VirtioInputEvent}; use crate::{ diff --git a/kernel/comps/virtio/src/device/input/mod.rs b/kernel/comps/virtio/src/device/input/mod.rs index d1ffadf3d..3bc26e4ca 100644 --- a/kernel/comps/virtio/src/device/input/mod.rs +++ b/kernel/comps/virtio/src/device/input/mod.rs @@ -28,7 +28,7 @@ pub mod device; use aster_util::safe_ptr::SafePtr; -use ostd::{Pod, io::IoMem}; +use ostd::io::IoMem; use crate::transport::VirtioTransport; diff --git a/kernel/comps/virtio/src/device/network/config.rs b/kernel/comps/virtio/src/device/network/config.rs index e87c1c2ff..c28b8897b 100644 --- a/kernel/comps/virtio/src/device/network/config.rs +++ b/kernel/comps/virtio/src/device/network/config.rs @@ -5,7 +5,7 @@ use core::mem::offset_of; use aster_network::EthernetAddr; use aster_util::safe_ptr::SafePtr; use bitflags::bitflags; -use ostd::Pod; +use ostd_pod::FromZeros; use crate::transport::{ConfigManager, VirtioTransport}; @@ -90,7 +90,7 @@ impl VirtioNetConfig { impl ConfigManager { pub(super) fn read_config(&self) -> VirtioNetConfig { - let mut net_config = VirtioNetConfig::new_uninit(); + let mut net_config = VirtioNetConfig::new_zeroed(); // Only following fields are defined in legacy interface. for i in 0..6 { net_config.mac.0[i] = self diff --git a/kernel/comps/virtio/src/device/network/header.rs b/kernel/comps/virtio/src/device/network/header.rs index 6af914aad..b646411d9 100644 --- a/kernel/comps/virtio/src/device/network/header.rs +++ b/kernel/comps/virtio/src/device/network/header.rs @@ -2,7 +2,6 @@ use bitflags::bitflags; use int_to_c_enum::TryFromInt; -use ostd::Pod; pub const VIRTIO_NET_HDR_LEN: usize = size_of::(); diff --git a/kernel/comps/virtio/src/device/socket/config.rs b/kernel/comps/virtio/src/device/socket/config.rs index c0c1a61bd..351ede1ba 100644 --- a/kernel/comps/virtio/src/device/socket/config.rs +++ b/kernel/comps/virtio/src/device/socket/config.rs @@ -2,7 +2,7 @@ use aster_util::safe_ptr::SafePtr; use bitflags::bitflags; -use ostd::{Pod, io::IoMem, mm::PodOnce}; +use ostd::{io::IoMem, mm::PodOnce}; use crate::transport::VirtioTransport; diff --git a/kernel/comps/virtio/src/device/socket/device.rs b/kernel/comps/virtio/src/device/socket/device.rs index 5c239c624..963e02842 100644 --- a/kernel/comps/virtio/src/device/socket/device.rs +++ b/kernel/comps/virtio/src/device/socket/device.rs @@ -6,7 +6,8 @@ use core::{fmt::Debug, hint::spin_loop}; use aster_network::{RxBuffer, TxBuffer}; use aster_util::{field_ptr, slot_vec::SlotVec}; use log::debug; -use ostd::{Pod, arch::trap::TrapFrame, mm::VmWriter, sync::SpinLock}; +use ostd::{arch::trap::TrapFrame, mm::VmWriter, sync::SpinLock}; +use ostd_pod::Pod; use super::{ config::{VirtioVsockConfig, VsockFeatures}, diff --git a/kernel/comps/virtio/src/device/socket/header.rs b/kernel/comps/virtio/src/device/socket/header.rs index de084426b..9eb1e62ce 100644 --- a/kernel/comps/virtio/src/device/socket/header.rs +++ b/kernel/comps/virtio/src/device/socket/header.rs @@ -27,7 +27,6 @@ // use bitflags::bitflags; use int_to_c_enum::TryFromInt; -use ostd::Pod; use super::error::{self, SocketError}; diff --git a/kernel/comps/virtio/src/device/socket/mod.rs b/kernel/comps/virtio/src/device/socket/mod.rs index d05e54c5c..80f56db14 100644 --- a/kernel/comps/virtio/src/device/socket/mod.rs +++ b/kernel/comps/virtio/src/device/socket/mod.rs @@ -1,6 +1,5 @@ // SPDX-License-Identifier: MPL-2.0 -// ! #![feature(linked_list_cursors)] use alloc::{collections::BTreeMap, string::String, sync::Arc, vec::Vec}; use ostd::sync::SpinLock; diff --git a/kernel/comps/virtio/src/lib.rs b/kernel/comps/virtio/src/lib.rs index 7241a1d2a..e2479d9c3 100644 --- a/kernel/comps/virtio/src/lib.rs +++ b/kernel/comps/virtio/src/lib.rs @@ -3,10 +3,12 @@ //! The virtio of Asterinas. #![no_std] #![deny(unsafe_code)] -#![feature(trait_alias)] #![feature(linked_list_cursors)] +#![feature(trait_alias)] extern crate alloc; +#[macro_use] +extern crate ostd_pod; use alloc::boxed::Box; use core::hint::spin_loop; diff --git a/kernel/comps/virtio/src/queue.rs b/kernel/comps/virtio/src/queue.rs index 9b703e645..b0ad5d0d5 100644 --- a/kernel/comps/virtio/src/queue.rs +++ b/kernel/comps/virtio/src/queue.rs @@ -12,10 +12,7 @@ use aster_rights::{Dup, TRightSet, TRights, Write}; use aster_util::{field_ptr, safe_ptr::SafePtr}; use bitflags::bitflags; use log::debug; -use ostd::{ - Pod, - mm::{HasPaddr, PodOnce, Split, dma::DmaCoherent}, -}; +use ostd::mm::{HasPaddr, PodOnce, Split, dma::DmaCoherent}; use crate::{ dma_buf::DmaBuf, @@ -439,6 +436,7 @@ pub struct AvailRing { /// The used ring is where the device returns buffers once it is done with them: /// it is only written to by the device, and read by the driver. #[repr(C, align(4))] +#[padding_struct] #[derive(Debug, Copy, Clone, Pod)] pub struct UsedRing { // the flag in UsedRing diff --git a/kernel/comps/virtio/src/transport/mmio/layout.rs b/kernel/comps/virtio/src/transport/mmio/layout.rs index a6b601ee0..8daf9132c 100644 --- a/kernel/comps/virtio/src/transport/mmio/layout.rs +++ b/kernel/comps/virtio/src/transport/mmio/layout.rs @@ -2,8 +2,6 @@ use core::fmt::Debug; -use ostd::Pod; - #[derive(Clone, Copy, Pod)] #[repr(C)] pub struct VirtioMmioLayout { diff --git a/kernel/comps/virtio/src/transport/mod.rs b/kernel/comps/virtio/src/transport/mod.rs index f5d1c1719..508698eec 100644 --- a/kernel/comps/virtio/src/transport/mod.rs +++ b/kernel/comps/virtio/src/transport/mod.rs @@ -6,12 +6,12 @@ use core::fmt::Debug; use aster_pci::cfg_space::Bar; use aster_util::safe_ptr::SafePtr; use ostd::{ - Pod, arch::device::io_port::{PortRead, PortWrite}, io::IoMem, irq::IrqCallbackFunction, mm::{PodOnce, dma::DmaCoherent}, }; +use ostd_pod::Pod; use self::{mmio::virtio_mmio_init, pci::virtio_pci_init}; use crate::{ diff --git a/kernel/comps/virtio/src/transport/pci/common_cfg.rs b/kernel/comps/virtio/src/transport/pci/common_cfg.rs index 30bb1dbe1..32b239ed5 100644 --- a/kernel/comps/virtio/src/transport/pci/common_cfg.rs +++ b/kernel/comps/virtio/src/transport/pci/common_cfg.rs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MPL-2.0 use aster_util::safe_ptr::SafePtr; -use ostd::{Pod, io::IoMem}; +use ostd::io::IoMem; use super::capability::VirtioPciCapabilityData; use crate::transport::pci::capability::VirtioPciCpabilityType; diff --git a/kernel/libs/aster-util/Cargo.toml b/kernel/libs/aster-util/Cargo.toml index 6a9763fd0..d48aded66 100644 --- a/kernel/libs/aster-util/Cargo.toml +++ b/kernel/libs/aster-util/Cargo.toml @@ -11,7 +11,9 @@ aster-rights-proc.workspace = true inherit-methods-macro.workspace = true osdk-heap-allocator.workspace = true ostd.workspace = true +ostd-pod.workspace = true typeflags-util.workspace = true +zerocopy.workspace = true [lints] workspace = true diff --git a/kernel/libs/aster-util/src/lib.rs b/kernel/libs/aster-util/src/lib.rs index 25559491f..8bf7bd000 100644 --- a/kernel/libs/aster-util/src/lib.rs +++ b/kernel/libs/aster-util/src/lib.rs @@ -16,4 +16,3 @@ pub mod printer; pub mod ranged_integer; pub mod safe_ptr; pub mod slot_vec; -pub mod union_read_ptr; diff --git a/kernel/libs/aster-util/src/printer.rs b/kernel/libs/aster-util/src/printer.rs index 9e8d5051f..7db2e1326 100644 --- a/kernel/libs/aster-util/src/printer.rs +++ b/kernel/libs/aster-util/src/printer.rs @@ -112,14 +112,15 @@ pub enum VmPrinterError { #[cfg(ktest)] mod test { - use ostd::{Pod, mm::VmWriter, prelude::*}; + use ostd::{mm::VmWriter, prelude::*}; + use ostd_pod::IntoBytes; use super::*; #[ktest] fn basic_write() { let mut buf = [0u8; 64]; - let mut writer = VmWriter::from(buf.as_bytes_mut()).to_fallible(); + let mut writer = VmWriter::from(buf.as_mut_bytes()).to_fallible(); let mut printer = VmPrinter::from(&mut writer); let res = writeln!(printer, "test"); @@ -132,7 +133,7 @@ mod test { #[ktest] fn write_with_skip() { let mut buf = [0u8; 3]; - let mut writer = VmWriter::from(buf.as_bytes_mut()).to_fallible(); + let mut writer = VmWriter::from(buf.as_mut_bytes()).to_fallible(); let mut printer = VmPrinter::new_skip(&mut writer, 3); let res = writeln!(printer, "val: {}", 123); @@ -145,7 +146,7 @@ mod test { #[ktest] fn skip_all_content() { let mut buf = [0u8; 64]; - let mut writer = VmWriter::from(buf.as_bytes_mut()).to_fallible(); + let mut writer = VmWriter::from(buf.as_mut_bytes()).to_fallible(); let mut printer = VmPrinter::new_skip(&mut writer, 100); let res = writeln!(printer, "short message"); diff --git a/kernel/libs/aster-util/src/safe_ptr.rs b/kernel/libs/aster-util/src/safe_ptr.rs index 850e8d7ba..e1f924341 100644 --- a/kernel/libs/aster-util/src/safe_ptr.rs +++ b/kernel/libs/aster-util/src/safe_ptr.rs @@ -5,13 +5,14 @@ use core::{fmt::Debug, marker::PhantomData}; use aster_rights::{Dup, Exec, Full, Read, Signal, TRightSet, TRights, Write}; use aster_rights_proc::require; use ostd::{ - Error, Pod, Result, + Error, Result, mm::{ Daddr, HasDaddr, HasPaddr, Paddr, PodOnce, VmIo, VmIoOnce, dma::DmaDirection, io_util::{HasVmReaderWriter, VmReaderWriterTypes}, }, }; +use ostd_pod::Pod; /// Safe pointers. /// diff --git a/kernel/libs/aster-util/src/union_read_ptr.rs b/kernel/libs/aster-util/src/union_read_ptr.rs deleted file mode 100644 index bea6ad761..000000000 --- a/kernel/libs/aster-util/src/union_read_ptr.rs +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MPL-2.0 - -use ostd::Pod; - -/// A reader to read `Pod` fields from a `Pod` type. -pub struct Reader<'a> { - bytes: &'a [u8], -} - -impl<'a> Reader<'a> { - pub fn new(object: &'a T) -> Self { - Self { - bytes: object.as_bytes(), - } - } - - pub fn read_at(&self, field_offset: usize, _type_infer: *const F) -> F { - F::from_bytes(&self.bytes[field_offset..]) - } -} - -#[macro_export] -macro_rules! read_union_field { - ($container:expr, $type:ty, $($field:tt)+) => {{ - use $crate::union_read_ptr::Reader; - - // Perform type checking first. - let container: &$type = $container; - let reader = Reader::new(container); - - let field_offset = core::mem::offset_of!($type, $($field)*); - let type_infer = ostd::ptr_null_of!({ - // This is not safe, but the code won't be executed. - &raw const container.$($field)* - }); - - reader.read_at(field_offset, type_infer) - }} -} diff --git a/kernel/src/arch/loongarch/cpu.rs b/kernel/src/arch/loongarch/cpu.rs index 213f281c6..7b72a731f 100644 --- a/kernel/src/arch/loongarch/cpu.rs +++ b/kernel/src/arch/loongarch/cpu.rs @@ -3,7 +3,6 @@ use core::fmt; use ostd::{ - Pod, arch::cpu::context::{CpuExceptionInfo, UserContext}, cpu::PinCurrentCpu, task::DisabledPreemptGuard, @@ -45,6 +44,7 @@ impl LinuxAbi for UserContext { /// Reference: #[repr(C)] #[repr(align(16))] +#[padding_struct] #[derive(Clone, Copy, Debug, Default, Pod)] pub struct SigContext { pub pc: usize, diff --git a/kernel/src/arch/riscv/cpu.rs b/kernel/src/arch/riscv/cpu.rs index c05aa69ae..605ed9e3e 100644 --- a/kernel/src/arch/riscv/cpu.rs +++ b/kernel/src/arch/riscv/cpu.rs @@ -3,7 +3,6 @@ use core::fmt; use ostd::{ - Pod, arch::cpu::context::{CpuException, UserContext}, cpu::PinCurrentCpu, task::DisabledPreemptGuard, diff --git a/kernel/src/arch/x86/cpu.rs b/kernel/src/arch/x86/cpu.rs index e5ae85bea..8da9b34a1 100644 --- a/kernel/src/arch/x86/cpu.rs +++ b/kernel/src/arch/x86/cpu.rs @@ -4,7 +4,6 @@ use alloc::{borrow::ToOwned, collections::btree_set::BTreeSet, string::String, v use core::{arch::x86_64::CpuidResult, ffi::CStr, fmt, str}; use ostd::{ - Pod, arch::{ cpu::{ context::{CpuException, PageFaultErrorCode, RawPageFaultInfo, UserContext}, diff --git a/kernel/src/device/evdev/file.rs b/kernel/src/device/evdev/file.rs index df96e59f1..e7e769f90 100644 --- a/kernel/src/device/evdev/file.rs +++ b/kernel/src/device/evdev/file.rs @@ -13,7 +13,6 @@ use aster_input::{ }; use atomic_integer_wrapper::define_atomic_version_of_integer_like_type; use ostd::{ - Pod, mm::{VmReader, VmWriter}, sync::Mutex, }; diff --git a/kernel/src/device/fb.rs b/kernel/src/device/fb.rs index c643b4ce3..6d05b5ea4 100644 --- a/kernel/src/device/fb.rs +++ b/kernel/src/device/fb.rs @@ -4,10 +4,7 @@ use alloc::sync::Arc; use aster_framebuffer::{ColorMapEntry, FRAMEBUFFER, FrameBuffer, MAX_CMAP_SIZE, PixelFormat}; use device_id::{DeviceId, MajorId, MinorId}; -use ostd::{ - Pod, - mm::{HasPaddr, HasSize, VmIo, io_util::HasVmReaderWriter}, -}; +use ostd::mm::{HasPaddr, HasSize, VmIo, io_util::HasVmReaderWriter}; use super::registry::char; use crate::{ @@ -149,6 +146,7 @@ struct FbVarScreenInfo { /// /// Reference: . #[repr(C)] +#[padding_struct] #[derive(Debug, Default, Clone, Copy, Pod)] struct FbFixScreenInfo { /// Identification string (e.g., "EFI VGA") diff --git a/kernel/src/device/tty/mod.rs b/kernel/src/device/tty/mod.rs index c761748f1..29a9e7968 100644 --- a/kernel/src/device/tty/mod.rs +++ b/kernel/src/device/tty/mod.rs @@ -192,6 +192,7 @@ impl Tty { height, charcount, data, + .. } = font_op; let vpitch = match *op { diff --git a/kernel/src/device/tty/termio.rs b/kernel/src/device/tty/termio.rs index 7fc322abd..4eea6ddea 100644 --- a/kernel/src/device/tty/termio.rs +++ b/kernel/src/device/tty/termio.rs @@ -318,8 +318,9 @@ pub struct CWinSize { /// A font operation; `struct console_font_op` in Linux. /// /// Reference: . -#[derive(Debug, Clone, Copy, Default, Pod)] #[repr(C)] +#[padding_struct] +#[derive(Debug, Clone, Copy, Default, Pod)] pub struct CFontOp { pub(super) op: u32, pub(super) flags: u32, diff --git a/kernel/src/fs/configfs/test.rs b/kernel/src/fs/configfs/test.rs index bbfd89828..e64cbf99d 100644 --- a/kernel/src/fs/configfs/test.rs +++ b/kernel/src/fs/configfs/test.rs @@ -29,10 +29,10 @@ use aster_systree::{ }; use inherit_methods_macro::inherit_methods; use ostd::{ - Pod, mm::{VmReader, VmWriter}, prelude::ktest, }; +use ostd_pod::IntoBytes; use spin::Once; use crate::{ @@ -191,7 +191,7 @@ fn test_config_fs() { // Test attr_a read/write on demo_foo assert!( attr_a_foo - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 0); @@ -204,7 +204,7 @@ fn test_config_fs() { ); assert!( attr_a_foo - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 42); @@ -212,7 +212,7 @@ fn test_config_fs() { // Test attr_b read/write on demo_foo assert!( attr_b_foo - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 0); @@ -225,7 +225,7 @@ fn test_config_fs() { ); assert!( attr_b_foo - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 100); @@ -236,7 +236,7 @@ fn test_config_fs() { // Verify that demo_bar has independent state from demo_foo assert!( attr_a_bar - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 0); // Should be 0, not 42 like demo_foo @@ -249,7 +249,7 @@ fn test_config_fs() { ); assert!( attr_a_bar - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 200); @@ -257,7 +257,7 @@ fn test_config_fs() { // Verify demo_foo's attr_a is still 42 assert!( attr_a_foo - .read_bytes_at(0, read_buffer.as_bytes_mut()) + .read_bytes_at(0, read_buffer.as_mut_bytes()) .is_ok() ); assert_eq!(read_buffer, 42); diff --git a/kernel/src/fs/exfat/super_block.rs b/kernel/src/fs/exfat/super_block.rs index 78225709c..fd36d6179 100644 --- a/kernel/src/fs/exfat/super_block.rs +++ b/kernel/src/fs/exfat/super_block.rs @@ -1,7 +1,5 @@ // SPDX-License-Identifier: MPL-2.0 -use ostd::Pod; - use super::constants::{EXFAT_FIRST_CLUSTER, EXFAT_RESERVED_CLUSTERS, MEDIA_FAILURE, VOLUME_DIRTY}; use crate::prelude::*; diff --git a/kernel/src/fs/ext2/block_ptr.rs b/kernel/src/fs/ext2/block_ptr.rs index 0ae7b5848..48af886e6 100644 --- a/kernel/src/fs/ext2/block_ptr.rs +++ b/kernel/src/fs/ext2/block_ptr.rs @@ -69,7 +69,7 @@ impl BlockPtrs { /// Views it as a mutable slice of `u8` bytes. pub fn as_bytes_mut(&mut self) -> &mut [u8] { - self.inner.as_bytes_mut() + self.inner.as_mut_bytes() } } diff --git a/kernel/src/fs/ext2/inode.rs b/kernel/src/fs/ext2/inode.rs index 686bde9c8..8c8635009 100644 --- a/kernel/src/fs/ext2/inode.rs +++ b/kernel/src/fs/ext2/inode.rs @@ -1333,7 +1333,7 @@ impl InodeImpl { pub fn device_id(&self) -> u64 { let mut device_id: u64 = 0; device_id - .as_bytes_mut() + .as_mut_bytes() .copy_from_slice(&self.desc.block_ptrs.as_bytes()[..size_of::()]); device_id } diff --git a/kernel/src/fs/ext2/super_block.rs b/kernel/src/fs/ext2/super_block.rs index c790931ed..8c6741449 100644 --- a/kernel/src/fs/ext2/super_block.rs +++ b/kernel/src/fs/ext2/super_block.rs @@ -578,7 +578,9 @@ impl From<&SuperBlock> for RawSuperBlock { #[repr(C)] #[derive(Clone, Copy, Debug, Pod)] -struct Reserved([u32; 190]); +// FIXME: `pub(super)` is needed due to a bug in `zerocopy`. See +// . +pub(super) struct Reserved([u32; 190]); impl Default for Reserved { fn default() -> Self { diff --git a/kernel/src/ipc/semaphore/system_v/sem_set.rs b/kernel/src/ipc/semaphore/system_v/sem_set.rs index ce1325746..a5a619165 100644 --- a/kernel/src/ipc/semaphore/system_v/sem_set.rs +++ b/kernel/src/ipc/semaphore/system_v/sem_set.rs @@ -52,6 +52,7 @@ pub struct SemaphoreSet { // https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/ipcbuf.h #[repr(C)] +#[padding_struct] #[derive(Debug, Copy, Clone, Default, Pod)] pub struct IpcPerm { key: u32, @@ -70,21 +71,34 @@ pub struct IpcPerm { // In Linux, most popular 64-bit architectures except x86_64 adopt the same // layout of `semid_ds`. // Reference: . +#[cfg(target_arch = "x86_64")] #[repr(C)] +#[padding_struct] #[derive(Debug, Copy, Clone, Default, Pod)] pub struct SemidDs { sem_perm: IpcPerm, sem_otime: u64, - #[cfg(target_arch = "x86_64")] _unused1: u64, sem_ctime: u64, - #[cfg(target_arch = "x86_64")] _unused2: u64, sem_nsems: u64, _unused3: u64, _unused4: u64, } +#[cfg(not(target_arch = "x86_64"))] +#[repr(C)] +#[padding_struct] +#[derive(Debug, Copy, Clone, Default, Pod)] +pub struct SemidDs { + sem_perm: IpcPerm, + sem_otime: u64, + sem_ctime: u64, + sem_nsems: u64, + _unused3: u64, + _unused4: u64, +} + #[derive(Debug)] pub(super) struct SemSetInner { /// Semaphores diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 974712529..5a98b5c27 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -6,6 +6,7 @@ #![no_std] #![no_main] #![deny(unsafe_code)] +#![feature(associated_type_defaults)] #![feature(btree_cursors)] #![feature(debug_closure_helpers)] #![feature(format_args_nl)] @@ -17,7 +18,6 @@ #![feature(min_specialization)] #![feature(thin_box)] #![feature(trait_alias)] -#![feature(associated_type_defaults)] #![register_tool(component_access_control)] extern crate alloc; @@ -26,6 +26,8 @@ extern crate lru; extern crate controlled; #[macro_use] extern crate getset; +#[macro_use] +extern crate ostd_pod; #[cfg_attr(target_arch = "x86_64", path = "arch/x86/mod.rs")] #[cfg_attr(target_arch = "riscv64", path = "arch/riscv/mod.rs")] diff --git a/kernel/src/net/socket/netlink/table/mod.rs b/kernel/src/net/socket/netlink/table/mod.rs index 5b2de99f8..44a1c6e1b 100644 --- a/kernel/src/net/socket/netlink/table/mod.rs +++ b/kernel/src/net/socket/netlink/table/mod.rs @@ -129,7 +129,7 @@ impl ProtocolSocketTable { let mut random_port = current!().pid(); while random_port == UNSPECIFIED_PORT || self.unicast_sockets.contains_key(&random_port) { - getrandom(random_port.as_bytes_mut()); + getrandom(random_port.as_mut_bytes()); } random_port }; diff --git a/kernel/src/prelude.rs b/kernel/src/prelude.rs index 0bdc38721..b2dc835d6 100644 --- a/kernel/src/prelude.rs +++ b/kernel/src/prelude.rs @@ -17,10 +17,10 @@ pub(crate) use bitflags::bitflags; pub(crate) use int_to_c_enum::TryFromInt; pub(crate) use log::{debug, error, info, log_enabled, trace, warn}; pub(crate) use ostd::{ - Pod, mm::{FallibleVmRead, FallibleVmWrite, PAGE_SIZE, Vaddr, VmReader, VmWriter}, sync::{Mutex, MutexGuard, RwLock, RwMutex, SpinLock, SpinLockGuard}, }; +pub(crate) use ostd_pod::{FromBytes, FromZeros, IntoBytes, Pod}; /// return current process #[macro_export] diff --git a/kernel/src/process/process_vm/heap.rs b/kernel/src/process/process_vm/heap.rs index 38a5ccb7d..79d993b8e 100644 --- a/kernel/src/process/process_vm/heap.rs +++ b/kernel/src/process/process_vm/heap.rs @@ -63,7 +63,7 @@ impl Heap { // make the heap values of a buggy user program harder // to be exploited by attackers. let mut nr_random_padding_pages: u8 = 0; - getrandom(nr_random_padding_pages.as_bytes_mut()); + getrandom(nr_random_padding_pages.as_mut_bytes()); nr_random_padding_pages as usize }; diff --git a/kernel/src/process/process_vm/init_stack/mod.rs b/kernel/src/process/process_vm/init_stack/mod.rs index 42502f0ea..a950793b0 100644 --- a/kernel/src/process/process_vm/init_stack/mod.rs +++ b/kernel/src/process/process_vm/init_stack/mod.rs @@ -134,7 +134,7 @@ impl InitStack { // make the stack values of a buggy user program harder // to be exploited by attackers. let mut nr_random_padding_pages: u8 = 0; - getrandom(nr_random_padding_pages.as_bytes_mut()); + getrandom(nr_random_padding_pages.as_mut_bytes()); nr_random_padding_pages as usize + NR_FIXED_PADDING_PAGES }; diff --git a/kernel/src/process/program_loader/elf/load_elf.rs b/kernel/src/process/program_loader/elf/load_elf.rs index 30a8bd2bb..16c96de9e 100644 --- a/kernel/src/process/program_loader/elf/load_elf.rs +++ b/kernel/src/process/program_loader/elf/load_elf.rs @@ -259,7 +259,7 @@ fn map_segment_vmos( // Add some random padding. let nr_pages_padding = { let mut nr_random_padding_pages: u8 = 0; - getrandom(nr_random_padding_pages.as_bytes_mut()); + getrandom(nr_random_padding_pages.as_mut_bytes()); nr_random_padding_pages as usize }; let offset = (PIE_BASE_ADDR + nr_pages_padding * PAGE_SIZE).align_down(align); diff --git a/kernel/src/process/signal/c_types.rs b/kernel/src/process/signal/c_types.rs index d5d909f66..075d0bd04 100644 --- a/kernel/src/process/signal/c_types.rs +++ b/kernel/src/process/signal/c_types.rs @@ -3,7 +3,6 @@ #![expect(dead_code)] #![expect(non_camel_case_types)] -use aster_util::read_union_field; use inherit_methods_macro::inherit_methods; use ostd::arch::cpu::context::UserContext; @@ -18,8 +17,9 @@ pub type sigset_t = u64; // FIXME: this type should be put at suitable place pub type clock_t = i64; -#[derive(Debug, Clone, Copy, Pod)] #[repr(C)] +#[padding_struct] +#[derive(Debug, Clone, Copy, Default, Pod)] pub struct sigaction_t { pub handler_ptr: Vaddr, pub flags: u32, @@ -27,8 +27,9 @@ pub struct sigaction_t { pub mask: sigset_t, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[padding_struct] +#[derive(Clone, Copy, Pod, Default)] pub struct siginfo_t { pub si_signo: i32, pub si_errno: i32, @@ -36,8 +37,6 @@ pub struct siginfo_t { // In x86_64, there will be a 4-bytes padding here automatically, the offset of `siginfo_fields` is `0x10`. // Yet in other architectures like arm64, there is no padding here and the offset of `siginfo_fields` is `0x0c`. //_padding: i32, - /// siginfo_fields should be a union type ( See occlum definition ). But union type have unsafe interfaces. - /// Here we use a simple byte array. siginfo_fields: siginfo_fields_t, } @@ -48,43 +47,55 @@ impl siginfo_t { si_errno: 0, si_code: code, siginfo_fields: siginfo_fields_t::zero_fields(), + ..Default::default() } } pub fn set_si_addr(&mut self, si_addr: Vaddr) { - self.siginfo_fields.sigfault.addr = si_addr; + self.siginfo_fields.sigfault_mut().addr = si_addr; } pub fn set_pid_uid(&mut self, pid: Pid, uid: Uid) { - let pid_uid = siginfo_common_first_t { - piduid: siginfo_piduid_t { pid, uid }, + let pid_uid = { + let pid_uid = siginfo_piduid_t { pid, uid }; + siginfo_common_first_t::new_piduid(pid_uid) }; - self.siginfo_fields.common.first = pid_uid; + self.siginfo_fields.common_mut().first = pid_uid; } pub fn set_status(&mut self, status: i32) { - self.siginfo_fields.common.second.sigchild.status = status; + *self + .siginfo_fields + .common_mut() + .second + .sigchild_mut() + .status_mut() = status; } pub fn si_addr(&self) -> Vaddr { - read_union_field!(self, Self, siginfo_fields.sigfault.addr) + self.siginfo_fields.sigfault().addr } } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] union siginfo_fields_t { bytes: [u8; 128 - size_of::() * 4], common: siginfo_common_t, sigfault: siginfo_sigfault_t, } +impl Default for siginfo_fields_t { + fn default() -> Self { + Self::new_zeroed() + } +} + impl siginfo_fields_t { fn zero_fields() -> Self { - Self { - bytes: [0; 128 - size_of::() * 4], - } + Self::new_zeroed() } } @@ -95,8 +106,9 @@ struct siginfo_common_t { second: siginfo_common_second_t, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] union siginfo_common_first_t { piduid: siginfo_piduid_t, timer: siginfo_timer_t, @@ -116,15 +128,17 @@ struct siginfo_timer_t { overrun: i32, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] union siginfo_common_second_t { value: sigval_t, sigchild: siginfo_sigchild_t, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] pub union sigval_t { sigval_int: i32, sigval_ptr: Vaddr, //*mut c_void @@ -132,39 +146,43 @@ pub union sigval_t { impl sigval_t { pub fn read_int(&self) -> i32 { - read_union_field!(self, Self, sigval_int) + *self.sigval_int() } pub fn read_ptr(&self) -> Vaddr { - read_union_field!(self, Self, sigval_ptr) + *self.sigval_ptr() } } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] union siginfo_sigchild_t { status: i32, utime: clock_t, stime: clock_t, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[padding_struct] +#[derive(Clone, Copy, Pod)] struct siginfo_sigfault_t { addr: Vaddr, //*const c_void addr_lsb: i16, first: siginfo_sigfault_first_t, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] union siginfo_sigfault_first_t { addr_bnd: siginfo_addr_bnd_t, pkey: u32, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] union siginfo_addr_bnd_t { lower: Vaddr, // *const c_void upper: Vaddr, // *const c_void, @@ -185,6 +203,7 @@ pub struct ucontext_t { /// Reference: /// Reference: #[cfg(any(target_arch = "riscv64", target_arch = "loongarch64"))] +#[padding_struct] #[derive(Clone, Copy, Debug, Pod)] #[repr(C)] pub struct ucontext_t { @@ -211,14 +230,21 @@ impl Default for ucontext_t { uc_sigmask: Default::default(), __unused: [0; 120], uc_mcontext: Default::default(), + __pad1: [0; _], + __pad2: [0; _], + __pad3: [0; _], + __pad4: [0; _], + __pad5: [0; _], + __pad6: [0; _], } } } pub type stack_t = sigaltstack_t; -#[derive(Debug, Clone, Copy, Pod, Default)] #[repr(C)] +#[padding_struct] +#[derive(Debug, Clone, Copy, Pod, Default)] pub struct sigaltstack_t { pub ss_sp: Vaddr, // *mut c_void pub ss_flags: i32, @@ -253,8 +279,9 @@ const SIGEV_MAX_SIZE: usize = 64; const SIGEV_PREAMBLE_SIZE: usize = size_of::() * 2 + size_of::(); const SIGEV_PAD_SIZE: usize = (SIGEV_MAX_SIZE - SIGEV_PREAMBLE_SIZE) / size_of::(); -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[pod_union] +#[derive(Clone, Copy)] pub union _sigev_un { pub _pad: [i32; SIGEV_PAD_SIZE], pub _tid: i32, @@ -263,15 +290,15 @@ pub union _sigev_un { impl _sigev_un { pub fn read_tid(&self) -> i32 { - read_union_field!(self, Self, _tid) + *self._tid() } pub fn read_function(&self) -> Vaddr { - read_union_field!(self, Self, _sigev_thread.function) + self._sigev_thread().function } pub fn read_attribute(&self) -> Vaddr { - read_union_field!(self, Self, _sigev_thread.attribute) + self._sigev_thread().attribute } } @@ -284,8 +311,8 @@ pub enum SigNotify { SIGEV_THREAD_ID = 4, } -#[derive(Clone, Copy, Pod)] #[repr(C)] +#[derive(Clone, Copy, Pod)] pub struct sigevent_t { pub sigev_value: sigval_t, pub sigev_signo: i32, diff --git a/kernel/src/process/signal/sig_action.rs b/kernel/src/process/signal/sig_action.rs index 295a07b82..0401b1e05 100644 --- a/kernel/src/process/signal/sig_action.rs +++ b/kernel/src/process/signal/sig_action.rs @@ -57,12 +57,14 @@ impl SigAction { flags: 0, restorer_ptr: 0, mask: 0, + ..Default::default() }, SigAction::Ign => sigaction_t { handler_ptr: SIG_IGN, flags: 0, restorer_ptr: 0, mask: 0, + ..Default::default() }, SigAction::User { handler_addr, @@ -74,6 +76,7 @@ impl SigAction { flags: flags.as_u32(), restorer_ptr: *restorer_addr, mask: (*mask).into(), + ..Default::default() }, } } diff --git a/kernel/src/process/signal/sig_stack.rs b/kernel/src/process/signal/sig_stack.rs index 00c69732c..935df1a17 100644 --- a/kernel/src/process/signal/sig_stack.rs +++ b/kernel/src/process/signal/sig_stack.rs @@ -99,6 +99,7 @@ impl From<&SigStack> for stack_t { ss_sp: value.base, ss_flags: value.flags.bits as _, ss_size: value.size, + ..Default::default() } } } diff --git a/kernel/src/syscall/epoll.rs b/kernel/src/syscall/epoll.rs index 68afa0135..05f564d35 100644 --- a/kernel/src/syscall/epoll.rs +++ b/kernel/src/syscall/epoll.rs @@ -266,21 +266,24 @@ pub fn sys_epoll_pwait2( Ok(SyscallReturn::Return(events_len as _)) } -#[derive(Debug, Clone, Copy, Pod)] #[repr(C)] // Here we use `repr(packed)` on x86_64 to ensure the same layout as Linux. // Reference: . #[cfg_attr(target_arch = "x86_64", repr(packed))] +#[cfg_attr(not(target_arch = "x86_64"), padding_struct)] +#[derive(Debug, Clone, Copy, Pod, Default)] struct c_epoll_event { events: u32, data: u64, } impl From<&EpollEvent> for c_epoll_event { + #[cfg_attr(target_arch = "x86_64", expect(clippy::needless_update))] fn from(ep_event: &EpollEvent) -> Self { Self { events: ep_event.events.bits(), data: ep_event.user_data, + ..Default::default() } } } diff --git a/kernel/src/syscall/fcntl.rs b/kernel/src/syscall/fcntl.rs index 0d78443ce..baa2e4ff8 100644 --- a/kernel/src/syscall/fcntl.rs +++ b/kernel/src/syscall/fcntl.rs @@ -213,6 +213,7 @@ pub enum RangeLockWhence { /// C struct for a file range lock in Libc #[repr(C)] +#[padding_struct] #[derive(Debug, Copy, Clone, Pod)] pub struct c_flock { /// Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK diff --git a/kernel/src/syscall/sendmmsg.rs b/kernel/src/syscall/sendmmsg.rs index 8105e6a3e..2f29f313b 100644 --- a/kernel/src/syscall/sendmmsg.rs +++ b/kernel/src/syscall/sendmmsg.rs @@ -47,6 +47,7 @@ pub fn sys_sendmmsg( } #[repr(C)] +#[padding_struct] #[derive(Debug, Clone, Copy, Pod)] struct CMmsgHdr { msg_hdr: CUserMsgHdr, diff --git a/kernel/src/syscall/sigaltstack.rs b/kernel/src/syscall/sigaltstack.rs index 28f95bef0..75d843617 100644 --- a/kernel/src/syscall/sigaltstack.rs +++ b/kernel/src/syscall/sigaltstack.rs @@ -48,6 +48,7 @@ fn get_old_stack(ctx: &Context, sp: usize) -> Result { ss_sp: old_stack.base(), ss_flags: flags.cast_signed(), ss_size: old_stack.size(), + ..Default::default() }; Ok(stack) diff --git a/kernel/src/syscall/sysinfo.rs b/kernel/src/syscall/sysinfo.rs index fcb672ca2..85591089e 100644 --- a/kernel/src/syscall/sysinfo.rs +++ b/kernel/src/syscall/sysinfo.rs @@ -6,8 +6,9 @@ use ostd::mm::VmIo; use super::SyscallReturn; use crate::{prelude::*, process::process_table}; -#[derive(Debug, Default, Clone, Copy, Pod)] #[repr(C)] +#[padding_struct] +#[derive(Debug, Default, Clone, Copy, Pod)] struct SysInfo { uptime: i64, /* Seconds since boot */ loads: [u64; 3], /* 1, 5, and 15 minute load averages */ diff --git a/kernel/src/util/copy_compact.rs b/kernel/src/util/copy_compact.rs index 0981e96b2..29a4e36e4 100644 --- a/kernel/src/util/copy_compact.rs +++ b/kernel/src/util/copy_compact.rs @@ -1,7 +1,5 @@ // SPDX-License-Identifier: MPL-2.0 -use ostd::Pod; - use crate::prelude::*; /// A trait that can copies structures from/to the user space in a backward-compatible way. @@ -37,7 +35,7 @@ impl CopyCompat for CurrentUserSpace<'_> { let mut val = T::new_zeroed(); let mut reader = self.reader(src, size)?; - reader.read_fallible(&mut VmWriter::from(val.as_bytes_mut()))?; + reader.read_fallible(&mut VmWriter::from(val.as_mut_bytes()))?; while reader.remain() > size_of::() { if reader.read_val::()? != 0 { diff --git a/kernel/src/util/iovec.rs b/kernel/src/util/iovec.rs index 1a6c4e68e..1a89d405c 100644 --- a/kernel/src/util/iovec.rs +++ b/kernel/src/util/iovec.rs @@ -272,7 +272,7 @@ impl dyn MultiRead + '_ { /// Reads a `T` value, returning a `None` if the readers have insufficient bytes. pub fn read_val_opt(&mut self) -> Result> { let mut val = T::new_zeroed(); - let nbytes = self.read(&mut VmWriter::from(val.as_bytes_mut()))?; + let nbytes = self.read(&mut VmWriter::from(val.as_mut_bytes()))?; if nbytes == size_of::() { Ok(Some(val)) diff --git a/kernel/src/util/net/addr/family.rs b/kernel/src/util/net/addr/family.rs index 69d6e70b0..a287841a7 100644 --- a/kernel/src/util/net/addr/family.rs +++ b/kernel/src/util/net/addr/family.rs @@ -145,7 +145,7 @@ pub fn read_socket_addr_from_user(addr: Vaddr, addr_len: usize) -> Result { diff --git a/kernel/src/util/net/addr/unix.rs b/kernel/src/util/net/addr/unix.rs index ab6ca92f6..4bbd5fcb9 100644 --- a/kernel/src/util/net/addr/unix.rs +++ b/kernel/src/util/net/addr/unix.rs @@ -43,7 +43,7 @@ where // bytes may exceed the size of `CSocketAddrUnix`. This is to match the Linux // implementation. See the "BUGS" section at // . - let mut bytes: [u8; CSocketAddrUnix::MAX_LEN + 1] = Pod::new_zeroed(); + let mut bytes: [u8; CSocketAddrUnix::MAX_LEN + 1] = FromZeros::new_zeroed(); bytes[..2].copy_from_slice(&(CSocketAddrFamily::AF_UNIX as u16).to_ne_bytes()); const { assert!(CSocketAddrUnix::PATH_OFFSET == 2) }; diff --git a/kernel/src/util/net/socket.rs b/kernel/src/util/net/socket.rs index bacf1d78e..93e577101 100644 --- a/kernel/src/util/net/socket.rs +++ b/kernel/src/util/net/socket.rs @@ -78,6 +78,7 @@ bitflags! { } #[repr(C)] +#[padding_struct] #[derive(Debug, Clone, Copy, Pod)] pub struct CUserMsgHdr { /// Pointer to socket address structure diff --git a/kernel/src/vdso.rs b/kernel/src/vdso.rs index 8a6dc0bff..6e7f6fb7d 100644 --- a/kernel/src/vdso.rs +++ b/kernel/src/vdso.rs @@ -18,10 +18,11 @@ use core::{mem::ManuallyDrop, time::Duration}; use aster_time::{Instant, read_monotonic_time}; use aster_util::coeff::Coeff; use ostd::{ - Pod, const_assert, + const_assert, mm::{PAGE_SIZE, UFrame, VmIo, VmIoOnce}, sync::SpinLock, }; +use ostd_pod::IntoBytes; use spin::Once; use crate::{ diff --git a/ostd/Cargo.toml b/ostd/Cargo.toml index ff298dc0d..3362e4043 100644 --- a/ostd/Cargo.toml +++ b/ostd/Cargo.toml @@ -36,6 +36,7 @@ ostd-pod.workspace = true spin.workspace = true smallvec.workspace = true volatile.workspace = true +zerocopy.workspace = true # The targets are chosen to prevent the generated machine code from using any # vector or floating-point registers. diff --git a/ostd/libs/linux-bzimage/builder/Cargo.toml b/ostd/libs/linux-bzimage/builder/Cargo.toml index 29d3a3488..427610913 100644 --- a/ostd/libs/linux-bzimage/builder/Cargo.toml +++ b/ostd/libs/linux-bzimage/builder/Cargo.toml @@ -11,10 +11,11 @@ edition.workspace = true [dependencies] align_ext.workspace = true bitflags.workspace = true -bytemuck.workspace = true libflate = { workspace = true, features = [ "std" ] } +ostd-pod.workspace = true serde.workspace = true xmas-elf.workspace = true +zerocopy.workspace = true [lints] workspace = true diff --git a/ostd/libs/linux-bzimage/builder/src/lib.rs b/ostd/libs/linux-bzimage/builder/src/lib.rs index c2e9609d2..fd266a597 100644 --- a/ostd/libs/linux-bzimage/builder/src/lib.rs +++ b/ostd/libs/linux-bzimage/builder/src/lib.rs @@ -13,6 +13,9 @@ //! The setup code should be built into the ELF target and we convert it to a flat binary //! in the builder. +#[macro_use] +extern crate ostd_pod; + pub mod encoder; mod mapping; mod pe_header; diff --git a/ostd/libs/linux-bzimage/builder/src/pe_header.rs b/ostd/libs/linux-bzimage/builder/src/pe_header.rs index 1ef89ad8c..3d1f72d33 100644 --- a/ostd/libs/linux-bzimage/builder/src/pe_header.rs +++ b/ostd/libs/linux-bzimage/builder/src/pe_header.rs @@ -11,8 +11,8 @@ use std::vec; use align_ext::AlignExt; -use bytemuck::{Pod, Zeroable}; use serde::Serialize; +use zerocopy::IntoBytes; use crate::mapping::{LEGACY_SETUP_SEC_SIZE, SetupFileOffset, SetupVA}; @@ -50,7 +50,7 @@ bitflags::bitflags! { } } -#[derive(Zeroable, Pod, Serialize, Clone, Copy)] +#[derive(Pod, Serialize, Clone, Copy)] #[repr(C, packed)] struct PeHdr { magic: u32, // PE magic @@ -73,7 +73,7 @@ enum PeImageSubsystem { EfiApplication = 10, } -#[derive(Zeroable, Pod, Serialize, Clone, Copy)] +#[derive(Pod, Serialize, Clone, Copy)] #[repr(C, packed)] struct Pe32PlusOptHdr { magic: u16, // file type @@ -107,7 +107,7 @@ struct Pe32PlusOptHdr { data_dirs: u32, // number of data dir entries } -#[derive(Zeroable, Pod, Serialize, Clone, Copy)] +#[derive(Pod, Serialize, Clone, Copy)] #[repr(C, packed)] struct Pe32PlusOptDataDirEnt { /// The RVA is the address of the table relative to the base address of the image when the table is loaded. @@ -126,7 +126,7 @@ impl Pe32PlusOptDataDirEnt { /// The `data_dirs` number field in the PE32+ optional header is just an illusion that you can choose to have a /// subset of the data directories. The actual number of data directories is fixed to 16 and you can only ignore /// data directories at the end of the list. We ignore data directories after the 8th as what Linux do. -#[derive(Zeroable, Pod, Serialize, Clone, Copy)] +#[derive(Pod, Serialize, Clone, Copy)] #[repr(C, packed)] struct Pe32PlusOptDataDirs { export_table: Pe32PlusOptDataDirEnt, @@ -166,7 +166,7 @@ bitflags::bitflags! { } } -#[derive(Zeroable, Pod, Serialize, Clone, Copy)] +#[derive(Pod, Serialize, Clone, Copy)] #[repr(C, packed)] struct PeSectionHdr { name: [u8; 8], // name or "/12\0" string tbl offset @@ -263,13 +263,13 @@ pub(crate) fn make_pe_coff_header(setup_elf: &[u8]) -> Vec { // Write the PE header pe_hdr.sections = sec_hdr_vec.len() as u16; - bin.extend_from_slice(bytemuck::bytes_of(&pe_hdr)); + bin.extend_from_slice(pe_hdr.as_bytes()); // Write the PE32+ optional header - bin.extend_from_slice(bytemuck::bytes_of(&pe_opt_hdr)); - bin.extend_from_slice(bytemuck::bytes_of(&pe_opt_hdr_data_dirs)); + bin.extend_from_slice(pe_opt_hdr.as_bytes()); + bin.extend_from_slice(pe_opt_hdr_data_dirs.as_bytes()); // Write the PE section headers for sec_hdr in sec_hdr_vec { - bin.extend_from_slice(bytemuck::bytes_of(&sec_hdr)); + bin.extend_from_slice(sec_hdr.as_bytes()); } bin diff --git a/ostd/libs/ostd-pod/Cargo.toml b/ostd/libs/ostd-pod/Cargo.toml index 8159273ba..2396d0ac5 100644 --- a/ostd/libs/ostd-pod/Cargo.toml +++ b/ostd/libs/ostd-pod/Cargo.toml @@ -1,7 +1,8 @@ [package] name = "ostd-pod" # REMINDER: Whenever you change this number, -# update the external documentation links in README.md. +# update all occurrences of the version in README +# (e.g., in external links and in the sample Cargo.toml). version = "0.4.0" description = "A trait for plain old data (POD)" readme = "README.md" diff --git a/ostd/libs/ostd-pod/macros/src/pod_derive.rs b/ostd/libs/ostd-pod/macros/src/pod_derive.rs index 5e06bddc0..a3d537dcd 100644 --- a/ostd/libs/ostd-pod/macros/src/pod_derive.rs +++ b/ostd/libs/ostd-pod/macros/src/pod_derive.rs @@ -29,7 +29,7 @@ pub fn expand_derive(attrs: TokenStream, input: TokenStream) -> TokenStream { let attr_tokens = proc_macro2::TokenStream::from(attrs); for token in attr_tokens.into_iter() { match token { - TokenTree::Ident(ident) if ident.to_string() == "Pod" => { + TokenTree::Ident(ident) if ident == "Pod" => { // Replace Pod with zerocopy traits push_zerocopy_derive(&mut new_derives, "FromBytes", true); push_zerocopy_derive(&mut new_derives, "IntoBytes", true); diff --git a/ostd/src/arch/loongarch/mm/mod.rs b/ostd/src/arch/loongarch/mm/mod.rs index e6fcd1ece..236fae5a0 100644 --- a/ostd/src/arch/loongarch/mm/mod.rs +++ b/ostd/src/arch/loongarch/mm/mod.rs @@ -2,16 +2,13 @@ use core::{arch::asm, intrinsics::AtomicOrdering::Relaxed, ops::Range}; -use crate::{ - Pod, - mm::{ - PAGE_SIZE, Paddr, PagingConstsTrait, PagingLevel, PodOnce, Vaddr, - dma::DmaDirection, - page_prop::{ - CachePolicy, PageFlags, PageProperty, PageTableFlags, PrivilegedPageFlags as PrivFlags, - }, - page_table::{PteScalar, PteTrait}, +use crate::mm::{ + PAGE_SIZE, Paddr, PagingConstsTrait, PagingLevel, PodOnce, Vaddr, + dma::DmaDirection, + page_prop::{ + CachePolicy, PageFlags, PageProperty, PageTableFlags, PrivilegedPageFlags as PrivFlags, }, + page_table::{PteScalar, PteTrait}, }; #[derive(Clone, Debug, Default)] diff --git a/ostd/src/arch/riscv/cpu/context.rs b/ostd/src/arch/riscv/cpu/context.rs index ad0e8a35e..193b3ec5b 100644 --- a/ostd/src/arch/riscv/cpu/context.rs +++ b/ostd/src/arch/riscv/cpu/context.rs @@ -5,7 +5,7 @@ use alloc::boxed::Box; use core::{arch::global_asm, fmt::Debug}; -use ostd_pod::Pod; +use ostd_pod::IntoBytes; use riscv::{ interrupt::supervisor::{Exception, Interrupt}, register::scause::Trap, @@ -375,9 +375,9 @@ impl FpuContext { /// Returns the FPU context as a mutable byte slice. pub fn as_bytes_mut(&mut self) -> &mut [u8] { match self { - Self::F(ctx) => ctx.as_bytes_mut(), - Self::D(ctx) => ctx.as_bytes_mut(), - Self::Q(ctx) => ctx.as_bytes_mut(), + Self::F(ctx) => ctx.as_mut_bytes(), + Self::D(ctx) => ctx.as_mut_bytes(), + Self::Q(ctx) => ctx.as_mut_bytes(), Self::None => &mut [], } } @@ -399,6 +399,7 @@ pub struct FFpuContext { /// FPU context for D extension (64-bit floating point). #[repr(C)] +#[padding_struct] #[derive(Clone, Copy, Debug, Default, Pod)] pub struct DFpuContext { f: [u64; 32], @@ -407,6 +408,7 @@ pub struct DFpuContext { /// FPU context for Q extension (128-bit floating point). #[repr(C)] +#[padding_struct] #[derive(Clone, Copy, Debug, Pod)] pub struct QFpuContext { f: [u64; 64], @@ -423,6 +425,8 @@ impl Default for QFpuContext { Self { f: [0; 64], fcsr: 0, + __pad1: [0; _], + __pad2: [0; _], } } } diff --git a/ostd/src/arch/riscv/mm/mod.rs b/ostd/src/arch/riscv/mm/mod.rs index eb5908f07..62df6bc33 100644 --- a/ostd/src/arch/riscv/mm/mod.rs +++ b/ostd/src/arch/riscv/mm/mod.rs @@ -8,7 +8,6 @@ pub(crate) use util::{ }; use crate::{ - Pod, arch::{ boot::DEVICE_TREE, cpu::extension::{IsaExtensions, has_extensions}, diff --git a/ostd/src/arch/x86/cpu/context/mod.rs b/ostd/src/arch/x86/cpu/context/mod.rs index 91a8ecdec..4dc439b2b 100644 --- a/ostd/src/arch/x86/cpu/context/mod.rs +++ b/ostd/src/arch/x86/cpu/context/mod.rs @@ -8,7 +8,7 @@ use core::arch::x86_64::{_fxrstor64, _fxsave64, _xrstor64, _xsave64}; use bitflags::bitflags; use cfg_if::cfg_if; use log::debug; -use ostd_pod::Pod; +use ostd_pod::{FromZeros, IntoBytes}; use spin::Once; use x86::bits64::segmentation::wrfsbase; use x86_64::registers::{ @@ -551,7 +551,7 @@ impl FpuContext { /// Returns the FPU context as a mutable byte slice. pub fn as_bytes_mut(&mut self) -> &mut [u8] { - &mut self.xsave_area.as_bytes_mut()[..self.area_size] + &mut self.xsave_area.as_mut_bytes()[..self.area_size] } } diff --git a/ostd/src/arch/x86/iommu/dma_remapping/context_table.rs b/ostd/src/arch/x86/iommu/dma_remapping/context_table.rs index 6be444c89..f2ba8d150 100644 --- a/ostd/src/arch/x86/iommu/dma_remapping/context_table.rs +++ b/ostd/src/arch/x86/iommu/dma_remapping/context_table.rs @@ -5,7 +5,6 @@ use alloc::collections::BTreeMap; use log::trace; -use ostd_pod::Pod; use super::second_stage::IommuPtConfig; use crate::{ diff --git a/ostd/src/arch/x86/iommu/dma_remapping/second_stage.rs b/ostd/src/arch/x86/iommu/dma_remapping/second_stage.rs index 83879285b..63f5bd019 100644 --- a/ostd/src/arch/x86/iommu/dma_remapping/second_stage.rs +++ b/ostd/src/arch/x86/iommu/dma_remapping/second_stage.rs @@ -2,13 +2,10 @@ use core::ops::Range; -use crate::{ - Pod, - mm::{ - Paddr, PageProperty, PagingConstsTrait, PagingLevel, PodOnce, - page_prop::{CachePolicy, PageFlags, PageTableFlags, PrivilegedPageFlags as PrivFlags}, - page_table::{PageTableConfig, PteScalar, PteTrait}, - }, +use crate::mm::{ + Paddr, PageProperty, PagingConstsTrait, PagingLevel, PodOnce, + page_prop::{CachePolicy, PageFlags, PageTableFlags, PrivilegedPageFlags as PrivFlags}, + page_table::{PageTableConfig, PteScalar, PteTrait}, }; /// The page table used by iommu maps the device address diff --git a/ostd/src/arch/x86/kernel/acpi/remapping.rs b/ostd/src/arch/x86/kernel/acpi/remapping.rs index c811649e6..c7e0f5c77 100644 --- a/ostd/src/arch/x86/kernel/acpi/remapping.rs +++ b/ostd/src/arch/x86/kernel/acpi/remapping.rs @@ -90,6 +90,7 @@ pub struct AtsrHeader { /// This optional structure provides the association between each Remapping hardware unit (identified /// by its espective Base Address) and the proximity domain to which that hardware unit belongs. #[repr(C)] +#[padding_struct] #[derive(Debug, Clone, Copy, Pod)] pub struct Rhsa { typ: u16, diff --git a/ostd/src/arch/x86/mm/mod.rs b/ostd/src/arch/x86/mm/mod.rs index b136a1d01..2522158c0 100644 --- a/ostd/src/arch/x86/mm/mod.rs +++ b/ostd/src/arch/x86/mm/mod.rs @@ -13,16 +13,13 @@ use x86_64::{ structures::paging::PhysFrame, }; -use crate::{ - Pod, - mm::{ - PAGE_SIZE, Paddr, PagingConstsTrait, PagingLevel, PodOnce, Vaddr, - dma::DmaDirection, - page_prop::{ - CachePolicy, PageFlags, PageProperty, PageTableFlags, PrivilegedPageFlags as PrivFlags, - }, - page_table::{PteScalar, PteTrait}, +use crate::mm::{ + PAGE_SIZE, Paddr, PagingConstsTrait, PagingLevel, PodOnce, Vaddr, + dma::DmaDirection, + page_prop::{ + CachePolicy, PageFlags, PageProperty, PageTableFlags, PrivilegedPageFlags as PrivFlags, }, + page_table::{PteScalar, PteTrait}, }; mod pat; diff --git a/ostd/src/lib.rs b/ostd/src/lib.rs index e1b07646d..60b41bad6 100644 --- a/ostd/src/lib.rs +++ b/ostd/src/lib.rs @@ -18,6 +18,8 @@ #![warn(missing_docs)] extern crate alloc; +#[macro_use] +extern crate ostd_pod; #[cfg_attr(target_arch = "x86_64", path = "arch/x86/mod.rs")] #[cfg_attr(target_arch = "riscv64", path = "arch/riscv/mod.rs")] @@ -53,7 +55,6 @@ pub use ostd_macros::{ global_frame_allocator, global_heap_allocator, global_heap_allocator_slot_map, main, panic_handler, }; -pub use ostd_pod::Pod; pub use self::{error::Error, prelude::Result}; diff --git a/ostd/src/mm/io.rs b/ostd/src/mm/io.rs index e48d4d878..a405c00c4 100644 --- a/ostd/src/mm/io.rs +++ b/ostd/src/mm/io.rs @@ -42,8 +42,10 @@ use core::{marker::PhantomData, mem::MaybeUninit}; +use ostd_pod::Pod; + use crate::{ - Error, Pod, + Error, arch::mm::{ __atomic_cmpxchg_fallible, __atomic_load_fallible, __memcpy_fallible, __memset_fallible, }, @@ -109,7 +111,7 @@ pub trait VmIo { // may not really initialize the bits of `val` at all! let mut val = T::new_zeroed(); - self.read_bytes(offset, val.as_bytes_mut())?; + self.read_bytes(offset, val.as_mut_bytes())?; Ok(val) } diff --git a/ostd/src/mm/page_table/boot_pt.rs b/ostd/src/mm/page_table/boot_pt.rs index 14e9e0ea6..9670ca76f 100644 --- a/ostd/src/mm/page_table/boot_pt.rs +++ b/ostd/src/mm/page_table/boot_pt.rs @@ -10,7 +10,7 @@ use core::{ sync::atomic::{AtomicU32, Ordering}, }; -use ostd_pod::Pod; +use ostd_pod::FromZeros; use super::{PteTrait, pte_index}; use crate::{ diff --git a/ostd/src/mm/page_table/mod.rs b/ostd/src/mm/page_table/mod.rs index 8d507e87b..7f36cbef9 100644 --- a/ostd/src/mm/page_table/mod.rs +++ b/ostd/src/mm/page_table/mod.rs @@ -12,12 +12,13 @@ use core::{ sync::atomic::{AtomicUsize, Ordering}, }; +use ostd_pod::Pod; + use super::{ HasPaddr, Paddr, PagingConstsTrait, PagingLevel, PodOnce, Vaddr, kspace::KernelPtConfig, nr_subpage_per_huge, page_prop::PageProperty, page_size, vm_space::UserPtConfig, }; use crate::{ - Pod, arch::mm::{PageTableEntry, PagingConsts}, mm::page_prop::PageTableFlags, task::{atomic_mode::AsAtomicModeGuard, disable_preempt}, diff --git a/ostd/src/mm/page_table/node/child.rs b/ostd/src/mm/page_table/node/child.rs index 9eabc1a3f..d957e75a8 100644 --- a/ostd/src/mm/page_table/node/child.rs +++ b/ostd/src/mm/page_table/node/child.rs @@ -4,7 +4,7 @@ use core::mem::ManuallyDrop; -use ostd_pod::Pod; +use ostd_pod::FromZeros; use super::{PageTableNode, PageTableNodeRef, PteTrait}; use crate::{ diff --git a/ostd/src/mm/page_table/test.rs b/ostd/src/mm/page_table/test.rs index cdee20e59..524d5076f 100644 --- a/ostd/src/mm/page_table/test.rs +++ b/ostd/src/mm/page_table/test.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MPL-2.0 +use ostd_pod::FromZeros; + use super::*; use crate::{ mm::{ diff --git a/ostd/src/mm/test.rs b/ostd/src/mm/test.rs index 0822e1365..8bc6753e4 100644 --- a/ostd/src/mm/test.rs +++ b/ostd/src/mm/test.rs @@ -2,8 +2,6 @@ use alloc::vec; -use ostd_pod::Pod; - use crate::{ Error, io::IoMem, @@ -24,7 +22,8 @@ mod io { /// A dummy Pod struct for testing complex types. #[repr(C)] - #[derive(Clone, Copy, PartialEq, Debug, Pod)] + #[padding_struct] + #[derive(Clone, Copy, PartialEq, Debug, Default, Pod)] pub struct TestPodStruct { pub a: u32, pub b: u64, @@ -85,6 +84,7 @@ mod io { let test_struct = TestPodStruct { a: 0x12345678, b: 0xABCDEF0123456789, + ..Default::default() }; writer_infallible.write_val(&test_struct).unwrap(); diff --git a/ostd/src/util/id_set.rs b/ostd/src/util/id_set.rs index 47bc4aa59..1a47cd22b 100644 --- a/ostd/src/util/id_set.rs +++ b/ostd/src/util/id_set.rs @@ -22,7 +22,6 @@ use core::{ fmt::Debug, marker::PhantomData, - mem::size_of, ops::{Bound, Range, RangeFrom, RangeFull, RangeTo, RangeToInclusive}, sync::atomic::{AtomicU64, Ordering}, };