From a676378ef7689a8f94303545f779834dac95a084 Mon Sep 17 00:00:00 2001 From: ZhiyuanSue <2262387848@qq.com> Date: Sat, 25 May 2024 16:14:58 +0800 Subject: [PATCH] adjust the user space syscall part --- README.md | 2 + user/servers/helloworld_server/src/console.rs | 3 +- user/servers/helloworld_server/src/main.rs | 15 ++- user/servers/helloworld_server/src/syscall.rs | 125 ++++-------------- user/servers/root_server/src/console.rs | 3 +- user/servers/root_server/src/main.rs | 13 +- user/servers/root_server/src/syscall.rs | 125 ++++-------------- 7 files changed, 72 insertions(+), 214 deletions(-) diff --git a/README.md b/README.md index 6014416..0df312e 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ make run ARCH=aarch64 LOG=info as a demo, the syscall is designed like this: 1/CreateThread only one parameter: the server number + TODO: we just create a new process ,but actually we need to add a process id parameter + and decide whether the new thread running in which process 2/Yield parameter is empty 3/Send(Blocked) diff --git a/user/servers/helloworld_server/src/console.rs b/user/servers/helloworld_server/src/console.rs index d37e867..fa704bc 100644 --- a/user/servers/helloworld_server/src/console.rs +++ b/user/servers/helloworld_server/src/console.rs @@ -3,11 +3,10 @@ use core::fmt::{self, Write}; struct Stdout; -const STDOUT: usize = 1; impl Write for Stdout { fn write_str(&mut self, s: &str) -> fmt::Result { - write(STDOUT, s.as_bytes()); + write(s.as_bytes()); Ok(()) } } diff --git a/user/servers/helloworld_server/src/main.rs b/user/servers/helloworld_server/src/main.rs index 53a398e..36269c3 100644 --- a/user/servers/helloworld_server/src/main.rs +++ b/user/servers/helloworld_server/src/main.rs @@ -12,7 +12,7 @@ mod syscall; #[link_section = ".text.entry"] pub extern "C" fn _start() -> ! { clear_bss(); - exit(main()); + main(); panic!("unreachable after sys_exit!"); } @@ -35,9 +35,12 @@ fn clear_bss() { use syscall::*; -pub fn write(fd: usize, buf: &[u8]) -> isize { - sys_write(fd, buf) -} -pub fn exit(exit_code: i32) -> isize { - sys_exit(exit_code) + +pub fn write(buf: &[u8]) -> isize { + let mut i=0; + for ch in buf{ + i+=1; + sys_debug_print(*ch); + } + i } \ No newline at end of file diff --git a/user/servers/helloworld_server/src/syscall.rs b/user/servers/helloworld_server/src/syscall.rs index ad6ba77..3ac3357 100644 --- a/user/servers/helloworld_server/src/syscall.rs +++ b/user/servers/helloworld_server/src/syscall.rs @@ -2,23 +2,13 @@ use core::arch::asm; // use crate::SignalAction; -const SYSCALL_DUP: usize = 24; -const SYSCALL_OPEN: usize = 56; -const SYSCALL_CLOSE: usize = 57; -const SYSCALL_PIPE: usize = 59; -const SYSCALL_READ: usize = 63; -const SYSCALL_WRITE: usize = 64; -const SYSCALL_EXIT: usize = 93; -const SYSCALL_YIELD: usize = 124; -const SYSCALL_KILL: usize = 129; -const SYSCALL_SIGACTION: usize = 134; -const SYSCALL_SIGPROCMASK: usize = 135; -const SYSCALL_SIGRETURN: usize = 139; -const SYSCALL_GET_TIME: usize = 169; -const SYSCALL_GETPID: usize = 172; -const SYSCALL_FORK: usize = 220; -const SYSCALL_EXEC: usize = 221; -const SYSCALL_WAITPID: usize = 260; +const SYSCALL_CREATETHREAD: usize = 0; +const SYSCALL_YIELD: usize = 1; +const SYSCALL_SEND: usize = 2; +const SYSCALL_RECV: usize = 3; +const SYSCALL_SEND_NB: usize = 4; +const SYSCALL_RECV_NB: usize = 5; +const SYSCALL_DEBUG_PRINT: usize = 6; #[cfg(target_arch = "riscv64")] fn syscall(id: usize, args: [usize; 3]) -> isize { @@ -86,94 +76,31 @@ fn syscall(id: usize, args: [usize; 3]) -> isize { ret } -pub fn sys_dup(fd: usize) -> isize { - syscall(SYSCALL_DUP, [fd, 0, 0]) +#[allow(dead_code)] +pub fn sys_createthread(server_num:usize) -> isize { + syscall(SYSCALL_CREATETHREAD, [server_num, 0, 0]) } - -pub fn sys_open(path: &str, flags: u32) -> isize { - syscall(SYSCALL_OPEN, [path.as_ptr() as usize, flags as usize, 0]) -} - -pub fn sys_close(fd: usize) -> isize { - syscall(SYSCALL_CLOSE, [fd, 0, 0]) -} - -pub fn sys_pipe(pipe: &mut [usize]) -> isize { - syscall(SYSCALL_PIPE, [pipe.as_mut_ptr() as usize, 0, 0]) -} - -pub fn sys_read(fd: usize, buffer: &mut [u8]) -> isize { - syscall( - SYSCALL_READ, - [fd, buffer.as_mut_ptr() as usize, buffer.len()], - ) -} - -pub fn sys_write(fd: usize, buffer: &[u8]) -> isize { - syscall(SYSCALL_WRITE, [fd, buffer.as_ptr() as usize, buffer.len()]) -} - -pub fn sys_exit(exit_code: i32) -> ! { - syscall(SYSCALL_EXIT, [exit_code as usize, 0, 0]); - panic!("sys_exit never returns!"); -} - +#[allow(dead_code)] pub fn sys_yield() -> isize { syscall(SYSCALL_YIELD, [0, 0, 0]) } - -pub fn sys_kill(pid: usize, signal: i32) -> isize { - syscall(SYSCALL_KILL, [pid, signal as usize, 0]) -} - -pub fn sys_get_time() -> isize { - syscall(SYSCALL_GET_TIME, [0, 0, 0]) -} - -pub fn sys_getpid() -> isize { - syscall(SYSCALL_GETPID, [0, 0, 0]) +#[allow(dead_code)] +pub fn sys_send(server_num:usize) -> isize { + syscall(SYSCALL_SEND, [server_num, 0, 0]) } - -pub fn sys_fork() -> isize { - syscall(SYSCALL_FORK, [0, 0, 0]) +#[allow(dead_code)] +pub fn sys_recv() -> isize { + syscall(SYSCALL_RECV, [0, 0, 0]) } - -pub fn sys_exec(path: &str, args: &[*const u8]) -> isize { - syscall( - SYSCALL_EXEC, - [path.as_ptr() as usize, args.as_ptr() as usize, 0], - ) +#[allow(dead_code)] +pub fn sys_send_nb() -> isize { + syscall(SYSCALL_SEND_NB, [0, 0, 0]) } - -pub fn sys_waitpid(pid: isize, exit_code: *mut i32) -> isize { - syscall(SYSCALL_WAITPID, [pid as usize, exit_code as usize, 0]) +#[allow(dead_code)] +pub fn sys_recv_nb() -> isize { + syscall(SYSCALL_RECV_NB, [0, 0, 0]) } - -// pub fn sys_sigaction( -// signum: i32, -// action: *const SignalAction, -// old_action: *mut SignalAction, -// ) -> isize { -// syscall( -// SYSCALL_SIGACTION, -// [signum as usize, action as usize, old_action as usize], -// ) -// /* -// syscall( -// SYSCALL_SIGACTION, -// [ -// signum as usize, -// action.map_or(0, |r| r as *const _ as usize), -// old_action.map_or(0, |r| r as *mut _ as usize), -// ], -// ) -// */ -// } - -pub fn sys_sigprocmask(mask: u32) -> isize { - syscall(SYSCALL_SIGPROCMASK, [mask as usize, 0, 0]) +#[allow(dead_code)] +pub fn sys_debug_print(ch:u8) -> isize { + syscall(SYSCALL_DEBUG_PRINT, [ch as usize, 0, 0]) } - -pub fn sys_sigreturn() -> isize { - syscall(SYSCALL_SIGRETURN, [0, 0, 0]) -} \ No newline at end of file diff --git a/user/servers/root_server/src/console.rs b/user/servers/root_server/src/console.rs index d37e867..fa704bc 100644 --- a/user/servers/root_server/src/console.rs +++ b/user/servers/root_server/src/console.rs @@ -3,11 +3,10 @@ use core::fmt::{self, Write}; struct Stdout; -const STDOUT: usize = 1; impl Write for Stdout { fn write_str(&mut self, s: &str) -> fmt::Result { - write(STDOUT, s.as_bytes()); + write(s.as_bytes()); Ok(()) } } diff --git a/user/servers/root_server/src/main.rs b/user/servers/root_server/src/main.rs index 52bad34..d9e20a2 100644 --- a/user/servers/root_server/src/main.rs +++ b/user/servers/root_server/src/main.rs @@ -12,7 +12,6 @@ mod syscall; #[link_section = ".text.entry"] pub extern "C" fn _start() -> ! { clear_bss(); - main(); panic!("unreachable after sys_exit!"); } @@ -35,9 +34,11 @@ fn clear_bss() { use syscall::*; -pub fn write(fd: usize, buf: &[u8]) -> isize { - sys_write(fd, buf) -} -pub fn exit(exit_code: i32) -> isize { - sys_exit(exit_code) +pub fn write(buf: &[u8]) -> isize { + let mut i=0; + for ch in buf{ + i+=1; + sys_debug_print(*ch); + } + i } \ No newline at end of file diff --git a/user/servers/root_server/src/syscall.rs b/user/servers/root_server/src/syscall.rs index ad6ba77..3ac3357 100644 --- a/user/servers/root_server/src/syscall.rs +++ b/user/servers/root_server/src/syscall.rs @@ -2,23 +2,13 @@ use core::arch::asm; // use crate::SignalAction; -const SYSCALL_DUP: usize = 24; -const SYSCALL_OPEN: usize = 56; -const SYSCALL_CLOSE: usize = 57; -const SYSCALL_PIPE: usize = 59; -const SYSCALL_READ: usize = 63; -const SYSCALL_WRITE: usize = 64; -const SYSCALL_EXIT: usize = 93; -const SYSCALL_YIELD: usize = 124; -const SYSCALL_KILL: usize = 129; -const SYSCALL_SIGACTION: usize = 134; -const SYSCALL_SIGPROCMASK: usize = 135; -const SYSCALL_SIGRETURN: usize = 139; -const SYSCALL_GET_TIME: usize = 169; -const SYSCALL_GETPID: usize = 172; -const SYSCALL_FORK: usize = 220; -const SYSCALL_EXEC: usize = 221; -const SYSCALL_WAITPID: usize = 260; +const SYSCALL_CREATETHREAD: usize = 0; +const SYSCALL_YIELD: usize = 1; +const SYSCALL_SEND: usize = 2; +const SYSCALL_RECV: usize = 3; +const SYSCALL_SEND_NB: usize = 4; +const SYSCALL_RECV_NB: usize = 5; +const SYSCALL_DEBUG_PRINT: usize = 6; #[cfg(target_arch = "riscv64")] fn syscall(id: usize, args: [usize; 3]) -> isize { @@ -86,94 +76,31 @@ fn syscall(id: usize, args: [usize; 3]) -> isize { ret } -pub fn sys_dup(fd: usize) -> isize { - syscall(SYSCALL_DUP, [fd, 0, 0]) +#[allow(dead_code)] +pub fn sys_createthread(server_num:usize) -> isize { + syscall(SYSCALL_CREATETHREAD, [server_num, 0, 0]) } - -pub fn sys_open(path: &str, flags: u32) -> isize { - syscall(SYSCALL_OPEN, [path.as_ptr() as usize, flags as usize, 0]) -} - -pub fn sys_close(fd: usize) -> isize { - syscall(SYSCALL_CLOSE, [fd, 0, 0]) -} - -pub fn sys_pipe(pipe: &mut [usize]) -> isize { - syscall(SYSCALL_PIPE, [pipe.as_mut_ptr() as usize, 0, 0]) -} - -pub fn sys_read(fd: usize, buffer: &mut [u8]) -> isize { - syscall( - SYSCALL_READ, - [fd, buffer.as_mut_ptr() as usize, buffer.len()], - ) -} - -pub fn sys_write(fd: usize, buffer: &[u8]) -> isize { - syscall(SYSCALL_WRITE, [fd, buffer.as_ptr() as usize, buffer.len()]) -} - -pub fn sys_exit(exit_code: i32) -> ! { - syscall(SYSCALL_EXIT, [exit_code as usize, 0, 0]); - panic!("sys_exit never returns!"); -} - +#[allow(dead_code)] pub fn sys_yield() -> isize { syscall(SYSCALL_YIELD, [0, 0, 0]) } - -pub fn sys_kill(pid: usize, signal: i32) -> isize { - syscall(SYSCALL_KILL, [pid, signal as usize, 0]) -} - -pub fn sys_get_time() -> isize { - syscall(SYSCALL_GET_TIME, [0, 0, 0]) -} - -pub fn sys_getpid() -> isize { - syscall(SYSCALL_GETPID, [0, 0, 0]) +#[allow(dead_code)] +pub fn sys_send(server_num:usize) -> isize { + syscall(SYSCALL_SEND, [server_num, 0, 0]) } - -pub fn sys_fork() -> isize { - syscall(SYSCALL_FORK, [0, 0, 0]) +#[allow(dead_code)] +pub fn sys_recv() -> isize { + syscall(SYSCALL_RECV, [0, 0, 0]) } - -pub fn sys_exec(path: &str, args: &[*const u8]) -> isize { - syscall( - SYSCALL_EXEC, - [path.as_ptr() as usize, args.as_ptr() as usize, 0], - ) +#[allow(dead_code)] +pub fn sys_send_nb() -> isize { + syscall(SYSCALL_SEND_NB, [0, 0, 0]) } - -pub fn sys_waitpid(pid: isize, exit_code: *mut i32) -> isize { - syscall(SYSCALL_WAITPID, [pid as usize, exit_code as usize, 0]) +#[allow(dead_code)] +pub fn sys_recv_nb() -> isize { + syscall(SYSCALL_RECV_NB, [0, 0, 0]) } - -// pub fn sys_sigaction( -// signum: i32, -// action: *const SignalAction, -// old_action: *mut SignalAction, -// ) -> isize { -// syscall( -// SYSCALL_SIGACTION, -// [signum as usize, action as usize, old_action as usize], -// ) -// /* -// syscall( -// SYSCALL_SIGACTION, -// [ -// signum as usize, -// action.map_or(0, |r| r as *const _ as usize), -// old_action.map_or(0, |r| r as *mut _ as usize), -// ], -// ) -// */ -// } - -pub fn sys_sigprocmask(mask: u32) -> isize { - syscall(SYSCALL_SIGPROCMASK, [mask as usize, 0, 0]) +#[allow(dead_code)] +pub fn sys_debug_print(ch:u8) -> isize { + syscall(SYSCALL_DEBUG_PRINT, [ch as usize, 0, 0]) } - -pub fn sys_sigreturn() -> isize { - syscall(SYSCALL_SIGRETURN, [0, 0, 0]) -} \ No newline at end of file -- GitLab