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