xref: /DragonOS/kernel/src/arch/riscv64/process/kthread.rs (revision 3959e94df38073fdb80b199777015f95611ba05f)
1 use alloc::sync::Arc;
2 use riscv::register::sstatus::SPP;
3 use system_error::SystemError;
4 
5 use crate::{
6     arch::interrupt::TrapFrame,
7     process::{
8         fork::CloneFlags,
9         kthread::{KernelThreadCreateInfo, KernelThreadMechanism},
10         Pid, ProcessManager,
11     },
12 };
13 
14 impl KernelThreadMechanism {
15     /// 伪造trapframe,创建内核线程
16     ///
17     /// ## 返回值
18     ///
19     /// 返回创建的内核线程的pid
20     #[inline(never)]
21     pub fn __inner_create(
22         info: &Arc<KernelThreadCreateInfo>,
23         clone_flags: CloneFlags,
24     ) -> Result<Pid, SystemError> {
25         // WARNING: If create failed, we must drop the info manually or it will cause memory leak. (refcount will not decrease when create failed)
26         let create_info: *const KernelThreadCreateInfo =
27             KernelThreadCreateInfo::generate_unsafe_arc_ptr(info.clone());
28 
29         let mut frame = TrapFrame::new();
30         frame.a0 = create_info as usize;
31 
32         // 使能中断
33         frame.status.update_sie(true);
34         frame.status.update_spp(SPP::Supervisor);
35 
36         frame.ra = kernel_thread_bootstrap_stage1 as usize;
37 
38         // fork失败的话,子线程不会执行。否则将导致内存安全问题。
39         let pid = ProcessManager::fork(&frame, clone_flags).map_err(|e| {
40             unsafe { KernelThreadCreateInfo::parse_unsafe_arc_ptr(create_info) };
41             e
42         })?;
43 
44         ProcessManager::find(pid)
45             .unwrap()
46             .set_name(info.name().clone());
47 
48         return Ok(pid);
49     }
50 }
51 
52 /// 内核线程引导函数的第一阶段
53 ///
54 /// 当内核线程开始执行时,会先执行这个函数,这个函数会将伪造的trapframe中的数据弹出,然后跳转到第二阶段
55 ///
56 /// 跳转之后,指向Box<KernelThreadClosure>的指针将传入到stage2的函数
57 // #[naked]
58 // pub(super) unsafe extern "C" fn kernel_thread_bootstrap_stage1() {
59 //     todo!()
60 // }
61 pub(super) unsafe extern "C" fn kernel_thread_bootstrap_stage1() {
62     // 这个函数要是naked的,只是因为现在还没有实现,而naked func不能打`unimplemented!()`
63     // 所以先写成了普通函数
64     unimplemented!("kernel_thread_bootstrap_stage1")
65 }
66