c_adapter.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. use crate::smp::core::smp_get_processor_id;
  2. use super::{kthread::kthread_init, process_init, ProcessManager, __PROCESS_MANAGEMENT_INIT_DONE};
  3. #[no_mangle]
  4. pub extern "C" fn rs_process_init() {
  5. process_init();
  6. }
  7. #[no_mangle]
  8. pub extern "C" fn rs_kthread_init() {
  9. kthread_init();
  10. }
  11. /// 临时用于获取空闲进程的栈顶的函数,这个函数是为了旧的smp模块的初始化而写在这的
  12. #[no_mangle]
  13. pub extern "C" fn rs_get_idle_stack_top(cpu_id: u32) -> usize {
  14. return ProcessManager::idle_pcb()[cpu_id as usize]
  15. .kernel_stack()
  16. .stack_max_address()
  17. .data();
  18. }
  19. #[no_mangle]
  20. pub extern "C" fn rs_current_pcb_cpuid() -> u32 {
  21. return smp_get_processor_id();
  22. }
  23. #[no_mangle]
  24. pub extern "C" fn rs_current_pcb_pid() -> u32 {
  25. if unsafe { __PROCESS_MANAGEMENT_INIT_DONE } {
  26. return ProcessManager::current_pcb().pid().0 as u32;
  27. }
  28. return 0;
  29. }
  30. #[no_mangle]
  31. pub extern "C" fn rs_current_pcb_preempt_count() -> u32 {
  32. return ProcessManager::current_pcb().preempt_count() as u32;
  33. }
  34. #[no_mangle]
  35. pub extern "C" fn rs_current_pcb_flags() -> u32 {
  36. return ProcessManager::current_pcb().flags().bits() as u32;
  37. }
  38. #[no_mangle]
  39. pub extern "C" fn rs_current_pcb_thread_rbp() -> u64 {
  40. return ProcessManager::current_pcb().arch_info_irqsave().rbp() as u64;
  41. }
  42. #[no_mangle]
  43. pub extern "C" fn rs_preempt_disable() {
  44. return ProcessManager::preempt_disable();
  45. }
  46. #[no_mangle]
  47. pub extern "C" fn rs_preempt_enable() {
  48. return ProcessManager::preempt_enable();
  49. }
  50. #[no_mangle]
  51. pub extern "C" fn rs_process_do_exit(exit_code: usize) -> usize {
  52. ProcessManager::exit(exit_code);
  53. }