From 2261985e7c22d19e47d3043f56b5fd352f9e958d Mon Sep 17 00:00:00 2001 From: hwacha Date: Mon, 20 Apr 2026 15:51:40 +0900 Subject: [PATCH] wip swift in kernel --- Kernel/CMakeLists.txt | 33 +++++++++++++++++++-- Kernel/Source/entry.S | 59 ++------------------------------------ Kernel/Source/kernel.swift | 22 ++++++++++++++ Kernel/Source/stubs.c | 38 ++++++++++++++++++++++++ Kernel/linker.ld | 14 +++++++++ 5 files changed, 108 insertions(+), 58 deletions(-) create mode 100644 Kernel/Source/kernel.swift create mode 100644 Kernel/Source/stubs.c diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 7d0c196..ac39306 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -1,6 +1,10 @@ cmake_minimum_required(VERSION 3.10) project(ksOSKernel LANGUAGES ASM C) +set(SWIFT_TOOLCHAIN "$ENV{HOME}/Library/Developer/Toolchains/swift-6.2.3-RELEASE.xctoolchain") +set(SWIFTC "${SWIFT_TOOLCHAIN}/usr/bin/swiftc") +set(SWIFT_RESOURCE_DIR "${SWIFT_TOOLCHAIN}/usr/lib/swift") + add_compile_options(-ffreestanding -nostdlib -O0 -g) set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld) @@ -11,8 +15,33 @@ add_link_options( -Wl,-T,${LINKER_SCRIPT} ) -add_executable(kernel.elf Source/entry.S) +set(SWIFT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Source/kernel.swift) +set(SWIFT_OBJ ${CMAKE_CURRENT_BINARY_DIR}/kernel_swift.o) + +add_custom_command( + OUTPUT ${SWIFT_OBJ} + COMMAND ${SWIFTC} + -target aarch64-none-none-elf + -enable-experimental-feature Embedded + -parse-as-library + -wmo + -O + -Xcc -fno-stack-protector + -resource-dir ${SWIFT_RESOURCE_DIR} + -c ${SWIFT_SOURCES} + -o ${SWIFT_OBJ} + DEPENDS ${SWIFT_SOURCES} + COMMENT "Compiling Swift kernel" +) + +set_source_files_properties(${SWIFT_OBJ} PROPERTIES + EXTERNAL_OBJECT TRUE + GENERATED TRUE +) + +add_executable(kernel.elf Source/entry.S Source/stubs.c ${SWIFT_OBJ}) + add_custom_command(TARGET kernel.elf POST_BUILD COMMAND ${LLVM_OBJCOPY} -O binary kernel.elf kernel.bin COMMENT "kernel.elf -> kernel.bin" -) \ No newline at end of file +) diff --git a/Kernel/Source/entry.S b/Kernel/Source/entry.S index c1179ce..2638f10 100644 --- a/Kernel/Source/entry.S +++ b/Kernel/Source/entry.S @@ -2,59 +2,6 @@ .global _start _start: - add x1, x0, #64 - ldr x2, [x1] // base - ldr x3, [x1, #16] // width - ldr x4, [x1, #24] // height - - mul x5, x3, x4 - mov x7, #5 - udiv x10, x5, x7 // stripe size - - // 0x00RRGGBB - // lblue: 5B CE FA - mov w11, #0xCEFA - movk w11, #0x5B, lsl #16 - - // pink: F5 A7 B8 - mov w12, #0xA7B8 - movk w12, #0xF5, lsl #16 - - // white: FF FF FF - mov w13, #0xFFFF - movk w13, #0xFF, lsl #16 - - mov x14, #0 // pixels in curr stripe - mov x15, #0 // stripe index - -fill_loop: - cbz x5, done - - cmp x15, #0 - b.eq set_blue - cmp x15, #1 - b.eq set_pink - cmp x15, #2 - b.eq set_white - cmp x15, #3 - b.eq set_pink - b set_blue - -set_blue: mov w6, w11; b draw -set_pink: mov w6, w12; b draw -set_white: mov w6, w13 - -draw: - str w6, [x2], #4 - sub x5, x5, #1 - add x14, x14, #1 - - cmp x14, x10 - b.lt fill_loop - - mov x14, #0 - add x15, x15, #1 - b fill_loop - -done: - b done \ No newline at end of file + bl kmain +.hang: + b .hang \ No newline at end of file diff --git a/Kernel/Source/kernel.swift b/Kernel/Source/kernel.swift new file mode 100644 index 0000000..384daaf --- /dev/null +++ b/Kernel/Source/kernel.swift @@ -0,0 +1,22 @@ +@_cdecl("kmain") +public func kernelMain(_ bootInfo: UInt) { + // Bootinfo offsets: fb starts at 64, then base(8), baseSize(8), width(8), height(8) + let fbBase = UnsafePointer(bitPattern: bootInfo &+ 64)!.pointee + let width = UnsafePointer(bitPattern: bootInfo &+ 80)!.pointee + let height = UnsafePointer(bitPattern: bootInfo &+ 88)!.pointee + + let pixels = UnsafeMutablePointer(bitPattern: fbBase)! + let total = Int(width) &* Int(height) + let stripe = total / 5 + + var i = 0 + while i < total { + let s = i / stripe + let color: UInt32 + if s == 0 || s >= 4 { color = 0x5BCEFA } + else if s == 2 { color = 0xFFFFFF } + else { color = 0xF5A7B8 } + pixels[i] = color + i &+= 1 + } +} diff --git a/Kernel/Source/stubs.c b/Kernel/Source/stubs.c new file mode 100644 index 0000000..57dad40 --- /dev/null +++ b/Kernel/Source/stubs.c @@ -0,0 +1,38 @@ +#include + +void* memmove(void* dest, const void* src, unsigned long n) { + unsigned char* d = (unsigned char*)dest; + const unsigned char* s = (const unsigned char*)src; + if (d < s) { + while (n--) *d++ = *s++; + } else { + d += n; s += n; + while (n--) *--d = *--s; + } + return dest; +} + +void* memcpy(void* dest, const void* src, unsigned long n) { + return memmove(dest, src, n); +} + +void* memset(void* dest, int c, unsigned long n) { + unsigned char* d = (unsigned char*)dest; + while (n--) *d++ = (unsigned char)c; + return dest; +} + +// Stack protection +long __stack_chk_guard = (long)0xDEADBEEFCAFEBABEULL; +void __stack_chk_fail(void) { while (1); } + +// Swift embedded uses putchar for print(); stub so it links but does nothing +int putchar(int c) { return c; } + +// Swift runtime allocator stubs — should never be called in embedded mode +int posix_memalign(void** ptr, unsigned long align, unsigned long size) { + (void)ptr; (void)align; (void)size; + while (1); +} + +void free(void* ptr) { (void)ptr; } diff --git a/Kernel/linker.ld b/Kernel/linker.ld index e69de29..9247fbe 100644 --- a/Kernel/linker.ld +++ b/Kernel/linker.ld @@ -0,0 +1,14 @@ +ENTRY(_start) + +SECTIONS { + . = 0; + + .text : { + *(.text.boot) + *(.text*) + } + + .rodata : { *(.rodata*) } + .data : { *(.data*) } + .bss : { *(.bss*) *(COMMON) } +}