From 50b601614491460dcc76857695b24a5ca13b0737 Mon Sep 17 00:00:00 2001 From: Garen Tyler Date: Sun, 12 Nov 2023 13:47:22 -0700 Subject: [PATCH] either_copyin and either_copyout --- kernel/proc.c | 31 ------------- kernel/rustkernel/src/arch/mod.rs | 5 ++- .../src/arch/riscv/virtual_memory.rs | 44 ++++++++++++++++++- kernel/rustkernel/src/console/mod.rs | 8 +--- 4 files changed, 47 insertions(+), 41 deletions(-) diff --git a/kernel/proc.c b/kernel/proc.c index b4085d3..b9196c9 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -8,7 +8,6 @@ struct proc proc[NPROC]; struct proc *initproc; -extern void forkret(void); // helps ensure that wakeups of wait()ing // parents are not lost. helps obey the @@ -76,33 +75,3 @@ forkret(void) 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; - } -} diff --git a/kernel/rustkernel/src/arch/mod.rs b/kernel/rustkernel/src/arch/mod.rs index 005693d..51b242c 100644 --- a/kernel/rustkernel/src/arch/mod.rs +++ b/kernel/rustkernel/src/arch/mod.rs @@ -46,8 +46,9 @@ pub mod mem { pub mod virtual_memory { #[cfg(target_arch = "riscv64")] pub use super::riscv::virtual_memory::{ - copyin, copyinstr, copyout, kvminit as init, kvminithart as inithart, mappages, uvmalloc, - uvmcopy, uvmcreate, uvmdealloc, uvmfree, uvmunmap, + copyin, copyinstr, copyout, either_copyin, either_copyout, kvminit as init, + kvminithart as inithart, mappages, uvmalloc, uvmcopy, uvmcreate, uvmdealloc, uvmfree, + uvmunmap, }; } diff --git a/kernel/rustkernel/src/arch/riscv/virtual_memory.rs b/kernel/rustkernel/src/arch/riscv/virtual_memory.rs index 080f850..0297cc3 100644 --- a/kernel/rustkernel/src/arch/riscv/virtual_memory.rs +++ b/kernel/rustkernel/src/arch/riscv/virtual_memory.rs @@ -1,6 +1,6 @@ use super::{ asm, - mem::{make_satp, pte2pa, kstack}, + mem::{kstack, make_satp, pte2pa}, plic::PLIC, power::QEMU_POWER, }; @@ -17,6 +17,7 @@ use crate::{ kalloc::{kalloc, kfree}, memmove, memset, }, + proc::process::Process, }; use core::ptr::{addr_of, addr_of_mut, null_mut}; @@ -25,6 +26,9 @@ extern "C" { pub static etext: [u8; 0]; /// trampoline.S 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. @@ -113,7 +117,13 @@ pub unsafe fn kvmmake() -> Pagetable { panic!("kalloc"); } 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 @@ -559,6 +569,36 @@ pub unsafe extern "C" fn copyin( 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 bytes to `dst` from virtual address `src_virtual_addr` diff --git a/kernel/rustkernel/src/console/mod.rs b/kernel/rustkernel/src/console/mod.rs index 27d7cb3..7414b6e 100644 --- a/kernel/rustkernel/src/console/mod.rs +++ b/kernel/rustkernel/src/console/mod.rs @@ -11,6 +11,7 @@ pub mod printf; use crate::{ + arch::virtual_memory::{either_copyin, either_copyout}, fs::file::{devsw, CONSOLE}, hardware::uart::Uart, proc::{ @@ -19,12 +20,7 @@ use crate::{ }, sync::mutex::Mutex, }; -use core::{ffi::c_void, 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; -} +use core::ptr::addr_of_mut; pub static UART0: &Uart = &crate::hardware::UARTS[0].1;