xref: /DragonOS/kernel/src/arch/riscv64/process/mod.rs (revision 1a72a751b18cf5bbe7b5b9e91aff530de0c18501)
1 use alloc::{string::String, sync::Arc, vec::Vec};
2 
3 use crate::{
4     process::{fork::KernelCloneArgs, KernelStack, ProcessControlBlock, ProcessManager},
5     syscall::SystemError,
6 };
7 
8 use super::interrupt::TrapFrame;
9 
10 pub mod kthread;
11 pub mod syscall;
12 
13 #[allow(dead_code)]
14 #[repr(align(32768))]
15 union InitProcUnion {
16     /// 用于存放idle进程的内核栈
17     idle_stack: [u8; 32768],
18 }
19 
20 #[link_section = ".data.init_proc_union"]
21 #[no_mangle]
22 static BSP_IDLE_STACK_SPACE: InitProcUnion = InitProcUnion {
23     idle_stack: [0; 32768],
24 };
25 
26 pub unsafe fn arch_switch_to_user(path: String, argv: Vec<String>, envp: Vec<String>) -> ! {
27     unimplemented!("RiscV64 arch_switch_to_user")
28 }
29 
30 impl ProcessManager {
31     pub fn arch_init() {
32         unimplemented!("ProcessManager::arch_init")
33     }
34 
35     /// fork的过程中复制线程
36     ///
37     /// 由于这个过程与具体的架构相关,所以放在这里
38     pub fn copy_thread(
39         current_pcb: &Arc<ProcessControlBlock>,
40         new_pcb: &Arc<ProcessControlBlock>,
41         clone_args: KernelCloneArgs,
42         current_trapframe: &TrapFrame,
43     ) -> Result<(), SystemError> {
44         unimplemented!("ProcessManager::copy_thread")
45     }
46 
47     /// 切换进程
48     ///
49     /// ## 参数
50     ///
51     /// - `prev`:上一个进程的pcb
52     /// - `next`:下一个进程的pcb
53     pub unsafe fn switch_process(prev: Arc<ProcessControlBlock>, next: Arc<ProcessControlBlock>) {
54         unimplemented!("ProcessManager::switch_process")
55     }
56 }
57 
58 impl ProcessControlBlock {
59     /// 获取当前进程的pcb
60     pub fn arch_current_pcb() -> Arc<Self> {
61         unimplemented!("ProcessControlBlock::arch_current_pcb")
62     }
63 }
64 
65 /// PCB中与架构相关的信息
66 #[derive(Debug)]
67 #[allow(dead_code)]
68 pub struct ArchPCBInfo {
69     // todo: add arch related fields
70 }
71 
72 #[allow(dead_code)]
73 impl ArchPCBInfo {
74     /// 创建一个新的ArchPCBInfo
75     ///
76     /// ## 参数
77     ///
78     /// - `kstack`:内核栈的引用
79     ///
80     /// ## 返回值
81     ///
82     /// 返回一个新的ArchPCBInfo
83     pub fn new(kstack: &KernelStack) -> Self {
84         unimplemented!("ArchPCBInfo::new")
85     }
86     // ### 从另一个ArchPCBInfo处clone,但是保留部分字段不变
87     pub fn clone_from(&mut self, from: &Self) {
88         unimplemented!("ArchPCBInfo::clone_from")
89     }
90 }
91