From c67f00d7ca290cf4cf6543a0530247c0c53038d5 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Wed, 22 May 2019 14:23:04 +0800 Subject: [PATCH] Use MaybeUninit for uninitialized --- crate/memory/src/cow.rs | 4 ++-- crate/memory/src/lib.rs | 1 + crate/memory/src/paging/mock_page_table.rs | 4 ++-- crate/memory/src/swap/mock_swapper.rs | 18 +++++++++--------- kernel/src/arch/aarch64/paging.rs | 4 ++-- kernel/src/arch/mipsel/paging.rs | 4 ++-- kernel/src/arch/x86_64/paging.rs | 4 ++-- kernel/src/lib.rs | 1 + kernel/src/process/structs.rs | 6 +++--- 9 files changed, 24 insertions(+), 22 deletions(-) diff --git a/crate/memory/src/cow.rs b/crate/memory/src/cow.rs index 2ee6b10..26b6948 100644 --- a/crate/memory/src/cow.rs +++ b/crate/memory/src/cow.rs @@ -109,8 +109,8 @@ impl CowExt { self.rc_map.write_decrease(&frame); return true; } - use core::mem::uninitialized; - let mut temp_data: [u8; PAGE_SIZE] = unsafe { uninitialized() }; + use core::mem::MaybeUninit; + let mut temp_data: [u8; PAGE_SIZE] = unsafe { MaybeUninit::uninitialized().into_initialized() }; temp_data[..].copy_from_slice(self.get_page_slice_mut(addr)); self.unmap_shared(addr); diff --git a/crate/memory/src/lib.rs b/crate/memory/src/lib.rs index 61aef37..2b68ad0 100644 --- a/crate/memory/src/lib.rs +++ b/crate/memory/src/lib.rs @@ -1,6 +1,7 @@ #![cfg_attr(not(test), no_std)] #![feature(alloc)] #![feature(nll)] +#![feature(maybe_uninit)] // import macros from log use log::*; diff --git a/crate/memory/src/paging/mock_page_table.rs b/crate/memory/src/paging/mock_page_table.rs index 6395325..525d56c 100644 --- a/crate/memory/src/paging/mock_page_table.rs +++ b/crate/memory/src/paging/mock_page_table.rs @@ -144,10 +144,10 @@ impl MockPageTable { ** @retval MockPageTable the mock page table created */ pub fn new() -> Self { - use core::mem::uninitialized; + use core::mem::MaybeUninit; MockPageTable { entries: [MockEntry::default(); PAGE_COUNT], - data: unsafe { uninitialized() }, + data: unsafe { MaybeUninit::uninitialized().into_initialized() }, page_fault_handler: None, } } diff --git a/crate/memory/src/swap/mock_swapper.rs b/crate/memory/src/swap/mock_swapper.rs index 74564c0..ec71c39 100644 --- a/crate/memory/src/swap/mock_swapper.rs +++ b/crate/memory/src/swap/mock_swapper.rs @@ -5,7 +5,7 @@ use super::Swapper; use alloc::collections::BTreeMap; -use core::mem::uninitialized; +use core::mem::MaybeUninit; const PAGE_SIZE: usize = 4096; @@ -17,7 +17,7 @@ pub struct MockSwapper { impl Swapper for MockSwapper { fn swap_out(&mut self, data: &[u8]) -> Result { let id = self.alloc_id(); - let mut slice: [u8; PAGE_SIZE] = unsafe { uninitialized() }; + let mut slice: [u8; PAGE_SIZE] = unsafe { MaybeUninit::uninitialized().into_initialized() }; slice.copy_from_slice(data); self.map.insert(id, slice); Ok(id) @@ -27,7 +27,7 @@ impl Swapper for MockSwapper { if !self.map.contains_key(&token) { return Err(()); } - let mut slice: [u8; PAGE_SIZE] = unsafe { uninitialized() }; + let mut slice: [u8; PAGE_SIZE] = unsafe { MaybeUninit::uninitialized().into_initialized() }; slice.copy_from_slice(data); self.map.insert(token, slice); Ok(()) @@ -64,8 +64,8 @@ mod test { #[test] fn swap_out_in() { let mut swapper = MockSwapper::default(); - let mut data: [u8; 4096] = unsafe { uninitialized() }; - let data1: [u8; 4096] = unsafe { uninitialized() }; + let mut data: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() }; + let data1: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() }; let token = swapper.swap_out(&data1).unwrap(); swapper.swap_in(token, &mut data).unwrap(); assert_data_eq(&data, &data1); @@ -74,9 +74,9 @@ mod test { #[test] fn swap_update() { let mut swapper = MockSwapper::default(); - let mut data: [u8; 4096] = unsafe { uninitialized() }; - let data1: [u8; 4096] = unsafe { uninitialized() }; - let data2: [u8; 4096] = unsafe { uninitialized() }; + let mut data: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() }; + let data1: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() }; + let data2: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() }; let token = swapper.swap_out(&data1).unwrap(); swapper.swap_update(token, &data2).unwrap(); swapper.swap_in(token, &mut data).unwrap(); @@ -86,7 +86,7 @@ mod test { #[test] fn invalid_token() { let mut swapper = MockSwapper::default(); - let mut data: [u8; 4096] = unsafe { uninitialized() }; + let mut data: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() }; assert_eq!(swapper.swap_in(0, &mut data), Err(())); } } diff --git a/kernel/src/arch/aarch64/paging.rs b/kernel/src/arch/aarch64/paging.rs index 5e7cd94..1d27b85 100644 --- a/kernel/src/arch/aarch64/paging.rs +++ b/kernel/src/arch/aarch64/paging.rs @@ -212,7 +212,7 @@ impl PageTableImpl { PageTableImpl { page_table: MappedPageTable::new(table, frame_to_page_table), root_frame: frame, - entry: core::mem::uninitialized(), + entry: core::mem::MaybeUninit::uninitialized().into_initialized(), } } } @@ -227,7 +227,7 @@ impl PageTableExt for PageTableImpl { PageTableImpl { page_table: MappedPageTable::new(table, frame_to_page_table), root_frame: frame, - entry: core::mem::uninitialized(), + entry: core::mem::MaybeUninit::uninitialized().into_initialized(), } } } diff --git a/kernel/src/arch/mipsel/paging.rs b/kernel/src/arch/mipsel/paging.rs index 81815b2..2dd1cdf 100644 --- a/kernel/src/arch/mipsel/paging.rs +++ b/kernel/src/arch/mipsel/paging.rs @@ -155,7 +155,7 @@ impl PageTableImpl { PageTableImpl { page_table: TwoLevelPageTable::new(table), root_frame: frame, - entry: unsafe { core::mem::uninitialized() }, + entry: unsafe { core::mem::MaybeUninit::uninitialized().into_initialized() }, } } } @@ -171,7 +171,7 @@ impl PageTableExt for PageTableImpl { PageTableImpl { page_table: TwoLevelPageTable::new(table), root_frame: frame, - entry: unsafe { core::mem::uninitialized() }, + entry: unsafe { core::mem::MaybeUninit::uninitialized().into_initialized() }, } } diff --git a/kernel/src/arch/x86_64/paging.rs b/kernel/src/arch/x86_64/paging.rs index b8f07ec..b6c5491 100644 --- a/kernel/src/arch/x86_64/paging.rs +++ b/kernel/src/arch/x86_64/paging.rs @@ -202,7 +202,7 @@ impl PageTableImpl { let table = unsafe { &mut *frame_to_page_table(frame) }; PageTableImpl( MappedPageTable::new(table, frame_to_page_table), - core::mem::uninitialized(), + core::mem::MaybeUninit::uninitialized().into_initialized()(), frame, ) } @@ -217,7 +217,7 @@ impl PageTableExt for PageTableImpl { unsafe { PageTableImpl( MappedPageTable::new(table, frame_to_page_table), - core::mem::uninitialized(), + core::mem::MaybeUninit::uninitialized().into_initialized()(), frame, ) } diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 1b8f90b..8788476 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -7,6 +7,7 @@ #![feature(panic_info_message)] #![feature(global_asm)] #![feature(fnbox)] +#![feature(maybe_uninit)] #![deny(unused_must_use)] #![no_std] diff --git a/kernel/src/process/structs.rs b/kernel/src/process/structs.rs index 0ed4ce8..384d2d5 100644 --- a/kernel/src/process/structs.rs +++ b/kernel/src/process/structs.rs @@ -21,7 +21,7 @@ use crate::sync::{Condvar, SpinNoIrqLock as Mutex}; use super::abi::{self, ProcInitInfo}; use crate::processor; -use core::mem::uninitialized; +use core::mem::MaybeUninit; use rcore_fs::vfs::INode; pub struct Thread { @@ -103,7 +103,7 @@ impl Thread { Box::new(Thread { context: Context::null(), // safety: other fields will never be used - ..core::mem::uninitialized() + ..core::mem::MaybeUninit::uninitialized().into_initialized() }) } @@ -146,7 +146,7 @@ impl Thread { ) -> Result<(MemorySet, usize, usize), &'static str> { // Read ELF header // 0x3c0: magic number from ld-musl.so - let mut data: [u8; 0x3c0] = unsafe { uninitialized() }; + let mut data: [u8; 0x3c0] = unsafe { MaybeUninit::uninitialized().into_initialized() }; inode .read_at(0, &mut data) .map_err(|_| "failed to read from INode")?;