xref: /DragonOS/kernel/src/process/c_adapter.rs (revision 7cc4a02c7ff7bafd798b185beb7b0c2986b9f32f)
1 use core::{ffi::c_void, ptr::null_mut};
2 
3 use alloc::boxed::Box;
4 
5 use crate::{
6     arch::{asm::current::current_pcb, fpu::FpState},
7     include::bindings::bindings::process_control_block,
8     syscall::SystemError,
9 };
10 
11 use super::{fork::copy_mm, process::init_stdio, process_init};
12 
13 #[no_mangle]
14 pub extern "C" fn rs_process_init() {
15     process_init();
16 }
17 
18 #[no_mangle]
19 pub extern "C" fn rs_process_copy_mm(clone_vm: bool, new_pcb: &mut process_control_block) -> usize {
20     return copy_mm(clone_vm, new_pcb)
21         .map(|_| 0)
22         .unwrap_or_else(|err| err.to_posix_errno() as usize);
23 }
24 
25 /// @brief 初始化当前进程的文件描述符数组
26 /// 请注意,如果当前进程已经有文件描述符数组,那么本操作将被禁止
27 #[no_mangle]
28 pub extern "C" fn process_init_files() -> i32 {
29     let r = current_pcb().init_files();
30     if r.is_ok() {
31         return 0;
32     } else {
33         return r.unwrap_err().to_posix_errno();
34     }
35 }
36 
37 #[no_mangle]
38 pub extern "C" fn rs_drop_address_space(pcb: &'static mut process_control_block) -> i32 {
39     unsafe {
40         pcb.drop_address_space();
41     }
42     return 0;
43 }
44 
45 /// @brief 拷贝当前进程的文件描述符信息
46 ///
47 /// @param clone_flags 克隆标志位
48 /// @param pcb 新的进程的pcb
49 #[no_mangle]
50 pub extern "C" fn process_copy_files(
51     clone_flags: u64,
52     from: &'static process_control_block,
53 ) -> i32 {
54     let r = current_pcb().copy_files(clone_flags, from);
55     if r.is_ok() {
56         return 0;
57     } else {
58         return r.unwrap_err().to_posix_errno();
59     }
60 }
61 
62 /// @brief 回收进程的文件描述符数组
63 ///
64 /// @param pcb 要被回收的进程的pcb
65 ///
66 /// @return i32
67 #[no_mangle]
68 pub extern "C" fn process_exit_files(pcb: &'static mut process_control_block) -> i32 {
69     let r: Result<(), SystemError> = pcb.exit_files();
70     if r.is_ok() {
71         return 0;
72     } else {
73         return r.unwrap_err().to_posix_errno();
74     }
75 }
76 
77 /// @brief 复制当前进程的浮点状态
78 #[allow(dead_code)]
79 #[no_mangle]
80 pub extern "C" fn rs_dup_fpstate() -> *mut c_void {
81     // 如果当前进程没有浮点状态,那么就返回一个默认的浮点状态
82     if current_pcb().fp_state == null_mut() {
83         return Box::leak(Box::new(FpState::default())) as *mut FpState as usize as *mut c_void;
84     } else {
85         // 如果当前进程有浮点状态,那么就复制一个新的浮点状态
86         let state = current_pcb().fp_state as usize as *mut FpState;
87         unsafe {
88             let s = state.as_ref().unwrap();
89             let state: &mut FpState = Box::leak(Box::new(s.clone()));
90 
91             return state as *mut FpState as usize as *mut c_void;
92         }
93     }
94 }
95 
96 /// @brief 释放进程的浮点状态所占用的内存
97 #[no_mangle]
98 pub extern "C" fn rs_process_exit_fpstate(pcb: &'static mut process_control_block) {
99     if pcb.fp_state != null_mut() {
100         let state = pcb.fp_state as usize as *mut FpState;
101         unsafe {
102             drop(Box::from_raw(state));
103         }
104     }
105 }
106 
107 #[no_mangle]
108 pub extern "C" fn rs_init_stdio() -> i32 {
109     let r = init_stdio();
110     if r.is_ok() {
111         return 0;
112     } else {
113         return r.unwrap_err().to_posix_errno();
114     }
115 }
116