[RUNNING] Structural and boot change:
1. Changed to multiboot2 complaint 2. Separated modules (hal, kernel, test, common) 3. Rewrite makefile/linker script/ grub.cfg to adapt changes.
This commit is contained in:
parent
2475039543
commit
e53e396556
@ -1,12 +0,0 @@
|
|||||||
menuentry "HOS x86 [Dev]" {
|
|
||||||
multiboot /HOS/kernel32
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry "HOS x64 [Dev]" {
|
|
||||||
multiboot /HOS/kernel64
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry "HOS Multiboot2 [Pending]" {
|
|
||||||
insmod kernel64
|
|
||||||
multiboot2 /HOS/multiboot2.bin
|
|
||||||
}
|
|
23
x64/CMakeLists.txt
Normal file
23
x64/CMakeLists.txt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8.4)
|
||||||
|
project(Workspace)
|
||||||
|
|
||||||
|
MACRO(HEADER_DIRECTORIES return_list)
|
||||||
|
FILE(GLOB_RECURSE new_list ./*.h)
|
||||||
|
SET(dir_list "")
|
||||||
|
FOREACH(file_path ${new_list})
|
||||||
|
GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
|
||||||
|
SET(dir_list ${dir_list} ${dir_path})
|
||||||
|
ENDFOREACH()
|
||||||
|
LIST(REMOVE_DUPLICATES dir_list)
|
||||||
|
SET(${return_list} ${dir_list})
|
||||||
|
ENDMACRO()
|
||||||
|
|
||||||
|
HEADER_DIRECTORIES(header_dirs)
|
||||||
|
|
||||||
|
include_directories(${header_dirs})
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
|
||||||
|
file(GLOB_RECURSE SOURCE_FILES ./*.h ./*.c)
|
||||||
|
|
||||||
|
add_executable(Workspace ${SOURCE_FILES})
|
55
x64/bochsUbuntu.bxrc
Normal file
55
x64/bochsUbuntu.bxrc
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# configuration file generated by Bochs
|
||||||
|
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, gameport=1, pci_ide=1, acpi=1, ioapic=1
|
||||||
|
config_interface: textconfig
|
||||||
|
display_library: sdl
|
||||||
|
magic_break: enabled=1
|
||||||
|
memory: host=128, guest=128
|
||||||
|
romimage: file="/usr/share/bochs/BIOS-bochs-latest"
|
||||||
|
vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest"
|
||||||
|
boot: cdrom
|
||||||
|
floppy_bootsig_check: disabled=0
|
||||||
|
# no floppya
|
||||||
|
# no floppyb
|
||||||
|
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
|
||||||
|
ata0-master: type=cdrom, path="secX.iso", status=inserted, biosdetect=auto, model="HOS"
|
||||||
|
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
|
||||||
|
ata2: enabled=0
|
||||||
|
ata3: enabled=0
|
||||||
|
parport1: enabled=1, file=""
|
||||||
|
parport2: enabled=0
|
||||||
|
com1: enabled=1, mode=null, dev=""
|
||||||
|
com2: enabled=0
|
||||||
|
com3: enabled=0
|
||||||
|
com4: enabled=0
|
||||||
|
usb_uhci: enabled=0
|
||||||
|
usb_ohci: enabled=0
|
||||||
|
i440fxsupport: enabled=1
|
||||||
|
vga_update_interval: 50000
|
||||||
|
vga: extension=vbe
|
||||||
|
cpu: count=1, ips=4000000, reset_on_triple_fault=1, ignore_bad_msrs=1
|
||||||
|
cpuid: cpuid_limit_winnt=0, mmx=1, sse=sse2, xapic=1, sep=1, aes=0, xsave=0, movbe=0, 1g_pages=1, pcid=0 fsgsbase=0
|
||||||
|
cpuid: stepping=3, vendor_string="GenuineIntel", brand_string=" Intel(R) Pentium(R) 4 CPU "
|
||||||
|
print_timestamps: enabled=0
|
||||||
|
# no gdb stub
|
||||||
|
port_e9_hack: enabled=0
|
||||||
|
text_snapshot_check: enabled=0
|
||||||
|
private_colormap: enabled=0
|
||||||
|
clock: sync=none, time0=local
|
||||||
|
# no cmosimage
|
||||||
|
ne2k: enabled=0
|
||||||
|
pnic: enabled=0
|
||||||
|
sb16: enabled=0
|
||||||
|
# no loader
|
||||||
|
log: -
|
||||||
|
logprefix: %t%e%d
|
||||||
|
panic: action=ask
|
||||||
|
error: action=report
|
||||||
|
info: action=report
|
||||||
|
debug: action=ignore
|
||||||
|
pass: action=fatal
|
||||||
|
keyboard_type: mf
|
||||||
|
keyboard_serial_delay: 250
|
||||||
|
keyboard_paste_delay: 100000
|
||||||
|
keyboard_mapping: enabled=0, map=
|
||||||
|
user_shortcut: keys=none
|
||||||
|
mouse: enabled=0, type=ps2, toggle=ctrl+mbutton
|
3
x64/grub.cfg
Normal file
3
x64/grub.cfg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
menuentry "secX x64 [Dev]" {
|
||||||
|
multiboot2 /secX/kernel
|
||||||
|
}
|
64
x64/makefile
Normal file
64
x64/makefile
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
ASM = nasm
|
||||||
|
CC = gcc
|
||||||
|
LD = ld
|
||||||
|
|
||||||
|
#Recursive Wildcard
|
||||||
|
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
|
||||||
|
rdircard=$(sort $(dir $(call rwildcard,$1,*)))
|
||||||
|
rdircardex=$(sort $(dir $(call rwildcard,$1,$2)))
|
||||||
|
|
||||||
|
#x64 vars
|
||||||
|
LD_SCRIPT := linker.ld
|
||||||
|
GRUB_CFG := grub.cfg
|
||||||
|
|
||||||
|
OUTPUT_DIR := out
|
||||||
|
HEADER_DIRS := $(call rdircardex, *,*.h)
|
||||||
|
ALL_OUTPUT_DIRS := $(addprefix $(OUTPUT_DIR)/,$(call rdircard,*))
|
||||||
|
|
||||||
|
C_FLAGS := -m64 -std=c11 -g -c $(addprefix -I, $(HEADER_DIRS)) -fno-stack-protector -fno-builtin -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -masm=intel -Wall -Wextra -Wno-comment
|
||||||
|
ASM_FLAGS := -f elf64 -I $(ASM_SRC_PATH_64)/
|
||||||
|
LD_FLAGS := -melf_x86_64
|
||||||
|
|
||||||
|
C_SRC := $(call rwildcard, ./, *.c)
|
||||||
|
ASM_SRC := $(call rwildcard, ./, *.asm)
|
||||||
|
|
||||||
|
KERNEL_BIN := kernel.bin
|
||||||
|
KERNEL_ELF := kernel.elf
|
||||||
|
|
||||||
|
#Object files
|
||||||
|
C_OBJ := $(C_SRC:.c=.o)
|
||||||
|
ASM_OBJ := $(ASM_SRC:.asm=.oasm)
|
||||||
|
ALL_OBJ := $(addprefix $(OUTPUT_DIR)/,$(C_OBJ)) $(addprefix $(OUTPUT_DIR)/,$(ASM_OBJ))
|
||||||
|
|
||||||
|
|
||||||
|
#Commands
|
||||||
|
all: init compile link buildiso clean
|
||||||
|
|
||||||
|
init:
|
||||||
|
mkdir -p $(ALL_OUTPUT_DIRS)
|
||||||
|
|
||||||
|
compile: $(C_OBJ) $(ASM_OBJ)
|
||||||
|
|
||||||
|
link: $(KERNEL_BIN)
|
||||||
|
|
||||||
|
buildiso:
|
||||||
|
mkdir -p $(OUTPUT_DIR)/temp_iso/secX
|
||||||
|
mkdir -p $(OUTPUT_DIR)/temp_iso/boot
|
||||||
|
mkdir -p $(OUTPUT_DIR)/temp_iso/boot/grub
|
||||||
|
mv $(OUTPUT_DIR)/$(KERNEL_BIN) $(OUTPUT_DIR)/temp_iso/secX/kernel
|
||||||
|
cp $(GRUB_CFG) $(OUTPUT_DIR)/temp_iso/boot/grub/
|
||||||
|
grub-mkrescue -o secX.iso $(OUTPUT_DIR)/temp_iso
|
||||||
|
rm -rf $(OUTPUT_DIR)/temp_iso
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(OUTPUT_DIR)
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(C_FLAGS) -o $(OUTPUT_DIR)/$@ $^
|
||||||
|
|
||||||
|
%.oasm: %.asm
|
||||||
|
$(ASM) $(ASM_FLAGS) -o $(OUTPUT_DIR)/$@ $^
|
||||||
|
|
||||||
|
$(KERNEL_BIN): $(ALL_OBJ)
|
||||||
|
$(LD) $(LD_FLAGS) -T $(LD_SCRIPT) -o $(OUTPUT_DIR)/$(KERNEL_BIN) $(ALL_OBJ)
|
||||||
|
|
@ -1,223 +0,0 @@
|
|||||||
/* multiboot.h - Multiboot header file. */
|
|
||||||
/* Copyright (C) 1999,2003,2007,2008,2009 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
|
|
||||||
* DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
||||||
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MULTIBOOT_HEADER
|
|
||||||
#define MULTIBOOT_HEADER 1
|
|
||||||
|
|
||||||
/* How many bytes from the start of the file we search for the header. */
|
|
||||||
#define MULTIBOOT_SEARCH 8192
|
|
||||||
|
|
||||||
/* The magic field should contain this. */
|
|
||||||
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
|
|
||||||
|
|
||||||
/* This should be in %eax. */
|
|
||||||
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
|
|
||||||
|
|
||||||
/* The bits in the required part of flags field we don't support. */
|
|
||||||
#define MULTIBOOT_UNSUPPORTED 0x0000fffc
|
|
||||||
|
|
||||||
/* Alignment of multiboot modules. */
|
|
||||||
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
|
||||||
|
|
||||||
/* Alignment of the multiboot info structure. */
|
|
||||||
#define MULTIBOOT_INFO_ALIGN 0x00000004
|
|
||||||
|
|
||||||
/* Flags set in the 'flags' member of the multiboot header. */
|
|
||||||
|
|
||||||
/* Align all boot modules on i386 page (4KB) boundaries. */
|
|
||||||
#define MULTIBOOT_PAGE_ALIGN 0x00000001
|
|
||||||
|
|
||||||
/* Must pass memory information to OS. */
|
|
||||||
#define MULTIBOOT_MEMORY_INFO 0x00000002
|
|
||||||
|
|
||||||
/* Must pass video information to OS. */
|
|
||||||
#define MULTIBOOT_VIDEO_MODE 0x00000004
|
|
||||||
|
|
||||||
/* This flag indicates the use of the address fields in the header. */
|
|
||||||
#define MULTIBOOT_AOUT_KLUDGE 0x00010000
|
|
||||||
|
|
||||||
/* Flags to be set in the 'flags' member of the multiboot info structure. */
|
|
||||||
|
|
||||||
/* is there basic lower/upper memory information? */
|
|
||||||
#define MULTIBOOT_INFO_MEMORY 0x00000001
|
|
||||||
/* is there a boot device set? */
|
|
||||||
#define MULTIBOOT_INFO_BOOTDEV 0x00000002
|
|
||||||
/* is the command-line defined? */
|
|
||||||
#define MULTIBOOT_INFO_CMDLINE 0x00000004
|
|
||||||
/* are there modules to do something with? */
|
|
||||||
#define MULTIBOOT_INFO_MODS 0x00000008
|
|
||||||
|
|
||||||
/* These next two are mutually exclusive */
|
|
||||||
|
|
||||||
/* is there a symbol table loaded? */
|
|
||||||
#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010
|
|
||||||
/* is there an ELF section header table? */
|
|
||||||
#define MULTIBOOT_INFO_ELF_SHDR 0X00000020
|
|
||||||
|
|
||||||
/* is there a full memory map? */
|
|
||||||
#define MULTIBOOT_INFO_MEM_MAP 0x00000040
|
|
||||||
|
|
||||||
/* Is there drive info? */
|
|
||||||
#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080
|
|
||||||
|
|
||||||
/* Is there a config table? */
|
|
||||||
#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100
|
|
||||||
|
|
||||||
/* Is there a boot loader name? */
|
|
||||||
#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200
|
|
||||||
|
|
||||||
/* Is there a APM table? */
|
|
||||||
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
|
|
||||||
|
|
||||||
/* Is there video information? */
|
|
||||||
#define MULTIBOOT_INFO_VIDEO_INFO 0x00000800
|
|
||||||
|
|
||||||
#ifndef ASM_FILE
|
|
||||||
|
|
||||||
typedef unsigned short multiboot_uint16_t;
|
|
||||||
typedef unsigned int multiboot_uint32_t;
|
|
||||||
typedef unsigned long long multiboot_uint64_t;
|
|
||||||
|
|
||||||
struct multiboot_header
|
|
||||||
{
|
|
||||||
/* Must be MULTIBOOT_MAGIC - see above. */
|
|
||||||
multiboot_uint32_t magic;
|
|
||||||
|
|
||||||
/* Feature flags. */
|
|
||||||
multiboot_uint32_t flags;
|
|
||||||
|
|
||||||
/* The above fields plus this one must equal 0 mod 2^32. */
|
|
||||||
multiboot_uint32_t checksum;
|
|
||||||
|
|
||||||
/* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
|
|
||||||
multiboot_uint32_t header_addr;
|
|
||||||
multiboot_uint32_t load_addr;
|
|
||||||
multiboot_uint32_t load_end_addr;
|
|
||||||
multiboot_uint32_t bss_end_addr;
|
|
||||||
multiboot_uint32_t entry_addr;
|
|
||||||
|
|
||||||
/* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
|
|
||||||
multiboot_uint32_t mode_type;
|
|
||||||
multiboot_uint32_t width;
|
|
||||||
multiboot_uint32_t height;
|
|
||||||
multiboot_uint32_t depth;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The symbol table for a.out. */
|
|
||||||
struct multiboot_aout_symbol_table
|
|
||||||
{
|
|
||||||
multiboot_uint32_t tabsize;
|
|
||||||
multiboot_uint32_t strsize;
|
|
||||||
multiboot_uint32_t addr;
|
|
||||||
multiboot_uint32_t reserved;
|
|
||||||
};
|
|
||||||
typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
|
|
||||||
|
|
||||||
/* The section header table for ELF. */
|
|
||||||
struct multiboot_elf_section_header_table
|
|
||||||
{
|
|
||||||
multiboot_uint32_t num;
|
|
||||||
multiboot_uint32_t size;
|
|
||||||
multiboot_uint32_t addr;
|
|
||||||
multiboot_uint32_t shndx;
|
|
||||||
};
|
|
||||||
typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
|
|
||||||
|
|
||||||
struct multiboot_info
|
|
||||||
{
|
|
||||||
/* Multiboot info version number */
|
|
||||||
multiboot_uint32_t flags;
|
|
||||||
|
|
||||||
/* Available memory from BIOS */
|
|
||||||
multiboot_uint32_t mem_lower;
|
|
||||||
multiboot_uint32_t mem_upper;
|
|
||||||
|
|
||||||
/* "root" partition */
|
|
||||||
multiboot_uint32_t boot_device;
|
|
||||||
|
|
||||||
/* Kernel command line */
|
|
||||||
multiboot_uint32_t cmdline;
|
|
||||||
|
|
||||||
/* Boot-Module list */
|
|
||||||
multiboot_uint32_t mods_count;
|
|
||||||
multiboot_uint32_t mods_addr;
|
|
||||||
|
|
||||||
union
|
|
||||||
{
|
|
||||||
multiboot_aout_symbol_table_t aout_sym;
|
|
||||||
multiboot_elf_section_header_table_t elf_sec;
|
|
||||||
} u;
|
|
||||||
|
|
||||||
/* Memory Mapping buffer */
|
|
||||||
multiboot_uint32_t mmap_length;
|
|
||||||
multiboot_uint32_t mmap_addr;
|
|
||||||
|
|
||||||
/* Drive Info buffer */
|
|
||||||
multiboot_uint32_t drives_length;
|
|
||||||
multiboot_uint32_t drives_addr;
|
|
||||||
|
|
||||||
/* ROM configuration table */
|
|
||||||
multiboot_uint32_t config_table;
|
|
||||||
|
|
||||||
/* Boot Loader Name */
|
|
||||||
multiboot_uint32_t boot_loader_name;
|
|
||||||
|
|
||||||
/* APM table */
|
|
||||||
multiboot_uint32_t apm_table;
|
|
||||||
|
|
||||||
/* Video */
|
|
||||||
multiboot_uint32_t vbe_control_info;
|
|
||||||
multiboot_uint32_t vbe_mode_info;
|
|
||||||
multiboot_uint16_t vbe_mode;
|
|
||||||
multiboot_uint16_t vbe_interface_seg;
|
|
||||||
multiboot_uint16_t vbe_interface_off;
|
|
||||||
multiboot_uint16_t vbe_interface_len;
|
|
||||||
};
|
|
||||||
typedef struct multiboot_info multiboot_info_t;
|
|
||||||
|
|
||||||
struct multiboot_mmap_entry
|
|
||||||
{
|
|
||||||
multiboot_uint32_t size;
|
|
||||||
multiboot_uint64_t addr;
|
|
||||||
multiboot_uint64_t len;
|
|
||||||
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
|
||||||
#define MULTIBOOT_MEMORY_RESERVED 2
|
|
||||||
multiboot_uint32_t type;
|
|
||||||
} __attribute__((packed));
|
|
||||||
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
|
||||||
|
|
||||||
struct multiboot_mod_list
|
|
||||||
{
|
|
||||||
/* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */
|
|
||||||
multiboot_uint32_t mod_start;
|
|
||||||
multiboot_uint32_t mod_end;
|
|
||||||
|
|
||||||
/* Module command line */
|
|
||||||
multiboot_uint32_t cmdline;
|
|
||||||
|
|
||||||
/* padding to take it to 16 bytes (must be zero) */
|
|
||||||
multiboot_uint32_t pad;
|
|
||||||
};
|
|
||||||
typedef struct multiboot_mod_list multiboot_module_t;
|
|
||||||
|
|
||||||
#endif /* ! ASM_FILE */
|
|
||||||
|
|
||||||
#endif /* ! MULTIBOOT_HEADER */
|
|
@ -1,17 +0,0 @@
|
|||||||
#include "k_intr.h"
|
|
||||||
#include "k_hal.h"
|
|
||||||
|
|
||||||
void k_set_interrupt_handler(uint64_t index, void (*handler)(void))
|
|
||||||
{
|
|
||||||
hal_set_interrupt_handler(index, handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
void k_disable_interrupt()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void k_enable_interrupt()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
@ -3,7 +3,7 @@
|
|||||||
* See COPYING under root for details
|
* See COPYING under root for details
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "inc/linked_list.h"
|
#include "linked_list.h"
|
||||||
|
|
||||||
static void KAPI _init_linked_list_node(linked_list_node_t *node)
|
static void KAPI _init_linked_list_node(linked_list_node_t *node)
|
||||||
{
|
{
|
@ -2,9 +2,9 @@
|
|||||||
; Distributed under GPL license
|
; Distributed under GPL license
|
||||||
; See COPYING under root for details
|
; See COPYING under root for details
|
||||||
|
|
||||||
global hal_interlocked_exchange;
|
;============================
|
||||||
|
|
||||||
;uint64_t _KERNEL_ABI hal_interlocked_exchange(_IN _OUT uint64_t* dst, _IN uint64_t val);
|
;uint64_t _KERNEL_ABI hal_interlocked_exchange(_IN _OUT uint64_t* dst, _IN uint64_t val);
|
||||||
|
global hal_interlocked_exchange;
|
||||||
hal_interlocked_exchange:
|
hal_interlocked_exchange:
|
||||||
lock xchg qword [rdi], rsi
|
lock xchg qword [rdi], rsi
|
||||||
mov rax, rsi
|
mov rax, rsi
|
@ -3,39 +3,62 @@
|
|||||||
; See COPYING under root for details
|
; See COPYING under root for details
|
||||||
|
|
||||||
extern kmain
|
extern kmain
|
||||||
extern kernel_start
|
|
||||||
extern kernel_end
|
|
||||||
global BOCHS_MAGIC_BREAKPOINT
|
|
||||||
; IMPORTANT: This module should be 4k-page aliened
|
; IMPORTANT: This module should be 4k-page aliened
|
||||||
[SECTION .entry]
|
[SECTION .entry]
|
||||||
[BITS 32]
|
[BITS 32]
|
||||||
; MultiBoot Header
|
; MultiBoot Header
|
||||||
GRUB_MAGIC equ 0x2BADB002
|
MULTIBOOT_LOADED_MAGIC equ 0x36d76289
|
||||||
MULTIBOOT_MAGIC_NUMBER equ 0x1BADB002
|
MULTIBOOT_MAGIC_NUMBER equ 0xE85250D6
|
||||||
MULTIBOOT_FLAGS equ 0x10003
|
MULTIBOOT_ARCH equ 0
|
||||||
MULTIBOOT_CHECK_SUM equ - (MULTIBOOT_MAGIC_NUMBER + MULTIBOOT_FLAGS)
|
MULTIBOOT_CHECK_SUM equ - (MULTIBOOT_MAGIC_NUMBER + MULTIBOOT_HEADER_SIZE + MULTIBOOT_ARCH)
|
||||||
MULTIBOOT_HEADER:
|
|
||||||
align 4
|
|
||||||
dd MULTIBOOT_MAGIC_NUMBER
|
|
||||||
dd MULTIBOOT_FLAGS
|
|
||||||
dd MULTIBOOT_CHECK_SUM
|
|
||||||
|
|
||||||
dd MULTIBOOT_HEADER
|
align 8
|
||||||
dd MULTIBOOT_HEADER
|
MULTIBOOT_HEADER:
|
||||||
dd 0
|
dd MULTIBOOT_MAGIC_NUMBER
|
||||||
dd 0
|
dd MULTIBOOT_ARCH
|
||||||
|
dd MULTIBOOT_HEADER_SIZE
|
||||||
|
dd MULTIBOOT_CHECK_SUM
|
||||||
|
;====================
|
||||||
|
;Address_tag
|
||||||
|
MULTIBOOT_ADDRESS_TAG:
|
||||||
|
dw 0x2 ;type=2
|
||||||
|
dw 0x0 ;flag=0
|
||||||
|
dd MULTIBOOT_ADDRESS_TAG_SIZE; size
|
||||||
|
dd MULTIBOOT_HEADER ; Since at the beginning of the file
|
||||||
|
dd MULTIBOOT_HEADER ; load start
|
||||||
|
dd 0 ; load end
|
||||||
|
dd 0 ; bss
|
||||||
|
MULTIBOOT_ADDRESS_TAG_SIZE equ ( $ - MULTIBOOT_ADDRESS_TAG)
|
||||||
|
;====================
|
||||||
|
;Entry_tag
|
||||||
|
align 8
|
||||||
|
MULTIBOOT_ENTRY_TAG:
|
||||||
|
dw 0x3; type=3
|
||||||
|
dw 0x0; flag=0
|
||||||
|
dd MULTIBOOT_ENTRY_TAG_SIZE
|
||||||
dd entry_32
|
dd entry_32
|
||||||
|
MULTIBOOT_ENTRY_TAG_SIZE equ ($ - MULTIBOOT_ENTRY_TAG)
|
||||||
|
;====================
|
||||||
|
;End_tag
|
||||||
|
align 8
|
||||||
|
dw 0x0
|
||||||
|
dw 0x0
|
||||||
|
dd 0x8
|
||||||
|
;====================
|
||||||
MULTIBOOT_HEADER_SIZE equ ($ - MULTIBOOT_HEADER)
|
MULTIBOOT_HEADER_SIZE equ ($ - MULTIBOOT_HEADER)
|
||||||
|
|
||||||
align 4096 ;4k alignment
|
|
||||||
|
align 4096
|
||||||
; temporary page table
|
; temporary page table
|
||||||
PML4_BASE:
|
PML4_BASE:
|
||||||
times 512 dq 0 ;reserved the rest for page entries
|
times 512 dq 0 ;reserved the rest for page entries
|
||||||
|
|
||||||
align 4096 ;4k alignment
|
align 4096
|
||||||
PDPT_BASE:
|
PDPT_BASE:
|
||||||
times 512 dq 0 ;reserved the rest for page entries
|
times 512 dq 0 ;reserved the rest for page entries
|
||||||
|
|
||||||
|
align 4096
|
||||||
; long mode gdt
|
; long mode gdt
|
||||||
GDT64: ; Global Descriptor Table (64-bit).
|
GDT64: ; Global Descriptor Table (64-bit).
|
||||||
; NULL
|
; NULL
|
||||||
@ -63,12 +86,14 @@ GDT64: ; Global Descriptor Table (64-bit).
|
|||||||
dw $ - GDT64 - 1 ; Limit.
|
dw $ - GDT64 - 1 ; Limit.
|
||||||
dq GDT64 ; Base.
|
dq GDT64 ; Base.
|
||||||
|
|
||||||
|
align 4096
|
||||||
entry_32:
|
entry_32:
|
||||||
; close interrupt
|
; close interrupt
|
||||||
cli
|
cli
|
||||||
|
cld
|
||||||
|
|
||||||
; check loaded by grub
|
; check loaded by grub
|
||||||
cmp eax,GRUB_MAGIC
|
cmp eax,MULTIBOOT_LOADED_MAGIC
|
||||||
je .loaded_by_grub
|
je .loaded_by_grub
|
||||||
hlt
|
hlt
|
||||||
.loaded_by_grub:
|
.loaded_by_grub:
|
||||||
@ -188,10 +213,6 @@ mov rdi,rsi ; multiboot_info*
|
|||||||
call kmain
|
call kmain
|
||||||
hlt
|
hlt
|
||||||
|
|
||||||
BOCHS_MAGIC_BREAKPOINT:
|
|
||||||
xchg bx,bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
align 4096 ;4k alignment
|
align 4096 ;4k alignment
|
||||||
times 8192 db 0
|
times 8192 db 0
|
||||||
KERNEL_STACK:
|
KERNEL_STACK:
|
@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
boot_info_t *KAPI hal_init(void *_m_info)
|
boot_info_t *KAPI hal_init(void *_m_info)
|
||||||
{
|
{
|
||||||
multiboot_info_t* m_info = (multiboot_info_t*) _m_info;
|
//multiboot_info_t* m_info = (multiboot_info_t*) _m_info;
|
||||||
if (m_info == NULL)
|
// if (m_info == NULL)
|
||||||
return NULL;
|
// return NULL;
|
||||||
|
|
||||||
// set up kernel heap;
|
// set up kernel heap;
|
||||||
hal_alloc_init();
|
hal_alloc_init();
|
||||||
@ -58,39 +58,39 @@ boot_info_t *KAPI hal_init(void *_m_info)
|
|||||||
mem_set(boot_info, 0, sizeof(boot_info_t));
|
mem_set(boot_info, 0, sizeof(boot_info_t));
|
||||||
// obtain boot information
|
// obtain boot information
|
||||||
// memory info
|
// memory info
|
||||||
if (m_info->flags & (1 << 6))
|
// if (m_info->flags & (1 << 6))
|
||||||
{
|
// {
|
||||||
boot_info->mem_info = (mem_info_t *) halloc(sizeof(mem_info_t));
|
// boot_info->mem_info = (mem_info_t *) halloc(sizeof(mem_info_t));
|
||||||
hal_assert(boot_info->mem_info != NULL, "Unable to allocate memory for mem_info.");
|
// hal_assert(boot_info->mem_info != NULL, "Unable to allocate memory for mem_info.");
|
||||||
boot_info->mem_info->mem_available = 0;
|
// boot_info->mem_info->mem_available = 0;
|
||||||
boot_info->mem_info->mem_installed = 0;
|
// boot_info->mem_info->mem_installed = 0;
|
||||||
boot_info->mem_info->free_page_list = (linked_list_t *) halloc((sizeof(linked_list_t)));
|
// boot_info->mem_info->free_page_list = (linked_list_t *) halloc((sizeof(linked_list_t)));
|
||||||
boot_info->mem_info->occupied_page_list = (linked_list_t *) halloc((sizeof(linked_list_t)));
|
// boot_info->mem_info->occupied_page_list = (linked_list_t *) halloc((sizeof(linked_list_t)));
|
||||||
hal_assert(boot_info->mem_info->free_page_list != NULL &&
|
// hal_assert(boot_info->mem_info->free_page_list != NULL &&
|
||||||
boot_info->mem_info->occupied_page_list != NULL, "Unable to allocate memory for mem_info_lists.");
|
// boot_info->mem_info->occupied_page_list != NULL, "Unable to allocate memory for mem_info_lists.");
|
||||||
linked_list_init(boot_info->mem_info->free_page_list);
|
// linked_list_init(boot_info->mem_info->free_page_list);
|
||||||
linked_list_init(boot_info->mem_info->occupied_page_list);
|
// linked_list_init(boot_info->mem_info->occupied_page_list);
|
||||||
multiboot_memory_map_t *mem_map = (multiboot_memory_map_t *) (uint64_t)m_info->mmap_addr;
|
// multiboot_memory_map_t *mem_map = (multiboot_memory_map_t *) (uint64_t)m_info->mmap_addr;
|
||||||
uint64_t mem_map_size = m_info->mmap_length / sizeof(multiboot_memory_map_t);
|
// uint64_t mem_map_size = m_info->mmap_length / sizeof(multiboot_memory_map_t);
|
||||||
for (uint64_t i = 0; i < mem_map_size; i++)
|
// for (uint64_t i = 0; i < mem_map_size; i++)
|
||||||
{
|
// {
|
||||||
hal_printf("==Base: 0x%X, Length: %u, Type: %s==\n", (mem_map + i)->addr, (mem_map + i)->len,
|
// hal_printf("==Base: 0x%X, Length: %u, Type: %s==\n", (mem_map + i)->addr, (mem_map + i)->len,
|
||||||
(mem_map + i)->type == MULTIBOOT_MEMORY_AVAILABLE ? "AVL" : "RSV");
|
// (mem_map + i)->type == MULTIBOOT_MEMORY_AVAILABLE ? "AVL" : "RSV");
|
||||||
if ((mem_map + i)->type == MULTIBOOT_MEMORY_AVAILABLE)
|
// if ((mem_map + i)->type == MULTIBOOT_MEMORY_AVAILABLE)
|
||||||
{
|
// {
|
||||||
uint64_t base_addr = (mem_map + i)->addr;
|
// uint64_t base_addr = (mem_map + i)->addr;
|
||||||
uint64_t end_addr = base_addr + (mem_map + i)->len;
|
// uint64_t end_addr = base_addr + (mem_map + i)->len;
|
||||||
|
//
|
||||||
// align head
|
// // align head
|
||||||
uint64_t aligned_base_addr = align_up(base_addr, PHYSICAL_PAGE_SIZE);
|
// uint64_t aligned_base_addr = align_up(base_addr, PHYSICAL_PAGE_SIZE);
|
||||||
// align tail
|
// // align tail
|
||||||
uint64_t aligned_end_addr = align_down(end_addr, PHYSICAL_PAGE_SIZE);
|
// uint64_t aligned_end_addr = align_down(end_addr, PHYSICAL_PAGE_SIZE);
|
||||||
|
//
|
||||||
|
//
|
||||||
uint64_t page_count = (aligned_end_addr - aligned_base_addr) / PHYSICAL_PAGE_SIZE;
|
// uint64_t page_count = (aligned_end_addr - aligned_base_addr) / PHYSICAL_PAGE_SIZE;
|
||||||
|
//
|
||||||
if (page_count == 0)
|
// if (page_count == 0)
|
||||||
continue;
|
// continue;
|
||||||
|
|
||||||
// strip kernel-occupied pages
|
// strip kernel-occupied pages
|
||||||
// TODO: Finished this.
|
// TODO: Finished this.
|
||||||
@ -119,49 +119,49 @@ boot_info_t *KAPI hal_init(void *_m_info)
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
memory_descriptor_node_t *each_desc = (memory_descriptor_node_t *) halloc(
|
// memory_descriptor_node_t *each_desc = (memory_descriptor_node_t *) halloc(
|
||||||
sizeof(memory_descriptor_node_t));
|
// sizeof(memory_descriptor_node_t));
|
||||||
hal_assert(each_desc != NULL, "Unable to allocate memory for memory_descriptor.");
|
// hal_assert(each_desc != NULL, "Unable to allocate memory for memory_descriptor.");
|
||||||
each_desc->page_count = page_count;
|
// each_desc->page_count = page_count;
|
||||||
each_desc->base_addr = aligned_base_addr;
|
// each_desc->base_addr = aligned_base_addr;
|
||||||
linked_list_push_back(boot_info->mem_info->free_page_list, &each_desc->list_node);
|
// linked_list_push_back(boot_info->mem_info->free_page_list, &each_desc->list_node);
|
||||||
boot_info->mem_info->mem_available += aligned_end_addr - aligned_base_addr;
|
// boot_info->mem_info->mem_available += aligned_end_addr - aligned_base_addr;
|
||||||
}
|
// }
|
||||||
boot_info->mem_info->mem_installed += (mem_map + i)->len;
|
// boot_info->mem_info->mem_installed += (mem_map + i)->len;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
// halt machine
|
// // halt machine
|
||||||
hal_printf("HAL: Cannot detect memory information.");
|
// hal_printf("HAL: Cannot detect memory information.");
|
||||||
hal_halt_cpu();
|
// hal_halt_cpu();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// loaded kernel modules
|
// // loaded kernel modules
|
||||||
if (m_info->flags & (1 << 3))
|
// if (m_info->flags & (1 << 3))
|
||||||
{
|
// {
|
||||||
boot_info->module_info = (module_info_t *) halloc(sizeof(module_info_t));
|
// boot_info->module_info = (module_info_t *) halloc(sizeof(module_info_t));
|
||||||
hal_assert(boot_info->module_info != NULL, "Unable to allocate memory for module_info.");
|
// hal_assert(boot_info->module_info != NULL, "Unable to allocate memory for module_info.");
|
||||||
boot_info->module_info->module_count = 0;
|
// boot_info->module_info->module_count = 0;
|
||||||
boot_info->module_info->module_list = (linked_list_t *) halloc(sizeof(linked_list_t));
|
// boot_info->module_info->module_list = (linked_list_t *) halloc(sizeof(linked_list_t));
|
||||||
hal_assert(boot_info->module_info->module_list != NULL, "Unable to allocate memory for module_list.");
|
// hal_assert(boot_info->module_info->module_list != NULL, "Unable to allocate memory for module_list.");
|
||||||
linked_list_init(boot_info->module_info->module_list);
|
// linked_list_init(boot_info->module_info->module_list);
|
||||||
multiboot_module_t *mods_list = (multiboot_module_t *) (uint64_t) m_info->mods_addr;
|
// multiboot_module_t *mods_list = (multiboot_module_t *) (uint64_t) m_info->mods_addr;
|
||||||
boot_info->module_info->module_count = m_info->mods_count;
|
// boot_info->module_info->module_count = m_info->mods_count;
|
||||||
for (uint64_t i = 0; i < boot_info->module_info->module_count; i++)
|
// for (uint64_t i = 0; i < boot_info->module_info->module_count; i++)
|
||||||
{
|
// {
|
||||||
module_descriptor_node_t *each_module = (module_descriptor_node_t *) halloc(
|
// module_descriptor_node_t *each_module = (module_descriptor_node_t *) halloc(
|
||||||
sizeof(module_descriptor_node_t));
|
// sizeof(module_descriptor_node_t));
|
||||||
hal_assert(each_module != NULL, "Unable to allocate memory for module_descriptor.");
|
// hal_assert(each_module != NULL, "Unable to allocate memory for module_descriptor.");
|
||||||
each_module->base_addr = (mods_list + i)->mod_start;
|
// each_module->base_addr = (mods_list + i)->mod_start;
|
||||||
each_module->size = (mods_list + i)->mod_end - (mods_list + i)->mod_start;
|
// each_module->size = (mods_list + i)->mod_end - (mods_list + i)->mod_start;
|
||||||
each_module->name = (char *) halloc((size_t) str_len((char *) (uint64_t) (mods_list + i)->cmdline) + 1);
|
// each_module->name = (char *) halloc((size_t) str_len((char *) (uint64_t) (mods_list + i)->cmdline) + 1);
|
||||||
hal_assert(each_module->name != NULL, "Unable to allocate memory for module name string.");
|
// hal_assert(each_module->name != NULL, "Unable to allocate memory for module name string.");
|
||||||
mem_cpy((void *) (uint64_t) (mods_list + i)->cmdline, each_module->name,
|
// mem_cpy((void *) (uint64_t) (mods_list + i)->cmdline, each_module->name,
|
||||||
str_len((char *) (uint64_t) (mods_list + i)->cmdline) + 1);
|
// str_len((char *) (uint64_t) (mods_list + i)->cmdline) + 1);
|
||||||
linked_list_push_back(boot_info->module_info->module_list, &each_module->list_node);
|
// linked_list_push_back(boot_info->module_info->module_list, &each_module->list_node);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// detect APIC
|
// detect APIC
|
||||||
cpuid_t cpuid_info;
|
cpuid_t cpuid_info;
|
@ -2,14 +2,6 @@
|
|||||||
; Distributed under GPL license
|
; Distributed under GPL license
|
||||||
; See COPYING under root for details
|
; See COPYING under root for details
|
||||||
|
|
||||||
global hal_write_port
|
|
||||||
global hal_read_port
|
|
||||||
global hal_enable_interrupt
|
|
||||||
global hal_disable_interrupt
|
|
||||||
global hal_interrupt_handler_wrapper
|
|
||||||
global hal_halt_cpu
|
|
||||||
extern hal_interrupt_handler_dummy
|
|
||||||
|
|
||||||
%macro pushaq 0
|
%macro pushaq 0
|
||||||
push rax ;save current rax
|
push rax ;save current rax
|
||||||
push rbx ;save current rbx
|
push rbx ;save current rbx
|
||||||
@ -48,6 +40,8 @@ extern hal_interrupt_handler_dummy
|
|||||||
|
|
||||||
[SECTION .text]
|
[SECTION .text]
|
||||||
[BITS 64]
|
[BITS 64]
|
||||||
|
;====================
|
||||||
|
global hal_write_port
|
||||||
hal_write_port:
|
hal_write_port:
|
||||||
mov rdx,rdi
|
mov rdx,rdi
|
||||||
mov rax,rsi
|
mov rax,rsi
|
||||||
@ -56,6 +50,8 @@ nop
|
|||||||
nop
|
nop
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;====================
|
||||||
|
global hal_read_port
|
||||||
hal_read_port:
|
hal_read_port:
|
||||||
mov rdx,rdi
|
mov rdx,rdi
|
||||||
xor rax,rax
|
xor rax,rax
|
||||||
@ -64,21 +60,36 @@ nop
|
|||||||
nop
|
nop
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;====================
|
||||||
|
global hal_disable_interrupt
|
||||||
hal_disable_interrupt:
|
hal_disable_interrupt:
|
||||||
cli
|
cli
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;====================
|
||||||
|
global hal_enable_interrupt
|
||||||
hal_enable_interrupt:
|
hal_enable_interrupt:
|
||||||
sti
|
sti
|
||||||
ret
|
ret
|
||||||
|
|
||||||
hal_interrupt_handler_wrapper:
|
;====================
|
||||||
|
global hal_interrupt_handler
|
||||||
|
extern hal_interrupt_dispatcher
|
||||||
|
hal_interrupt_handler:
|
||||||
pushaq
|
pushaq
|
||||||
cld
|
cld
|
||||||
call hal_interrupt_handler_dummy
|
call hal_interrupt_dispatcher
|
||||||
popaq
|
popaq
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
|
;====================
|
||||||
|
global hal_halt_cpu
|
||||||
hal_halt_cpu:
|
hal_halt_cpu:
|
||||||
hlt
|
hlt
|
||||||
|
ret
|
||||||
|
|
||||||
|
;====================
|
||||||
|
global hal_bochs_magic_breakpoint
|
||||||
|
hal_bochs_magic_breakpoint:
|
||||||
|
xchg bx,bx
|
||||||
ret
|
ret
|
@ -49,3 +49,9 @@ void KAPI hal_assert(int64_t expression,
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KAPI hal_interrupt_dispatcher(void)
|
||||||
|
{
|
||||||
|
hal_printf("Yep... That just happened, an interrupt...\n");
|
||||||
|
return;
|
||||||
|
}
|
@ -2,18 +2,14 @@
|
|||||||
; Distributed under GPL license
|
; Distributed under GPL license
|
||||||
; See COPYING under root for details
|
; See COPYING under root for details
|
||||||
|
|
||||||
global hal_flush_gdt
|
|
||||||
global hal_flush_tlb
|
|
||||||
global hal_flush_idt
|
|
||||||
global hal_cpuid
|
|
||||||
global hal_read_page_base
|
|
||||||
global hal_write_page_base
|
|
||||||
;Functions preserve the registers rbx, rsp, rbp, r12, r13, r14, and 15
|
;Functions preserve the registers rbx, rsp, rbp, r12, r13, r14, and 15
|
||||||
;rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers.
|
;rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers.
|
||||||
;function parameter: rdi,rsi,rdx,rcx,r8,r9
|
;function parameter: rdi,rsi,rdx,rcx,r8,r9
|
||||||
|
|
||||||
[SECTION .text]
|
[SECTION .text]
|
||||||
[BITS 64]
|
[BITS 64]
|
||||||
|
;======================
|
||||||
|
global hal_flush_gdt
|
||||||
hal_flush_gdt:
|
hal_flush_gdt:
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp,rsp
|
mov rbp,rsp
|
||||||
@ -39,13 +35,16 @@ mov rsp,rbp
|
|||||||
pop rbp
|
pop rbp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;======================
|
||||||
|
global hal_flush_tlb
|
||||||
;void flush_tlb(void)
|
;void flush_tlb(void)
|
||||||
hal_flush_tlb:
|
hal_flush_tlb:
|
||||||
mov rax,cr3
|
mov rax,cr3
|
||||||
mov cr3,rax
|
mov cr3,rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;======================
|
||||||
|
global hal_cpuid
|
||||||
;void get_cpuid(int64_t* rax, int64_t* rbx, int64_t* rcx, int64_t* rdx)
|
;void get_cpuid(int64_t* rax, int64_t* rbx, int64_t* rcx, int64_t* rdx)
|
||||||
hal_cpuid:
|
hal_cpuid:
|
||||||
mov rax,[rdi]
|
mov rax,[rdi]
|
||||||
@ -59,19 +58,22 @@ pop rcx
|
|||||||
mov [rcx],rdx
|
mov [rcx],rdx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;flush_idt
|
;======================
|
||||||
|
global hal_flush_idt
|
||||||
hal_flush_idt:
|
hal_flush_idt:
|
||||||
lidt [rdi]
|
lidt [rdi]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;read_cr3
|
;======================
|
||||||
|
global hal_read_page_base
|
||||||
hal_read_page_base:
|
hal_read_page_base:
|
||||||
mov rax,cr3
|
mov rax,cr3
|
||||||
mov r11,0xFFFFFFFFFF000
|
mov r11,0xFFFFFFFFFF000
|
||||||
and rax,r11 ;keep bits 12-51
|
and rax,r11 ;keep bits 12-51
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;write_cr3
|
;======================
|
||||||
|
global hal_write_page_base
|
||||||
hal_write_page_base:
|
hal_write_page_base:
|
||||||
mov r11,0xFFFFFFFFFF000
|
mov r11,0xFFFFFFFFFF000
|
||||||
and rdi,r11 ;keep bits 12-51
|
and rdi,r11 ;keep bits 12-51
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
extern void KAPI hal_write_port(uint64_t port, int64_t data);
|
extern void KAPI hal_write_port(uint64_t port, int64_t data);
|
||||||
extern int64_t KAPI hal_read_port(uint64_t port);
|
extern int64_t KAPI hal_read_port(uint64_t port);
|
||||||
void KAPI hal_interrupt_handler_dummy();
|
void KAPI hal_interrupt_handler_dispatcher();
|
||||||
|
|
||||||
void KAPI hal_set_interrupt_handler(uint64_t index, void (*handler)(void));
|
void KAPI hal_set_interrupt_handler(uint64_t index, void (*handler)(void));
|
||||||
extern void KAPI hal_enable_interrupt();
|
extern void KAPI hal_enable_interrupt();
|
375
x64/src/hal/inc/hal_multiboot.h
Normal file
375
x64/src/hal/inc/hal_multiboot.h
Normal file
@ -0,0 +1,375 @@
|
|||||||
|
/* multiboot2.h - Multiboot 2 header file. */
|
||||||
|
/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
|
||||||
|
* DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||||
|
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MULTIBOOT_HEADER
|
||||||
|
#define MULTIBOOT_HEADER 1
|
||||||
|
|
||||||
|
/* How many bytes from the start of the file we search for the header. */
|
||||||
|
#define MULTIBOOT_SEARCH 32768
|
||||||
|
#define MULTIBOOT_HEADER_ALIGN 8
|
||||||
|
|
||||||
|
/* The magic field should contain this. */
|
||||||
|
#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
|
||||||
|
|
||||||
|
/* This should be in %eax. */
|
||||||
|
#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
|
||||||
|
|
||||||
|
/* Alignment of multiboot modules. */
|
||||||
|
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
||||||
|
|
||||||
|
/* Alignment of the multiboot info structure. */
|
||||||
|
#define MULTIBOOT_INFO_ALIGN 0x00000008
|
||||||
|
|
||||||
|
/* Flags set in the 'flags' member of the multiboot header. */
|
||||||
|
|
||||||
|
#define MULTIBOOT_TAG_ALIGN 8
|
||||||
|
#define MULTIBOOT_TAG_TYPE_END 0
|
||||||
|
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
|
||||||
|
#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
|
||||||
|
#define MULTIBOOT_TAG_TYPE_MODULE 3
|
||||||
|
#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
|
||||||
|
#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
|
||||||
|
#define MULTIBOOT_TAG_TYPE_MMAP 6
|
||||||
|
#define MULTIBOOT_TAG_TYPE_VBE 7
|
||||||
|
#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
|
||||||
|
#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
|
||||||
|
#define MULTIBOOT_TAG_TYPE_APM 10
|
||||||
|
#define MULTIBOOT_TAG_TYPE_EFI32 11
|
||||||
|
#define MULTIBOOT_TAG_TYPE_EFI64 12
|
||||||
|
#define MULTIBOOT_TAG_TYPE_SMBIOS 13
|
||||||
|
#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
|
||||||
|
#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
|
||||||
|
#define MULTIBOOT_TAG_TYPE_NETWORK 16
|
||||||
|
#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
|
||||||
|
#define MULTIBOOT_TAG_TYPE_EFI_BS 18
|
||||||
|
|
||||||
|
#define MULTIBOOT_HEADER_TAG_END 0
|
||||||
|
#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
|
||||||
|
#define MULTIBOOT_HEADER_TAG_ADDRESS 2
|
||||||
|
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
|
||||||
|
#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
|
||||||
|
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
|
||||||
|
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
|
||||||
|
#define MULTIBOOT_HEADER_TAG_EFI_BS 7
|
||||||
|
|
||||||
|
#define MULTIBOOT_ARCHITECTURE_I386 0
|
||||||
|
#define MULTIBOOT_ARCHITECTURE_MIPS32 4
|
||||||
|
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
|
||||||
|
|
||||||
|
#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
|
||||||
|
#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
|
||||||
|
|
||||||
|
#ifndef ASM_FILE
|
||||||
|
|
||||||
|
typedef unsigned char multiboot_uint8_t;
|
||||||
|
typedef unsigned short multiboot_uint16_t;
|
||||||
|
typedef unsigned int multiboot_uint32_t;
|
||||||
|
typedef unsigned long long multiboot_uint64_t;
|
||||||
|
|
||||||
|
struct multiboot_header
|
||||||
|
{
|
||||||
|
/* Must be MULTIBOOT_MAGIC - see above. */
|
||||||
|
multiboot_uint32_t magic;
|
||||||
|
|
||||||
|
/* ISA */
|
||||||
|
multiboot_uint32_t architecture;
|
||||||
|
|
||||||
|
/* Total header length. */
|
||||||
|
multiboot_uint32_t header_length;
|
||||||
|
|
||||||
|
/* The above fields plus this one must equal 0 mod 2^32. */
|
||||||
|
multiboot_uint32_t checksum;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_information_request
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t requests[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_address
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t header_addr;
|
||||||
|
multiboot_uint32_t load_addr;
|
||||||
|
multiboot_uint32_t load_end_addr;
|
||||||
|
multiboot_uint32_t bss_end_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_entry_address
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t entry_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_console_flags
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t console_flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_framebuffer
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t width;
|
||||||
|
multiboot_uint32_t height;
|
||||||
|
multiboot_uint32_t depth;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_header_tag_module_align
|
||||||
|
{
|
||||||
|
multiboot_uint16_t type;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_color
|
||||||
|
{
|
||||||
|
multiboot_uint8_t red;
|
||||||
|
multiboot_uint8_t green;
|
||||||
|
multiboot_uint8_t blue;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_mmap_entry
|
||||||
|
{
|
||||||
|
multiboot_uint64_t addr;
|
||||||
|
multiboot_uint64_t len;
|
||||||
|
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
||||||
|
#define MULTIBOOT_MEMORY_RESERVED 2
|
||||||
|
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
|
||||||
|
#define MULTIBOOT_MEMORY_NVS 4
|
||||||
|
#define MULTIBOOT_MEMORY_BADRAM 5
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t zero;
|
||||||
|
} GRUB_PACKED;
|
||||||
|
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
||||||
|
|
||||||
|
struct multiboot_tag
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_string
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
char string[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_module
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t mod_start;
|
||||||
|
multiboot_uint32_t mod_end;
|
||||||
|
char cmdline[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_basic_meminfo
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t mem_lower;
|
||||||
|
multiboot_uint32_t mem_upper;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_bootdev
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t biosdev;
|
||||||
|
multiboot_uint32_t slice;
|
||||||
|
multiboot_uint32_t part;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_mmap
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t entry_size;
|
||||||
|
multiboot_uint32_t entry_version;
|
||||||
|
struct multiboot_mmap_entry entries[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_vbe_info_block
|
||||||
|
{
|
||||||
|
multiboot_uint8_t external_specification[512];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_vbe_mode_info_block
|
||||||
|
{
|
||||||
|
multiboot_uint8_t external_specification[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_vbe
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
|
||||||
|
multiboot_uint16_t vbe_mode;
|
||||||
|
multiboot_uint16_t vbe_interface_seg;
|
||||||
|
multiboot_uint16_t vbe_interface_off;
|
||||||
|
multiboot_uint16_t vbe_interface_len;
|
||||||
|
|
||||||
|
struct multiboot_vbe_info_block vbe_control_info;
|
||||||
|
struct multiboot_vbe_mode_info_block vbe_mode_info;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_framebuffer_common
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
|
||||||
|
multiboot_uint64_t framebuffer_addr;
|
||||||
|
multiboot_uint32_t framebuffer_pitch;
|
||||||
|
multiboot_uint32_t framebuffer_width;
|
||||||
|
multiboot_uint32_t framebuffer_height;
|
||||||
|
multiboot_uint8_t framebuffer_bpp;
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
|
||||||
|
multiboot_uint8_t framebuffer_type;
|
||||||
|
multiboot_uint16_t reserved;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_framebuffer
|
||||||
|
{
|
||||||
|
struct multiboot_tag_framebuffer_common common;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
multiboot_uint16_t framebuffer_palette_num_colors;
|
||||||
|
struct multiboot_color framebuffer_palette[0];
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
multiboot_uint8_t framebuffer_red_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_red_mask_size;
|
||||||
|
multiboot_uint8_t framebuffer_green_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_green_mask_size;
|
||||||
|
multiboot_uint8_t framebuffer_blue_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_blue_mask_size;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_elf_sections
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t num;
|
||||||
|
multiboot_uint32_t entsize;
|
||||||
|
multiboot_uint32_t shndx;
|
||||||
|
char sections[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_apm
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint16_t version;
|
||||||
|
multiboot_uint16_t cseg;
|
||||||
|
multiboot_uint32_t offset;
|
||||||
|
multiboot_uint16_t cseg_16;
|
||||||
|
multiboot_uint16_t dseg;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint16_t cseg_len;
|
||||||
|
multiboot_uint16_t cseg_16_len;
|
||||||
|
multiboot_uint16_t dseg_len;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_efi32
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t pointer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_efi64
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint64_t pointer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_smbios
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint8_t major;
|
||||||
|
multiboot_uint8_t minor;
|
||||||
|
multiboot_uint8_t reserved[6];
|
||||||
|
multiboot_uint8_t tables[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_old_acpi
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint8_t rsdp[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_new_acpi
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint8_t rsdp[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_network
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint8_t dhcpack[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_tag_efi_mmap
|
||||||
|
{
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t descr_size;
|
||||||
|
multiboot_uint32_t descr_vers;
|
||||||
|
multiboot_uint8_t efi_mmap[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* ! ASM_FILE */
|
||||||
|
|
||||||
|
#endif /* ! MULTIBOOT_HEADER */
|
@ -37,6 +37,6 @@ extern void KAPI hal_halt_cpu(void);
|
|||||||
// hal memory
|
// hal memory
|
||||||
|
|
||||||
//debug
|
//debug
|
||||||
extern void KAPI BOCHS_MAGIC_BREAKPOINT();
|
extern void KAPI hal_bochs_magic_breakpoint();
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef _K_INTR_H_
|
#ifndef _K_INTR_H_
|
||||||
#define _K_INTR_H_
|
#define _K_INTR_H_
|
||||||
#include "k_type.h"
|
#include "k_type.h"
|
||||||
|
#include "k_def.h"
|
||||||
|
|
||||||
typedef uint64_t irql_t;
|
typedef uint64_t irql_t;
|
||||||
|
|
||||||
@ -9,6 +10,11 @@ typedef uint64_t irql_t;
|
|||||||
#define IRQL_KERNEL 3
|
#define IRQL_KERNEL 3
|
||||||
#define IRQL_USER 4
|
#define IRQL_USER 4
|
||||||
|
|
||||||
|
void KAPI k_set_interrupt_handler(uint64_t index, void (*handler)(void));
|
||||||
|
|
||||||
|
void KAPI k_disable_interrupt();
|
||||||
|
|
||||||
|
void KAPI k_enable_interrupt();
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -18,6 +18,9 @@ void KAPI kmain(void *multiboot_info)
|
|||||||
avl_tree_test();
|
avl_tree_test();
|
||||||
salloc_test();
|
salloc_test();
|
||||||
|
|
||||||
|
hal_printf("KRNL: Kernel task finished.");
|
||||||
|
hal_halt_cpu();
|
||||||
|
|
||||||
if(boot_info->mem_info != NULL)
|
if(boot_info->mem_info != NULL)
|
||||||
{
|
{
|
||||||
hal_printf("Installed Memory: %uB\n", boot_info->mem_info->mem_installed);
|
hal_printf("Installed Memory: %uB\n", boot_info->mem_info->mem_installed);
|
||||||
@ -48,10 +51,10 @@ void KAPI kmain(void *multiboot_info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup interrupt
|
// setup interrupt
|
||||||
for(uint64_t i = 0; i <= 21; i++)
|
// for(uint64_t i = 0; i <= 21; i++)
|
||||||
{
|
// {
|
||||||
hal_set_interrupt_handler(i, hal_interrupt_handler_wrapper);
|
// hal_set_interrupt_handler(i, hal_interrupt_handler_wrapper);
|
||||||
}
|
// }
|
||||||
// hal_enable_interrupt();
|
// hal_enable_interrupt();
|
||||||
|
|
||||||
hal_printf("KRNL: Kernel task finished.");
|
hal_printf("KRNL: Kernel task finished.");
|
17
x64/src/kernel/k_intr.c
Normal file
17
x64/src/kernel/k_intr.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "k_intr.h"
|
||||||
|
#include "k_hal.h"
|
||||||
|
|
||||||
|
void KAPI k_set_interrupt_handler(uint64_t index, void (*handler)(void))
|
||||||
|
{
|
||||||
|
hal_set_interrupt_handler(index, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KAPI k_disable_interrupt()
|
||||||
|
{
|
||||||
|
hal_disable_interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KAPI k_enable_interrupt()
|
||||||
|
{
|
||||||
|
hal_disable_interrupt();
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
#include "hal_print.h"
|
#include "hal_print.h"
|
||||||
#include "k_test_driver.h"
|
#include "k_test_driver.h"
|
||||||
#include "k_type.h"
|
|
||||||
#include "hal_mem.h"
|
#include "hal_mem.h"
|
||||||
|
|
||||||
#define GAT_SIZE 256
|
#define GAT_SIZE 256
|
Loading…
Reference in New Issue
Block a user