From 8f0de18b37d93acb5b2746a1150d36c9ca581c50 Mon Sep 17 00:00:00 2001 From: Curle Date: Wed, 17 Jul 2019 15:08:47 +0100 Subject: [PATCH] Begin transition to UEFI. The current system of separating x86 and x86_64 is no longer feasible with UEFI implementation. UEFI must have its own entry point. To this end, some optimisations have been implemented in the ASM files. Everything related to setup has been removed, leaving only the IDT and GDT utility functions. The linker may be required for the other files, though. --- arch/i386/boot.s | 94 --------------------------------- arch/uefi/boot.s | 28 ++++++++++ arch/uefi/entry.c | 0 arch/{i386 => uefi}/linker.ld | 50 +++++++++--------- arch/{i386 => uefi}/make.config | 18 +++---- arch/{i386 => uefi}/sys_clock.c | 68 ++++++++++++------------ arch/{i386 => uefi}/tty.c | 0 7 files changed, 96 insertions(+), 162 deletions(-) delete mode 100755 arch/i386/boot.s create mode 100644 arch/uefi/boot.s create mode 100644 arch/uefi/entry.c rename arch/{i386 => uefi}/linker.ld (93%) mode change 100755 => 100644 rename arch/{i386 => uefi}/make.config (95%) mode change 100755 => 100644 rename arch/{i386 => uefi}/sys_clock.c (95%) mode change 100755 => 100644 rename arch/{i386 => uefi}/tty.c (100%) diff --git a/arch/i386/boot.s b/arch/i386/boot.s deleted file mode 100755 index 93820cd..0000000 --- a/arch/i386/boot.s +++ /dev/null @@ -1,94 +0,0 @@ -[BITS 32] ;... somehow. - -[GLOBAL start] -start: - mov esp, _sys_stack ; Stack pointer! - jmp stublet ; This has a purpse. I don't know what it is, but there is one. - -ALIGN 4 ; 4KB alignment, required by GRUB. -mboot: ; This is all magic, and all of it required for GRUB to see our stuff. - MULTIBOOT_ALIGN equ 1<<0 - MULTIBOOT_MEM equ 1<<1 - MULTIBOOT_AOUT equ 1<<16 - MULTIBOOT_MAGIC equ 0x1BADB002 - MULTIBOOT_FLAGS equ MULTIBOOT_ALIGN | MULTIBOOT_MEM | MULTIBOOT_AOUT - MULTIBOOT_CHECKSUM equ -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) - EXTERN code, bss, end - - dd MULTIBOOT_MAGIC - dd MULTIBOOT_FLAGS - dd MULTIBOOT_CHECKSUM - - dd mboot - dd code - dd bss - dd end - dd start - -stublet: ; Where the kernel stuff goes. - - ;===================================== - ;===Priority: 32 bit Protected Mode=== - ;===================================== - - cli ; Interrupts be gone! - - xor cx, cx ; CX - GP, useful here. -kbempty: - in al, 64h ; Read keyboard status - test al, 02h ; Check if the buffer is full - loopnz kbempty ; Wait until it is - mov al, 0d1h ; Prepare a message - out 64h, al ; And then send it to the keyboard (controller) -kbempty2: - in al, 64h ; Read the status again - test al, 02h ; Check if it's processed our message - loopnz kbempty2 ; And wait until it has - mov al, 0dfh ; Prepare a different message, telling it to enable A20 - out 60h, al ; Send the message - mov cx, 14h ; Restore the value of CX -wait_kb: ; Insinuate a 25uS delay to allow the processor to catch up - out 0edh, ax - loop wait_kb - - mov eax, cr0 ; Read the control register - or al, 1 ; Set bit 1: protected mode - mov cr0, eax ; Set the control register back - jmp $+2 ; Clear the queue - nop ; (jump straight to kernel) - nop - -;================================== -;===32-bit Protected Mode active=== -;================================== - ; Call the kernel - - EXTERN kernel_main - call kernel_main - jmp $ - -[GLOBAL load_gdt] -[EXTERN gp] -load_gdt: - lgdt [gp] ; Load the new GDT pointer - - mov ax, 0x10 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - jmp 0x08:flush -flush: - ret - -[GLOBAL idt_load] -[EXTERN idtp] -idt_load: - lidt [idtp] - ret - - -SECTION .bss - resb 8192 -_sys_stack: diff --git a/arch/uefi/boot.s b/arch/uefi/boot.s new file mode 100644 index 0000000..095bac0 --- /dev/null +++ b/arch/uefi/boot.s @@ -0,0 +1,28 @@ +[BITS 32] ;... somehow. + + +[GLOBAL load_gdt] +[EXTERN gp] +load_gdt: + lgdt [gp] + + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + jmp 0x08:flush ; Far jump and load the new CSD into the processor +flush: + ret + +[GLOBAL load_idt] +[EXTERN idtp] +load_idt: + lidt [idtp] + ret + + +SECTION .bss + resb 8192 +_sys_stack: diff --git a/arch/uefi/entry.c b/arch/uefi/entry.c new file mode 100644 index 0000000..e69de29 diff --git a/arch/i386/linker.ld b/arch/uefi/linker.ld old mode 100755 new mode 100644 similarity index 93% rename from arch/i386/linker.ld rename to arch/uefi/linker.ld index 2b7963a..c705f4a --- a/arch/i386/linker.ld +++ b/arch/uefi/linker.ld @@ -1,25 +1,25 @@ -OUTPUT_FORMAT("elf32-i386") -ENTRY(start) -phys = 0x00100000; -SECTIONS -{ - .text phys : AT(phys) { - code = .; - *(.text) - *(.rodata) - . = ALIGN(4096); - } - .data : AT(phys + (data - code)) - { - data = .; - *(.data) - . = ALIGN(4096); - } - .bss : AT(phys + (bss - code)) - { - bss = .; - *(.bss) - . = ALIGN(4096); - } - end = .; -} +OUTPUT_FORMAT("elf32-i386") +ENTRY(start) +phys = 0x00100000; +SECTIONS +{ + .text phys : AT(phys) { + code = .; + *(.text) + *(.rodata) + . = ALIGN(4096); + } + .data : AT(phys + (data - code)) + { + data = .; + *(.data) + . = ALIGN(4096); + } + .bss : AT(phys + (bss - code)) + { + bss = .; + *(.bss) + . = ALIGN(4096); + } + end = .; +} diff --git a/arch/i386/make.config b/arch/uefi/make.config old mode 100755 new mode 100644 similarity index 95% rename from arch/i386/make.config rename to arch/uefi/make.config index 3a2220f..70359ae --- a/arch/i386/make.config +++ b/arch/uefi/make.config @@ -1,9 +1,9 @@ -KERNEL_ARCH_CFLAGS= -KERNEL_ARCH_CPPFLAGS= -KERNEL_ARCH_LDFLAGS= -KERNEL_ARCH_LIBS= - -KERNEL_ARCH_OBJS= \ -$(ARCHDIR)/boot.o \ -$(ARCHDIR)/sys_clock.o \ -$(ARCHDIR)/tty.o +KERNEL_ARCH_CFLAGS= +KERNEL_ARCH_CPPFLAGS= +KERNEL_ARCH_LDFLAGS= +KERNEL_ARCH_LIBS= + +KERNEL_ARCH_OBJS= \ +$(ARCHDIR)/boot.o \ +$(ARCHDIR)/sys_clock.o \ +$(ARCHDIR)/tty.o diff --git a/arch/i386/sys_clock.c b/arch/uefi/sys_clock.c old mode 100755 new mode 100644 similarity index 95% rename from arch/i386/sys_clock.c rename to arch/uefi/sys_clock.c index df0cb8d..cb26901 --- a/arch/i386/sys_clock.c +++ b/arch/uefi/sys_clock.c @@ -1,35 +1,35 @@ -/************************ - *** Team Kitty, 2019 *** - *** Sync *** - ***********************/ - -/* This file provides an interface to - * the hardware timer / RTC. Not much - * more to be said about it. */ - -#include -#include -#include -#include - -size_t timer_ticks = 0; -size_t flag = 0; -void timer_handler(struct int_frame* r) { - gdb_end(); - timer_ticks++; - - if(timer_ticks % 18 == 0) { - if(++flag % 2 == 0) { - serial_print(0x3F8, "Tick."); - } else { - serial_print(0x3F8, "Tock."); - } - } - - if(timer_ticks > 18) - timer_ticks = 0; -} - -void timer_install() { - irq_install_handler(0, &timer_handler); +/************************ + *** Team Kitty, 2019 *** + *** Sync *** + ***********************/ + +/* This file provides an interface to + * the hardware timer / RTC. Not much + * more to be said about it. */ + +#include +#include +#include +#include + +size_t timer_ticks = 0; +size_t flag = 0; +void timer_handler(struct int_frame* r) { + gdb_end(); + timer_ticks++; + + if(timer_ticks % 18 == 0) { + if(++flag % 2 == 0) { + serial_print(0x3F8, "Tick."); + } else { + serial_print(0x3F8, "Tock."); + } + } + + if(timer_ticks > 18) + timer_ticks = 0; +} + +void timer_install() { + irq_install_handler(0, &timer_handler); } \ No newline at end of file diff --git a/arch/i386/tty.c b/arch/uefi/tty.c similarity index 100% rename from arch/i386/tty.c rename to arch/uefi/tty.c