|
|
|
@ -10,7 +10,7 @@ use rcore_memory::VMError;
|
|
|
|
|
use crate::arch::cpu;
|
|
|
|
|
use crate::arch::interrupt::TrapFrame;
|
|
|
|
|
use crate::arch::syscall::*;
|
|
|
|
|
use crate::memory::MemorySet;
|
|
|
|
|
use crate::memory::{copy_from_user_u8, MemorySet};
|
|
|
|
|
use crate::process::*;
|
|
|
|
|
use crate::sync::{Condvar, MutexGuard, SpinNoIrq};
|
|
|
|
|
use crate::thread;
|
|
|
|
@ -556,3 +556,20 @@ pub fn spin_and_wait<T>(condvars: &[&Condvar], mut action: impl FnMut() -> Optio
|
|
|
|
|
Condvar::wait_any(&condvars);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn check_and_clone_cstr(user: *const u8) -> Result<String, SysError> {
|
|
|
|
|
let mut buffer = Vec::new();
|
|
|
|
|
for i in 0.. {
|
|
|
|
|
let addr = unsafe { user.add(i) };
|
|
|
|
|
if let Some(data) = copy_from_user_u8(addr) {
|
|
|
|
|
if data > 0 {
|
|
|
|
|
buffer.push(data);
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return Err(SysError::EFAULT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return String::from_utf8(buffer).map_err(|_| SysError::EFAULT);
|
|
|
|
|
}
|
|
|
|
|