From 1f71b9576db536af84155363e14fc49e92de2eef Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Sun, 29 Aug 2021 02:52:48 -0500 Subject: [PATCH] backup 8.29.21 --- src/.gdb_history | 404 +++++++++++++++---------------- src/bootloader/bootloader.asm | 1 - src/bootloader/enter_kernel.asm | 13 +- src/debug/gdbinit.gdb | 4 +- src/include/addr.h | 11 + src/include/int.h | 2 +- src/include/kernel.h | 10 +- src/include/{serial.h => klog.h} | 11 +- src/include/panic.h | 3 + src/include/printf.h | 1 + src/include/smp_sync.h | 17 ++ src/indigo_os | Bin 42016 -> 42912 bytes src/kernel/acpi.c | 4 +- src/kernel/int.c | 22 +- src/kernel/kernel.c | 35 +-- src/kernel/klog.c | 174 +++++++++---- src/kernel/madt.c | 2 +- src/kernel/page.c | 2 +- src/kernel/panic.c | 12 +- src/kernel/printf.c | 17 +- src/kernel/smp.c | 37 +-- src/kernel/smp_trampoline.asm | 78 +++--- src/kernel/timer.c | 6 +- src/link.ld | 5 +- src/makefile | 14 -- 25 files changed, 507 insertions(+), 378 deletions(-) create mode 100644 src/include/addr.h rename src/include/{serial.h => klog.h} (51%) create mode 100644 src/include/smp_sync.h diff --git a/src/.gdb_history b/src/.gdb_history index df12f20..b48fd09 100644 --- a/src/.gdb_history +++ b/src/.gdb_history @@ -1,205 +1,3 @@ -thread 1 -next -thread 1 -step -print core_stacks -print core_stacks[0] -print core_stacks[1] -print core_stacks[2] -print core_stacks[3] -quit -c -c -quit -hb debug -c -c -next -info reg rax -thread 1 -thread 2 -info reg rax -print smp_bootstrap_stackarray -print *smp_bootstrap_stackarray -print/x *smp_bootstrap_stackarray -inf ore g rax -print smp_bootstrap_array -quit -hb debug -c -c -quit -hb debug -c -c -nexti -info reg ebx -info reg ebx -quit -hb debug -c -c -quit -hb debug -c -c -stepi -info reg ebx -stepi -stepi -info reg rsp -stepi -info reg esp -info reg rsp -x rbx -info reg rbx -print smp_bootstrap_stackarray -print/x *smp_bootstrap_stackarray -info reg ebx -quit -quit -stepi -info reg cl -info reg ecx -quit -next -quit -nexti -info reg ecx -stepi -info reg ebx -quit -c -quit -stepi -info reg ebx -stepi -info reg bl -print smp_bootstrap_bsp -info reg bl -stepi -info reg bl -info reg ebx -x 0x80f0 -print (uint64_t *)0x80f0 -print (uint64_t*)0x80f0 -x 0x80f9 -stepi -stepi -info reg rsp -print smp_bootstrap_stackarray -print/x *smp_bootstrap_stackarray -quit -info reg rax -info reg rax -x 0xbffde058 -print smp_bootstrap_bsp -print &smp_bootstrap_bsp -print smp_bootstrap_bsp -x 0x80f1 -print (uint64_t)*0x80f1 -x smp_bootstrap_bsp -smp_bootstrap_bsp -print smp_bootstrap_bsp -smp_bootstrap_stackarray -print smp_bootstrap_stackarray -print *smp_bootstrap_stackarray -print smp_bootstrap_stackarray[0] -print/x smp_bootstrap_stackarray[0] -print/x smp_bootstrap_stackarray[1] -print/x smp_bootstrap_stackarray[0] -info reg rax -print smp_bootstrap_stackarray -quit -info reg rax -quit -next -stepi -quit -c -quit -c -stepi -quit -hb smp_trampoline -c -next -hb debug -c -quit -c -quit -c -quit -c -stepi -quit -c -quit -c -next -info reg rsp -thread 2 -context -quit -quit -c -info reg cl -info reg ecx -quit -c -next -quit -info reg rax -c -info reg rax -stepi -info rax -inf oreg rax -info reg rax -info reg rbx -x 0xffff8000bffde058 -x *0xffff8000bffde058 -print *0xffff8000bffde058 -print/x *0xffff8000bffde058 -print/x (uint64_t)*0xffff8000bffde058 -print/x (uint64_t)0xffff8000bffde058 -print/x (uint64_t)*0xffff8000bffde058 -print/x (uint64_t)0xffff8000bffde058 -print/x (uint64_t)0xffff8000bffde058[1] -print ((uint64_t)0xffff8000bffde058)[1] -print ((uint64_t *)0xffff8000bffde058)[1] -print ((uint64_t *)0xffff8000bffde058)[0] -print ((uint64_t *)0xffff8000bffde058)[1] -print/x ((uint64_t *)0xffff8000bffde058)[1] -quit -c -nexti -quit -c -stepi -stepi -info thread 0 -thread 1 -c -quit -next -print cores_active -print cores.corecount -next -print cores.corecount -print cores_active -next -c -print cores_active -thread 0 -print cores_active -thread 1 -print cores_active -quit -c -stepi -info reg rax thread 0 thread 2 print cores_active @@ -254,3 +52,205 @@ c c c quit +quit +print final_gdt_descriptor +print gdt +quit +quit +quit +nexti +thread 1 +thread 23 +thread 2 +print final_gdt_descriptor.offset +qut +quit +context +disassemble +x/i 0x80dd +quit +c +c +c +quit +next +print gdt +print gdtr +next +print gdtr +print/x (void *)&gdtr +print/x *(void *)&gdtr +hexdump &gdtr +print/x gdtr +quit +c +quit +next +stepi +info reg rax +info reg rdx +print final_gdt_descriptor +print &final_gdt_descriptor +quit +quit +c +quit +c +thread 2 +next +quit +c +thread +threads +info threads +thread 1 +c +c +quit +c +quit +c +quit +hb klog.c +hb klog +hb klog_init +c +quit +hb init_klog +c +print sizeof(serial_ports) +print sizeof(serial_ports) / sizeof(uint16_t) +quit +c +quit +c +quit +c +quit +hb smp_trampoline.asm:163 +c +print smp_kinit +x smp_kinit +next +info reg rax +x smp_kinit +nexti +x smp_kinit +info reg rax +quit +c +quit +c +quit +c +quit +c +quit +nexti +stepi +stepi +next +quit +b _putchar +c +stepi +next +c +c +quit +hb _putchar +c +c +next +step +print screen_buffer +x 0xffff8000000b80a0 +0xffff800000000000 +x 0xffff800000000000 +quit +c +quit +b _putchar +c +c +step +print screen_buffer +stepi +c +d +c +quit +next +quit +b init_klog +c +next +print serial_ports[0] +print/x serial_ports[0] +next +quit +quit +c +quit +c +quit +c +quit +c +quit +c +quit +b init_klog +c +print sizeof(serial_ports) / sizeof(uint16_t) +next +print p +next +make +quit +b init_klog +c +next +step +b _putchar +c +step +step +print (char *)((uint64_t)VIDEO_BUFFER + ((on_line * 160) + (on_char * 2))) +print (char *)((uint64_t)0xb8000 + ((on_line * 160) + (on_char * 2))) +quit +c +quit +hb test_shit +c +c +c +c +c +c +c +c +c +c +c +c +quit +c +quit +quit +next +quit +quit +quit +info reg edx +nexti +info reg edx +quit +next +info reg ebx +quit +hb fuckyou +quit +c +info reg ebx +quit diff --git a/src/bootloader/bootloader.asm b/src/bootloader/bootloader.asm index 8e5fbeb..fcb39a7 100644 --- a/src/bootloader/bootloader.asm +++ b/src/bootloader/bootloader.asm @@ -1,7 +1,6 @@ [bits 16] [extern _kernel_sector_size] [extern _bootloader_stage1_size] -[extern _kernel_s1_loc] jmp stage0 times 3-($-$$) db 0x90 diff --git a/src/bootloader/enter_kernel.asm b/src/bootloader/enter_kernel.asm index ef2cd71..bdf0a71 100644 --- a/src/bootloader/enter_kernel.asm +++ b/src/bootloader/enter_kernel.asm @@ -1,4 +1,4 @@ -[extern main] +[extern kernel_init] [extern _kernel_stack_loc] [extern _kernel_page_size] enter_longmode: @@ -68,13 +68,14 @@ mov cr4, eax ;If it's not and we enable it, it will cause pagefaults on read mov eax, 0x80000001 cpuid -and edx, 1 << 20 -shr edx, 9 +mov ebx, edx +and ebx, 1 << 20 +shr ebx, 9 mov ecx, 0xc0000080 rdmsr -or eax, 1 << 8 | 1 << 11 -or eax, edx +or eax, 1 << 8 +or eax, ebx wrmsr mov eax, cr0 @@ -90,7 +91,7 @@ enter_kernel: bits 64 mov rbp, 0 mov rsp, _kernel_stack_loc -mov rax, QWORD main +mov rax, QWORD kernel_init ;push QWORD 0 jmp rax jmp $ diff --git a/src/debug/gdbinit.gdb b/src/debug/gdbinit.gdb index b6ad20a..1a96557 100644 --- a/src/debug/gdbinit.gdb +++ b/src/debug/gdbinit.gdb @@ -1,8 +1,8 @@ target remote localhost:1234 symbol-file debug/debug_syms.o -hb debug -hb smp_boot +hb fuckyou +hb kernel_init define cs2bs diff --git a/src/include/addr.h b/src/include/addr.h new file mode 100644 index 0000000..039d11d --- /dev/null +++ b/src/include/addr.h @@ -0,0 +1,11 @@ +#ifndef ADDR_INCLUDED +#define ADDR_INCLUDED + +#include + +//couldn't get symbols working, fix later +#define PA_OFFSET 0xffff800000000000 +#define TXT_OFFSET 0xffffffff80000000 +#define PHYS_TO_VIRT(addr) ((void *)((uintptr_t)(addr) | PA_OFFSET)) + +#endif diff --git a/src/include/int.h b/src/include/int.h index 8cc6a88..32313bd 100644 --- a/src/include/int.h +++ b/src/include/int.h @@ -7,7 +7,7 @@ void usleep(unsigned int us); -void init_interrupts(); +void init_interrupts_bsp(); typedef uint32_t *lapic_t; diff --git a/src/include/kernel.h b/src/include/kernel.h index db0f049..ea1223a 100644 --- a/src/include/kernel.h +++ b/src/include/kernel.h @@ -2,14 +2,10 @@ #define KERNEL -#define PA_OFFSET 0xffff800000000000 -#define TXT_OFFSET 0xffffffff80000000 -#define PHYS_TO_VIRT(addr) ((void *)(addr) + PA_OFFSET) - -#define DEV_EMAIL "brett_weiland@bpcspace.com" - -void multicore_main(); +void smp_kinit(); +void kernel_init(); +void kmain(); #endif diff --git a/src/include/serial.h b/src/include/klog.h similarity index 51% rename from src/include/serial.h rename to src/include/klog.h index ef5eecf..1a6d3af 100644 --- a/src/include/serial.h +++ b/src/include/klog.h @@ -1,26 +1,19 @@ -//these com values are just guesses! Figure out how to find em later if you want #ifndef _SERIAL_H_ #define _SERIAL_H_ #include #include -#define COM1 0x3f8 -#define COM2 0x2f8 -#define COM3 0x3e8 -#define COM4 0x2e8 -bool init_serial(uint16_t port); + +void init_klog(); void serial_out(uint16_t port, char *string); void _putchar_serial(uint16_t port, char character); void move_cursor(unsigned int x, unsigned int y); -//TODO fix shitty header -void _putchar_screen(char character); - void clear_screen(); diff --git a/src/include/panic.h b/src/include/panic.h index 6a987f4..43712a2 100644 --- a/src/include/panic.h +++ b/src/include/panic.h @@ -52,6 +52,9 @@ void panic(int reason, void *frame_p, struct registers *regs); #define KERNEL_PANIC_INVALID_RSDT 35 #define KERNEL_PANIC_INVALID_IOAPIC_VEC 36 #define KERNEL_PANIC_HPET_REQUIRED 37 +#define KERNEL_PANIC_SMP_FAILED 38 + +#define DEV_EMAIL "brett_weiland@bpcspace.com" diff --git a/src/include/printf.h b/src/include/printf.h index 6104ccf..0733f55 100644 --- a/src/include/printf.h +++ b/src/include/printf.h @@ -61,6 +61,7 @@ void _putchar(char character); int printf_(const char* format, ...); + /** * Tiny sprintf implementation * Due to security reasons (buffer overflow) YOU SHOULD CONSIDER USING (V)SNPRINTF INSTEAD! diff --git a/src/include/smp_sync.h b/src/include/smp_sync.h new file mode 100644 index 0000000..92784b8 --- /dev/null +++ b/src/include/smp_sync.h @@ -0,0 +1,17 @@ +#ifndef SMP_SYNC_INCLUDED +#define SMP_SYNC_INCLUDED + +static inline void lock(uint8_t *lock) { + asm("mov al, 1\n" + "spinlock:\n" + "lock xchgb [%0], al\n" + "test al, al\n" + "jnz spinlock\n" + ::"r"(lock):"al"); +} + +static inline void unlock(uint8_t *lock) { + asm("lock andb [%0], 0"::"r"(lock)); +} + +#endif diff --git a/src/indigo_os b/src/indigo_os index ca0db980ce568952d40df7d31134b5233a9f9436..3fe850b3eaeecaaa813cca9fdcd4cd1bb2cc40c0 100755 GIT binary patch delta 9366 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 V&3k!xMA{2J?LDqtpHSV)^uO-i5HA1# delta 8536 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 MI$bM2p|GduZ(ClJO8@`> diff --git a/src/kernel/acpi.c b/src/kernel/acpi.c index e5a6e4d..0696e58 100644 --- a/src/kernel/acpi.c +++ b/src/kernel/acpi.c @@ -1,13 +1,13 @@ #include #include #include -#include #include -#include +#include #include #include #include #include +#include //finding rsdp diff --git a/src/kernel/int.c b/src/kernel/int.c index 34f1c78..5901a90 100644 --- a/src/kernel/int.c +++ b/src/kernel/int.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -44,7 +44,6 @@ .present = 1 \ }) -#define GDT_ADDR (uint64_t)PHYS_TO_VIRT(0x7e22) #define IOAPICR_VER 1 @@ -74,18 +73,10 @@ struct idt_reg { uint64_t offset; } __attribute__((packed)); -struct gdt_reg { - uint16_t size; - uint64_t offset; -} __attribute__((packed)); - struct idt_descriptor *idt; static struct idt_reg idtr; -struct gdt_reg gdtr = { - .size = 0x17, - .offset = GDT_ADDR -}; + lapic_t lapic; //would make this static but it's needed by timer.c @@ -211,7 +202,7 @@ void init_exceptions() { //void new_idt -void init_interrupts() { +void init_interrupts_bsp() { init_madt(); debug_madt(); lapic = get_lapic(); @@ -232,9 +223,7 @@ void init_interrupts() { bzero(&isr_bitmap, sizeof(isr_bitmap)); isr_bitmap[0] = (((uint64_t)1 << 32) - 1); - //set idt and new gdt - asm("lgdt [%0]\n" - "lidt [%1]\n":: "m"(gdtr), "m"(idtr)); + asm("lidt [%0]\n"::"m"(idtr)); //Spurrious Interrupt (permanent, required for APIC) @@ -251,3 +240,6 @@ void init_interrupts() { init_timer(); asm("sti\n"); } + +void smp_init_interrupts() { +} diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index d550e37..11df1f1 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -1,12 +1,12 @@ #include #include -#include +#include #include #include #include #include #include -#include +#include #include #include #include @@ -19,31 +19,36 @@ //testing headers #include - -void multicore_main() { - printf("\nKernal started\n"); - asm("cli\nhlt"); +void kmain() { + PANIC(KERNEL_PANIC_KERNEL_RETURNED); } -void main() { -#ifndef SCREEN_OUTPUT - if(init_serial(COM1)) printf("\nKernal started on CPU 1!\n"); -#endif +void smp_kinit() { + printf("\nKernal started on core\n"); //TODO get lapic working, then print core number + kmain(); +} + +//TODO move to global constructors +void kernel_init() { + size_t pmap_size; + get_mem_capabilities(); - init_pmap(map_complete_physical()); + pmap_size = map_complete_physical(); + init_klog(); + init_pmap(pmap_size); + printf("\nKernal started on CPU 1!\n"); find_root_sdp(); debug_acpi(); - init_interrupts(); + init_interrupts_bsp(); randinit(); smp_boot(); fix_stack(); - unmap_lowmem(); - - PANIC(KERNEL_PANIC_KERNEL_RETURNED); + //unmap_lowmem(); + kmain(); } diff --git a/src/kernel/klog.c b/src/kernel/klog.c index 52444b1..c62c4d3 100644 --- a/src/kernel/klog.c +++ b/src/kernel/klog.c @@ -1,57 +1,104 @@ #include -#include #include #include -#include +#include #include #include +#include -//README -//this file has some temporary workarounds until I get further into development -//this isn't going to be the serial driver I end up keeping +//right now, this program is simply for debuging. +//Later in development, we will hook it up to a TTY, impliment FCS, etc #define VIDEO_BUFFER PHYS_TO_VIRT(0xb8000) #define MAX_LOOPBACK_ATTEMPTS 20 -//later we'll set it up for interrupting instead of polling -bool init_serial(uint16_t port) { - outb_wait(port + 1, 0x00); - outb_wait(port + 2, 0x00); - outb_wait(port + 3, 0x80); - outb_wait(port + 0, 0x01); //here - outb_wait(port + 1, 0x00); - outb_wait(port + 3, 0x03); - outb_wait(port + 2, 0xc7); - outb_wait(port + 4, 0x0b); - outb_wait(port + 4, 0x1e); +#define KLOG_COM1 0 +#define KLOG_COM2 1 +#define KLOG_COM3 2 +#define KLOG_COM4 3 +#define KLOG_SCREEN 4 + +static int debug_output = KLOG_SCREEN; + +#define SERIAL_THR 0 //transmitter holding buffer +#define SERIAL_RBR 1 //receiving holding buffer +#define SERIAL_DLL 0 //divisor latch low byte +#define SERIAL_DLH 1 //divisor latch high byte +#define SERIAL_FCR 2 +#define SERIAL_IIR 2 +#define SERIAL_LCR 3 +#define SERIAL_MCR 4 +#define SERIAL_LSR 5 +#define SERIAL_MSR 6 +#define SERIAL_SR 7 + +#define COM1 0x3f8 +#define COM2 0x2f8 +#define COM3 0x3e8 +#define COM4 0x2e8 + +uint16_t serial_ports[4] = {COM1, COM2, COM3, COM4}; + +/** +enum com_ports { + COM1 = 0x3f8, + COM2 = 0x2f8, + COM3 = 0x3e8, + COM4 = 0x2e8 +}; +**/ - //we shouldn't accept this as a loopback success. - //I'm making an exception because my dell desktop has a faulty serial port - //that requires some extra effort. +static bool detect_serial(uint16_t port) { + outb(port + SERIAL_FCR, 0xe7); + outb(port + SERIAL_SR, 0xba); + if((inb(port + SERIAL_IIR) & (1 << 6)) && (inb(port + SERIAL_SR) == 0xba)) { + outb_wait(port + 1, 0x00); + outb_wait(port + 2, 0x00); + outb_wait(port + 3, 0x80); + outb_wait(port + 0, 0x01); + outb_wait(port + 1, 0x00); + outb_wait(port + 3, 0x03); + outb_wait(port + 2, 0xc7); + outb_wait(port + 4, 0x0b); + outb_wait(port + 4, 0x1e); - uint8_t loopback_byte; - for(int attempts = 0; attempts < MAX_LOOPBACK_ATTEMPTS; attempts++) { - outb_wait(port + 0, 0xae); // test char - loopback_byte = inb(port); - if(loopback_byte == 0xae) break; - } - if(loopback_byte != 0xae) { - //I'm sorry if these next few lines give you a stroke. They gave me one. + uint8_t loopback_byte; + for(int attempts = 0; attempts < MAX_LOOPBACK_ATTEMPTS; attempts++) { + outb_wait(port + 0, 0xae); + loopback_byte = inb(port); + if(loopback_byte == 0xae) break; + } + + if(loopback_byte != 0xae) { + //you better delete this once you get tty drivers working... + int a = 0 / 0; + } - //My old Dell test desktop has disfunctional serial hardware that only works after a reboot. - //Seeing we don't have ACPI set up yet, we can't reboot without crashing. - //IM GOING TO REMOVE THIS ONCE I DEVELOP THE "REAL" SERIAL DRIVER!!!! - asm("mov rax, 0\n" - "div rax\n"); - return false; + outb_wait(port + 4, 0x0f); + return true; } - - outb_wait(port + 4, 0x0f); - return true; + return false; } + +//this function is going to be teleted after ttys work. +//but, for now, if a serial port is detected, it'll set debug_output to 0-3 (com port #). +//debug_output == 4 is for screen output. +void init_klog() { + for(unsigned int p = 0; p < (sizeof(serial_ports) / sizeof(uint16_t)); p++) { + if(detect_serial(serial_ports[p])) { + debug_output = p; + return; + } + } + debug_output = KLOG_SCREEN; + _putchar('\n'); +} + + + void _putchar_serial(uint16_t port, char msg) { while(!(inb(port + 5) & 0x20)); //wait for transmit to be done outb_wait(port, msg); @@ -80,13 +127,10 @@ void next_line() { } void move_cursor(unsigned int x, unsigned int y) { - //yeah yeah yeah, it doens't test for overflows... I'm gonna delete this once i get serial working - //on my second desktop on_char = x; on_line = y; } -//until we get serial working on hp void _putchar_screen(char msg) { if(on_char >= 80) { next_line(); @@ -94,7 +138,55 @@ void _putchar_screen(char msg) { next_line(); return; } - char *screen_buffer = (void *)((uint64_t)VIDEO_BUFFER + ((on_line * 160) + (on_char * 2))); - *screen_buffer = msg; + *(char *)((uint64_t)VIDEO_BUFFER + ((on_line * 160) + (on_char * 2))) = msg; on_char++; } + + + +void _putchar(char character) { + if(debug_output < (sizeof(serial_ports) / sizeof(uint16_t))) { + _putchar_serial(serial_ports[debug_output], character); + } + else { + _putchar_screen(character); + } +} + + + + +/** + * Set the value "0xE7" to the FCR to test the status of the FIFO flags. +Read the value of the IIR to test for what flags actually got set. +If Bit 6 is set Then + If Bit 7 is set Then + If Bit 5 is set Then + UART is 16750 (64 bit fifo) + Else + UART is 16550A (idk why this matters, 16 bit fifo) + End If + Else + UART is 16550 (16 bit fifo) + End If +Else you know the chip doesn't use FIFO, so we need to check the scratch register + Set some arbitrary value like 0x2A to the Scratch Register. + If the arbitrary value comes back identical + UART is 16450 (idk why this matters, 1 byte at a time) + Else + UART is 8250 (one byte at a time) + End If +End If + +#define UART_16750 0 +#define UART_16550A 1 +#define UART_16550 2 +#define UART_16450 3 +#define UART_8250 4 + +#define KLOG_COM1 0 +#define KLOG_COM2 1 +#define KLOG_COM3 2 +#define KLOG_COM4 3 +#define KLOG_SCREEN 4 * 5 // 5 leaves enough space for com ports +**/ diff --git a/src/kernel/madt.c b/src/kernel/madt.c index 62e0535..adeb547 100644 --- a/src/kernel/madt.c +++ b/src/kernel/madt.c @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/kernel/page.c b/src/kernel/page.c index 734194c..3f6c4a8 100644 --- a/src/kernel/page.c +++ b/src/kernel/page.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/kernel/panic.c b/src/kernel/panic.c index 82a761f..d17c185 100644 --- a/src/kernel/panic.c +++ b/src/kernel/panic.c @@ -1,12 +1,15 @@ #include #include #include -#include -#include +#include +#include #include +#include + +static uint8_t panic_lock = 0; void panic(int reason, void *eframe_p, struct registers *regs) { // will fill with debugging info latter - + lock(&panic_lock); #ifdef EASTEREGG_BLOATWARE printf("\nKernel PANIC!!!!!!!\n"); @@ -49,6 +52,9 @@ void panic(int reason, void *eframe_p, struct registers *regs) { // will fill wi break; case KERNEL_PANIC_HPET_REQUIRED: printf("\nHPET is required. \nIf you get this error, let know;\nif enough people share this issue, I'll impliment PIT usage.\n"); + case KERNEL_PANIC_SMP_FAILED: + printf("\nNot all cores booted successfully (see text before panic).\n"); + break; default: printf("\nUnknown panic code %i\n.", reason); break; diff --git a/src/kernel/printf.c b/src/kernel/printf.c index 8267755..b496bce 100644 --- a/src/kernel/printf.c +++ b/src/kernel/printf.c @@ -33,10 +33,11 @@ #include #include + #include "printf.h" //this is my own ugly library -#include +#include //and my options /** @@ -161,12 +162,7 @@ static inline void _out_char(char character, void* buffer, size_t idx, size_t ma { (void)buffer; (void)idx; (void)maxlen; if (character) { -#ifdef SCREEN_OUTPUT - _putchar_screen(character); -#else - _putchar_serial(COM1, character); // later we should figure out a way to not specifify exclusively com1 -#endif - + _putchar(character); } } @@ -874,17 +870,24 @@ static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const /////////////////////////////////////////////////////////////////////////////// +#include +static uint8_t printf_lock = 0; int printf_(const char* format, ...) { + //BRETT modification + lock(&printf_lock); va_list va; va_start(va, format); char buffer[1]; const int ret = _vsnprintf(_out_char, buffer, (size_t)-1, format, va); va_end(va); + unlock(&printf_lock); return ret; } +/////////////////////////////////////////////////////////////////////////////// + int sprintf_(char* buffer, const char* format, ...) { diff --git a/src/kernel/smp.c b/src/kernel/smp.c index 5796ab9..9714c91 100644 --- a/src/kernel/smp.c +++ b/src/kernel/smp.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -7,6 +7,7 @@ #include #include #include +#include #define LAPIC_ICR_LOW 192 #define LAPIC_ICR_HIGH 196 @@ -16,6 +17,7 @@ extern char __load_start_smp_bootloader, __load_stop_smp_bootloader; extern uint8_t *smp_bootstrap_corecount; extern uint8_t smp_bootstrap_bsp; extern uint64_t *smp_bootstrap_stackarray; +extern char final_gdt_descriptor; struct icr_reg { uint8_t vector; @@ -30,22 +32,30 @@ struct icr_reg { unsigned int reserved_2:12; }__attribute__((packed)); -//1: get bsp number 2 -//2: get list of lapics 3 -//3: copy code 1 -//4: - static inline void write_icr(uint8_t dest, uint32_t message) { lapic[LAPIC_ICR_HIGH] = (uint32_t)dest << 24; lapic[LAPIC_ICR_LOW] = message; } +struct gdt_descriptor { + uint16_t size; + void *offset; +} __attribute__((packed)); + +static struct gdt_descriptor gdtr; + void smp_boot() { - uint8_t cores_active = 1; //TODO change in asm + uint8_t cores_active = 1; struct cores_info cores; struct icr_reg icr; get_coreinfo(&cores); + if(cores.corecount == 1) { + asm("sgdt [%0]"::"m"(gdtr)); + gdtr.offset = PHYS_TO_VIRT(gdtr.offset); + asm("lgdt [%0]"::"m"(gdtr)); + return; + } bzero(&icr, sizeof(icr)); void **core_stacks = malloc(sizeof(void *) * (cores.corecount - 1)); @@ -57,9 +67,7 @@ void smp_boot() { &__load_stop_smp_bootloader - &__load_start_smp_bootloader); smp_bootstrap_corecount = &cores_active; smp_bootstrap_bsp = cores.bsp; - smp_bootstrap_stackarray = (uint64_t)core_stacks; - - + smp_bootstrap_stackarray = (void *)core_stacks; icr.deliv_mode = 0b101; icr.dest_shorthand = 0b11; @@ -74,10 +82,9 @@ void smp_boot() { if(cores_active != cores.corecount) write_icr(0, *(uint32_t *)&icr); usleep(200); if(cores_active != cores.corecount) { - printf("NOT ALL CORES ONLINE\n"); - asm("cli\nhlt"); - } - else { - printf("%i!!!!!!\n", cores_active); + printf("Only %i cores online (expected %i)\n", cores_active, cores.corecount); //maybe add a panic + PANIC(KERNEL_PANIC_SMP_FAILED); } + printf("%i \n", cores_active); + //asm("lgdt [%0]\n"::"r"(PHYS_TO_VIRT(&final_gdt_descriptor))); TODO NOW } diff --git a/src/kernel/smp_trampoline.asm b/src/kernel/smp_trampoline.asm index 15b85e2..78303a3 100644 --- a/src/kernel/smp_trampoline.asm +++ b/src/kernel/smp_trampoline.asm @@ -1,13 +1,19 @@ global smp_bootstrap_stackarray global smp_bootstrap_bsp global smp_bootstrap_corecount +global final_gdt_descriptor -extern multicore_main +extern smp_kinit +extern _pmem_vaddr [bits 16] smp_trampoline: cli +in al, 0x92 +or al, 2 +out 0x92, al + xor ax, ax mov ds, ax lgdt [.gdt_descriptor_p] @@ -15,12 +21,11 @@ mov eax, cr0 or eax, 0x1 mov cr0, eax ; now in long mode -jmp 0x8:.smp_protected +jmp 0x8:smp_protected ;________________________________________________________________________________________ -;TODO find how to use old gdt .gdt_start_p: ; we need to start with a null gdt dd 0 dd 0 @@ -52,9 +57,9 @@ SMP_PROTECTED_DATA_SEGMENT equ .gdt_data_p - .gdt_start_p ;________________________________________________________________________________________ -.smp_protected: +smp_protected: -[bits 32] +bits 32 mov ax, SMP_PROTECTED_DATA_SEGMENT mov ds, ax mov ss, ax @@ -62,10 +67,8 @@ mov es, ax mov fs, ax mov gs, ax -lgdt [.gdt_descriptor_l] - -mov eax, 0x10000 ;TODO clarify _why_ this is a thing +mov eax, 0x10000 mov cr3, eax ;setting up misc features @@ -78,13 +81,15 @@ mov cr4, eax ;set NX and LME mov eax, 0x80000001 cpuid -and edx, 1 << 20 -shr edx, 9 +mov ebx, edx +and ebx, 1 << 20 +shr ebx, 9 mov ecx, 0xc0000080 rdmsr -or eax, 1 << 8 | 1 << 11 -or eax, edx +or eax, 1 << 8 +fuckyou: +or eax, ebx wrmsr @@ -94,14 +99,16 @@ or eax, 1 << 31 | 1 << 0; and ax, ~(1 << 2) mov cr0, eax +lgdt [final_gdt_descriptor] -jmp SMP_LONG_CODE_SEGMENT:.counter + +jmp SMP_LONG_CODE_SEGMENT:smp_longsetup ;________________________________________________________________________________________ -[bits 64] -;TODO do we really need all this? -.gdt_start_l: +bits 64 +final_gdt: +.start: ;and now we set up a temporary GDT creating a 1:1 mapping dw 0xffff dw 0 @@ -111,7 +118,7 @@ db 1 db 0 ;now for the code GDT: -.gdt_code_l: +.code: dw 0 ; segment limit 15:00 (I don't think this matters in 64 bit mode!) dw 0 ; base address 15:00 db 0 ; base address 23:16 @@ -119,7 +126,7 @@ db 10011010b db 00100000b db 0 -.gdt_data_l: +.data: dw 0 dw 0 db 0 @@ -127,17 +134,18 @@ db 10010010b db 00100000b db 0 -.gdt_end_l: ; later calculates offset in defs below +.end: ; later calculates offset in defs below -.gdt_descriptor_l: - dw .gdt_end_l - .gdt_start_l - 1 -dq .gdt_start_l +final_gdt_descriptor: + dw final_gdt.end - final_gdt.start - 1 +.offset: +dq final_gdt.start -SMP_LONG_CODE_SEGMENT equ .gdt_code_l - .gdt_start_l -SMP_LONG_DATA_SEGMENT equ .gdt_data_l - .gdt_start_l +SMP_LONG_CODE_SEGMENT equ final_gdt.code - final_gdt.start +SMP_LONG_DATA_SEGMENT equ final_gdt.data - final_gdt.start -.counter: +smp_longsetup: mov eax, 1 cpuid shr ebx, 24 @@ -146,19 +154,29 @@ jl .apic_below_bsp sub bl, 1 .apic_below_bsp: - mov rax, QWORD [smp_bootstrap_stackarray] -debug: mov rsp, QWORD [rax + rbx * 8] -mov rax, [smp_bootstrap_corecount] -inc BYTE [rax] +mov rax, 0xffff800000000000 +;or QWORD [final_gdt_descriptor.offset], rax +;lgdt [final_gdt_descriptor] -mov rax, multicore_main +.inc_corecounter: + + +mov rax, [smp_bootstrap_corecount] +lock inc BYTE [rax] + + + +smp_enter_kernel: +mov rax, smp_kinit jmp rax align 8 smp_bootstrap_stackarray: dq 0 +smp_lock: dq 0 smp_bootstrap_bsp: db 0 smp_bootstrap_corecount: db 0 + times 512 - ($ - $$) db 0 diff --git a/src/kernel/timer.c b/src/kernel/timer.c index aed42ba..295abe2 100644 --- a/src/kernel/timer.c +++ b/src/kernel/timer.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -204,10 +204,8 @@ void init_timer() { uint32_t unused, cpuid_reg; __get_cpuid(0x80000007, &unused, &unused, &unused, &cpuid_reg); - //goto debug_tsc; if((cpuid_reg >> 8) & 1) { printf("Detected invariant TSC\n"); - //.1 second to calibrate, TODO do we need to check if the register is big enough? uint64_t hpet_ticks = (100000000000000 * (1 / (double)hpet_info.hpet_period)) + 0.5; printf("Starting TSC calibration...\n"); uint64_t volatile start_tsc, end_tsc; @@ -274,7 +272,7 @@ void init_timer() { apic_div = (((apic_div & 0b100) << 1) | (apic_div * 0b1011)); } - lapic_timer_lvt.vector = SPURRIOUS_VECTOR; //TODO CHANGE ME + lapic_timer_lvt.vector = SPURRIOUS_VECTOR; lapic_timer_lvt.timer_mode = LAPIC_TIMER_MODE_PERIODIC; lapic_timer_lvt.delivery_status = 0; lapic_timer_lvt.mask = 1; diff --git a/src/link.ld b/src/link.ld index 9d707b4..35c404a 100644 --- a/src/link.ld +++ b/src/link.ld @@ -1,6 +1,7 @@ SEARCH_DIR(objects) -_kernel_s1_loc = 0xffffffff80000000; +_txt_vaddr = 0xffffffff80000000; +_pmem_vaddr = 0xffff800000000000; _meminfo = 0x7000; _vbe_infoblock = 0x500; @@ -15,7 +16,7 @@ SECTIONS { smp_trampoline.o(.text) } - kernel _kernel_s1_loc : + kernel _txt_vaddr : AT (0 + SIZEOF(smp_bootloader) + SIZEOF(bootloader)) { EXCLUDE_FILE (*bootloader.o *smp_trampoline.o) *(.text .data .bss .rodata .comment .eh_frame) diff --git a/src/makefile b/src/makefile index 83876c2..03984ec 100644 --- a/src/makefile +++ b/src/makefile @@ -44,20 +44,6 @@ all: $(ASM_OBJFILES) $(C_OBJFILES) $(MISC_OBJFILES) bootloader.o smp_trampoline. isv.o: kernel/isv.c $(CC) $(CFLAGS) $(INC) -mgeneral-regs-only -MMD -MP -c kernel/isv.c -o objects/$@ -printf.o: kernel/printf.c -ifdef screen - $(CC) $(CFLAGS) $(INC) -MMD -MP -DSCREEN_OUTPUT -c kernel/printf.c -o objects/$@ -else - $(CC) $(CFLAGS) $(INC) -MMD -MP -c kernel/printf.c -o objects/$@ -endif - -kernel.o: kernel/kernel.c -ifdef screen - $(CC) $(CFLAGS) $(INC) -MMD -MP -DSCREEN_OUTPUT -c kernel/kernel.c -o objects/$@ -else - $(CC) $(CFLAGS) $(INC) -MMD -MP -c kernel/kernel.c -o objects/$@ -endif - %.o: kernel/%.c makefile $(CC) $(CFLAGS) $(INC) -MMD -MP -c $< -o objects/$@