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:
parent
41c2d8ca2a
commit
7cc18fac3d
|
@ -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)
|
75
makefile
75
makefile
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
extern hk_main
|
||||
[SECTION .text]
|
||||
[BITS 64]
|
||||
call hk_main
|
|
@ -0,0 +1,11 @@
|
|||
#include "type.h"
|
||||
#include "kdef.h"
|
||||
|
||||
extern word *kernel_stack;
|
||||
|
||||
int64 HYPKERNEL64 hk_main(void)
|
||||
{
|
||||
//Setup x64
|
||||
x64:
|
||||
goto x64;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue