Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
ioapic.c
Go to the documentation of this file.
1#include "libk/io.h"
2#include "type.h"
3#include <hal/apic/ioapic.h>
4
5static struct irq_gsi_map irq_gsi_table[32] = {0};
6
7#define IOAPICVER 0x01
8#define IOAPICARB 0x02
9#define IOAPICREDTBL(n) \
10 (0x10 + 2 * n) // lower-32bits (add +1 for upper 32-bits)
11
13
14static void write_ioapic_register(const uintptr_t apic_base,
15 const uint8_t offset, const uint32_t val) {
16 mmio_outl(apic_base, offset);
17 mmio_outl(apic_base + 0x10, val);
18}
19
20static uint32_t
22 mmio_outl(apic_base, offset);
23 return mmio_inl(apic_base + 0x10);
24}
25
30
35
37 uint32_t low = 0;
38 uint32_t high = 0;
39
40 low |= vector;
41 low |= (0 << 8); // delivery mode
42 low |= (0 << 11);
43 low |= (0 << 13); // polarity
44 low |= (0 << 15); // trigger mode
45
46 high |= (uint32_t) (apic_id << 24);
47
48 // set redirection table
50 low);
52 (uint8_t) (IOAPICREDTBL(irq) + 1), high);
53}
54
55void ioapic_setup(uintptr_t ioapic_addr) {
56 ioapic_base_addr = ioapic_addr;
57 // tandai smeua ioapic termasking
58 for (int i = 0; i < 24; i++) {
59 write_ioapic_register((uintptr_t) ioapic_addr,
60 (uint8_t) IOAPICREDTBL(i), 1 << 16);
61 write_ioapic_register((uintptr_t) ioapic_addr,
62 (uint8_t) (IOAPICREDTBL(i) + 1), 0);
63 }
64
65 // vxIOAPICMapISR(11, 0x56, 0);
66 // nyalakan irq 2 untuk HPET
67 // write_ioapic_register((uintptr_t)ioapic_base_addr, IOAPICREDTBL(2), 0
68 // | 0x30); write_ioapic_register((uintptr_t)ioapic_base_addr,
69 // IOAPICREDTBL(2) + 1, 0 << 24);
70
71 // virtio
72 // write_ioapic_register((uintptr_t)ioapic_base_addr, IOAPICREDTBL(10),
73 // 0 | 55);
74 // write_ioapic_register((uintptr_t)ioapic_base_addr, IOAPICREDTBL(10) +
75 // 1,
76 // 1 << 24);
77}
78
80 irq_gsi_table[irq].gsi = gsi;
81 irq_gsi_table[irq].flags = flags;
82}
cpu_register_t reg
Definition thread.h:14
uint16_t flags
Definition thread.h:5
static void mmio_outl(uintptr_t addr, uint32_t value)
Definition io.h:51
static uint32_t mmio_inl(uintptr_t addr)
Definition io.h:55
static void write_ioapic_register(const uintptr_t apic_base, const uint8_t offset, const uint32_t val)
Definition ioapic.c:14
void ioapic_setup(uintptr_t ioapic_addr)
Definition ioapic.c:55
static uintptr_t ioapic_base_addr
Definition ioapic.c:12
uint32_t ioapic_isr_get_vector(uint8_t irq)
Definition ioapic.c:26
#define IOAPICREDTBL(n)
Definition ioapic.c:9
static uint32_t read_ioapic_register(const uintptr_t apic_base, const uint8_t offset)
Definition ioapic.c:21
void ioapic_add_irq_gsi_map(uint8_t irq, uint32_t gsi, uint16_t flags)
Definition ioapic.c:79
void vxIOAPICMapISR(uint8_t irq, uint8_t vector, uint8_t apic_id)
Definition ioapic.c:36
static struct irq_gsi_map irq_gsi_table[32]
Definition ioapic.c:5
uint32_t gsi
Definition ioapic.h:0
uint8_t ioapic_isr_get_apic_id(uint8_t irq)
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
#define KERNEL_API
Definition type.h:93
unsigned long uintptr_t
Definition type.h:73
unsigned char uint8_t
Definition type.h:7
#define vector(T)
Definition vector.h:11
uint32_t offset
Definition virtio.h:6