mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-10 12:16:48 +00:00
63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
#pragma once
|
|
|
|
#include "../../../common/asm.h"
|
|
#include"../../../process/ptrace.h"
|
|
#include"../../../exception/irq.h"
|
|
#include "../../../mm/mm.h"
|
|
|
|
#define APIC_IO_APIC_VIRT_BASE_ADDR SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + IO_APIC_MAPPING_OFFSET
|
|
#define APIC_LOCAL_APIC_VIRT_BASE_ADDR SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + LOCAL_APIC_MAPPING_OFFSET
|
|
|
|
// ======== local apic 寄存器地址偏移量表 =======
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_ID 0x20
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_Version 0x30
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_TPR 0x80
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_APR 0x90
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_PPR 0xa0
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_EOI 0xb0
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_RRD 0xc0
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_LDR 0xd0
|
|
#define LOCAL_APIC_OFFSET_Local_APIC_DFR 0xe0
|
|
|
|
struct apic_IO_APIC_map
|
|
{
|
|
// 间接访问寄存器的物理基地址
|
|
uint addr_phys;
|
|
// 索引寄存器虚拟地址
|
|
unsigned char* virtual_index_addr;
|
|
// 数据寄存器虚拟地址
|
|
uint* virtual_data_addr;
|
|
// EOI寄存器虚拟地址
|
|
uint* virtual_EOI_addr;
|
|
}apic_ioapic_map;
|
|
|
|
/**
|
|
* @brief 中断服务程序
|
|
*
|
|
* @param rsp 中断栈指针
|
|
* @param number 中断号
|
|
*/
|
|
void do_IRQ(struct pt_regs* rsp, ul number);
|
|
|
|
|
|
/**
|
|
* @brief 读取RTE寄存器
|
|
*
|
|
* @param index 索引值
|
|
* @return ul
|
|
*/
|
|
ul apic_ioapic_read_rte(unsigned char index);
|
|
|
|
/**
|
|
* @brief 写入RTE寄存器
|
|
*
|
|
* @param index 索引值
|
|
* @param value 要写入的值
|
|
*/
|
|
void apic_ioapic_write_rte(unsigned char index, ul value);
|
|
|
|
/**
|
|
* @brief 初始化apic控制器
|
|
*
|
|
*/
|
|
void apic_init(); |