mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 19:36:47 +00:00
159 lines
2.9 KiB
C
159 lines
2.9 KiB
C
/**
|
|
* @file irq.h
|
|
* @author longjin
|
|
* @brief 中断处理程序
|
|
* @version 0.1
|
|
* @date 2022-01-28
|
|
*
|
|
* @copyright Copyright (c) 2022
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "../common/glib.h"
|
|
|
|
#include "../process/ptrace.h"
|
|
|
|
#define SMP_IRQ_NUM 10
|
|
extern void (*interrupt_table[24])(void);
|
|
extern void do_IRQ(struct pt_regs *regs, ul number);
|
|
|
|
|
|
extern void (*SMP_interrupt_table[SMP_IRQ_NUM])(void);
|
|
|
|
extern void (*syscall_intr_table[1])(void);
|
|
|
|
/* ========= 中断向量分配表 ==========
|
|
|
|
0~255 IDT
|
|
|
|
0 ~ 31 trap fault abort for system
|
|
0 devide error
|
|
1 debug
|
|
2 NMI
|
|
3 breakpoint
|
|
4 overflow
|
|
5 bound range
|
|
6 undefined opcode
|
|
7 device not available
|
|
8 double fault
|
|
9 coprocessor segment overrun
|
|
10 invalid TSS
|
|
11 segment not present
|
|
12 stack segment fault
|
|
13 general protection
|
|
14 page fault
|
|
15
|
|
16 x87 FPU error
|
|
17 alignment check
|
|
18 machine check
|
|
19 SIMD exception
|
|
20 virtualization exception
|
|
21 ~ 31 Do not use
|
|
|
|
32 ~ 55 I/O APIC
|
|
32 8259A
|
|
33 keyboard
|
|
34 HPET timer 0,8254 counter 0
|
|
35 serial port A
|
|
36 serial port B
|
|
37 parallel port
|
|
38 floppy
|
|
39 parallel port
|
|
40 RTC,HPET timer 1
|
|
41 Generic
|
|
42 Generic
|
|
43 HPET timer 2
|
|
44 HPET timer 3 / mouse
|
|
45 FERR#
|
|
46 SATA primary
|
|
47 SATA secondary
|
|
48 PIRQA
|
|
49 PIRQB
|
|
50 PIRQC
|
|
51 PIRQD
|
|
52 PIRQE
|
|
53 PIRQF
|
|
54 PIRQG
|
|
55 PIRQH
|
|
|
|
|
|
0x80 system call
|
|
0x81 system interrupt 系统中断
|
|
|
|
150 ~ 200 Local APIC
|
|
150 CMCI
|
|
151 Timer
|
|
152 Thermal Monitor
|
|
153 Performance Counter
|
|
154 LINT0
|
|
155 LINT1
|
|
156 Error
|
|
|
|
200 ~ 255 MP IPI
|
|
|
|
*/
|
|
|
|
typedef struct hardware_intr_type
|
|
{
|
|
// 使能中断操作接口
|
|
void (*enable)(ul irq_num);
|
|
// 禁止中断操作接口
|
|
void (*disable)(ul irq_num);
|
|
|
|
// 安装中断操作接口
|
|
ul (*install)(ul irq_num, void *arg);
|
|
// 卸载中断操作接口
|
|
void (*uninstall)(ul irq_num);
|
|
// 应答中断操作接口
|
|
void (*ack)(ul irq_num);
|
|
} hardware_intr_controller;
|
|
|
|
// 中断描述结构体
|
|
typedef struct
|
|
{
|
|
hardware_intr_controller *controller;
|
|
// 中断名
|
|
char *irq_name;
|
|
// 中断处理函数的参数
|
|
ul parameter;
|
|
// 中断处理函数
|
|
void (*handler)(ul irq_num, ul parameter, struct pt_regs *regs);
|
|
|
|
// 自定义的标志位
|
|
ul flags;
|
|
} irq_desc_t;
|
|
|
|
#define IRQ_NUM 24
|
|
irq_desc_t interrupt_desc[IRQ_NUM] = {0};
|
|
|
|
|
|
irq_desc_t SMP_IPI_desc[SMP_IRQ_NUM];
|
|
|
|
/**
|
|
* @brief 中断注册函数
|
|
*
|
|
* @param irq_num 中断向量号
|
|
* @param arg 传递给中断安装接口的参数
|
|
* @param handler 中断处理函数
|
|
* @param paramater 中断处理函数的参数
|
|
* @param controller 中断控制器结构
|
|
* @param irq_name 中断名
|
|
* @return int
|
|
*/
|
|
int irq_register(ul irq_num, void *arg, void (*handler)(ul irq_num, ul parameter, struct pt_regs *regs), ul paramater, hardware_intr_controller *controller, char *irq_name);
|
|
|
|
/**
|
|
* @brief 中断注销函数
|
|
*
|
|
* @param irq_num 中断向量号
|
|
* @return int
|
|
*/
|
|
int irq_unregister(ul irq_num);
|
|
|
|
/**
|
|
* @brief 初始化中断模块
|
|
*/
|
|
void irq_init();
|