c_adapter.rs 2.1 KB

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