diff --git a/Kernel/Core/arch/amd64/sync.rs b/Kernel/Core/arch/amd64/sync.rs index f2ddc1380e054c3b9bb5ce0d13bbc1590051f04d..9d21b25f2bdc09e97efd8f34e069a54de6433fd5 100644 --- a/Kernel/Core/arch/amd64/sync.rs +++ b/Kernel/Core/arch/amd64/sync.rs @@ -39,7 +39,7 @@ impl<T> Spinlock<T> /// Create a new spinning lock pub const fn new(val: T) -> Spinlock<T> { Spinlock { - lock: ::core::sync::atomic::ATOMIC_BOOL_INIT, //AtomicBool::new(false), + lock: AtomicBool::new(false), value: ::core::cell::UnsafeCell::new(val), } } diff --git a/Kernel/Core/arch/amd64/threads.rs b/Kernel/Core/arch/amd64/threads.rs index 715a91fffc1dd4b76d55e4f2f9efb710a60c981c..2ca508e74c5502e5ef62d324be6b8134fd307ade 100644 --- a/Kernel/Core/arch/amd64/threads.rs +++ b/Kernel/Core/arch/amd64/threads.rs @@ -30,7 +30,7 @@ extern "C" { fn task_switch(oldrsp: &mut u64, newrsp: &u64, tlsbase: u64, cr3: u64); } -pub static S_IRQS_ENABLED: ::core::sync::atomic::AtomicBool = ::core::sync::atomic::ATOMIC_BOOL_INIT; +pub static S_IRQS_ENABLED: ::core::sync::atomic::AtomicBool = ::core::sync::atomic::AtomicBool::new(false); static mut S_IDLE_THREAD: *mut ::threads::Thread = 0 as *mut _; #[repr(C)] diff --git a/Kernel/Core/async/event.rs b/Kernel/Core/async/event.rs index 4fbb959a3ba8d89396f04cfe6c79342fc39ecf6f..54faeca07634d9e87b3219d52a8e9047540bc5c6 100644 --- a/Kernel/Core/async/event.rs +++ b/Kernel/Core/async/event.rs @@ -5,7 +5,7 @@ //! Asynchronous event waiter #[allow(unused_imports)] use prelude::*; -use core::sync::atomic::{AtomicBool,ATOMIC_BOOL_INIT,Ordering}; +use core::sync::atomic::{AtomicBool,Ordering}; use core::fmt; /// A general-purpose wait event (when flag is set, waiters will be informed) @@ -34,15 +34,15 @@ pub struct Waiter<'a> source: Option<&'a Source>, } -//static S_EVENT_NONE: Source = Source { flag: ATOMIC_BOOL_INIT, waiter: mutex_init!(None) }; +//static S_EVENT_NONE: Source = Source { flag: AtomicBool::new(false), waiter: mutex_init!(None) }; impl Source { /// Create a new event source - pub fn new() -> Source + pub const fn new() -> Source { Source { - flag: ATOMIC_BOOL_INIT, + flag: AtomicBool::new(false), waiter: ::sync::mutex::Mutex::new(None), } } diff --git a/Kernel/Core/lib/mem/aref.rs b/Kernel/Core/lib/mem/aref.rs index d1e9602c653a8c0631e9f6e60c188b15c224dc87..90ef4043817448db9d270ec94488a77c35cd9753 100644 --- a/Kernel/Core/lib/mem/aref.rs +++ b/Kernel/Core/lib/mem/aref.rs @@ -133,7 +133,7 @@ impl<T: ?Sized + Any> ArefBorrow<T> { pub fn downcast<U: Any>(self) -> Result<ArefBorrow<U>,Self> { // SAFE: Transmute validity is checked by checking that the type IDs match unsafe { - if (*self).get_type_id() == ::core::any::TypeId::of::<U>() { + if (*self).type_id() == ::core::any::TypeId::of::<U>() { let ptr = self.__ptr.as_ptr() as *const ArefInner<U>; ::core::mem::forget(self); Ok(ArefBorrow { __ptr: NonNull::new_unchecked(ptr as *mut _) }) diff --git a/Kernel/Core/lib/mod.rs b/Kernel/Core/lib/mod.rs index 2559aff13805542a291d95b7b89064439ae7e787..41249fd13e9f467f6acd1d07bf786a8fb38d8d08 100644 --- a/Kernel/Core/lib/mod.rs +++ b/Kernel/Core/lib/mod.rs @@ -22,7 +22,7 @@ pub use self::pod::{as_byte_slice, as_byte_slice_mut}; pub use self::collections::vec_map; pub mod collections; -pub mod thunk; +//pub mod thunk; pub mod borrow; pub mod ascii; diff --git a/Kernel/Core/main.rs b/Kernel/Core/main.rs index 0c08a6409e409ce562bb2dc1f91e0961c657c65d..e9fe6db3167181e3a365c829e7d21bd852ff75fd 100644 --- a/Kernel/Core/main.rs +++ b/Kernel/Core/main.rs @@ -16,8 +16,7 @@ #![feature(slice_patterns)] // Slice (array) destructuring patterns, used by multiboot code #![feature(linkage)] // allows using #[linkage="external"] #![feature(const_fn)] // Allows defining `const fn` -#![feature(get_type_id)] // used by process_local's "AnyMap" hackery -#![feature(integer_atomics)] // AtomicU8 +//#![feature(integer_atomics)] // AtomicU8 #![feature(dropck_eyepatch)] #![feature(panic_info_message)] diff --git a/Kernel/Core/metadevs/storage.rs b/Kernel/Core/metadevs/storage.rs index ac1dc1aaa1608277a46c2849b7059aab86a56504..003775c7be2f730e5875467b375c63be61bf499a 100644 --- a/Kernel/Core/metadevs/storage.rs +++ b/Kernel/Core/metadevs/storage.rs @@ -4,7 +4,7 @@ // Core/metadevs/storage.rs // - Storage (block device) subsystem use prelude::*; -use core::sync::atomic::{AtomicUsize,ATOMIC_USIZE_INIT}; +use core::sync::atomic::{AtomicUsize}; use sync::mutex::LazyMutex; use lib::{VecMap}; use lib::mem::Arc; @@ -157,9 +157,9 @@ struct PhysicalRegion first_block: u64, } -static S_NEXT_PV_IDX: AtomicUsize = ATOMIC_USIZE_INIT; +static S_NEXT_PV_IDX: AtomicUsize = AtomicUsize::new(0); static S_PHYSICAL_VOLUMES: LazyMutex<VecMap<usize,PhysicalVolumeInfo>> = lazymutex_init!(); -static S_NEXT_LV_IDX: AtomicUsize = ATOMIC_USIZE_INIT; +static S_NEXT_LV_IDX: AtomicUsize = AtomicUsize::new(0); static S_LOGICAL_VOLUMES: LazyMutex<VecMap<usize,Arc<LogicalVolume>>> = lazymutex_init!(); static S_MAPPERS: LazyMutex<Vec<&'static Mapper>> = lazymutex_init!(); diff --git a/Kernel/Core/metadevs/video/geom.rs b/Kernel/Core/metadevs/video/geom.rs index 15bd2b265d395757981a717241cf224753fdc643..8252d92809c34adcf636eb829fb32fb4562b5f7f 100644 --- a/Kernel/Core/metadevs/video/geom.rs +++ b/Kernel/Core/metadevs/video/geom.rs @@ -120,8 +120,8 @@ impl Rect /// Obtain the closest Pos in this Rect pub fn clamp_pos(&self, pos: Pos) -> Pos { - let x = ::core::cmp::min( ::core::cmp::max(pos.x, self.left()), self.right() ); - let y = ::core::cmp::min( ::core::cmp::max(pos.y, self.top() ), self.bottom() ); + let x = ::core::cmp::min( ::core::cmp::max(pos.x, self.left()), self.right() - 1 ); + let y = ::core::cmp::min( ::core::cmp::max(pos.y, self.top() ), self.bottom() - 1 ); Pos::new(x, y) } diff --git a/Kernel/Core/metadevs/video/mod.rs b/Kernel/Core/metadevs/video/mod.rs index 37ef7b31c320b78a29823858559b7714f8b08a63..8a17388adba86aabee0e2e1463bed978c3886e45 100644 --- a/Kernel/Core/metadevs/video/mod.rs +++ b/Kernel/Core/metadevs/video/mod.rs @@ -286,9 +286,11 @@ fn get_closest_visible_pos(pos: Pos) -> Pos } /// Returns the display region that contains the given point -pub fn get_display_for_pos(pos: Pos) -> Option<Rect> +pub fn get_display_for_pos(pos: Pos) -> Result<Rect,Rect> { with_display_at_pos(pos, |s| s.region) + // If the position is outside of any displays, return the closest display to it + .ok_or_else( || with_display_at_pos(get_closest_visible_pos(pos), |s| s.region).unwrap() ) } /// Write part of a single scanline to the screen diff --git a/Kernel/Core/sync/event_channel.rs b/Kernel/Core/sync/event_channel.rs index 0c0b03f8aa024b5e8a43167435aab01c5cb5a041..824f8f2019fb9372658e6aab591f66a21027839a 100644 --- a/Kernel/Core/sync/event_channel.rs +++ b/Kernel/Core/sync/event_channel.rs @@ -32,7 +32,7 @@ impl EventChannel EventChannel { lock: Spinlock::new( false ), queue: UnsafeCell::new( WaitQueue::new() ), - pending_wakes: ::core::sync::atomic::ATOMIC_USIZE_INIT, + pending_wakes: ::core::sync::atomic::AtomicUsize::new(0), } } diff --git a/Kernel/Core/threads/mod.rs b/Kernel/Core/threads/mod.rs index ea83022386077f37ed1d4c1c31fd69dc513746ec..beabcde4aca8dd66b10dfda736c8e4a87ef6198d 100644 --- a/Kernel/Core/threads/mod.rs +++ b/Kernel/Core/threads/mod.rs @@ -198,8 +198,8 @@ pub fn get_process_local<T: Send+Sync+::core::any::Any+Default+'static>() -> Are for s in pld.read().iter() { let item_ref: &::core::any::Any = &**s; - //log_debug!("{:?} ?== {:?}", item_ref.get_type_id(), ::core::any::TypeId::of::<T>()); - if item_ref.get_type_id() == ::core::any::TypeId::of::<T>() { + //log_debug!("{:?} ?== {:?}", item_ref.type_id(), ::core::any::TypeId::of::<T>()); + if item_ref.type_id() == ::core::any::TypeId::of::<T>() { return s.borrow().downcast::<T>().ok().unwrap(); } } @@ -208,8 +208,8 @@ pub fn get_process_local<T: Send+Sync+::core::any::Any+Default+'static>() -> Are let mut lh = pld.write(); for s in lh.iter() { let item_ref: &::core::any::Any = &**s; - //log_debug!("{:?} ?== {:?}", item_ref.get_type_id(), ::core::any::TypeId::of::<T>()); - if item_ref.get_type_id() == ::core::any::TypeId::of::<T>() { + //log_debug!("{:?} ?== {:?}", item_ref.type_id(), ::core::any::TypeId::of::<T>()); + if item_ref.type_id() == ::core::any::TypeId::of::<T>() { return s.borrow().downcast::<T>().ok().unwrap(); } } diff --git a/Kernel/Core/threads/thread.rs b/Kernel/Core/threads/thread.rs index 45835f291cc9c2e4c4f1d929f5dee3f4937bb397..95383c90c676bf1dee7f73c82d9f2d9e0b0b354c 100644 --- a/Kernel/Core/threads/thread.rs +++ b/Kernel/Core/threads/thread.rs @@ -85,9 +85,9 @@ pub struct Thread assert_trait!{Thread : Send} /// Last allocated TID (because TID0 is allocated differently) -static S_LAST_TID: ::core::sync::atomic::AtomicUsize = ::core::sync::atomic::ATOMIC_USIZE_INIT; +static S_LAST_TID: ::core::sync::atomic::AtomicUsize = ::core::sync::atomic::AtomicUsize::new(0); const C_MAX_TID: usize = 0x7FFF_FFF0; // Leave 16 TIDs spare at end of 31 bit number -static S_LAST_PID: ::core::sync::atomic::AtomicUsize = ::core::sync::atomic::ATOMIC_USIZE_INIT; +static S_LAST_PID: ::core::sync::atomic::AtomicUsize = ::core::sync::atomic::AtomicUsize::new(0); const C_MAX_PID: usize = 0x007F_FFF0; // Leave 16 PIDs spare at end of 23 bit number fn allocate_tid() -> ThreadID @@ -195,7 +195,7 @@ impl ProcessHandle for s in pld.read().iter() { let item_ref: &::core::any::Any = &**s; - if item_ref.get_type_id() == ::core::any::TypeId::of::<T>() { + if item_ref.type_id() == ::core::any::TypeId::of::<T>() { return Some( s.borrow().downcast::<T>().ok().unwrap() ); } } @@ -211,7 +211,7 @@ impl ProcessHandle for s in pld.read().iter() { let item_ref: &::core::any::Any = &**s; - if item_ref.get_type_id() == ::core::any::TypeId::of::<T>() { + if item_ref.type_id() == ::core::any::TypeId::of::<T>() { return s.borrow().downcast::<T>().ok().unwrap(); } } @@ -220,7 +220,7 @@ impl ProcessHandle for s in lh.iter() { let item_ref: &::core::any::Any = &**s; - if item_ref.get_type_id() == ::core::any::TypeId::of::<T>() { + if item_ref.type_id() == ::core::any::TypeId::of::<T>() { return s.borrow().downcast::<T>().ok().unwrap(); } } diff --git a/Kernel/Core/unwind.rs b/Kernel/Core/unwind.rs index 7f1a5fef0cf5d83a31100592a07847285335a1eb..034fcf5955c0d2f1aeff91faa729278202759ea7 100644 --- a/Kernel/Core/unwind.rs +++ b/Kernel/Core/unwind.rs @@ -75,7 +75,7 @@ pub extern fn rust_begin_unwind(info: &::core::panic::PanicInfo) -> ! { } fn begin_panic_fmt(msg: &::core::fmt::Arguments, (file, line): (&str, u32)) -> ! { - static NESTED: ::core::sync::atomic::AtomicBool = ::core::sync::atomic::ATOMIC_BOOL_INIT; + static NESTED: ::core::sync::atomic::AtomicBool = ::core::sync::atomic::AtomicBool::new(false); ::arch::puts("\nERROR: rust_begin_unwind: "); ::arch::puts(file); ::arch::puts(":"); diff --git a/Kernel/Makefile b/Kernel/Makefile index 7d96fdd066261e9a389908fdc220f6a30c15c595..fd70a7dc19f300acb23b4fc3ca30e8484346f54d 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -246,7 +246,7 @@ $(OBJDIR)libcore.rlib: $(LIBCORESRC)lib.rs $(TARGET_FILE) $(OBJDIR)libcompiler_builtins.rlib: $(RUSTUP_SRC_DIR)libcompiler_builtins/src/lib.rs $(TARGET_FILE) @echo [RUSTC] -o $@ @mkdir -p $(dir $@) - $V$(ENV) $(RUSTC) $(RUSTFLAGS) --emit=link,dep-info --out-dir $(dir $@) --cfg feature=\"compiler-builtins\" $< + $V$(ENV) $(RUSTC) $(RUSTFLAGS) --emit=link,dep-info --out-dir $(dir $@) --cfg feature=\"compiler-builtins\" $< --cfg stage0 @cp $(OBJDIR)core.d $(OBJDIR)libcore.d $(OBJDIR)acpica.a: ../acpica/Makefile $(wildcard ../acpica/patches/source/include/platform/*) diff --git a/Kernel/Modules/gui/input/mod.rs b/Kernel/Modules/gui/input/mod.rs index 8bd228bb28ec49b3d4fed531be9f055933fb69ec..494d5551bfc3cf6584b3b1a05b996c9982d284b7 100644 --- a/Kernel/Modules/gui/input/mod.rs +++ b/Kernel/Modules/gui/input/mod.rs @@ -6,7 +6,7 @@ #[allow(unused_imports)] use kernel::prelude::*; use self::keyboard::KeyCode; -use core::sync::atomic::{AtomicUsize,ATOMIC_USIZE_INIT,Ordering}; +use core::sync::atomic::{AtomicUsize,Ordering}; use kernel::sync::atomic::AtomicValue; use kernel::sync::Mutex; @@ -286,7 +286,7 @@ impl InputChannel impl ModKeyPair { const fn new() -> ModKeyPair { - ModKeyPair(ATOMIC_USIZE_INIT) + ModKeyPair(AtomicUsize::new(0)) } fn set_l(&self) { self.0.fetch_or(1, Ordering::Relaxed); } fn set_r(&self) { self.0.fetch_or(2, Ordering::Relaxed); } diff --git a/Kernel/Modules/gui/kernel_log.rs b/Kernel/Modules/gui/kernel_log.rs index 1540d2d3bdd0aee31d6bd8407879c9c10c17940c..8c569aebba6a221a2b018ab4464428480236e714 100644 --- a/Kernel/Modules/gui/kernel_log.rs +++ b/Kernel/Modules/gui/kernel_log.rs @@ -81,8 +81,8 @@ impl KernelLog // - Is this particular call bad for bypassing the GUI? Or is this acceptable let max_dims = match ::kernel::metadevs::video::get_display_for_pos( Pos::new(0,0) ) { - Some(display) => display.dims(), - None => { + Ok(display) => display.dims(), + Err(_) => { log_warning!("No display at (0,0)"); Dims::new(0,0) }, diff --git a/Kernel/Modules/gui/windows/mod.rs b/Kernel/Modules/gui/windows/mod.rs index 7d04b312f266c078babc86f61ef584f341119ba8..3d98777a7627eb210491805025280b81d1735e6b 100644 --- a/Kernel/Modules/gui/windows/mod.rs +++ b/Kernel/Modules/gui/windows/mod.rs @@ -72,7 +72,7 @@ struct CursorPos { // - 13 sessions, #0 is fixed to be the kernel's log 1-12 are bound to F1-F12 const C_MAX_SESSIONS: usize = 13; static S_WINDOW_GROUPS: LazyMutex<SparseVec< Arc<Mutex<WindowGroup>> >> = lazymutex_init!(); -static S_CURRENT_GROUP: ::core::sync::atomic::AtomicUsize = ::core::sync::atomic::ATOMIC_USIZE_INIT; +static S_CURRENT_GROUP: ::core::sync::atomic::AtomicUsize = ::core::sync::atomic::AtomicUsize::new(0); static S_RENDER_REQUEST: ::kernel::sync::EventChannel = ::kernel::sync::EventChannel::new(); static S_RENDER_NEEDED: atomic::AtomicBool = atomic::AtomicBool::new(false); @@ -102,20 +102,36 @@ pub fn update_dims() let mut lh = grp.lock(); for &mut (ref mut pos, ref win) in lh.windows.iter_mut() { - // Locate screen for the upper-left corner - let screen = match ::kernel::metadevs::video::get_display_for_pos(*pos) - { - Some(x) => x, - // TODO: If now off-screen, warp to a visible position (with ~20px leeway) - None => todo!("update_dims: Handle window moving off display area"), - }; // if window is maximised, keep it that way if win.flags.lock().maximised { + // Locate screen for the upper-left corner + let screen = match ::kernel::metadevs::video::get_display_for_pos(*pos) + { + Ok(x) => x, + // TODO: If now off-screen, warp to a visible position (with ~20px leeway) + Err(r) => { + todo!("update_dims: Handle full-screen window moving off display area - {:?} - {:?}", *pos, r) + }, + }; // Re-maximise *pos = screen.pos(); win.resize(screen.dims()); } + else + { + // Otherwise, ensure that the window stays visible + match ::kernel::metadevs::video::get_display_for_pos(*pos) + { + Ok(x) => { + // TODO: Crop window's display area to fit on-screen? + }, + // TODO: If now off-screen, warp to a visible position (with ~20px leeway) + Err(r) => { + todo!("update_dims: Handle window moving off display area - {:?} - {:?}", *pos, r) + }, + } + } } // Recalculate all visibilities let count = lh.render_order.len(); @@ -476,9 +492,9 @@ impl WindowGroup let &mut(ref mut pos, ref win_rc) = &mut self.windows[idx as usize]; let rect = match ::kernel::metadevs::video::get_display_for_pos(*pos) { - Some(x) => x, - None => { - log_error!("TODO: Handle window being off-screen"); + Ok(x) => x, + Err(r) => { + log_error!("TODO: Handle window being off-screen - closest {:?}", r); Rect::new(0,0, 0,0) }, }; diff --git a/Kernel/Modules/gui/windows/window.rs b/Kernel/Modules/gui/windows/window.rs index 7d5cfd585690e7d438cb5a9c084802f7994713e3..517c4c45dcd7f296e885da7d5f3afc98645d61ce 100644 --- a/Kernel/Modules/gui/windows/window.rs +++ b/Kernel/Modules/gui/windows/window.rs @@ -66,7 +66,7 @@ impl Window name: name, buf: Default::default(), dirty_rects: Default::default(), - is_dirty: atomic::ATOMIC_BOOL_INIT, + is_dirty: atomic::AtomicBool::new(false), flags: Default::default(), input: WindowInput { queue: Mutex::new(RingBuf::new(16)), diff --git a/Kernel/Modules/nic_rtl8139/lib.rs b/Kernel/Modules/nic_rtl8139/lib.rs index f1deba2f34be392891a4defd42825e59c2ad6d9b..60fd9b394d5328d23f3288b06a177fbff79053ff 100644 --- a/Kernel/Modules/nic_rtl8139/lib.rs +++ b/Kernel/Modules/nic_rtl8139/lib.rs @@ -5,7 +5,6 @@ //! Realtek 8139 driver #![no_std] #![feature(linkage)] // for module_define! -#![feature(integer_atomics)] // AtomicU8 use kernel::prelude::*; use kernel::sync::Mutex; use kernel::_async3 as async; diff --git a/Kernel/Modules/syscalls/lib.rs b/Kernel/Modules/syscalls/lib.rs index 0e807cfa1c51cfb444e8fb7659b55e0fc2e72346..6fa5174edc18d6527abf37630265ebd4fd5706c6 100644 --- a/Kernel/Modules/syscalls/lib.rs +++ b/Kernel/Modules/syscalls/lib.rs @@ -4,7 +4,6 @@ // Core/syscalls/mod.rs //! Userland system-call interface #![no_std] -#![feature(integer_atomics)] #[allow(unused_imports)] use kernel::prelude::*; diff --git a/Kernel/Modules/usb_ohci/lib.rs b/Kernel/Modules/usb_ohci/lib.rs index 2a26910c63ff2361b47e49a570d4a2320a3b21ce..85e324e808e513c353bce252f7854b90cefb2b5f 100644 --- a/Kernel/Modules/usb_ohci/lib.rs +++ b/Kernel/Modules/usb_ohci/lib.rs @@ -2,7 +2,6 @@ //! Open Host Controller Interface (OHCI) driver #![no_std] #![feature(linkage)] // for module_define! -#![feature(integer_atomics)] // AtomicU8 use kernel::prelude::*; use kernel::_async3 as async; use kernel::lib::mem::aref::{Aref,ArefBorrow}; diff --git a/Kernel/Modules/virtio/devices/video.rs b/Kernel/Modules/virtio/devices/video.rs index 28f7ce564c7f82f044b5f650be6a03f63ac39417..aa3fee1e7b87925570cf0b2bcc276fe5605a9284 100644 --- a/Kernel/Modules/virtio/devices/video.rs +++ b/Kernel/Modules/virtio/devices/video.rs @@ -141,10 +141,12 @@ where width: width, height: height, }; + let mut ret_hdr: hw::CtrlHeader = ::kernel::lib::PodHelpers::zeroed(); let _rv = { let h = self.controlq.send_buffers(&self.interface, &mut [ Buffer::Read(::kernel::lib::as_byte_slice(&hdr)), Buffer::Read(::kernel::lib::as_byte_slice(&cmd)), + Buffer::Write(::kernel::lib::as_byte_slice_mut(&mut ret_hdr)), ]); h.wait_for_completion().expect("") }; @@ -169,11 +171,13 @@ where scanout_id: scanout_idx as u32, resource_id: resource_handle.idx, }; + let mut ret_hdr: hw::CtrlHeader = ::kernel::lib::PodHelpers::zeroed(); let _rv = { let h = self.controlq.send_buffers(&self.interface, &mut [ Buffer::Read(::kernel::lib::as_byte_slice(&hdr)), Buffer::Read(::kernel::lib::as_byte_slice(&cmd)), + Buffer::Write(::kernel::lib::as_byte_slice_mut(&mut ret_hdr)), ]); h.wait_for_completion().expect("") }; diff --git a/Kernel/Modules/virtio/lib.rs b/Kernel/Modules/virtio/lib.rs index 57cc54e15d940035cf0b0514ec4e4b782d34d3b8..70cad334eb6931e15179dc2fce7287220be368b6 100644 --- a/Kernel/Modules/virtio/lib.rs +++ b/Kernel/Modules/virtio/lib.rs @@ -5,7 +5,6 @@ //! Virtual IO devices #![no_std] #![feature(linkage)] -#![feature(integer_atomics)] #[macro_use] extern crate kernel; diff --git a/Kernel/Modules/virtio/queue.rs b/Kernel/Modules/virtio/queue.rs index 90dd75b5ea80222b237b0caab12badbfb871dbc4..453107fff854c745b68974aa45508c75eb636c92 100644 --- a/Kernel/Modules/virtio/queue.rs +++ b/Kernel/Modules/virtio/queue.rs @@ -113,7 +113,7 @@ impl Queue log_debug!("idx={}, desc={:?}", idx, self.used_ring().ents[idx]); let UsedElem { id, len } = self.used_ring().ents[idx]; - assert!(len > 0); + assert!(len > 0, "Used entry {} returned a zero length (id={})", idx, id); self.avail_ring_res[id as usize].store(len as usize, Ordering::Release); self.interrupt_flag.release(); } diff --git a/Usermode/Makefile b/Usermode/Makefile index 17f94bf6896967cb3bc475206da08ab53b93354e..8da9b005625c89e17628faf23d749486fe301968 100644 --- a/Usermode/Makefile +++ b/Usermode/Makefile @@ -46,7 +46,7 @@ endif BIN_RUSTFLAGS := #BIN_RUSTFLAGS += -C lto -RUSTFLAGS_compiler_builtins = --cfg feature=\"compiler-builtins\" +RUSTFLAGS_compiler_builtins = --cfg feature=\"compiler-builtins\" --cfg stage0 # - List non-file targets .PHONY: all clean