xref: /DragonOS/kernel/src/process/c_adapter.rs (revision e28411791f090c421fe4b6fa5956fb1bd362a8d9)
17ae679ddSLoGin use crate::smp::core::smp_get_processor_id;
27ae679ddSLoGin 
35b59005fSLoGin use super::{process_init, ProcessManager, __PROCESS_MANAGEMENT_INIT_DONE};
440fe15e0SLoGin 
540fe15e0SLoGin #[no_mangle]
rs_process_init()64fda81ceSLoGin unsafe extern "C" fn rs_process_init() {
740fe15e0SLoGin     process_init();
840fe15e0SLoGin }
940fe15e0SLoGin 
101496ba7bSLoGin /// 临时用于获取空闲进程的栈顶的函数,这个函数是为了旧的smp模块的初始化而写在这的
1140fe15e0SLoGin #[no_mangle]
rs_get_idle_stack_top(cpu_id: u32) -> usize124fda81ceSLoGin unsafe extern "C" fn rs_get_idle_stack_top(cpu_id: u32) -> usize {
131496ba7bSLoGin     return ProcessManager::idle_pcb()[cpu_id as usize]
141496ba7bSLoGin         .kernel_stack()
151496ba7bSLoGin         .stack_max_address()
161496ba7bSLoGin         .data();
1740fe15e0SLoGin }
1840fe15e0SLoGin 
1940fe15e0SLoGin #[no_mangle]
rs_current_pcb_cpuid() -> u32204fda81ceSLoGin unsafe extern "C" fn rs_current_pcb_cpuid() -> u32 {
21*e2841179SLoGin     return smp_get_processor_id().data();
2240fe15e0SLoGin }
237ae679ddSLoGin 
2440fe15e0SLoGin #[no_mangle]
rs_current_pcb_pid() -> u32254fda81ceSLoGin unsafe extern "C" fn rs_current_pcb_pid() -> u32 {
267ae679ddSLoGin     if unsafe { __PROCESS_MANAGEMENT_INIT_DONE } {
271496ba7bSLoGin         return ProcessManager::current_pcb().pid().0 as u32;
2840fe15e0SLoGin     }
297ae679ddSLoGin     return 0;
307ae679ddSLoGin }
3140fe15e0SLoGin 
3240fe15e0SLoGin #[no_mangle]
rs_current_pcb_preempt_count() -> u32334fda81ceSLoGin unsafe extern "C" fn rs_current_pcb_preempt_count() -> u32 {
34971462beSGnoCiYeH     if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } {
35971462beSGnoCiYeH         return 0;
36971462beSGnoCiYeH     }
371496ba7bSLoGin     return ProcessManager::current_pcb().preempt_count() as u32;
3840fe15e0SLoGin }
391496ba7bSLoGin 
401496ba7bSLoGin #[no_mangle]
rs_current_pcb_flags() -> u32414fda81ceSLoGin unsafe extern "C" fn rs_current_pcb_flags() -> u32 {
42971462beSGnoCiYeH     if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } {
43971462beSGnoCiYeH         return 0;
44971462beSGnoCiYeH     }
451496ba7bSLoGin     return ProcessManager::current_pcb().flags().bits() as u32;
461496ba7bSLoGin }
471496ba7bSLoGin 
481496ba7bSLoGin #[no_mangle]
494fda81ceSLoGin #[cfg(target_arch = "x86_64")]
rs_current_pcb_thread_rbp() -> u64504fda81ceSLoGin unsafe extern "C" fn rs_current_pcb_thread_rbp() -> u64 {
51971462beSGnoCiYeH     if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } {
52971462beSGnoCiYeH         return 0;
53971462beSGnoCiYeH     }
541496ba7bSLoGin     return ProcessManager::current_pcb().arch_info_irqsave().rbp() as u64;
551496ba7bSLoGin }
561496ba7bSLoGin 
571496ba7bSLoGin #[no_mangle]
581a72a751SLoGin #[cfg(target_arch = "riscv64")]
rs_current_pcb_thread_rbp() -> u64591a72a751SLoGin unsafe extern "C" fn rs_current_pcb_thread_rbp() -> u64 {
601a72a751SLoGin     // 不应该实现这个函数
611a72a751SLoGin     unimplemented!("rs_current_pcb_thread_rbp")
621a72a751SLoGin }
631a72a751SLoGin 
641a72a751SLoGin #[no_mangle]
rs_preempt_disable()654fda81ceSLoGin unsafe extern "C" fn rs_preempt_disable() {
661496ba7bSLoGin     return ProcessManager::preempt_disable();
671496ba7bSLoGin }
681496ba7bSLoGin 
691496ba7bSLoGin #[no_mangle]
rs_preempt_enable()704fda81ceSLoGin unsafe extern "C" fn rs_preempt_enable() {
711496ba7bSLoGin     return ProcessManager::preempt_enable();
721496ba7bSLoGin }
731496ba7bSLoGin 
741496ba7bSLoGin #[no_mangle]
rs_process_do_exit(exit_code: usize) -> usize754fda81ceSLoGin unsafe extern "C" fn rs_process_do_exit(exit_code: usize) -> usize {
76971462beSGnoCiYeH     if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } {
77971462beSGnoCiYeH         return 0;
78971462beSGnoCiYeH     }
791496ba7bSLoGin     ProcessManager::exit(exit_code);
8040fe15e0SLoGin }
81