summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-08 12:43:53 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-08 12:43:53 +0200
commit1230afc0aaef07b03f09d3725f459df07b982de8 (patch)
treece0f127319285a010547bfb3695a9a634f778684 /src
parent70266efd6fbe9a12a19cbec451eec536266ffb5e (diff)
downloadabaos-1230afc0aaef07b03f09d3725f459df07b982de8.tar.gz
abaos-1230afc0aaef07b03f09d3725f459df07b982de8.tar.bz2
added dedicated kernel entry to avoid address reordering under compiler optimization
affect the entry poin 0x8800 of kernel_main (now kernel_entry)
Diffstat (limited to 'src')
-rw-r--r--src/Makefile8
-rw-r--r--src/README1
-rw-r--r--src/drivers/video/vga.c2
-rw-r--r--src/kernel/entry.c16
4 files changed, 24 insertions, 3 deletions
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( );
+}