SMP works?

This commit is contained in:
Mark
2020-10-04 15:48:11 +03:00
parent ff8f319d8c
commit d7a3ed3ff5
6 changed files with 55 additions and 7 deletions
+2 -2
View File
@@ -72,14 +72,14 @@ static uint32_t timer_tick(void *arg) {
break; break;
} }
#if defined(DEBUG_COUNTERS) //#if defined(DEBUG_COUNTERS)
static uint64_t last_debug_cycle = 0; static uint64_t last_debug_cycle = 0;
uint64_t delta = (system_time - last_debug_cycle) / 1000000ULL; uint64_t delta = (system_time - last_debug_cycle) / 1000000ULL;
if (delta >= 1000) { if (delta >= 1000) {
sched_debug_cycle(delta); sched_debug_cycle(delta);
last_debug_cycle = system_time; last_debug_cycle = system_time;
} }
#endif //#endif
struct list_head *iter, *b_iter; struct list_head *iter, *b_iter;
uintptr_t irq; uintptr_t irq;
+1 -1
View File
@@ -1,7 +1,7 @@
#pragma once #pragma once
#define AMD64_KERNEL_STACK 65536 #define AMD64_KERNEL_STACK 65536
#define AMD64_MAX_SMP 1 //#define AMD64_MAX_SMP 4
//#define SLAB_TRACE_ALLOC 1 //#define SLAB_TRACE_ALLOC 1
#undef SLAB_TRACE_ALLOC #undef SLAB_TRACE_ALLOC
+23 -1
View File
@@ -51,6 +51,10 @@ KERNEL_OBJ=$(O)/arch/amd64/boot/yboot.o \
$(O)/arch/amd64/syscall_s.o \ $(O)/arch/amd64/syscall_s.o \
$(O)/arch/amd64/syscall.o \ $(O)/arch/amd64/syscall.o \
$(O)/arch/amd64/binfmt_elf.o \ $(O)/arch/amd64/binfmt_elf.o \
$(O)/arch/amd64/smp/smp.o \
$(O)/arch/amd64/smp/ap_code.o \
$(O)/arch/amd64/smp/ipi.o \
$(O)/arch/amd64/smp/irq_ipi_s.o \
$(O)/sys/debug.o \ $(O)/sys/debug.o \
$(O)/sys/ubsan.o \ $(O)/sys/ubsan.o \
$(O)/sys/panic.o \ $(O)/sys/panic.o \
@@ -127,6 +131,7 @@ DIRS+=$(O)/arch/amd64/hw \
$(O)/drivers/usb \ $(O)/drivers/usb \
$(O)/drivers/ata \ $(O)/drivers/ata \
$(O)/drivers/pci \ $(O)/drivers/pci \
$(O)/arch/amd64/smp \
$(O)/fs \ $(O)/fs \
$(O)/fs/ext2 \ $(O)/fs/ext2 \
$(O)/sys/block \ $(O)/sys/block \
@@ -144,6 +149,8 @@ include etc/KernelOptions.makefile
KERNEL_GIT_VERSION=$(shell git describe --always --tags) KERNEL_GIT_VERSION=$(shell git describe --always --tags)
KERNEL_CFLAGS=-Iinclude \ KERNEL_CFLAGS=-Iinclude \
-Iinclude/arch/amd64/acpica \ -Iinclude/arch/amd64/acpica \
-DAMD64_SMP=4 \
-DAMD64_MAX_SMP=4 \
-Iboot \ -Iboot \
-fshort-wchar \ -fshort-wchar \
-I$(O)/include \ -I$(O)/include \
@@ -163,7 +170,8 @@ KERNEL_CFLAGS=-Iinclude \
-Wall \ -Wall \
-Wextra \ -Wextra \
-Wno-unused \ -Wno-unused \
-O0 \ -O2 \
-funroll-loops \
-ggdb \ -ggdb \
-Werror $(KERNEL_DEF) -Werror $(KERNEL_DEF)
KERNEL_LDFLAGS=-nostdlib \ KERNEL_LDFLAGS=-nostdlib \
@@ -202,3 +210,17 @@ $(O)/sys/font/default8x16.psfu.o: etc/default8x16.psfu arch/amd64/incbin.S
-DINCBIN_START="_psf_start" \ -DINCBIN_START="_psf_start" \
-DINCBIN_END="_psf_end" \ -DINCBIN_END="_psf_end" \
-o $@ arch/amd64/incbin.S -o $@ arch/amd64/incbin.S
$(O)/arch/amd64/smp/ap_code.o: $(O)/arch/amd64/hw/ap_code.bin arch/amd64/incbin.S
@echo " RES $@"
@$(CC) \
-c \
-D__ASM__ \
-DINCBIN_FILE='"$(O)/arch/amd64/hw/ap_code.bin"' \
-DINCBIN_START="amd64_ap_code_start" \
-DINCBIN_END="amd64_ap_code_end" \
-o $@ arch/amd64/incbin.S
$(O)/arch/amd64/hw/ap_code.bin: arch/amd64/hw/ap_code.nasm
@echo "NASM $@"
@nasm -fbin -o $@ $<
+2
View File
@@ -372,6 +372,8 @@ void sysfs_populate(void) {
sysfs_add_config_endpoint(dir, "modules", SYSFS_MODE_DEFAULT, 512, NULL, mod_list, NULL); sysfs_add_config_endpoint(dir, "modules", SYSFS_MODE_DEFAULT, 512, NULL, mod_list, NULL);
sysfs_add_config_endpoint(dir, "debug_serial", SYSFS_MODE_DEFAULT, 32, "serial", debug_config_get, debug_config_set); sysfs_add_config_endpoint(dir, "debug_serial", SYSFS_MODE_DEFAULT, 32, "serial", debug_config_get, debug_config_set);
sysfs_add_config_endpoint(dir, "debug_display", SYSFS_MODE_DEFAULT, 32, "display", debug_config_get, debug_config_set); sysfs_add_config_endpoint(dir, "debug_display", SYSFS_MODE_DEFAULT, 32, "display", debug_config_get, debug_config_set);
extern size_t sched_ncpus;
sysfs_add_config_endpoint(dir, "smp", SYSFS_MODE_DEFAULT, 16, &sched_ncpus, sysfs_config_int64_getter, NULL);
sysfs_add_config_endpoint(NULL, "mem", SYSFS_MODE_DEFAULT, 512, NULL, system_mem_getter, NULL); sysfs_add_config_endpoint(NULL, "mem", SYSFS_MODE_DEFAULT, 512, NULL, system_mem_getter, NULL);
+1 -2
View File
@@ -13,7 +13,7 @@ void panicf(const char *fmt, ...) {
asm volatile ("cli"); asm volatile ("cli");
va_list args; va_list args;
kfatal("--- Panic ---\n"); kfatal("--- Panic (cpu%d) ---\n", get_cpu()->processor_id);
if (sched_ready) { if (sched_ready) {
debugs(DEBUG_FATAL, "\033[41m"); debugs(DEBUG_FATAL, "\033[41m");
@@ -35,7 +35,6 @@ void panicf(const char *fmt, ...) {
#if defined(AMD64_SMP) #if defined(AMD64_SMP)
// Send PANIC IPIs to all other CPUs // Send PANIC IPIs to all other CPUs
size_t cpu = get_cpu()->processor_id; size_t cpu = get_cpu()->processor_id;
kfatal("cpu%u initiates panic sequence\n", cpu);
for (size_t i = 0; i < smp_ncpus; ++i) { for (size_t i = 0; i < smp_ncpus; ++i) {
if (i != cpu) { if (i != cpu) {
amd64_ipi_send(i, IPI_VECTOR_PANIC); amd64_ipi_send(i, IPI_VECTOR_PANIC);
+26 -1
View File
@@ -25,6 +25,7 @@ static struct thread threads_idle[AMD64_MAX_SMP] = {0};
static size_t queue_sizes[AMD64_MAX_SMP] = {0}; static size_t queue_sizes[AMD64_MAX_SMP] = {0};
int sched_ncpus = 1; int sched_ncpus = 1;
int sched_ready = 0; int sched_ready = 0;
static int clk = 0;
static spin_t sched_lock = 0; static spin_t sched_lock = 0;
@@ -90,7 +91,11 @@ void sched_queue(struct thread *thr) {
} }
} }
spin_release_irqrestore(&sched_lock, &irq); spin_release_irqrestore(&sched_lock, &irq);
sched_queue_to(thr, min_queue_index); if (min_queue_size == 0) {
sched_queue_to(thr, (clk++) % sched_ncpus);
} else {
sched_queue_to(thr, min_queue_index);
}
#else #else
sched_queue_to(thr, 0); sched_queue_to(thr, 0);
#endif #endif
@@ -156,6 +161,26 @@ void sched_unqueue(struct thread *thr, enum thread_state new_state) {
} }
} }
void sched_debug_cycle(uint64_t ms) {
uintptr_t irq;
spin_lock_irqsave(&sched_lock, &irq);
for (int cpu = 0; cpu < sched_ncpus; ++cpu) {
debugf(DEBUG_DEFAULT, "cpu%d: ", cpu);
for (struct thread *thr = queue_heads[cpu]; thr; thr = thr->sched_next) {
debugf(DEBUG_DEFAULT, "#%d (%s):<%p> ", thr->proc->pid, thr->proc->name, thr);
if (thr->sched_next == queue_heads[cpu]) {
break;
}
}
debugc(DEBUG_DEFAULT, '\n');
}
spin_release_irqrestore(&sched_lock, &irq);
}
//#if defined(DEBUG_COUNTERS) //#if defined(DEBUG_COUNTERS)
//static void sched_debug_tree(int level, struct thread *thr, int depth) { //static void sched_debug_tree(int level, struct thread *thr, int depth) {
// for (int i = 0; i < depth; ++i) { // for (int i = 0; i < depth; ++i) {