Skip to content
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@
/qemu_log.txt
/tar
/src/oboskrnl/inc/*
/.cache
/.clangd
/config/initrd.tar
4 changes: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CMakeLists.txt
#
# Copyright (c) 2024 Omar Berrow
# Copyright (c) 2024-2025 Omar Berrow

cmake_minimum_required(VERSION 3.10)

Expand All @@ -16,6 +16,7 @@ option (OBOS_NVS_SAVE_S3 "Enable compile-time support for saving NVS before S3"
option (OBOS_ENABLE_LOCK_PROFILING "(Experimental) Enable profiling for locks.")
option (OBOS_ENABLE_PROFILER "(Experimental) Enable profiling.")
option (OBOS_LAZY_IRQL "Enables lazy IRQL. Recommended if the main target of the kernel is hypervisors, where writing to cr8 is slooow.")
option (OBOS_USE_OBOS_GCC "Uses arch-obos-gcc instead of obos-elf-gcc. Ignored if OBOS_USE_CLANG is true.")

# String options

Expand Down Expand Up @@ -219,4 +220,5 @@ add_subdirectory("src/drivers/generic/initrd")
add_subdirectory("src/drivers/generic/slowfat")
add_subdirectory("src/drivers/test_driver")
add_subdirectory("src/drivers/generic/ahci")
add_subdirectory("src/drivers/generic/r8169")
add_subdirectory("src/isogen")
2 changes: 1 addition & 1 deletion dependencies/uacpi.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# dependencies/uacpi.cmake

# Copyright (c) 2024 Omar Berrow
# Copyright (c) 2024-2025 Omar Berrow

if (OBOS_REFRESH_DEPENDENCIES)
include(FetchContent)
Expand Down
1 change: 1 addition & 0 deletions scripts/generate_initrd-x86_64.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ cp out/ahci tar
# rm tar/ahci
cp out/slowfat tar
cp out/bochs_vbe tar
cp out/r8169 tar
#cp out/init tar
if [[ ! -d tar/dev ]]
then
Expand Down
1 change: 0 additions & 1 deletion scripts/launch_qemu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ rm qemu_log.txt
echo $@
qemu-system-x86_64 \
-drive format=raw,file=out/obos.iso,media=disk,index=0 \
-drive format=raw,file=disk.img,media=disk,index=1 \
-m 2G \
-gdb tcp:0.0.0.0:1234 -S \
-M q35 \
Expand Down
129 changes: 65 additions & 64 deletions src/build/x86_64/toolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,44 @@ set(CMAKE_SYSTEM_NAME "Generic")
set(CMAKE_SYSTEM_PROCESSOR "x86-64")

if (NOT OBOS_USE_CLANG)
find_program(HAS_CROSS_COMPILER "x86_64-elf-g++")
if (NOT HAS_CROSS_COMPILER)
message(FATAL_ERROR "No x86_64-elf cross compiler in the PATH!")
endif()

set(CMAKE_C_COMPILER "x86_64-elf-gcc")
set(CMAKE_CXX_COMPILER "x86_64-elf-g++")
set(CMAKE_C_COMPILER_WORKS true)
set(CMAKE_CXX_COMPILER_WORKS true)
if (NOT OBOS_USE_OBOS_GCC)
set(CMAKE_C_COMPILER "x86_64-elf-gcc")
set(CMAKE_CXX_COMPILER "x86_64-elf-g++")
else()
set(CMAKE_C_COMPILER "x86_64-obos-gcc")
set(CMAKE_CXX_COMPILER "x86_64-obos-g++")
endif()

find_program(HAS_CROSS_COMPILER ${CMAKE_C_COMPILER})
if (NOT HAS_CROSS_COMPILER)
message(FATAL_ERROR "No ${CMAKE_C_COMPILER} cross compiler in the PATH!")
endif()

set(CMAKE_C_COMPILER_WORKS true)
set(CMAKE_CXX_COMPILER_WORKS true)
else()
set (CMAKE_C_COMPILER "clang${OBOS_CLANG_SUFFIX}")
set (CMAKE_CXX_COMPILER "clang++${OBOS_CLANG_SUFFIX}")

add_compile_options(
$<$<COMPILE_LANGUAGE:C,CXX>:-target>
$<$<COMPILE_LANGUAGE:C,CXX>:x86_64-unknown-linux-elf>
$<$<COMPILE_LANGUAGE:C,CXX>:-mstack-protector-guard-offset=552>
$<$<COMPILE_LANGUAGE:C,CXX>:-mstack-protector-guard-reg=gs>
)

add_link_options("-static" "-target" "x86_64-unknown-linux-elf" "-ffreestanding")

if (CMAKE_HOST_UNIX)
set (LLD "ld.lld${OBOS_CLANG_SUFFIX}")
elseif(CMAKE_HOST_WIN32)
set (LLD "lld-link${OBOS_CLANG_SUFFIX}")
endif()

find_program(HAS_LLD ${LLD})
if (HAS_LLD)
add_link_options("-fuse-ld=lld")
endif()
set (CMAKE_C_COMPILER "clang${OBOS_CLANG_SUFFIX}")
set (CMAKE_CXX_COMPILER "clang++${OBOS_CLANG_SUFFIX}")

add_compile_options(
$<$<COMPILE_LANGUAGE:C,CXX>:-target>
$<$<COMPILE_LANGUAGE:C,CXX>:x86_64-unknown-linux-elf>
$<$<COMPILE_LANGUAGE:C,CXX>:-mstack-protector-guard-offset=552>
$<$<COMPILE_LANGUAGE:C,CXX>:-mstack-protector-guard-reg=gs>
)

add_link_options("-static" "-target" "x86_64-unknown-linux-elf" "-ffreestanding")

if (CMAKE_HOST_UNIX)
set (LLD "ld.lld${OBOS_CLANG_SUFFIX}")
elseif(CMAKE_HOST_WIN32)
set (LLD "lld-link${OBOS_CLANG_SUFFIX}")
endif()

find_program(HAS_LLD ${LLD})
if (HAS_LLD)
add_link_options("-fuse-ld=lld")
endif()
endif()

set(CMAKE_ASM_NASM_COMPILER "nasm")
Expand All @@ -46,45 +52,40 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf64")

execute_process(COMMAND x86_64-elf-gcc -print-file-name=no-red-zone/libgcc.a OUTPUT_VARIABLE LIBGCC)
if (LIBGCC STREQUAL "no-red-zone/libgcc.a" OR LIBGCC STREQUAL "")
# Use normal libgcc
execute_process(COMMAND x86_64-elf-gcc -print-file-name=libgcc.a OUTPUT_VARIABLE LIBGCC)
if (NOT OBOS_USE_CLANG)
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=no-red-zone/libgcc.a OUTPUT_VARIABLE LIBGCC)
string(STRIP "${LIBGCC}" LIBGCC)
if ("${LIBGCC}" STREQUAL "no-red-zone/libgcc.a")
# Use normal libgcc
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libgcc.a OUTPUT_VARIABLE LIBGCC)
endif()

string(STRIP "${LIBGCC}" LIBGCC)
set (OBJCOPY "objcopy")
else()
set (OBJCOPY "llvm-objcopy")
endif()

string(STRIP "${LIBGCC}" LIBGCC)

find_program(HAS_x86_64_elf_objcopy "x86_64-elf-objcopy")
find_program(HAS_x86_64_elf_nm "x86_64-elf-nm")
if (HAS_x86_64_elf_objcopy)
set(OBJCOPY "x86_64-elf-objcopy")
else()
set(OBJCOPY "objcopy")
endif()
if (HAS_x86_64_elf_nm)
set(NM "x86_64-elf-nm")
else()
set(NM "nm")
endif()
set(TARGET_COMPILE_OPTIONS_C -mno-red-zone -fno-omit-frame-pointer -mgeneral-regs-only -mcmodel=kernel -march=x86-64-v2)
set(TARGET_DRIVER_COMPILE_OPTIONS_C -mno-red-zone -fno-omit-frame-pointer -mgeneral-regs-only -march=x86-64-v2)
set(TARGET_LINKER_OPTIONS -mcmodel=kernel)
set(TARGET_DRIVER_LINKER_OPTIONS)

set(gdbstub_source
# "arch/x86_64/gdbstub/connection.c" "arch/x86_64/gdbstub/alloc.c" "arch/x86_64/gdbstub/packet_dispatcher.c"
# "arch/x86_64/gdbstub/general_query.c" "arch/x86_64/gdbstub/debug.c" "arch/x86_64/gdbstub/stop_reply.c" "arch/x86_64/gdbstub/bp.c"
# "arch/x86_64/gdbstub/connection.c" "arch/x86_64/gdbstub/alloc.c" "arch/x86_64/gdbstub/packet_dispatcher.c"
# "arch/x86_64/gdbstub/general_query.c" "arch/x86_64/gdbstub/debug.c" "arch/x86_64/gdbstub/stop_reply.c" "arch/x86_64/gdbstub/bp.c"
)

list (APPEND oboskrnl_sources
"arch/x86_64/entry.asm" "arch/x86_64/entry.c" "arch/x86_64/bgdt.asm" "arch/x86_64/idt.c"
"arch/x86_64/asm_helpers.asm" "arch/x86_64/thread_ctx.asm" "arch/x86_64/memmanip.asm"
"arch/x86_64/pmm.c" "arch/x86_64/map.c" "arch/x86_64/isr.asm" "arch/x86_64/lapic.c"
"arch/x86_64/smp.c" "arch/x86_64/smp.asm" "arch/x86_64/lapic_timer_calibration.asm"
"arch/x86_64/ioapic.c" "arch/x86_64/drv_loader.c" "arch/x86_64/ssignal.c" "arch/x86_64/except.c"
"arch/x86_64/pci.c" "arch/x86_64/syscall.c" "arch/x86_64/syscall.asm" "arch/x86_64/wake.c"
"arch/x86_64/mtrr.c" "arch/x86_64/timer.c" "arch/x86_64/execve.c" "arch/x86_64/sse.c"
${gdbstub_source}
"arch/x86_64/entry.asm" "arch/x86_64/entry.c" "arch/x86_64/bgdt.asm" "arch/x86_64/idt.c"
"arch/x86_64/asm_helpers.asm" "arch/x86_64/thread_ctx.asm" "arch/x86_64/memmanip.asm"
"arch/x86_64/pmm.c" "arch/x86_64/map.c" "arch/x86_64/isr.asm" "arch/x86_64/lapic.c"
"arch/x86_64/smp.c" "arch/x86_64/smp.asm" "arch/x86_64/lapic_timer_calibration.asm"
"arch/x86_64/ioapic.c" "arch/x86_64/drv_loader.c" "arch/x86_64/ssignal.c" "arch/x86_64/except.c"
"arch/x86_64/pci.c" "arch/x86_64/syscall.c" "arch/x86_64/syscall.asm" "arch/x86_64/wake.c"
"arch/x86_64/mtrr.c" "arch/x86_64/timer.c" "arch/x86_64/execve.c" "arch/x86_64/sse.c"
${gdbstub_source}
)

# set_source_files_properties(
Expand All @@ -95,12 +96,12 @@ list (APPEND oboskrnl_sources
# )

add_compile_definitions(
__x86_64__=1
OBOS_PAGE_SIZE=4096 OBOS_HUGE_PAGE_SIZE=2097152
OBOS_KERNEL_ADDRESS_SPACE_BASE=0xffff900000000000 OBOS_KERNEL_ADDRESS_SPACE_LIMIT=0xfffffffffffff000
OBOS_USER_ADDRESS_SPACE_BASE=0x1000 OBOS_USER_ADDRESS_SPACE_LIMIT=0x7FFFFFFFFFFF
OBOS_ARCH_USES_SOFT_FLOAT=0
OBOS_ARCH_EMULATED_IRQL=0
__x86_64__=1
OBOS_PAGE_SIZE=4096 OBOS_HUGE_PAGE_SIZE=2097152
OBOS_KERNEL_ADDRESS_SPACE_BASE=0xffff900000000000 OBOS_KERNEL_ADDRESS_SPACE_LIMIT=0xfffffffffffff000
OBOS_USER_ADDRESS_SPACE_BASE=0x1000 OBOS_USER_ADDRESS_SPACE_LIMIT=0x7FFFFFFFFFFF
OBOS_ARCH_USES_SOFT_FLOAT=0
OBOS_ARCH_EMULATED_IRQL=0
)
add_compile_options($<$<CONFIG:Debug>:-g>)

Expand Down
3 changes: 2 additions & 1 deletion src/drivers/generic/ahci/main.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* drivers/generic/ahci/main.c
*
* Copyright (c) 2024 Omar Berrow
* Copyright (c) 2024-2025 Omar Berrow
*/

#include <int.h>
Expand Down Expand Up @@ -32,6 +32,7 @@

#include "command.h"
#include "ahci_irq.h"
#include "mm/page.h"
#include "structs.h"

#include <uacpi/namespace.h>
Expand Down
32 changes: 32 additions & 0 deletions src/drivers/generic/r8169/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# drivers/generic/r8169/CMakeLists.txt
#
# Copyright (c) 2025 Omar Berrow

add_executable(r8169 "main.c" "device.c")

target_compile_options(r8169
PRIVATE $<$<COMPILE_LANGUAGE:C>:${TARGET_DRIVER_COMPILE_OPTIONS_C}>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-ffreestanding>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-Wall>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-Wextra>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-fstack-protector-all>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-fno-builtin-memset>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-fvisibility=hidden>
PRIVATE $<$<COMPILE_LANGUAGE:C>:-fPIC>
)

set_property(TARGET r8169 PROPERTY link_depends ${DRIVER_LINKER_SCRIPT})

target_include_directories(r8169
PRIVATE "${CMAKE_SOURCE_DIR}/src/oboskrnl"
PRIVATE ${OBOSKRNL_EXTERNAL_INCLUDES})

target_link_options(r8169
PRIVATE "-nostdlib"
PRIVATE "-fPIC"
PRIVATE "-Wl,-shared"
# PRIVATE "-Wl,--allow-shlib-undefined"
PRIVATE "-T" PRIVATE ${DRIVER_LINKER_SCRIPT}
PRIVATE ${TARGET_DRIVER_LINKER_OPTIONS}
)
target_compile_definitions(r8169 PRIVATE OBOS_DRIVER=1)
Loading