123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /**
- * @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);
- /* ========= 中断向量分配表 ==========
- 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
- 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();
|