So I figured that grub2 can do some fancy stuff about loading modules.

There we go! We will keep x86 and load x64 as a module and then jump to x64 from x86!!
This commit is contained in:
HyperAssembler 2015-01-29 22:42:30 -08:00
parent 41c2d8ca2a
commit 7cc18fac3d
36 changed files with 94 additions and 84 deletions

View File

@ -1,55 +0,0 @@
ASM = nasm
CC = gcc
LD = ld
C_SRC_PATH = x86/src/c
ASM_SRC_PATH = x86/src/asm
OUTPUT_DIR = temp
C_FLAGS_32 = -m32 -c -fno-builtin -masm=intel -Wall -Wextra
ASM_FLAGS_32 = -f elf32 -I $(ASM_SRC_PATH)/
LD_FLAGS_32 = -m elf_i386
LD_SCRIPT = build/link.ld
GRUB_CFG = build/grub.cfg
#C source code
C_FILES = $(wildcard $(C_SRC_PATH)/*.c)
#ASM source code
ASM_FILES = $(wildcard $(ASM_SRC_PATH)/*.asm)
#bin files
KERNEL_BIN = $(OUTPUT_DIR)/kernel.bin
#Object files
C_OBJ_FILES = $(addprefix $(OUTPUT_DIR)/,$(notdir $(C_FILES:.c=.oc)))
ASM_OBJ_FILES = $(addprefix $(OUTPUT_DIR)/,$(notdir $(ASM_FILES:.asm=.oasm)))
ALL_OBJ_FILES = $(C_OBJ_FILES) $(ASM_OBJ_FILES)
all : init compile link buildiso clean
init:
sudo mkdir $(OUTPUT_DIR)
compile: $(C_OBJ_FILES) $(ASM_OBJ_FILES)
link: $(KERNEL_BIN)
clean:
sudo rm -rf $(OUTPUT_DIR)
buildiso:
sudo mkdir $(OUTPUT_DIR)/temp_iso
sudo mkdir $(OUTPUT_DIR)/temp_iso/HOS
sudo mkdir $(OUTPUT_DIR)/temp_iso/boot
sudo mkdir $(OUTPUT_DIR)/temp_iso/boot/grub
sudo mv $(KERNEL_BIN) $(OUTPUT_DIR)/temp_iso/HOS/kernel.bin
sudo cp $(GRUB_CFG) $(OUTPUT_DIR)/temp_iso/boot/grub/
sudo grub-mkrescue -o HOS.iso $(OUTPUT_DIR)/temp_iso
$(OUTPUT_DIR)/%.oc : $(C_SRC_PATH)/%.c
sudo $(CC) $(C_FLAGS_32) -o $@ $^
$(OUTPUT_DIR)/%.oasm : $(ASM_SRC_PATH)/%.asm
sudo $(ASM) $(ASM_FLAGS_32) -o $@ $^
$(KERNEL_BIN): $(ALL_OBJ_FILES)
sudo $(LD) $(LD_FLAGS_32) -T $(LD_SCRIPT) -o $(KERNEL_BIN) $(ALL_OBJ_FILES)

View File

@ -1,38 +1,52 @@
ASM = nasm
CC = gcc
LD = ld
C_SRC_PATH = x64/src/c
ASM_SRC_PATH = x64/src/asm
OUTPUT_DIR = temp
C_FLAGS = -m64 -c -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra
ASM_FLAGS = -f elf64 -I $(ASM_SRC_PATH)/
LD_FLAGS = -melf_x86_64
LD_SCRIPT = build/link.ld
#x86 vars
C_SRC_PATH_32 = x86/src/c
ASM_SRC_PATH_32 = x86/src/asm
C_FLAGS_32 = -m32 -c -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra
ASM_FLAGS_32 = -f elf32 -I $(ASM_SRC_PATH_32)/
LD_FLAGS_32 = -melf_i386
LD_SCRIPT_32 = build/link32.ld
#x64 vars
C_SRC_PATH_64 = x64/src/c
ASM_SRC_PATH_64 = x64/src/asm
C_FLAGS_64 = -m64 -c -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra
ASM_FLAGS_64 = -f elf64 -I $(ASM_SRC_PATH_64)/
LD_FLAGS_64 = -melf_x86_64
LD_SCRIPT_64 = build/link64.ld
GRUB_CFG = build/grub.cfg
OUTPUT_DIR = temp
#C source code
C_FILES = $(wildcard $(C_SRC_PATH)/*.c)
C_FILES_32 = $(wildcard $(C_SRC_PATH_32)/*.c)
C_FILES_64 = $(wildcard $(C_SRC_PATH_64)/*.c)
#ASM source code
ASM_FILES = $(wildcard $(ASM_SRC_PATH)/*.asm)
ASM_FILES_32 = $(wildcard $(ASM_SRC_PATH_32)/*.asm)
ASM_FILES_64 = $(wildcard $(ASM_SRC_PATH_64)/*.asm)
#bin files
KERNEL_BIN = $(OUTPUT_DIR)/kernel.bin
KERNEL_BIN_32 = $(OUTPUT_DIR)/kernel32.bin
KERNEL_BIN_64 = $(OUTPUT_DIR)/kernel64.bin
#modules
#Object files
C_OBJ_FILES = $(addprefix $(OUTPUT_DIR)/,$(notdir $(C_FILES:.c=.oc)))
ASM_OBJ_FILES = $(addprefix $(OUTPUT_DIR)/,$(notdir $(ASM_FILES:.asm=.oasm)))
ALL_OBJ_FILES = $(C_OBJ_FILES) $(ASM_OBJ_FILES)
C_OBJ_FILES_32 = $(addprefix $(OUTPUT_DIR)/,$(notdir $(C_FILES_32:.c=_x86.o)))
C_OBJ_FILES_64 = $(addprefix $(OUTPUT_DIR)/,$(notdir $(C_FILES_64:.c=_x86_64.o)))
ASM_OBJ_FILES_32 = $(addprefix $(OUTPUT_DIR)/,$(notdir $(ASM_FILES_32:.asm=_asm_x86.o)))
ASM_OBJ_FILES_64 = $(addprefix $(OUTPUT_DIR)/,$(notdir $(ASM_FILES_64:.asm=_asm_x86_64.o)))
ALL_OBJ_FILES_32 = $(C_OBJ_FILES_32) $(ASM_OBJ_FILES_32)
ALL_OBJ_FILES_64 = $(C_OBJ_FILES_64) $(ASM_OBJ_FILES_64)
all : init compile link buildiso clean
init:
sudo mkdir $(OUTPUT_DIR)
compile: $(C_OBJ_FILES) $(ASM_OBJ_FILES)
compile: $(C_OBJ_FILES_32) $(ASM_OBJ_FILES_32) $(C_OBJ_FILES_64) $(ASM_OBJ_FILES_64)
link: $(KERNEL_BIN)
link: $(KERNEL_BIN_32) $(KERNEL_BIN_64)
clean:
sudo rm -rf $(OUTPUT_DIR)
@ -41,15 +55,26 @@ buildiso:
sudo mkdir $(OUTPUT_DIR)/temp_iso/HOS
sudo mkdir $(OUTPUT_DIR)/temp_iso/boot
sudo mkdir $(OUTPUT_DIR)/temp_iso/boot/grub
sudo mv $(KERNEL_BIN) $(OUTPUT_DIR)/temp_iso/HOS/kernel.bin
sudo mkdir $(OUTPUT_DIR)/temp_mod
sudo mv $(KERNEL_BIN_64) $(OUTPUT_DIR)/temp_mod/kernel64.mod
sudo mv $(KERNEL_BIN_32) $(OUTPUT_DIR)/temp_iso/HOS/kernel32.bin
sudo cp $(GRUB_CFG) $(OUTPUT_DIR)/temp_iso/boot/grub/
sudo grub-mkrescue -o HOS.iso $(OUTPUT_DIR)/temp_iso
sudo grub-mkrescue --modules="$(OUTPUT_DIR)/temp_mod/kernel64" -o HOS.iso $(OUTPUT_DIR)/temp_iso
$(OUTPUT_DIR)/%.oc : $(C_SRC_PATH)/%.c
sudo $(CC) $(C_FLAGS) -o $@ $^
$(OUTPUT_DIR)/%_x86.o: $(C_SRC_PATH_32)/%.c
sudo $(CC) $(C_FLAGS_32) -o $@ $^
$(OUTPUT_DIR)/%.oasm : $(ASM_SRC_PATH)/%.asm
sudo $(ASM) $(ASM_FLAGS) -o $@ $^
$(OUTPUT_DIR)/%_x86_64.o: $(C_SRC_PATH_64)/%.c
sudo $(CC) $(C_FLAGS_64) -o $@ $^
$(KERNEL_BIN): $(ALL_OBJ_FILES)
sudo $(LD) $(LD_FLAGS) -T $(LD_SCRIPT) -o $(KERNEL_BIN) $(ALL_OBJ_FILES)
$(OUTPUT_DIR)/%_asm_x86.o: $(ASM_SRC_PATH_32)/%.asm
sudo $(ASM) $(ASM_FLAGS_32) -o $@ $^
$(OUTPUT_DIR)/%_asm_x86_64.o: $(ASM_SRC_PATH_64)/%.asm
sudo $(ASM) $(ASM_FLAGS_64) -o $@ $^
$(KERNEL_BIN_32): $(ALL_OBJ_FILES_32)
sudo $(LD) $(LD_FLAGS_32) -T $(LD_SCRIPT_32) -o $(KERNEL_BIN_32) $(ALL_OBJ_FILES_32)
$(KERNEL_BIN_64): $(ALL_OBJ_FILES_64)
sudo $(LD) $(LD_FLAGS_64) -T $(LD_SCRIPT_64) -o $(KERNEL_BIN_64) $(ALL_OBJ_FILES_64)

4
x64/src/asm/entry.asm Normal file
View File

@ -0,0 +1,4 @@
extern hk_main
[SECTION .text]
[BITS 64]
call hk_main

11
x64/src/c/entry.c Normal file
View File

@ -0,0 +1,11 @@
#include "type.h"
#include "kdef.h"
extern word *kernel_stack;
int64 HYPKERNEL64 hk_main(void)
{
//Setup x64
x64:
goto x64;
}

10
x64/src/c/kdef.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef _HKDEF32_H_
#define _HKDEF32_H_
#define HYPKERNEL64
#define BOCHS_MAGIC_BREAKPOINT asm("xchg bx,bx");
#define NULL ((void*)0)
#endif

View File

@ -18,7 +18,7 @@ mov eax,[ss:ebp+12]
push eax
push dword .reload
retf
.reload
.reload:
mov eax,[ss:ebp+16]
mov ss,ax
mov es,ax
@ -56,9 +56,9 @@ test edx, 1 << 29 ; Test if the LM-bit, which is bit 29, is set in the D-re
jz .not_supported ; They aren't, there is no long mode.
mov eax,1
jmp .end
.not_supported
.not_supported:
xor eax,eax
.end
.end:
mov esp,ebp
pop ebp
ret
@ -76,4 +76,4 @@ hk_enable_paging:
mov eax, cr0 ; Set the A-register to control register 0.
or eax, 1 << 31 ; Set the PG-bit, which is bit 31.
mov cr0, eax ; Set control register 0 to the A-register.
ret
ret

15
x86/src/c/type32.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef _TYPE_H_
#define _TYPE_H_
typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned long long uint64;
typedef unsigned char uint8;
typedef int int32;
typedef short int16;
typedef long long int64;
typedef char int8;
typedef uint8 byte;
typedef uint16 word;
typedef uint32 dword;
typedef uint64 qword;
#endif