Add IRQ tracing, fix incorrent LAPIC ID code

This commit is contained in:
Mark
2019-10-10 13:50:25 +03:00
parent 2e320b5974
commit 84497ba98e
7 changed files with 76 additions and 14 deletions
+3 -2
View File
@@ -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
View File
@@ -0,0 +1,2 @@
# vi: ft=make :
export AMD64_TRACE_IRQ=1
+11
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+24
View File
@@ -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"