From 1230afc0aaef07b03f09d3725f459df07b982de8 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 8 Jul 2017 12:43:53 +0200 Subject: added dedicated kernel entry to avoid address reordering under compiler optimization affect the entry poin 0x8800 of kernel_main (now kernel_entry) --- doc/LINKS.TODO | 3 +++ src/Makefile | 8 ++++++-- src/README | 1 + src/drivers/video/vga.c | 2 +- src/kernel/entry.c | 16 ++++++++++++++++ 5 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/kernel/entry.c diff --git a/doc/LINKS.TODO b/doc/LINKS.TODO index 9c26e69..092c620 100644 --- a/doc/LINKS.TODO +++ b/doc/LINKS.TODO @@ -96,3 +96,6 @@ http://bos.asmhackers.net/docs/vga_without_bios/ GUI: https://github.com/vurtun/nuklear http://webserver2.tecgraf.puc-rio.br/iup/ + +linker: +https://stackoverflow.com/questions/26143123/how-do-i-ensure-the-entry-function-at-a-fixed-address-of-bare-metal-arm diff --git a/src/Makefile b/src/Makefile index 876376d..62909a1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,6 @@ CC := gcc INCLUDES = -I. -Ilibc -Ihardware -Idrivers -Idrivers/hdi -Idrivers/hdi/ps2 -Idrivers/video -Ikernel -Igui -CFLAGS := -std=c99 -m32 -ffreestanding -O0 -g -Wall -Werror $(INCLUDES) +CFLAGS := -std=c99 -m32 -ffreestanding -O0 -g -Werror $(INCLUDES) LD := ld NASMFLAGS := -f elf32 NASM := nasm @@ -33,8 +33,9 @@ kernel.bin: kernel.elf kernel.sym: kernel.elf $(OBJCOPY) --only-keep-debug kernel.elf kernel.sym -kernel.elf: kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o kernel/memorymanagement.o kernel/tasks.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/ps2/keyboard.o drivers/hdi/ps2/mouse.o drivers/video/vga.o drivers/video/vga_font.o gui/widget.o gui/composite_widget.o gui/window.o gui/desktop.o gui/text_widget.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o +kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o kernel/memorymanagement.o kernel/tasks.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/ps2/keyboard.o drivers/hdi/ps2/mouse.o drivers/video/vga.o drivers/video/vga_font.o gui/widget.o gui/composite_widget.o gui/window.o gui/desktop.o gui/text_widget.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o $(LD) -o kernel.elf -N -n -Ttext 0x8800 --oformat elf32-i386 \ + kernel/entry.o \ kernel/kernel.o kernel/kernel_asm.o \ kernel/console.o kernel/vgatext.o kernel/serial.o \ kernel/memorymanagement.o kernel/tasks.o \ @@ -51,6 +52,9 @@ kernel.elf: kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext. magic.bin: boot/magic.asm $(NASM) boot/magic.asm -DMAGIC='"$(MAGIC)"' -f bin -o magic.bin +kernel/entry.o: kernel/entry.c + $(CC) $(CFLAGS) -c -o kernel/entry.o kernel/entry.c + kernel/kernel.o: kernel/kernel.c $(CC) $(CFLAGS) -c -o kernel/kernel.o kernel/kernel.c diff --git a/src/README b/src/README index b529282..9269936 100644 --- a/src/README +++ b/src/README @@ -22,6 +22,7 @@ kernel Kernel main and utility routines like early consoles. +* entry.c - the kernel entry from the bootloader * kernel.c - kernel helper functions * console.c - the kernel console, can use VGA or serial port for now * vga.c - VGA basic output routines for early kernel output diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index 146194e..0cd623d 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -210,7 +210,7 @@ static uint8_t *get_frame_buffer_segment( vga_t *vga ) { port8_write( &vga->graphics_controller_index_port, 0x06 ); uint8_t segment_no = ( port8_read( &vga->graphics_controller_data_port ) >> 2 ) & 0x03; - uint8_t *segment; + uint8_t *segment = 0x0; switch( segment_no ) { case 0: // A0000h - BFFFFh, 128k diff --git a/src/kernel/entry.c b/src/kernel/entry.c new file mode 100644 index 0000000..d0e75a7 --- /dev/null +++ b/src/kernel/entry.c @@ -0,0 +1,16 @@ +#include "kernel.h" + +// must be first entry in kernel.bin (0x8800) as stage 2 of +// the boot loader expects the entry point to b here! +// +// compilers (at least gcc) mess with the order of functions when +// compiling with optimization levels, so kernel_main ends up somewhere +// in the first compilation unit. I didn't find an elegand way (but for +// an ld script with custom section and some compiler specific attributes +// how to solve this issue). This solution here is sort of a nice +// workaround working no matter what the compilers try to do (of course +// till we get optimization across compilation units that is) +void kernel_entry( void ) +{ + kernel_main( ); +} -- cgit v1.2.3-54-g00ecf