Run first app from ramdisk!
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <amd64/apic.h>
|
||||
#include <amd64/intr.h>
|
||||
#include <amd64/intr_defs.h>
|
||||
#include <amd64/io.h>
|
||||
#include <aux/compiler.h>
|
||||
#include <irq/irq.h>
|
||||
@@ -100,54 +101,23 @@ static void amd64_idt_init (void) {
|
||||
#define IDT_ENTRY(n, ist) \
|
||||
extern void amd64_intr##n (void); \
|
||||
amd64_idt_set (&idt_entries[(n)], (uint64_t)&amd64_intr##n, 0x8E, (ist))
|
||||
IDT_ENTRY (0, 0);
|
||||
IDT_ENTRY (1, 0);
|
||||
IDT_ENTRY (2, 0);
|
||||
IDT_ENTRY (3, 0);
|
||||
IDT_ENTRY (4, 0);
|
||||
IDT_ENTRY (5, 0);
|
||||
IDT_ENTRY (6, 0);
|
||||
IDT_ENTRY (7, 0);
|
||||
IDT_ENTRY (8, 0);
|
||||
IDT_ENTRY (9, 0);
|
||||
IDT_ENTRY (10, 0);
|
||||
IDT_ENTRY (11, 0);
|
||||
IDT_ENTRY (12, 0);
|
||||
IDT_ENTRY (13, 0);
|
||||
IDT_ENTRY (14, 0);
|
||||
IDT_ENTRY (15, 0);
|
||||
IDT_ENTRY (16, 0);
|
||||
IDT_ENTRY (17, 0);
|
||||
IDT_ENTRY (18, 0);
|
||||
IDT_ENTRY (19, 0);
|
||||
IDT_ENTRY (20, 0);
|
||||
IDT_ENTRY (21, 0);
|
||||
IDT_ENTRY (22, 0);
|
||||
IDT_ENTRY (23, 0);
|
||||
IDT_ENTRY (24, 0);
|
||||
IDT_ENTRY (25, 0);
|
||||
IDT_ENTRY (26, 0);
|
||||
IDT_ENTRY (27, 0);
|
||||
IDT_ENTRY (28, 0);
|
||||
IDT_ENTRY (29, 0);
|
||||
IDT_ENTRY (30, 0);
|
||||
IDT_ENTRY (31, 0);
|
||||
IDT_ENTRY (32, 1);
|
||||
IDT_ENTRY (33, 1);
|
||||
IDT_ENTRY (34, 1);
|
||||
IDT_ENTRY (35, 1);
|
||||
IDT_ENTRY (36, 1);
|
||||
IDT_ENTRY (37, 1);
|
||||
IDT_ENTRY (38, 1);
|
||||
IDT_ENTRY (39, 1);
|
||||
IDT_ENTRY (40, 1);
|
||||
IDT_ENTRY (41, 1);
|
||||
IDT_ENTRY (42, 1);
|
||||
IDT_ENTRY (43, 1);
|
||||
IDT_ENTRY (44, 1);
|
||||
IDT_ENTRY (45, 1);
|
||||
IDT_ENTRY (46, 1);
|
||||
IDT_ENTRY (47, 1);
|
||||
/* clang-format off */
|
||||
IDT_ENTRY (0, 0); IDT_ENTRY (1, 0); IDT_ENTRY (2, 0); IDT_ENTRY (3, 0);
|
||||
IDT_ENTRY (4, 0); IDT_ENTRY (5, 0); IDT_ENTRY (6, 0); IDT_ENTRY (7, 0);
|
||||
IDT_ENTRY (8, 0); IDT_ENTRY (9, 0); IDT_ENTRY (10, 0); IDT_ENTRY (11, 0);
|
||||
IDT_ENTRY (12, 0); IDT_ENTRY (13, 0); IDT_ENTRY (14, 0); IDT_ENTRY (15, 0);
|
||||
IDT_ENTRY (16, 0); IDT_ENTRY (17, 0); IDT_ENTRY (18, 0); IDT_ENTRY (19, 0);
|
||||
IDT_ENTRY (20, 0); IDT_ENTRY (21, 0); IDT_ENTRY (22, 0); IDT_ENTRY (23, 0);
|
||||
IDT_ENTRY (24, 0); IDT_ENTRY (25, 0); IDT_ENTRY (26, 0); IDT_ENTRY (27, 0);
|
||||
IDT_ENTRY (28, 0); IDT_ENTRY (29, 0); IDT_ENTRY (30, 0); IDT_ENTRY (31, 0);
|
||||
IDT_ENTRY (32, 1); IDT_ENTRY (33, 1); IDT_ENTRY (34, 1); IDT_ENTRY (35, 1);
|
||||
IDT_ENTRY (36, 1); IDT_ENTRY (37, 1); IDT_ENTRY (38, 1); IDT_ENTRY (39, 1);
|
||||
IDT_ENTRY (40, 1); IDT_ENTRY (41, 1); IDT_ENTRY (42, 1); IDT_ENTRY (43, 1);
|
||||
IDT_ENTRY (44, 1); IDT_ENTRY (45, 1); IDT_ENTRY (46, 1); IDT_ENTRY (47, 1);
|
||||
|
||||
IDT_ENTRY (SCHED_PREEMPT_TIMER, 1);
|
||||
IDT_ENTRY (TLB_SHOOTDOWN, 1);
|
||||
/* clang-format on */
|
||||
#undef IDT_ENTRY
|
||||
|
||||
idt.limit = sizeof (idt_entries) - 1;
|
||||
@@ -177,7 +147,11 @@ static void amd64_intr_exception (struct saved_regs* regs) {
|
||||
regs->error, regs->rip, regs->cs, regs->rflags, regs->rsp, regs->ss, cr2, cr3,
|
||||
regs->rbx);
|
||||
|
||||
amd64_spin ();
|
||||
if (regs->cs == (0x18 | 0x03)) {
|
||||
proc_kill (thiscpu->proc_current);
|
||||
} else {
|
||||
amd64_spin ();
|
||||
}
|
||||
}
|
||||
|
||||
void amd64_intr_handler (void* stack_ptr) {
|
||||
@@ -185,16 +159,20 @@ void amd64_intr_handler (void* stack_ptr) {
|
||||
|
||||
if (regs->trap <= 31) {
|
||||
amd64_intr_exception (regs);
|
||||
} else if (regs->trap >= 32) {
|
||||
} else {
|
||||
amd64_lapic_eoi ();
|
||||
|
||||
__asm__ volatile ("sti");
|
||||
struct irq* irq = irq_find (regs->trap);
|
||||
|
||||
irq_invoke_each (regs->trap);
|
||||
if (irq != NULL) {
|
||||
if (!(irq->flags & IRQ_INTERRUPT_SAFE))
|
||||
__asm__ volatile ("sti");
|
||||
|
||||
__asm__ volatile ("cli");
|
||||
} else {
|
||||
DEBUG ("unknown trap %lu\n", regs->trap);
|
||||
irq->func (irq->arg, stack_ptr);
|
||||
|
||||
if (!(irq->flags & IRQ_INTERRUPT_SAFE))
|
||||
__asm__ volatile ("cli");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,3 +213,12 @@ void irq_restore (void) {
|
||||
if (prev == 1)
|
||||
amd64_irq_restore_flags (thiscpu->irq_ctx.rflags);
|
||||
}
|
||||
|
||||
uint8_t amd64_resolve_irq (uint8_t irq) {
|
||||
static const uint8_t mappings[] = {
|
||||
[SCHED_PREEMPT_TIMER] = 0,
|
||||
[TLB_SHOOTDOWN] = 1,
|
||||
};
|
||||
|
||||
return mappings[irq];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user