softirq.c 1.2 KB

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