HelenOS sources
#ifndef KERN_ia32_APIC_H_
#define KERN_ia32_APIC_H_
#define L_APIC_BASE 0xfee00000
#define IO_APIC_BASE 0xfec00000
#ifndef __ASSEMBLER__
#include <cpu.h>
#include <stdint.h>
#include <genarch/pic/pic_ops.h>
#define FIXED (0 << 0)
#define LOPRI (1 << 0)
#define APIC_ID_COUNT 16
#define IPI_INIT 0
#define IPI_STARTUP 0
#define DELMOD_FIXED 0x0U
#define DELMOD_LOWPRI 0x1U
#define DELMOD_SMI 0x2U
#define DELMOD_NMI 0x4U
#define DELMOD_INIT 0x5U
#define DELMOD_STARTUP 0x6U
#define DELMOD_EXTINT 0x7U
#define DESTMOD_PHYS 0x0U
#define DESTMOD_LOGIC 0x1U
#define TRIGMOD_EDGE 0x0U
#define TRIGMOD_LEVEL 0x1U
#define LEVEL_DEASSERT 0x0U
#define LEVEL_ASSERT 0x1U
#define SHORTHAND_NONE 0x0U
#define SHORTHAND_SELF 0x1U
#define SHORTHAND_ALL_INCL 0x2U
#define SHORTHAND_ALL_EXCL 0x3U
#define POLARITY_HIGH 0x0U
#define POLARITY_LOW 0x1U
#define DIVIDE_2 0x0U
#define DIVIDE_4 0x1U
#define DIVIDE_8 0x2U
#define DIVIDE_16 0x3U
#define DIVIDE_32 0x8U
#define DIVIDE_64 0x9U
#define DIVIDE_128 0xaU
#define DIVIDE_1 0xbU
#define TIMER_ONESHOT 0x0U
#define TIMER_PERIODIC 0x1U
#define DELIVS_IDLE 0x0U
#define DELIVS_PENDING 0x1U
#define DEST_ALL 0xffU
#define MODEL_FLAT 0xfU
#define MODEL_CLUSTER 0x0U
#define ICRlo (0x300U / sizeof(uint32_t))
#define ICRhi (0x310U / sizeof(uint32_t))
typedef struct {
union {
uint32_t lo;
struct {
uint8_t vector;
unsigned int delmod : 3;
unsigned int destmod : 1;
unsigned int delivs : 1;
unsigned int : 1;
unsigned int level : 1;
unsigned int trigger_mode : 1;
unsigned int : 2;
unsigned int shorthand : 2;
unsigned int : 12;
} __attribute__((packed));
};
union {
uint32_t hi;
struct {
unsigned int : 24;
uint8_t dest;
} __attribute__((packed));
};
} __attribute__((packed)) icr_t;
#define EOI (0x0b0U / sizeof(uint32_t))
#define ESR (0x280U / sizeof(uint32_t))
typedef union {
uint32_t value;
uint8_t err_bitmap;
struct {
unsigned int send_checksum_error : 1;
unsigned int receive_checksum_error : 1;
unsigned int send_accept_error : 1;
unsigned int receive_accept_error : 1;
unsigned int : 1;
unsigned int send_illegal_vector : 1;
unsigned int received_illegal_vector : 1;
unsigned int illegal_register_address : 1;
unsigned int : 24;
} __attribute__((packed));
} esr_t;
#define TPR (0x080U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
unsigned int pri_sc : 4;
unsigned int pri : 4;
} __attribute__((packed));
} tpr_t;
#define SVR (0x0f0U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
uint8_t vector;
unsigned int lapic_enabled : 1;
unsigned int focus_checking : 1;
unsigned int : 22;
} __attribute__((packed));
} svr_t;
#define TDCR (0x3e0U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
unsigned int div_value : 4;
unsigned int : 28;
} __attribute__((packed));
} tdcr_t;
#define ICRT (0x380U / sizeof(uint32_t))
#define CCRT (0x390U / sizeof(uint32_t))
#define LVT_Tm (0x320U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
uint8_t vector;
unsigned int : 4;
unsigned int delivs : 1;
unsigned int : 3;
unsigned int masked : 1;
unsigned int mode : 1;
unsigned int : 14;
} __attribute__((packed));
} lvt_tm_t;
#define LVT_LINT0 (0x350U / sizeof(uint32_t))
#define LVT_LINT1 (0x360U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
uint8_t vector;
unsigned int delmod : 3;
unsigned int : 1;
unsigned int delivs : 1;
unsigned int intpol : 1;
unsigned int irr : 1;
unsigned int trigger_mode : 1;
unsigned int masked : 1;
unsigned int : 15;
} __attribute__((packed));
} lvt_lint_t;
#define LVT_Err (0x370U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
uint8_t vector;
unsigned int : 4;
unsigned int delivs : 1;
unsigned int : 3;
unsigned int masked : 1;
unsigned int : 15;
} __attribute__((packed));
} lvt_error_t;
#define L_APIC_ID (0x020U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
unsigned int : 24;
uint8_t apic_id;
} __attribute__((packed));
} l_apic_id_t;
#define LAVR (0x030U / sizeof(uint32_t))
#define LAVR_Mask 0xffU
#define is_local_apic(x) (((x) & LAVR_Mask & 0xf0U) == 0x1U)
#define is_82489DX_apic(x) ((((x) & LAVR_Mask & 0xf0U) == 0x0U))
#define is_local_xapic(x) (((x) & LAVR_Mask) == 0x14U)
#define LDR (0x0d0U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
unsigned int : 24;
uint8_t id;
} __attribute__((packed));
} ldr_t;
#define DFR (0x0e0U / sizeof(uint32_t))
typedef union {
uint32_t value;
struct {
unsigned int : 28;
unsigned int model : 4;
} __attribute__((packed));
} dfr_t;
#define IOREGSEL (0x00U / sizeof(uint32_t))
#define IOWIN (0x10U / sizeof(uint32_t))
#define IOAPICID 0x00U
#define IOAPICVER 0x01U
#define IOAPICARB 0x02U
#define IOREDTBL 0x10U
typedef union {
uint32_t value;
struct {
uint8_t reg_addr;
unsigned int : 24;
} __attribute__((packed));
} io_regsel_t;
typedef struct io_redirection_reg {
union {
uint32_t lo;
struct {
uint8_t intvec;
unsigned int delmod : 3;
unsigned int destmod : 1;
unsigned int delivs : 1;
unsigned int intpol : 1;
unsigned int irr : 1;
unsigned int trigger_mode : 1;
unsigned int masked : 1;
unsigned int : 15;
} __attribute__((packed));
};
union {
uint32_t hi;
struct {
unsigned int : 24;
uint8_t dest : 8;
} __attribute__((packed));
};
} __attribute__((packed)) io_redirection_reg_t;
typedef union {
uint32_t value;
struct {
unsigned int : 24;
unsigned int apic_id : 4;
unsigned int : 4;
} __attribute__((packed));
} io_apic_id_t;
extern pic_ops_t apic_pic_ops;
extern volatile uint32_t *l_apic;
extern volatile uint32_t *io_apic;
extern uint32_t apic_id_mask;
extern uint8_t bsp_l_apic;
extern void apic_init(void);
extern void l_apic_init(void);
extern void l_apic_eoi(unsigned int);
extern int l_apic_send_custom_ipi(uint8_t, uint8_t);
extern int l_apic_broadcast_custom_ipi(uint8_t);
extern int l_apic_send_init_ipi(uint8_t);
extern void l_apic_debug(void);
extern uint32_t io_apic_read(uint8_t);
extern void io_apic_write(uint8_t, uint32_t);
extern void io_apic_change_ioredtbl(uint8_t pin, uint8_t dest, uint8_t v, unsigned int);
extern void io_apic_disable_irqs(uint16_t);
extern void io_apic_enable_irqs(uint16_t);
#endif
#endif
HelenOS homepage, sources at GitHub