mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 00:46:31 +00:00
软中断处理机制
This commit is contained in:
@ -50,7 +50,6 @@ Restore_all:
|
||||
|
||||
popq %rax
|
||||
addq $0x10, %rsp // 弹出变量FUNC和errcode
|
||||
|
||||
iretq
|
||||
|
||||
ret_from_exception:
|
||||
@ -58,6 +57,7 @@ ret_from_exception:
|
||||
ENTRY(ret_from_intr)
|
||||
jmp Restore_all
|
||||
|
||||
|
||||
Err_Code:
|
||||
// ===== 有错误码的情况下,保存寄存器并跳转服务程序
|
||||
|
||||
|
65
kernel/exception/softirq.c
Normal file
65
kernel/exception/softirq.c
Normal file
@ -0,0 +1,65 @@
|
||||
#include "softirq.h"
|
||||
#include <common/kprint.h>
|
||||
|
||||
void set_softirq_status(uint64_t status)
|
||||
{
|
||||
softirq_status |= status;
|
||||
}
|
||||
|
||||
uint64_t get_softirq_status()
|
||||
{
|
||||
return softirq_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 软中断注册函数
|
||||
*
|
||||
* @param irq_num 软中断号
|
||||
* @param action 响应函数
|
||||
* @param data 响应数据结构体
|
||||
*/
|
||||
void register_softirq(uint32_t irq_num, void (*action)(void *data), void *data)
|
||||
{
|
||||
softirq_vector[irq_num].action = action;
|
||||
softirq_vector[irq_num].data = data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 卸载软中断
|
||||
*
|
||||
* @param irq_num 软中断号
|
||||
*/
|
||||
void unregister_softirq(uint32_t irq_num)
|
||||
{
|
||||
softirq_vector[irq_num].action = NULL;
|
||||
softirq_vector[irq_num].data = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 软中断处理程序
|
||||
*
|
||||
*/
|
||||
void do_softirq()
|
||||
{
|
||||
|
||||
sti();
|
||||
for(uint32_t i=0;i<MAX_SOFTIRQ_NUM&&softirq_status;++i)
|
||||
{
|
||||
if(softirq_status&(1<<i))
|
||||
{
|
||||
softirq_vector[i].action(softirq_vector[i].data);
|
||||
softirq_status &= (~(1<<i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
cli();
|
||||
}
|
||||
|
||||
void softirq_init()
|
||||
{
|
||||
softirq_status = 0;
|
||||
memset(softirq_vector, 0, sizeof(struct softirq_t) * MAX_SOFTIRQ_NUM);
|
||||
}
|
||||
|
||||
|
56
kernel/exception/softirq.h
Normal file
56
kernel/exception/softirq.h
Normal file
@ -0,0 +1,56 @@
|
||||
/**
|
||||
* @file softirq.h
|
||||
* @author fslongjin (longjin@RinGoTek.cn)
|
||||
* @brief 软中断
|
||||
* @version 0.1
|
||||
* @date 2022-04-08
|
||||
*
|
||||
* @copyright Copyright (c) 2022
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include<common/glib.h>
|
||||
|
||||
#define MAX_SOFTIRQ_NUM 64
|
||||
|
||||
#define TIMER_SIRQ (1<<0) // 时钟软中断号
|
||||
|
||||
uint64_t softirq_status = 0;
|
||||
|
||||
struct softirq_t
|
||||
{
|
||||
void (*action)(void* data); // 软中断处理函数
|
||||
void* data;
|
||||
};
|
||||
|
||||
struct softirq_t softirq_vector[MAX_SOFTIRQ_NUM] = {0};
|
||||
|
||||
|
||||
/**
|
||||
* @brief 软中断注册函数
|
||||
*
|
||||
* @param irq_num 软中断号
|
||||
* @param action 响应函数
|
||||
* @param data 响应数据结构体
|
||||
*/
|
||||
void register_softirq(uint32_t irq_num, void (*action)(void * data), void* data);
|
||||
|
||||
/**
|
||||
* @brief 卸载软中断
|
||||
*
|
||||
* @param irq_num 软中断号
|
||||
*/
|
||||
void unregister_softirq(uint32_t irq_num);
|
||||
|
||||
void set_softirq_status(uint64_t status);
|
||||
uint64_t get_softirq_status();
|
||||
|
||||
/**
|
||||
* @brief 软中断处理程序
|
||||
*
|
||||
*/
|
||||
void do_softirq();
|
||||
|
||||
|
||||
void softirq_init();
|
Reference in New Issue
Block a user