softirq.c 1.1 KB

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