Rewrite makefile and get it compiled.

This commit is contained in:
HyperAssembler 2015-04-23 00:47:20 -07:00
parent c2a9e43ad3
commit aa0a4483b8
4 changed files with 169 additions and 88 deletions

171
makefile
View File

@ -1,79 +1,164 @@
ASM = nasm
CC = gcc
LD = ld
#x86 vars
C_SRC_PATH_32 = x86/src/c
ASM_SRC_PATH_32 = x86/src/asm
C_FLAGS_32 = -m32 -std=c11 -c -fno-stack-protector -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 -std=c11 -c -fno-stack-protector -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
CC = gcc
LD = ld
#Recursive Wildcard
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
#x86 vars
C_SRC_PATH_32 := x86/src/c
ASM_SRC_PATH_32 := x86/src/asm
C_FLAGS_32 := -m32 -std=c11 -c -fno-stack-protector -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 -std=c11 -c -fno-stack-protector -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_32 = $(wildcard $(C_SRC_PATH_32)/*.c)
C_FILES_64 = $(wildcard $(C_SRC_PATH_64)/*.c)
C_FILES_32 := $(call rwildcard, $(C_SRC_PATH_32), *.c)
C_FILES_64 := $(call rwildcard, $(C_SRC_PATH_64), *.c)
#ASM source code
ASM_FILES_32 = $(wildcard $(ASM_SRC_PATH_32)/*.asm)
ASM_FILES_64 = $(wildcard $(ASM_SRC_PATH_64)/*.asm)
ASM_FILES_32 := $(call rwildcard, $(ASM_SRC_PATH_32), *.asm)
ASM_FILES_64 := $(call rwildcard, $(ASM_SRC_PATH_64), *.asm)
#bin files
KERNEL_BIN_32 = $(OUTPUT_DIR)/kernel32.bin
KERNEL_BIN_64 = $(OUTPUT_DIR)/kernel64.bin
#modules
KERNEL_BIN_32 := kernel32.bin
KERNEL_BIN_64 := kernel64.bin
#Object 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=_x64.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_x64.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)
C_OBJ_FILES_32 := $(C_FILES_32:.c=.o32)
C_OBJ_FILES_64 := $(C_FILES_64:.c=.o64)
ASM_OBJ_FILES_32 := $(ASM_FILES_32:.asm=.oa32)
ASM_OBJ_FILES_64 := $(ASM_FILES_64:.asm=.oa64)
ALL_OBJ_FILES_32 := $(addprefix $(OUTPUT_DIR)/,$(subst /,_,$(C_OBJ_FILES_32))) $(addprefix $(OUTPUT_DIR)/,$(subst /,_,$(ASM_OBJ_FILES_32)))
ALL_OBJ_FILES_64 := $(addprefix $(OUTPUT_DIR)/,$(subst /,_,$(C_OBJ_FILES_64))) $(addprefix $(OUTPUT_DIR)/,$(subst /,_,$(ASM_OBJ_FILES_64)))
print_source:
$(info ${C_OBJ_FILES_32})
all : init compile link buildiso clean
init:
sudo mkdir $(OUTPUT_DIR)
compile: $(C_OBJ_FILES_32) $(ASM_OBJ_FILES_32) $(C_OBJ_FILES_64) $(ASM_OBJ_FILES_64)
link: $(KERNEL_BIN_32) $(KERNEL_BIN_64)
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_64) $(OUTPUT_DIR)/temp_iso/HOS/kernel64
sudo mv $(KERNEL_BIN_32) $(OUTPUT_DIR)/temp_iso/HOS/kernel32
sudo mv $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(OUTPUT_DIR)/temp_iso/HOS/kernel64
sudo mv $(OUTPUT_DIR)/$(KERNEL_BIN_32) $(OUTPUT_DIR)/temp_iso/HOS/kernel32
sudo cp $(GRUB_CFG) $(OUTPUT_DIR)/temp_iso/boot/grub/
sudo grub-mkrescue -o HOS.iso $(OUTPUT_DIR)/temp_iso
$(OUTPUT_DIR)/%_x86.o: $(C_SRC_PATH_32)/%.c
sudo $(CC) $(C_FLAGS_32) -o $@ $^
$(OUTPUT_DIR)/%_x64.o: $(C_SRC_PATH_64)/%.c
sudo $(CC) $(C_FLAGS_64) -o $@ $^
$(OUTPUT_DIR)/%_asm_x86.o: $(ASM_SRC_PATH_32)/%.asm
sudo $(ASM) $(ASM_FLAGS_32) -o $@ $^
%.o32: %.c
sudo $(CC) $(C_FLAGS_32) -o $(OUTPUT_DIR)/$(subst /,_,$@) $^
%.o64: %.c
sudo $(CC) $(C_FLAGS_64) -o $(OUTPUT_DIR)/$(subst /,_,$@) $^
%.oa32: %.asm
sudo $(ASM) $(ASM_FLAGS_32) -o $(OUTPUT_DIR)/$(subst /,_,$@) $^
%.oa64: %.asm
sudo $(ASM) $(ASM_FLAGS_64) -o $(OUTPUT_DIR)/$(subst /,_,$@) $^
$(OUTPUT_DIR)/%_asm_x64.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)
sudo $(LD) $(LD_FLAGS_32) -T $(LD_SCRIPT_32) -o $(OUTPUT_DIR)/$(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)
sudo $(LD) $(LD_FLAGS_64) -T $(LD_SCRIPT_64) -o $(OUTPUT_DIR)/$(KERNEL_BIN_64) $(ALL_OBJ_FILES_64)

View File

@ -1,39 +0,0 @@
%ifndef _SYS_ASM_
%define _SYS_ASM_
%macro pushaq
push rax ;save current rax
push rbx ;save current rbx
push rcx ;save current rcx
push rdx ;save current rdx
push rbp ;save current rbp
push rdi ;save current rdi
push rsi ;save current rsi
push r8 ;save current r8
push r9 ;save current r9
push r10 ;save current r10
push r11 ;save current r11
push r12 ;save current r12
push r13 ;save current r13
push r14 ;save current r14
push r15 ;save current r15
%endmacro
%macro popaq
pop r15 ;restore current r15
pop r14 ;restore current r14
pop r13 ;restore current r13
pop r12 ;restore current r12
pop r11 ;restore current r11
pop r10 ;restore current r10
pop r9 ;restore current r9
pop r8 ;restore current r8
pop rsi ;restore current rsi
pop rdi ;restore current rdi
pop rbp ;restore current rbp
pop rdx ;restore current rdx
pop rcx ;restore current rcx
pop rbx ;restore current rbx
pop rax ;restore current rax
%endmacro
%endif

View File

@ -1,11 +1,46 @@
%include "../common/sys.asm"
global hal_write_port
global hal_read_port
global hal_enable_interrupt
global hal_disable_interrupt
global hal_interrupt_handler_wrapper
extern hal_interrupt_handler_dummy
%macro pushaq 0
push rax ;save current rax
push rbx ;save current rbx
push rcx ;save current rcx
push rdx ;save current rdx
push rbp ;save current rbp
push rdi ;save current rdi
push rsi ;save current rsi
push r8 ;save current r8
push r9 ;save current r9
push r10 ;save current r10
push r11 ;save current r11
push r12 ;save current r12
push r13 ;save current r13
push r14 ;save current r14
push r15 ;save current r15
%endmacro
%macro popaq 0
pop r15 ;restore current r15
pop r14 ;restore current r14
pop r13 ;restore current r13
pop r12 ;restore current r12
pop r11 ;restore current r11
pop r10 ;restore current r10
pop r9 ;restore current r9
pop r8 ;restore current r8
pop rsi ;restore current rsi
pop rdi ;restore current rdi
pop rbp ;restore current rbp
pop rdx ;restore current rdx
pop rcx ;restore current rcx
pop rbx ;restore current rbx
pop rax ;restore current rax
%endmacro
[SECTION .text]
[BITS 64]
hal_write_port:

View File

@ -1,6 +1,6 @@
global flush_gdt
global flush_tlb
global cpuid
global hal_flush_gdt
global hal_flush_tlb
global hal_cpuid
;Functions preserve the registers rbx, rsp, rbp, r12, r13, r14, and 15
;rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers.
;function parameter: rdi,rsi,rdx,rcx,r8,r9
@ -21,7 +21,7 @@ pop rax
push rax ; eflags
push rsi ; cs
push qword flush_gdt.reload ;eip
push qword .reload ;eip
iretq
.reload:
mov es,dx