软中断处理机制

This commit is contained in:
fslongjin
2022-04-08 20:04:12 +08:00
parent d887f9a0f7
commit 9828aff985
12 changed files with 202 additions and 25 deletions

View File

@ -50,7 +50,6 @@ Restore_all:
popq %rax
addq $0x10, %rsp // FUNCerrcode
iretq
ret_from_exception:
@ -58,6 +57,7 @@ ret_from_exception:
ENTRY(ret_from_intr)
jmp Restore_all
Err_Code:
// =====

View 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);
}

View 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();