either_copyin and either_copyout
This commit is contained in:
parent
c39b98dd02
commit
50b6016144
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
struct proc proc[NPROC];
|
struct proc proc[NPROC];
|
||||||
struct proc *initproc;
|
struct proc *initproc;
|
||||||
extern void forkret(void);
|
|
||||||
|
|
||||||
// helps ensure that wakeups of wait()ing
|
// helps ensure that wakeups of wait()ing
|
||||||
// parents are not lost. helps obey the
|
// parents are not lost. helps obey the
|
||||||
@ -76,33 +75,3 @@ forkret(void)
|
|||||||
|
|
||||||
usertrapret();
|
usertrapret();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy to either a user address, or kernel address,
|
|
||||||
// depending on usr_dst.
|
|
||||||
// Returns 0 on success, -1 on error.
|
|
||||||
int
|
|
||||||
either_copyout(int user_dst, uint64 dst, void *src, uint64 len)
|
|
||||||
{
|
|
||||||
struct proc *p = myproc();
|
|
||||||
if(user_dst){
|
|
||||||
return copyout(p->pagetable, dst, src, len);
|
|
||||||
} else {
|
|
||||||
memmove((char *)dst, src, len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy from either a user address, or kernel address,
|
|
||||||
// depending on usr_src.
|
|
||||||
// Returns 0 on success, -1 on error.
|
|
||||||
int
|
|
||||||
either_copyin(void *dst, int user_src, uint64 src, uint64 len)
|
|
||||||
{
|
|
||||||
struct proc *p = myproc();
|
|
||||||
if(user_src){
|
|
||||||
return copyin(p->pagetable, dst, src, len);
|
|
||||||
} else {
|
|
||||||
memmove(dst, (char*)src, len);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -46,8 +46,9 @@ pub mod mem {
|
|||||||
pub mod virtual_memory {
|
pub mod virtual_memory {
|
||||||
#[cfg(target_arch = "riscv64")]
|
#[cfg(target_arch = "riscv64")]
|
||||||
pub use super::riscv::virtual_memory::{
|
pub use super::riscv::virtual_memory::{
|
||||||
copyin, copyinstr, copyout, kvminit as init, kvminithart as inithart, mappages, uvmalloc,
|
copyin, copyinstr, copyout, either_copyin, either_copyout, kvminit as init,
|
||||||
uvmcopy, uvmcreate, uvmdealloc, uvmfree, uvmunmap,
|
kvminithart as inithart, mappages, uvmalloc, uvmcopy, uvmcreate, uvmdealloc, uvmfree,
|
||||||
|
uvmunmap,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use super::{
|
use super::{
|
||||||
asm,
|
asm,
|
||||||
mem::{make_satp, pte2pa, kstack},
|
mem::{kstack, make_satp, pte2pa},
|
||||||
plic::PLIC,
|
plic::PLIC,
|
||||||
power::QEMU_POWER,
|
power::QEMU_POWER,
|
||||||
};
|
};
|
||||||
@ -17,6 +17,7 @@ use crate::{
|
|||||||
kalloc::{kalloc, kfree},
|
kalloc::{kalloc, kfree},
|
||||||
memmove, memset,
|
memmove, memset,
|
||||||
},
|
},
|
||||||
|
proc::process::Process,
|
||||||
};
|
};
|
||||||
use core::ptr::{addr_of, addr_of_mut, null_mut};
|
use core::ptr::{addr_of, addr_of_mut, null_mut};
|
||||||
|
|
||||||
@ -25,6 +26,9 @@ extern "C" {
|
|||||||
pub static etext: [u8; 0];
|
pub static etext: [u8; 0];
|
||||||
/// trampoline.S
|
/// trampoline.S
|
||||||
pub static trampoline: [u8; 0];
|
pub static trampoline: [u8; 0];
|
||||||
|
|
||||||
|
// pub fn either_copyin(dst: *mut u8, user_src: i32, src: u64, len: u64) -> i32;
|
||||||
|
// pub fn either_copyout(user_dst: i32, dst: u64, src: *mut u8, len: u64) -> i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The kernel's pagetable.
|
/// The kernel's pagetable.
|
||||||
@ -113,7 +117,13 @@ pub unsafe fn kvmmake() -> Pagetable {
|
|||||||
panic!("kalloc");
|
panic!("kalloc");
|
||||||
}
|
}
|
||||||
let virtual_addr = kstack(i) as u64;
|
let virtual_addr = kstack(i) as u64;
|
||||||
kvmmap(pagetable, virtual_addr, page as u64, PAGE_SIZE as u64, PTE_R | PTE_W);
|
kvmmap(
|
||||||
|
pagetable,
|
||||||
|
virtual_addr,
|
||||||
|
page as u64,
|
||||||
|
PAGE_SIZE as u64,
|
||||||
|
PTE_R | PTE_W,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pagetable
|
pagetable
|
||||||
@ -559,6 +569,36 @@ pub unsafe extern "C" fn copyin(
|
|||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy to either a user address, or kernel address,
|
||||||
|
// depending on usr_dst.
|
||||||
|
// Returns 0 on success, -1 on error.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn either_copyout(user_dst: i32, dst: u64, src: *mut u8, len: u64) -> i32 {
|
||||||
|
let p = Process::current().unwrap();
|
||||||
|
|
||||||
|
if user_dst > 0 {
|
||||||
|
copyout(p.pagetable, dst, src, len)
|
||||||
|
} else {
|
||||||
|
memmove(dst as *mut u8, src, len as u32);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy from either a user address, or kernel address,
|
||||||
|
// depending on usr_src.
|
||||||
|
// Returns 0 on success, -1 on error.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn either_copyin(dst: *mut u8, user_src: i32, src: u64, len: u64) -> i32 {
|
||||||
|
let p = Process::current().unwrap();
|
||||||
|
|
||||||
|
if user_src > 0 {
|
||||||
|
copyin(p.pagetable, dst, src, len)
|
||||||
|
} else {
|
||||||
|
memmove(dst, src as *mut u8, len as u32);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Copy a null-terminated string from user to kernel.
|
/// Copy a null-terminated string from user to kernel.
|
||||||
///
|
///
|
||||||
/// Copy bytes to `dst` from virtual address `src_virtual_addr`
|
/// Copy bytes to `dst` from virtual address `src_virtual_addr`
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
pub mod printf;
|
pub mod printf;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
arch::virtual_memory::{either_copyin, either_copyout},
|
||||||
fs::file::{devsw, CONSOLE},
|
fs::file::{devsw, CONSOLE},
|
||||||
hardware::uart::Uart,
|
hardware::uart::Uart,
|
||||||
proc::{
|
proc::{
|
||||||
@ -19,12 +20,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
sync::mutex::Mutex,
|
sync::mutex::Mutex,
|
||||||
};
|
};
|
||||||
use core::{ffi::c_void, ptr::addr_of_mut};
|
use core::ptr::addr_of_mut;
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
fn either_copyin(dst: *mut c_void, user_src: i32, src: u64, len: u64) -> i32;
|
|
||||||
fn either_copyout(user_dst: i32, dst: u64, src: *mut c_void, len: u64) -> i32;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub static UART0: &Uart = &crate::hardware::UARTS[0].1;
|
pub static UART0: &Uart = &crate::hardware::UARTS[0].1;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user