diff --git a/Makefile b/Makefile index e4bcc76..262a036 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,8 @@ ifeq ($(ARCH),amd64) CFLAGS+=-DARCH_AMD64 endif +include config + export O?=$(abspath build) # Include base system @@ -14,8 +16,7 @@ include sys/conf.mk # Arch details include sys/$(ARCH)/conf.mk - -all: mkdirs $(TARGETS) +all: mkdirs config $(TARGETS) clean: @rm -rf $(O) diff --git a/config b/config new file mode 100644 index 0000000..b832187 --- /dev/null +++ b/config @@ -0,0 +1,2 @@ +# vi: ft=make : +export AMD64_TRACE_IRQ=1 diff --git a/include/sys/amd64/asm/asm_irq.h b/include/sys/amd64/asm/asm_irq.h index 413c0c8..23dc121 100644 --- a/include/sys/amd64/asm/asm_irq.h +++ b/include/sys/amd64/asm/asm_irq.h @@ -2,9 +2,20 @@ #define AMD64_STACK_CTX_CANARY 0xBAD57AC6BAD57AC6 // TODO: use base + off instead of an absolute address +#define AMD64_LAPIC_REG_ID_ABS 0xFFFFFF00FEE00020 #define AMD64_LAPIC_REG_EOI_ABS 0xFFFFFF00FEE000B0 #if defined(__ASM__) + +.macro irq_trace, n +#if defined(AMD64_TRACE_IRQ) + // Assuming we're entering from safe context + movq $\n, %rdi + call amd64_irq_trace +#else +#endif +.endm + .macro irq_push_ctx pushq %rax pushq %rcx diff --git a/sys/amd64/conf.mk b/sys/amd64/conf.mk index 9d07a38..223fb17 100644 --- a/sys/amd64/conf.mk +++ b/sys/amd64/conf.mk @@ -5,6 +5,7 @@ include sys/amd64/compiler.mk all: ### Kernel build DEFINES+=-DARCH_AMD64 + OBJS+=$(O)/sys/amd64/hw/rs232.o \ $(O)/sys/amd64/kernel.o \ $(O)/sys/amd64/hw/gdt.o \ @@ -17,6 +18,13 @@ OBJS+=$(O)/sys/amd64/hw/rs232.o \ $(O)/sys/amd64/hw/irq0.o \ $(O)/sys/amd64/hw/ap_code_blob.o \ $(O)/sys/amd64/hw/con.o + +### From config +ifdef AMD64_TRACE_IRQ +DEFINES+=-DAMD64_TRACE_IRQ +OBJS+=$(O)/sys/amd64/hw/irq_trace.o +endif + kernel_OBJS=$(O)/sys/amd64/entry.o \ $(OBJS) kernel_LINKER=sys/amd64/link.ld @@ -51,23 +59,23 @@ DIRS+=$(O)/sys/amd64/image/boot/grub \ # add .inc includes for asm HEADERS+=$(shell find include -name "*.inc") -$(O)/sys/amd64/kernel.elf: $(kernel_OBJS) $(kernel_LINKER) +$(O)/sys/amd64/kernel.elf: $(kernel_OBJS) $(kernel_LINKER) config @printf " LD\t%s\n" $(@:$(O)/%=%) @$(CC64) $(kernel_LDFLAGS) -o $@ $(kernel_OBJS) -$(O)/sys/%.o: sys/%.S $(HEADERS) +$(O)/sys/%.o: sys/%.S $(HEADERS) config @printf " AS\t%s\n" $(@:$(O)/%=%) @$(CC64) $(kernel_CFLAGS) -D__ASM__ -c -o $@ $< -$(O)/sys/%.o: sys/%.c $(HEADERS) +$(O)/sys/%.o: sys/%.c $(HEADERS) config @printf " CC\t%s\n" $(@:$(O)/%=%) @$(CC64) $(kernel_CFLAGS) -c -o $@ $< -$(O)/sys/amd64/hw/ap_code_blob.o: $(O)/sys/amd64/hw/ap_code.bin +$(O)/sys/amd64/hw/ap_code_blob.o: $(O)/sys/amd64/hw/ap_code.bin config @printf " AS\t%s\n" $(@:$(O)/%=%) @$(CC64) $(kernel_CFLAGS) -c -DAP_CODE_BIN='"$<"' -o $@ sys/amd64/hw/ap_code_blob.S -$(O)/sys/amd64/hw/ap_code.bin: sys/amd64/hw/ap_code.nasm +$(O)/sys/amd64/hw/ap_code.bin: sys/amd64/hw/ap_code.nasm config @printf " NASM\t%s\n" $(@:$(O)/%=%) @nasm -f bin -o $@ $< @@ -90,15 +98,15 @@ loader_CFLAGS=-ffreestanding \ -Wno-language-extension-token loader_LDFLAGS=-nostdlib -T$(loader_LINKER) -$(O)/sys/amd64/loader.elf: $(loader_OBJS) $(loader_LINKER) +$(O)/sys/amd64/loader.elf: $(loader_OBJS) $(loader_LINKER) config @printf " LD\t%s\n" $(@:$(O)/%=%) @$(CC86) $(loader_LDFLAGS) -o $@ $(loader_OBJS) -$(O)/sys/amd64/loader/%.o: sys/amd64/loader/%.S $(HEADERS) +$(O)/sys/amd64/loader/%.o: sys/amd64/loader/%.S $(HEADERS) config @printf " AS\t%s\n" $(@:$(O)/%=%) @$(CC86) $(loader_CFLAGS) -D__ASM__ -c -o $@ $< -$(O)/sys/amd64/loader/%.o: sys/amd64/loader/%.c $(HEADERS) +$(O)/sys/amd64/loader/%.o: sys/amd64/loader/%.c $(HEADERS) config @printf " CC\t%s\n" $(@:$(O)/%=%) @$(CC86) $(loader_CFLAGS) -c -o $@ $< diff --git a/sys/amd64/hw/apic.c b/sys/amd64/hw/apic.c index 6b58022..a5ef0e9 100644 --- a/sys/amd64/hw/apic.c +++ b/sys/amd64/hw/apic.c @@ -97,10 +97,23 @@ static void amd64_pic8259_disable(void) { static void amd64_ap_code_entry(void) { // Can do this as core should've bootstrapped BEFORE BSP checks this value again + // {{{ CRITICAL BLOCK ++started_up_aps; + // }}} + + // Enable LAPIC timer + kdebug("AP %d startup\n", started_up_aps); + + // Enable LAPIC.SVR.SoftwareEnable bit + // And set spurious interrupt mapping to 0xFF + *(uint32_t *) (lapic_base + IA32_LAPIC_REG_SVR) |= (1 << 8) | (0xFF); + + *(uint32_t *) (lapic_base + IA32_LAPIC_REG_LVTT) = 32 | 0x20000; + *(uint32_t *) (lapic_base + IA32_LAPIC_REG_TMRDIV) = 1; + *(uint32_t *) (lapic_base + IA32_LAPIC_REG_TMRINITCNT) = 0xFFFFFFF; while (1) { - asm ("cli; hlt"); + asm ("sti; hlt"); } } @@ -177,7 +190,7 @@ void amd64_apic_init(struct acpi_madt *madt) { amd64_pic8259_disable(); // Determine the BSP LAPIC ID - bsp_lapic_id = *(uint32_t *) (lapic_base + IA32_LAPIC_REG_ID); + bsp_lapic_id = (*(uint32_t *) (lapic_base + IA32_LAPIC_REG_ID) >> 24); kdebug("BSP Local APIC ID: %d\n", bsp_lapic_id); // Enable LAPIC.SVR.SoftwareEnable bit @@ -207,6 +220,6 @@ void amd64_apic_init(struct acpi_madt *madt) { // Enable LAPIC timer *(uint32_t *) (lapic_base + IA32_LAPIC_REG_LVTT) = 32 | 0x20000; - *(uint32_t *) (lapic_base + IA32_LAPIC_REG_TMRDIV) = 2; - *(uint32_t *) (lapic_base + IA32_LAPIC_REG_TMRINITCNT) = 100000; + *(uint32_t *) (lapic_base + IA32_LAPIC_REG_TMRDIV) = 1; + *(uint32_t *) (lapic_base + IA32_LAPIC_REG_TMRINITCNT) = 0xFFFFFFF; } diff --git a/sys/amd64/hw/irq0.S b/sys/amd64/hw/irq0.S index 63f968b..5b25788 100644 --- a/sys/amd64/hw/irq0.S +++ b/sys/amd64/hw/irq0.S @@ -3,6 +3,7 @@ .global amd64_irq0 amd64_irq0: + cli // Interrupt entry: // rsp should be one of the following: // The one specified in the TSS.RSP0 @@ -12,6 +13,8 @@ amd64_irq0: // Let's adhere to the amd64 ABI movq %rsp, %rbp + irq_trace 0 + // TODO: call sched here, do something // EOI diff --git a/sys/amd64/hw/irq_trace.S b/sys/amd64/hw/irq_trace.S new file mode 100644 index 0000000..cb7f259 --- /dev/null +++ b/sys/amd64/hw/irq_trace.S @@ -0,0 +1,24 @@ +#include "asm/asm_irq.h" + +.section .text +.global amd64_irq_trace +amd64_irq_trace: + pushq %rbp + movq %rsp, %rbp + + // Get LAPIC ID + // TODO: support non-APIC configs + movq $AMD64_LAPIC_REG_ID_ABS, %rax + movl (%rax), %edx + shrl $24, %edx + + leaq _irq_msg_fmt(%rip), %rsi + movq %rdi, %rcx + xorq %rdi, %rdi + call debugf + + leaveq + retq + +_irq_msg_fmt: + .string "[IRQ @ %d] %d\n"