Add IRQ tracing, fix incorrent LAPIC ID code
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
+16
-8
@@ -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 $@ $<
|
||||
|
||||
|
||||
+17
-4
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user