40 interrupt_entry_t* tbl) {
43 asm volatile(
"lidt %0" : :
"m"(*ptr));
53 entries[n].selector = (
uint16_t)selector;
55 entries[n].type_attr = type_attr;
57 entries[n].offset_high = (
uint64_t)handler >> 32;
77 uint8_t old = __atomic_load_n(&entry->
mask, __ATOMIC_ACQUIRE);
82 int e = __builtin_ctz(free_mask);
85 if (__atomic_compare_exchange_n(&entry->
mask, &old,
new,
false,
96 __atomic_store_n(&entry->
configured,
true, __ATOMIC_RELEASE);
98 if (use_default_isr) {
105 selector,
ist, type_attr);
116 if (__atomic_compare_exchange_n(&entry->
allocated, &expected,
117 true,
false, __ATOMIC_ACQ_REL,
153 "Non Maskable Interrupt",
155 "Into Detected Overflow",
160 "Coprocessor Segment Overrun",
162 "Segment Not Present",
164 "General Protection Fault",
167 "x87 FPU Floating Point Error",
170 "SIMD Floating Point Exception",
227 auto cpu_id = cpu->core_id;
231 if (int_number < 32) {
235 asm volatile(
"mov %%cr2, %0" :
"=r"(cr2));
238 auto err =
rsp->err_code;
240 " err bits: present=%d write=%d user=%d nx=%d\n",
241 err & 1, (err >> 1) & 1, (err >> 2) & 1,
263 "Exception %s on thread id %d at rip=0x%x "
288 if (__atomic_load_n(&irq->
configured, __ATOMIC_ACQUIRE)) {
293 int i = __builtin_ctz(m);
294 void*
h = __atomic_load_n(
295 &irq->
handler[i], __ATOMIC_ACQUIRE);
each_core_data * get_current_core_data(void)
void update_core_gs(uint8_t id)
@ THREAD_STATE_TERMINATED
uintptr_t rip_before_run_elf
@ VMM_COMMUNICATION_EXCEPTION
@ COPROCESSOR_SEGMENT_OVERRUN
@ VIRTUALIZATION_EXCEPTION
@ CONTORL_PROTECTION_EXCEPTION
@ X87_FPU_FLOATING_POINT_ERROR
@ HYPERVISOR_INJECTION_EXCEPTION
@ GENERAL_PROTECTION_FAULT
@ SIMD_FLOATING_POINT_EXCEPTION
void jump_usermode(uintptr_t addr)
static interrupt_per_core_data_t interrupt_per_core_data[VOXIA_MAX_CORE]
static void interrupt_register(interrupt_entry_t *entries, int n, void *handler, int selector, uint8_t ist, uint8_t type_attr)
boolean_t g__scheduler__is__running
boolean_t elf_has_running
static const char * exception_messages[]
static void interrupt_reload(interrupt_pointers_t *ptr, interrupt_entry_t *tbl)
uint16_t irq_alloc_entry(uint8_t core)
static void interrupt_io_wait()
void irq_register(uint8_t core, int n, void *handler, boolean_t use_default_isr, uint16_t selector, uint8_t ist, uint8_t type_attr)
static void interrupt_pic_remap(void)
boolean_t is_running_program
void irq_setup(uint16_t core)
#define INTERRUPT_ATTR_KERNEL
static void outb(uint16_t port, uint8_t value)
void serial2_printf(const char *fmt,...)
void sch_restore_to_next_thread(volatile interrupt_stack_frame_t *rsp, uint16_t core_id)
scheduler_queue_t * vxSchedulerGetCurrentQueue(uint16_t core)
struct scheduler_queue scheduler_queue_t
#define LOG2_ERROR(mod, fmt,...)
void memset(void *ptr, int value, size_t num)
boolean_t use_default_isr
struct xhci_slot_ctx slot