fixing base setup
This commit is contained in:
0
src/OSDev_18/src/kernel.c
Normal file
0
src/OSDev_18/src/kernel.c
Normal file
137
src/group_name/CMakeLists.txt
Normal file
137
src/group_name/CMakeLists.txt
Normal file
@@ -0,0 +1,137 @@
|
||||
########################################
|
||||
# The University of Agder Operating System: UiAOS
|
||||
# Languages: C, C++, and NASM Assembly
|
||||
# Tip: Use Ctrl+Shift+P in Visual Studio Code to get started with CMake.
|
||||
########################################
|
||||
|
||||
# Skip compiler self-tests (saves time, avoids errors with some cross compilers)
|
||||
set(CMAKE_C_COMPILER_WORKS 1)
|
||||
set(CMAKE_CXX_COMPILER_WORKS 1)
|
||||
|
||||
# Minimum required CMake version
|
||||
cmake_minimum_required(VERSION 3.22.1)
|
||||
|
||||
# Project name and languages used
|
||||
project(UiAOS LANGUAGES C CXX ASM_NASM)
|
||||
|
||||
# Create a lock file to prevent parallel runs of CMake
|
||||
file(LOCK ${CMAKE_SOURCE_DIR} DIRECTORY GUARD FILE)
|
||||
|
||||
########################################
|
||||
# CMake: Import Plugins
|
||||
########################################
|
||||
include(FetchContent)
|
||||
|
||||
########################################
|
||||
# UiAOS: Variables
|
||||
########################################
|
||||
set(OS_ARCH_TARGET "i386") # x86_64
|
||||
set(OS_NAME "UiA Operating System")
|
||||
set(OS_KERNEL_NAME "uiaos")
|
||||
set(OS_KERNEL_BINARY "kernel.bin")
|
||||
set(OS_KERNEL_IMAGE "kernel.iso")
|
||||
|
||||
########################################
|
||||
# Compiler Configuration
|
||||
########################################
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
||||
########################################
|
||||
# Assembly Configuration
|
||||
########################################
|
||||
set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS "s;S;asm")
|
||||
if(OS_ARCH_TARGET STREQUAL "i386")
|
||||
set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf32")
|
||||
elseif(OS_ARCH_TARGET STREQUAL "x86_64")
|
||||
set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf64")
|
||||
endif()
|
||||
|
||||
# Command to compile NASM files
|
||||
set(CMAKE_ASM_NASM_COMPILE_OBJECT
|
||||
"<CMAKE_ASM_NASM_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o <OBJECT> <SOURCE>")
|
||||
|
||||
########################################
|
||||
# OS Target
|
||||
########################################
|
||||
set(OS_KERNEL_LINKER "${CMAKE_CURRENT_SOURCE_DIR}/src/arch/${OS_ARCH_TARGET}/linker.ld")
|
||||
|
||||
# Add executable target for the kernel
|
||||
add_executable(uiaos-kernel
|
||||
# src/multiboot2.asm # TODO: Add multiboot2 support
|
||||
src/kernel.c
|
||||
)
|
||||
|
||||
# Include directories for the kernel target
|
||||
target_include_directories(uiaos-kernel PUBLIC include)
|
||||
|
||||
|
||||
# Specify compile options for C and C++
|
||||
target_compile_options(uiaos-kernel PRIVATE
|
||||
$<$<COMPILE_LANGUAGE:C>:-Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -Wno-main -g>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:-Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -g>
|
||||
$<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-m32 -march=i386 -Wno-unused-variable -Wno-unused-parameter>
|
||||
)
|
||||
|
||||
|
||||
# Specify link options for C and C++
|
||||
target_link_options(uiaos-kernel PUBLIC
|
||||
$<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-ffreestanding -nostdlib -fno-builtin -static -pie -O0 -T${OS_KERNEL_LINKER} -g>
|
||||
)
|
||||
|
||||
|
||||
target_link_options(
|
||||
uiaos-kernel
|
||||
PUBLIC "-ffreestanding"
|
||||
PUBLIC "-nostdlib"
|
||||
PUBLIC "-static"
|
||||
PUBLIC "-pie"
|
||||
PUBLIC "-T${OS_KERNEL_LINKER}"
|
||||
)
|
||||
|
||||
|
||||
# Set properties for the kernel target
|
||||
set_target_properties(uiaos-kernel PROPERTIES
|
||||
OUTPUT_NAME "${OS_KERNEL_BINARY}"
|
||||
#LINK_FLAGS "${OS_KERNEL_LINK_FLAGS}"
|
||||
)
|
||||
|
||||
########################################
|
||||
# Create Empty Fat32 Disk Image
|
||||
########################################
|
||||
set(DISK_IMAGE "${CMAKE_CURRENT_BINARY_DIR}/disk.iso")
|
||||
|
||||
# Custom target to create an empty FAT32 disk image of 32MB
|
||||
add_custom_target(
|
||||
create-fat32-disk
|
||||
COMMAND dd if=/dev/zero of=${DISK_IMAGE} bs=1M count=32
|
||||
COMMAND mkfs.fat -F 32 ${DISK_IMAGE}
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
########################################
|
||||
# OS-Image Target
|
||||
########################################
|
||||
set(ISO_DIR ${CMAKE_CURRENT_BINARY_DIR}/iso)
|
||||
set(LIMINE_CONFIG_DIR ${CMAKE_SOURCE_DIR})
|
||||
set(LIMINE_DIR /usr/local/limine)
|
||||
add_custom_target(
|
||||
uiaos-create-image
|
||||
COMMAND rm -rf ${ISO_DIR}
|
||||
COMMAND mkdir -p ${ISO_DIR}
|
||||
COMMAND cp -v $<TARGET_FILE:uiaos-kernel>
|
||||
${LIMINE_CONFIG_DIR}/limine.cfg ${LIMINE_DIR}/limine-bios.sys ${LIMINE_DIR}/limine-bios-cd.bin
|
||||
${LIMINE_DIR}/limine-uefi-cd.bin ${ISO_DIR}/
|
||||
COMMAND mkdir -p ${ISO_DIR}/EFI/BOOT
|
||||
COMMAND cp -v ${LIMINE_DIR}/BOOTX64.EFI ${ISO_DIR}/EFI/BOOT/
|
||||
COMMAND cp -v ${LIMINE_DIR}/BOOTIA32.EFI ${ISO_DIR}/EFI/BOOT/
|
||||
COMMAND xorriso -as mkisofs -b limine-bios-cd.bin
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table
|
||||
--efi-boot limine-uefi-cd.bin
|
||||
-efi-boot-part --efi-boot-image --protective-msdos-label
|
||||
${ISO_DIR} -o ${CMAKE_CURRENT_BINARY_DIR}/kernel.iso
|
||||
COMMAND ${LIMINE_DIR}/limine bios-install ${CMAKE_CURRENT_BINARY_DIR}/kernel.iso
|
||||
#COMMAND sudo rm -rf ${ISO_DIR}
|
||||
DEPENDS create-fat32-disk uiaos-kernel
|
||||
VERBATIM
|
||||
)
|
||||
0
src/group_name/README.md
Normal file
0
src/group_name/README.md
Normal file
4
src/group_name/include/libc/limits.h
Normal file
4
src/group_name/include/libc/limits.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#define INT_MAX 2147483647
|
||||
|
||||
14
src/group_name/include/libc/stdarg.h
Normal file
14
src/group_name/include/libc/stdarg.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
// va_list
|
||||
typedef __builtin_va_list va_list;
|
||||
|
||||
// va_start
|
||||
#define va_start(v, l) __builtin_va_start(v, l)
|
||||
|
||||
// va_end
|
||||
#define va_end(v) __builtin_va_end(v)
|
||||
|
||||
// va_arg
|
||||
#define va_arg(v, l) __builtin_va_arg(v, l)
|
||||
|
||||
5
src/group_name/include/libc/stdbool.h
Normal file
5
src/group_name/include/libc/stdbool.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#define bool unsigned char
|
||||
#define true 1
|
||||
#define false 0
|
||||
3
src/group_name/include/libc/stddef.h
Normal file
3
src/group_name/include/libc/stddef.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#define NULL ((void*)0)
|
||||
10
src/group_name/include/libc/stdint.h
Normal file
10
src/group_name/include/libc/stdint.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
typedef long unsigned int size_t;
|
||||
typedef long unsigned int uint32_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef long int int32_t;
|
||||
typedef short int16_t;
|
||||
typedef signed char int8_t;
|
||||
5
src/group_name/include/libc/stdio.h
Normal file
5
src/group_name/include/libc/stdio.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
int putchar(int ic);
|
||||
bool print(const char* data, size_t length);
|
||||
int printf(const char* __restrict__ format, ...);
|
||||
4
src/group_name/include/libc/string.h
Normal file
4
src/group_name/include/libc/string.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
size_t strlen(const char* str);
|
||||
417
src/group_name/include/multiboot2.h
Normal file
417
src/group_name/include/multiboot2.h
Normal file
@@ -0,0 +1,417 @@
|
||||
/* 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_TAG_TYPE_EFI32_IH 19
|
||||
#define MULTIBOOT_TAG_TYPE_EFI64_IH 20
|
||||
#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
|
||||
|
||||
#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_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
|
||||
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
|
||||
#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
|
||||
|
||||
#define MULTIBOOT_ARCHITECTURE_I386 0
|
||||
#define MULTIBOOT_ARCHITECTURE_MIPS32 4
|
||||
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
|
||||
|
||||
#define MULTIBOOT_LOAD_PREFERENCE_NONE 0
|
||||
#define MULTIBOOT_LOAD_PREFERENCE_LOW 1
|
||||
#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
|
||||
|
||||
#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_header_tag_relocatable
|
||||
{
|
||||
multiboot_uint16_t type;
|
||||
multiboot_uint16_t flags;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t min_addr;
|
||||
multiboot_uint32_t max_addr;
|
||||
multiboot_uint32_t align;
|
||||
multiboot_uint32_t preference;
|
||||
};
|
||||
|
||||
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;
|
||||
};
|
||||
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];
|
||||
};
|
||||
|
||||
struct multiboot_tag_efi32_ih
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t pointer;
|
||||
};
|
||||
|
||||
struct multiboot_tag_efi64_ih
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint64_t pointer;
|
||||
};
|
||||
|
||||
struct multiboot_tag_load_base_addr
|
||||
{
|
||||
multiboot_uint32_t type;
|
||||
multiboot_uint32_t size;
|
||||
multiboot_uint32_t load_base_addr;
|
||||
};
|
||||
|
||||
#endif /* ! ASM_FILE */
|
||||
|
||||
#endif /* ! MULTIBOOT_HEADER */
|
||||
19
src/group_name/limine.cfg
Normal file
19
src/group_name/limine.cfg
Normal file
@@ -0,0 +1,19 @@
|
||||
# Timeout in seconds that Limine will use before automatically booting.
|
||||
TIMEOUT=5
|
||||
|
||||
# The entry name that will be displayed in the boot menu.
|
||||
:UiA OS (KASLR on)
|
||||
# We use the Limine boot protocol.
|
||||
PROTOCOL=multiboot2
|
||||
|
||||
# Path to the kernel to boot. boot:/// represents the partition on which limine.cfg is located.
|
||||
KERNEL_PATH=boot:///kernel.bin
|
||||
|
||||
# Same thing, but without KASLR.
|
||||
:UiA OS (KASLR off)
|
||||
PROTOCOL=multiboot2
|
||||
|
||||
# Disable KASLR (it is enabled by default for relocatable kernels)
|
||||
KASLR=no
|
||||
|
||||
KERNEL_PATH=boot:///kernel.bin
|
||||
39
src/group_name/scripts/start_qemu.sh
Normal file
39
src/group_name/scripts/start_qemu.sh
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
KERNEL_PATH=$1
|
||||
DISK_PATH=$2
|
||||
|
||||
# Start QEMU in the background
|
||||
echo "Starting QEMU"
|
||||
qemu-system-i386 -S -gdb tcp::1234 -boot d -hda $KERNEL_PATH -hdb $DISK_PATH -m 64 -audiodev sdl,id=sdl1,out.buffer-length=40000 -machine pcspk-audiodev=sdl1 -serial pty &
|
||||
QEMU_PID=$!
|
||||
|
||||
# Function to check if gdb is running
|
||||
is_gdb_running() {
|
||||
pgrep -f "gdb-multiarch" > /dev/null
|
||||
}
|
||||
|
||||
# Function to handle termination signals
|
||||
cleanup() {
|
||||
echo "Stopping QEMU..."
|
||||
kill $QEMU_PID
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Trap SIGINT and SIGTERM signals
|
||||
trap cleanup SIGINT SIGTERM
|
||||
|
||||
# Wait for gdb to start
|
||||
echo "Waiting for gdb to start..."
|
||||
while ! is_gdb_running; do
|
||||
sleep 1
|
||||
done
|
||||
echo "gdb started."
|
||||
|
||||
# Wait for gdb to stop
|
||||
echo "Monitoring gdb connection..."
|
||||
while is_gdb_running; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# Cleanup after gdb stops
|
||||
cleanup
|
||||
0
src/group_name/src/README.md
Normal file
0
src/group_name/src/README.md
Normal file
0
src/group_name/src/arch/i386/README.md
Normal file
0
src/group_name/src/arch/i386/README.md
Normal file
37
src/group_name/src/arch/i386/linker.ld
Normal file
37
src/group_name/src/arch/i386/linker.ld
Normal file
@@ -0,0 +1,37 @@
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS {
|
||||
. = 1M;
|
||||
|
||||
.boot :
|
||||
{
|
||||
/* Ensure that the multiboot header is at the beginning! */
|
||||
*(.multiboot_header)
|
||||
}
|
||||
|
||||
. = ALIGN(4K);
|
||||
.text :
|
||||
{
|
||||
*(.text .text.*)
|
||||
}
|
||||
|
||||
. = ALIGN(4K);
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata .rodata.*)
|
||||
}
|
||||
|
||||
. = ALIGN(4K);
|
||||
.data :
|
||||
{
|
||||
*(.data .data.*)
|
||||
}
|
||||
|
||||
. = ALIGN(4K);
|
||||
.bss :
|
||||
{
|
||||
*(.bss .bss.*)
|
||||
}
|
||||
|
||||
end = .; _end = .; __end = .;
|
||||
}
|
||||
0
src/group_name/src/arch/x86_64/README.md
Normal file
0
src/group_name/src/arch/x86_64/README.md
Normal file
63
src/group_name/src/arch/x86_64/linker.ld
Normal file
63
src/group_name/src/arch/x86_64/linker.ld
Normal file
@@ -0,0 +1,63 @@
|
||||
/* Tell the linker that we want an x86_64 ELF64 output file */
|
||||
OUTPUT_FORMAT(elf64-x86-64)
|
||||
OUTPUT_ARCH(i386:x86-64)
|
||||
|
||||
/* We want the symbol _start to be our entry point */
|
||||
ENTRY(_start)
|
||||
|
||||
/* Define the program headers we want so the bootloader gives us the right */
|
||||
/* MMU permissions */
|
||||
PHDRS
|
||||
{
|
||||
text PT_LOAD FLAGS((1 << 0) | (1 << 2)) ; /* Execute + Read */
|
||||
rodata PT_LOAD FLAGS((1 << 2)) ; /* Read only */
|
||||
data PT_LOAD FLAGS((1 << 1) | (1 << 2)) ; /* Write + Read */
|
||||
dynamic PT_DYNAMIC FLAGS((1 << 1) | (1 << 2)) ; /* Dynamic PHDR for relocations */
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
/* We wanna be placed in the topmost 2GiB of the address space, for optimisations */
|
||||
/* and because that is what the Limine spec mandates. */
|
||||
/* Any address in this region will do, but often 0xffffffff80000000 is chosen as */
|
||||
/* that is the beginning of the region. */
|
||||
. = 0xffffffff80000000;
|
||||
|
||||
.text : {
|
||||
*(.text .text.*)
|
||||
} :text
|
||||
|
||||
/* Move to the next memory page for .rodata */
|
||||
. += CONSTANT(MAXPAGESIZE);
|
||||
|
||||
.rodata : {
|
||||
*(.rodata .rodata.*)
|
||||
} :rodata
|
||||
|
||||
/* Move to the next memory page for .data */
|
||||
. += CONSTANT(MAXPAGESIZE);
|
||||
|
||||
.data : {
|
||||
*(.data .data.*)
|
||||
} :data
|
||||
|
||||
/* Dynamic section for relocations, both in its own PHDR and inside data PHDR */
|
||||
.dynamic : {
|
||||
*(.dynamic)
|
||||
} :data :dynamic
|
||||
|
||||
/* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */
|
||||
/* unnecessary zeros will be written to the binary. */
|
||||
/* If you need, for example, .init_array and .fini_array, those should be placed */
|
||||
/* above this. */
|
||||
.bss : {
|
||||
*(.bss .bss.*)
|
||||
*(COMMON)
|
||||
} :data
|
||||
|
||||
/* Discard .note.* and .eh_frame since they may cause issues on some hosts. */
|
||||
/DISCARD/ : {
|
||||
*(.eh_frame)
|
||||
*(.note .note.*)
|
||||
}
|
||||
}
|
||||
45
src/group_name/src/multiboot2.asm
Normal file
45
src/group_name/src/multiboot2.asm
Normal file
@@ -0,0 +1,45 @@
|
||||
extern main
|
||||
|
||||
global _start
|
||||
|
||||
section .multiboot_header
|
||||
header_start:
|
||||
dd 0xe85250d6 ; Magic number (multiboot 2)
|
||||
dd 0 ; Architecture 0 (protected mode i386)
|
||||
dd header_end - header_start ; Header length
|
||||
dd 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start)) ; Checksum
|
||||
|
||||
;align 8
|
||||
;framebuffer_tag_start:
|
||||
; dw 5 ; type
|
||||
; dw 1 ; flags
|
||||
; dd framebuffer_tag_end - framebuffer_tag_start ; size
|
||||
; dd 800 ; width
|
||||
; dd 600 ; height
|
||||
; dd 32 ; depth
|
||||
;framebuffer_tag_end:
|
||||
|
||||
align 8
|
||||
; Required end tag:
|
||||
dw 0 ; type
|
||||
dw 0 ; flags
|
||||
dw 8 ; size
|
||||
header_end:
|
||||
|
||||
section .text
|
||||
bits 32
|
||||
|
||||
_start:
|
||||
cli
|
||||
|
||||
mov esp, stack_top
|
||||
|
||||
push ebx
|
||||
push eax
|
||||
|
||||
call main ; Jump main function
|
||||
|
||||
section .bss
|
||||
stack_bottom:
|
||||
resb 4096 * 16
|
||||
stack_top:
|
||||
Reference in New Issue
Block a user