From e818cdf6601960a7b158500b4d02d76e358f6e65 Mon Sep 17 00:00:00 2001 From: Morten Delenk Date: Sat, 18 Jun 2016 13:16:15 +0200 Subject: [PATCH] x86_64 now loads --- buildcrosscompiler.sh | 13 +++++++-- kernel.settings | 2 +- kernel/Makefile | 2 +- kernel/hal/x86/include/idt.hpp | 2 +- kernel/hal/x86_64/Makefile | 4 +-- kernel/hal/x86_64/asm/snippets.S | 14 +++++----- kernel/hal/x86_64/init/init.cpp | 21 ++++++++------- kernel/kernel-x86_64.ld | 2 +- settings | 44 +++++++++++++++++++++++++++++++ test.elf | Bin 18720 -> 6298200 bytes user/x86/syscall.S | 2 +- 11 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 settings diff --git a/buildcrosscompiler.sh b/buildcrosscompiler.sh index b518946..dc2985b 100644 --- a/buildcrosscompiler.sh +++ b/buildcrosscompiler.sh @@ -21,13 +21,21 @@ function buildscript() { make install-target-libgcc 2>&1 > /dev/null cd .. rm -rf build-gcc + echo "[$(date +%c)] Building gdb for $1." | tee -a buildlog + mkdir build-gdb + cd build-gdb + ../gdb-7.11/configure --prefix=$CROSSPATH --target=$1 --disable-nls 2>&1 > /dev/null + make -j8 2>&1 > /dev/null + make install 2>&1 > /dev/null + cd .. + rm -rf build-gdb echo "[$(date +%c)] Cross-compiler for $1 was built." | tee -a buildlog } tempdir=$(mktemp -d) cd $tempdir echo "Temponary files are in $tempdir. Build log can be found under $tempdir/buildlog" | tee -a buildlog -echo "Downloading GCC, Binutils, MPC, MPFR and GMP" | tee -a buildlog -wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2 ftp://ftp.gnu.org/gnu/binutils/binutils-2.26.tar.bz2 ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.xz ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.0.tar.xz http://isl.gforge.inria.fr/isl-0.16.tar.xz http://www.bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz +echo "Downloading GCC, Binutils, MPC, MPFR, GMP, isl, cloog and gdb" | tee -a buildlog +wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2 ftp://ftp.gnu.org/gnu/binutils/binutils-2.26.tar.bz2 ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.xz ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.0.tar.xz http://isl.gforge.inria.fr/isl-0.16.tar.xz http://www.bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz http://ftp.gnu.org/gnu/gdb/gdb-7.11.tar.xz echo "Untaring..." 2>&1 | tee -a buildlog tar -xf gcc-6.1.0.tar.bz2 tar -xf binutils-2.26.tar.bz2 @@ -43,6 +51,7 @@ mv isl-0.16 isl tar -xf ../cloog-0.18.4.tar.gz mv cloog-0.18.4 cloog cd .. +tar -xf gdb-7.11.tar.xz echo "Preperation done. Beginning the compilation now." 2>&1 | tee -a buildlog buildscript i686-elf #x86 port buildscript arm-none-eabi #Little endian ARM ports (GBA (v4), DS(i) (v4, v5), 3DS/2DS (v4, v5, v6), pi (v6), pi2 (v7)) diff --git a/kernel.settings b/kernel.settings index b5291f4..ec7cbfe 100644 --- a/kernel.settings +++ b/kernel.settings @@ -1,4 +1,4 @@ -arch = x86 +arch = x86_64 #MODE = debug MODE = release # enables optimization diff --git a/kernel/Makefile b/kernel/Makefile index 7eb7436..45ffa7f 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -4,7 +4,7 @@ KERNSRCS = $(shell find kernel -name '*.cpp' -o -name '*.c') OBJS = $(addsuffix .o,$(basename $(SRCS))) OBJS += $(addsuffix .o,$(basename $(KERNSRCS))) LD = $(PREFIX)g++ -LDFLAGS = -nostdlib -nodefaultlibs -nostdlib -fno-builtin $(ARCHFLAGS) -T kernel-$(arch).ld +LDFLAGS = -nostdlib -nodefaultlibs -nostdlib -fno-builtin $(ARCHFLAGS) -T kernel-$(arch).ld -z max-page-size=0x1000 -lgcc all: hal kernel $(LD) $(LDFLAGS) -o mtgos $(OBJS) diff --git a/kernel/hal/x86/include/idt.hpp b/kernel/hal/x86/include/idt.hpp index 0f60a15..621796f 100644 --- a/kernel/hal/x86/include/idt.hpp +++ b/kernel/hal/x86/include/idt.hpp @@ -9,7 +9,7 @@ #define IDT_RING_3 0x60 #define IDT_USED 0x80 #define SEG_KERNEL 0x08 -#define SEG_USER 0x18 /*NEVER USE!!*/ +#define SEG_USER 0x08 /*NEVER USE!!*/ #define SEG_DBL_FAULT 0x28 /*Only use for double fault handler!!*/ extern "C" { void loadIDT(void * ptr); diff --git a/kernel/hal/x86_64/Makefile b/kernel/hal/x86_64/Makefile index a6eda68..4462091 100644 --- a/kernel/hal/x86_64/Makefile +++ b/kernel/hal/x86_64/Makefile @@ -5,8 +5,8 @@ OBJS = $(addsuffix .o,$(basename $(SRCS))) CPP = $(PREFIX)g++ CC = $(PREFIX)gcc ASFLAGS = -m64 -CFLAGS = -m64 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -CPPFLAGS = -m64 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder +CFLAGS = -m64 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -ffreestanding -mcmodel=large -mno-red-zone -mno-mmx -mno-sse -mno-sse2 +CPPFLAGS = -m64 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -ffreestanding -mcmodel=large -mno-red-zone -mno-mmx -mno-sse -mno-sse2 all: $(OBJS) diff --git a/kernel/hal/x86_64/asm/snippets.S b/kernel/hal/x86_64/asm/snippets.S index e7d2604..5006c20 100644 --- a/kernel/hal/x86_64/asm/snippets.S +++ b/kernel/hal/x86_64/asm/snippets.S @@ -1,7 +1,7 @@ .global loadGDT //void _stdcall loadGDT(struct gdtp* ptr); loadGDT: - mov 0x8(%rsp), %rax // Load argument + mov %rdi, %rax // Load argument lgdt (%rax) //GDT is loaded now mov $0x10, %ax @@ -11,21 +11,19 @@ loadGDT: mov %ax, %gs mov %ax, %ss mov $0x10, %rax -.code32 - ljmp $8, $.1 //Hacky hack -.code64 + //ljmp $8, $.1 //Hell, I don't care. FFS, there is not a single method to load a GDT in long mode. .1: ret .global loadIDT //void _stdcall loadIDT(struct idtp* ptr); loadIDT: - mov 0x8(%rsp), %rax + mov %rdi, %rax lidt (%rax) ret .global enterPaging //void _stdcall enterPaging(uint32** pd); enterPaging: - mov 0x8(%rsp), %rax + mov %rdi, %rax mov %rax, %cr3 mov %cr4, %rax or $0x10, %rax @@ -271,7 +269,7 @@ intr_stub 212 intr_stub 213 intr_stub 214 intr_stub 215 -intr_stub 216 +intr_stub 4216 intr_stub 217 intr_stub 218 intr_stub 219 @@ -343,7 +341,7 @@ intr_common_handler: mov $0x10, %ax mov %ax, %ds mov %ax, %es - push %rsp + mov %rsp, %rax call handleINT mov %rax, %rsp mov $8, %rcx diff --git a/kernel/hal/x86_64/init/init.cpp b/kernel/hal/x86_64/init/init.cpp index b09d366..52e4bb3 100644 --- a/kernel/hal/x86_64/init/init.cpp +++ b/kernel/hal/x86_64/init/init.cpp @@ -25,15 +25,21 @@ namespace MTGosHAL { new (&debug) Serial(); debug << "Hello debugger! This is MTGos v00r01\nThese logs are probably very long, so please redirect the output to a file.\n"; + debug << "Init Screen output\n"; + new (&out) Screen(ebx); + new (&err) Screen(ebx); + out << BG_color::BLACK << FG_color::WHITE << "Loading MTGos...\n"; + err << BG_color::BLACK << FG_color::RED; + debug << "Init GDT\n"; new (&gdt) GDT(); gdt.setEntry(0, 0, 0, 0); - gdt.setEntry(1, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_64_BIT | GDT_FLAG_CODESEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT); - gdt.setEntry(2, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_64_BIT | GDT_FLAG_DATASEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT); - gdt.setEntry(3, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_64_BIT | GDT_FLAG_CODESEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3); - gdt.setEntry(4, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_64_BIT | GDT_FLAG_DATASEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3); + gdt.setEntry(1, 0, 0, 0x298); + gdt.setEntry(2, 0, 0, 0x292); + gdt.setEntry(3, 0, 0, 0x2F8); + gdt.setEntry(4, 0, 0, 0x2F2); gdt.setEntry(5, (uint64_t)tasks.tss, sizeof(tasks.tss), GDT_FLAG_RING3 | GDT_FLAG_TSS | GDT_FLAG_PRESENT); - gdt.setEntry(6, 0, 0xfffff, GDT_FLAG_RING3 | GDT_FLAG_TSS | GDT_FLAG_PRESENT); + gdt.setEntry(6, 0, 0, GDT_FLAG_RING3 | GDT_FLAG_TSS | GDT_FLAG_PRESENT); gdt.apply(); debug << "Init IDT\n"; @@ -49,11 +55,6 @@ namespace MTGosHAL { debug << "Init MM\n"; new (&mm) PMM(ebx); - debug << "Init Screen output\n"; - new (&out) Screen(ebx); - new (&err) Screen(ebx); - out << BG_color::BLACK << FG_color::WHITE << "Loading MTGos...\n"; - err << BG_color::BLACK << FG_color::RED; debug << "Init Keyboard\n"; new (&in) Keyboard(); diff --git a/kernel/kernel-x86_64.ld b/kernel/kernel-x86_64.ld index 0b6209c..2bbe9a1 100644 --- a/kernel/kernel-x86_64.ld +++ b/kernel/kernel-x86_64.ld @@ -3,7 +3,7 @@ OUTPUT_FORMAT(elf32-i386) OUTPUT_ARCH(i386:x86-64) SECTIONS { - . = 0x100000; + . = 0x200000; kernel_start = .; .text : { *(multiboot) diff --git a/settings b/settings new file mode 100644 index 0000000..42bbe72 --- /dev/null +++ b/settings @@ -0,0 +1,44 @@ +# configuration file generated by Bochs +plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1 +config_interface: textconfig +display_library: x +memory: host=1024, guest=1024 +romimage: file="/usr/share/bochs/BIOS-bochs-latest" +vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest" +boot: floppy, disk +floppy_bootsig_check: disabled=0 +# no floppya +# no floppyb +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 +ata0-master: type=disk, path="/dev/sdc", mode=flat, cylinders=1024, heads=4, spt=63, model="Generic 1234", biosdetect=auto, translation=auto +ata0-slave: type=none +ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15 +ata1-master: type=none +ata1-slave: type=none +ata2: enabled=0 +ata3: enabled=0 +pci: enabled=1, chipset=i440fx +vga: extension=vbe, update_freq=5, realtime=1 +cpu: count=1, ips=4000000, model=corei7_haswell_4770, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0 +print_timestamps: enabled=0 +gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0 +port_e9_hack: enabled=0 +private_colormap: enabled=0 +clock: sync=none, time0=local, rtc_sync=0 +# no cmosimage +# no loader +log: - +logprefix: %t%e%d +debug: action=ignore +info: action=report +error: action=report +panic: action=ask +keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none +mouse: type=ps2, enabled=0, toggle=ctrl+mbutton +speaker: enabled=1, mode=system +parport1: enabled=1, file=none +parport2: enabled=0 +com1: enabled=1, mode=null +com2: enabled=0 +com3: enabled=0 +com4: enabled=0 diff --git a/test.elf b/test.elf index f2c6ab7b99f4febb99581869d5edd8e88336b952..35e002112d9e26fb1b82c3b0e251077f19e5f053 100755 GIT binary patch delta 13264 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 DF=ozl literal 18720 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 U69@08=6El567lEDMlq`Y0g+~<$^ZZW diff --git a/user/x86/syscall.S b/user/x86/syscall.S index d3ef6cf..d0d1ddb 100644 --- a/user/x86/syscall.S +++ b/user/x86/syscall.S @@ -33,7 +33,7 @@ screenout_clear: int $0x30 pop %ebx ret - + .global screenout_setcolor // void * screenout_setcolor(void* handle, uint32_t BG, uint32_t FG) screenout_setcolor: