softirq.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "softirq.h"
  2. #include <common/kprint.h>
  3. #include <process/process.h>
  4. uint64_t softirq_status = 0;
  5. void set_softirq_status(uint64_t status)
  6. {
  7. softirq_status |= status;
  8. }
  9. uint64_t get_softirq_status()
  10. {
  11. return softirq_status;
  12. }
  13. /**
  14. * @brief 软中断注册函数
  15. *
  16. * @param irq_num 软中断号
  17. * @param action 响应函数
  18. * @param data 响应数据结构体
  19. */
  20. void register_softirq(uint32_t irq_num, void (*action)(void *data), void *data)
  21. {
  22. softirq_vector[irq_num].action = action;
  23. softirq_vector[irq_num].data = data;
  24. }
  25. /**
  26. * @brief 卸载软中断
  27. *
  28. * @param irq_num 软中断号
  29. */
  30. void unregister_softirq(uint32_t irq_num)
  31. {
  32. softirq_vector[irq_num].action = NULL;
  33. softirq_vector[irq_num].data = NULL;
  34. }
  35. /**
  36. * @brief 软中断处理程序
  37. *
  38. */
  39. void do_softirq()
  40. {
  41. sti();
  42. for (uint32_t i = 0; i < MAX_SOFTIRQ_NUM && softirq_status; ++i)
  43. {
  44. if (softirq_status & (1 << i) && softirq_vector[i].action != NULL)
  45. {
  46. softirq_vector[i].action(softirq_vector[i].data);
  47. }
  48. }
  49. cli();
  50. }
  51. void softirq_init()
  52. {
  53. softirq_status = 0;
  54. memset(softirq_vector, 0, sizeof(struct softirq_t) * MAX_SOFTIRQ_NUM);
  55. }