prevent cursor r/w optimization

This commit is contained in:
Simon Renblad 2024-12-17 11:46:36 +08:00
parent 7d6d40a785
commit 81eba30a29
2 changed files with 4 additions and 0 deletions

View File

@ -2,6 +2,7 @@
use alloc::vec::Vec; use alloc::vec::Vec;
use core_io::{Error as IoError, Read, Write}; use core_io::{Error as IoError, Read, Write};
use core::arch::asm;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Cursor<T> { pub struct Cursor<T> {
@ -47,6 +48,7 @@ impl<T: AsRef<[u8]>> Read for Cursor<T> {
let len = buf.len().min(data.len()); let len = buf.len().min(data.len());
// ``copy_from_slice`` generates AXI bursts, use a regular loop instead // ``copy_from_slice`` generates AXI bursts, use a regular loop instead
for i in 0..len { for i in 0..len {
unsafe { asm!("", options(preserves_flags, nostack, readonly)); }
buf[i] = data[i]; buf[i] = data[i];
} }
self.pos += len; self.pos += len;
@ -59,6 +61,7 @@ impl Write for Cursor<&mut [u8]> {
let data = &mut self.inner[self.pos..]; let data = &mut self.inner[self.pos..];
let len = buf.len().min(data.len()); let len = buf.len().min(data.len());
for i in 0..len { for i in 0..len {
unsafe { asm!("", options(preserves_flags, nostack, readonly)); }
data[i] = buf[i]; data[i] = buf[i];
} }
self.pos += len; self.pos += len;

View File

@ -1,5 +1,6 @@
#![no_std] #![no_std]
#![feature(never_type)] #![feature(never_type)]
#![feature(asm)]
#[cfg(feature = "alloc")] #[cfg(feature = "alloc")]
extern crate alloc; extern crate alloc;