wip: IPC and Runtime
This commit is contained in:
@@ -56,3 +56,7 @@ find_program(LLVM_OBJCOPY NAMES llvm-objcopy objcopy
|
||||
/opt/homebrew/bin
|
||||
REQUIRED
|
||||
)
|
||||
|
||||
set(CMAKE_C_FLAGS_INIT "-ffreestanding -mgeneral-regs-only -std=c23")
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-nostdlib -static -no-pie -z max-page-size=0x1000 --no-dynamic-linker -T ${CMAKE_CURRENT_LIST_DIR}/linker.ld -Ttext=0x400000")
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Copyright (c) 2026 0xKSor
|
||||
|
||||
set(KSOS_SYSROOT_SRC "${CMAKE_CURRENT_LIST_DIR}/..")
|
||||
set(BUILD_DIR $ENV{BUILD_DIR})
|
||||
if(NOT BUILD_DIR)
|
||||
set(BUILD_DIR "${CMAKE_CURRENT_LIST_DIR}/../../.build")
|
||||
endif()
|
||||
|
||||
set(KSOS_LIB_DIR "${BUILD_DIR}/Runtime/System/libksOS")
|
||||
|
||||
function(add_ksos_executable TARGET_NAME)
|
||||
add_executable(${TARGET_NAME}
|
||||
"${KSOS_SYSROOT_SRC}/System/libksOS/Source/crt0.S"
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
target_include_directories(${TARGET_NAME} PRIVATE
|
||||
"${KSOS_SYSROOT_SRC}/System/libksOS/Include"
|
||||
)
|
||||
|
||||
target_link_directories(${TARGET_NAME} PRIVATE
|
||||
"${KSOS_LIB_DIR}"
|
||||
)
|
||||
|
||||
target_link_libraries(${TARGET_NAME} PRIVATE
|
||||
ksOS
|
||||
)
|
||||
endfunction()
|
||||
@@ -4,44 +4,16 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(ksOS_init LANGUAGES C ASM)
|
||||
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/../../Common/ksOS_SDK.cmake")
|
||||
|
||||
file(GLOB_RECURSE INIT_SOURCES CMAKE_CONFIGURE_DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.S
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.c
|
||||
)
|
||||
|
||||
add_executable(init ${INIT_SOURCES})
|
||||
add_ksos_executable(Init ${INIT_SOURCES})
|
||||
|
||||
target_include_directories(init PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../Common
|
||||
)
|
||||
|
||||
target_compile_options(init PRIVATE
|
||||
$<$<COMPILE_LANGUAGE:C>:
|
||||
-std=c23
|
||||
-fno-stack-protector
|
||||
-fno-builtin
|
||||
-Wall
|
||||
-Wextra
|
||||
>
|
||||
-ffreestanding
|
||||
-g
|
||||
-mgeneral-regs-only
|
||||
)
|
||||
|
||||
target_link_options(init PRIVATE
|
||||
-nostdlib
|
||||
-static
|
||||
-no-pie
|
||||
-T "${CMAKE_CURRENT_SOURCE_DIR}/../../Common/linker.ld"
|
||||
-Ttext=0x400000
|
||||
-e _start
|
||||
-z max-page-size=0x1000
|
||||
--no-dynamic-linker
|
||||
)
|
||||
|
||||
set_target_properties(init PROPERTIES
|
||||
set_target_properties(Init PROPERTIES
|
||||
OUTPUT_NAME "Init"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (c) 2026 0xKSor
|
||||
|
||||
void main(void) {
|
||||
__asm__ volatile(
|
||||
"svc #0\n"
|
||||
"b .\n"
|
||||
);
|
||||
#include <ksOS/Syscall.h>
|
||||
|
||||
int main(void) {
|
||||
SysSend(1, 0xa0a0a0a0a);
|
||||
while (1) {}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Copyright (c) 2026 0xKSor
|
||||
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(ksOS_test LANGUAGES C ASM)
|
||||
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/../../Common/ksOS_SDK.cmake")
|
||||
|
||||
file(GLOB_RECURSE INIT_SOURCES CMAKE_CONFIGURE_DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.S
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Source/*.c
|
||||
)
|
||||
|
||||
add_ksos_executable(Init ${INIT_SOURCES})
|
||||
|
||||
set_target_properties(Init PROPERTIES
|
||||
OUTPUT_NAME "Test"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
)
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <ksOS/Syscall.h>
|
||||
|
||||
|
||||
int main() {
|
||||
IPCMessage message = SysRecive();
|
||||
if (message.data == 0xa0a0a0a0a) {
|
||||
Sys228();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(libksOS LANGUAGES C ASM)
|
||||
|
||||
file(GLOB_RECURSE LIB_SOURCES CMAKE_CONFIGURE_DEPENDS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/*.c
|
||||
)
|
||||
|
||||
add_library(ksOS STATIC ${LIB_SOURCES})
|
||||
|
||||
target_include_directories(ksOS PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Include
|
||||
)
|
||||
|
||||
target_compile_options(ksOS PRIVATE
|
||||
-std=c23 -fno-stack-protector -fno-builtin -Wall -Wextra
|
||||
)
|
||||
@@ -0,0 +1,55 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (c) 2026 0xKSor
|
||||
|
||||
#pragma once
|
||||
#include <ksOS/Types.h>
|
||||
|
||||
enum {
|
||||
kSyscallSend = 1,
|
||||
kSyscallReceive,
|
||||
};
|
||||
|
||||
typedef struct IPCMessage {
|
||||
UInt64 senderID;
|
||||
UInt64 data;
|
||||
} IPCMessage;
|
||||
|
||||
static inline UInt64 SysSend(UInt64 handleID, UInt64 data) {
|
||||
register UInt64 x8 __asm__("x8") = kSyscallSend;
|
||||
register UInt64 x0 __asm__("x0") = handleID;
|
||||
register UInt64 x1 __asm__("x1") = data;
|
||||
|
||||
__asm__ volatile(
|
||||
"svc #0\n"
|
||||
: "+r" (x0)
|
||||
: "r" (x1), "r" (x8)
|
||||
: "memory", "cc"
|
||||
);
|
||||
return x0;
|
||||
}
|
||||
|
||||
static inline IPCMessage SysRecive(void) {
|
||||
register UInt64 x8 __asm__("x8") = kSyscallReceive;
|
||||
register UInt64 x0 __asm__("x0");
|
||||
register UInt64 x1 __asm__("x1");
|
||||
|
||||
__asm__ volatile(
|
||||
"svc #0\n"
|
||||
: "=r" (x0), "=r" (x1)
|
||||
: "r" (x8)
|
||||
: "memory", "cc"
|
||||
);
|
||||
|
||||
struct IPCMessage msg = { x0, x1 };
|
||||
return msg;
|
||||
}
|
||||
|
||||
static inline void Sys228(void) {
|
||||
register UInt64 x8 __asm__("x8") = 228;
|
||||
__asm__ volatile(
|
||||
"svc #0\n"
|
||||
:
|
||||
: "r" (x8)
|
||||
: "memory", "cc"
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (c) 2026 0xKSor
|
||||
|
||||
#pragma once
|
||||
|
||||
#if defined(NDEBUG) || defined(__OPTIMIZE__)
|
||||
#define IS_RELEASE 1
|
||||
#else
|
||||
#define IS_RELEASE 0
|
||||
#endif
|
||||
|
||||
typedef unsigned char UInt8;
|
||||
typedef unsigned short UInt16;
|
||||
typedef unsigned int UInt32;
|
||||
typedef unsigned long long UInt64;
|
||||
typedef unsigned long long UInt;
|
||||
|
||||
typedef void* Pointer;
|
||||
typedef UInt Address;
|
||||
typedef UInt32 Address32;
|
||||
typedef UInt8* BytePointer;
|
||||
typedef UInt8* MemoryPointer;
|
||||
|
||||
typedef signed char Int8;
|
||||
typedef signed short Int16;
|
||||
typedef signed int Int32;
|
||||
typedef signed long long Int64;
|
||||
typedef int Int;
|
||||
|
||||
typedef UInt64 Size;
|
||||
typedef char ASCII;
|
||||
|
||||
typedef _Bool Boolean;
|
||||
@@ -0,0 +1,2 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright (c) 2026 0xKSor
|
||||
@@ -4,14 +4,9 @@
|
||||
.section .text.entry, "ax"
|
||||
.global _start
|
||||
_start:
|
||||
// Set up stack pointer (8KB stack)
|
||||
adrp x0, stack_top
|
||||
add sp, x0, :lo12:stack_top
|
||||
|
||||
// Jump to C main
|
||||
bl main
|
||||
|
||||
// If main returns, loop forever
|
||||
b .
|
||||
|
||||
.section .bss, "aw", @nobits
|
||||
@@ -95,8 +95,22 @@ _default:
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# libksOS MUST be built first — everyone depends on it
|
||||
for dir in "${projects[@]}"; do
|
||||
name=$(basename "${dir}")
|
||||
if [ "${name}" = "libksOS" ]; then
|
||||
echo ""
|
||||
echo " 📦 ${CATEGORY}/${name}"
|
||||
just --quiet _build_cmake "${dir}" "${CATEGORY}/${name}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
for dir in "${projects[@]}"; do
|
||||
name=$(basename "${dir}")
|
||||
if [ "${name}" = "libksOS" ]; then
|
||||
continue
|
||||
fi
|
||||
echo ""
|
||||
echo " 📦 ${CATEGORY}/${name}"
|
||||
|
||||
@@ -111,6 +125,7 @@ _default:
|
||||
|
||||
@build:
|
||||
@echo "🛠️ Building Runtime..."
|
||||
@just --quiet clangd
|
||||
@mkdir -p {{ RUNTIME_BUILD_DIR }}/System
|
||||
@mkdir -p {{ RUNTIME_BUILD_DIR }}/Apps
|
||||
@just --quiet _discover_and_build System
|
||||
@@ -122,3 +137,13 @@ _default:
|
||||
@rm -rf {{ TEMP_DIR }}/Runtime
|
||||
@rm -rf {{ RUNTIME_BUILD_DIR }}
|
||||
@echo "🧹 Runtime cleaned"
|
||||
|
||||
@clangd:
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
RUNTIME_DIR="{{ justfile_directory() }}"
|
||||
INCLUDE_DIR="${RUNTIME_DIR}/System/libksOS/Include"
|
||||
|
||||
printf 'CompileFlags:\n Add:\n - -xc\n - --target=aarch64-none-elf\n - -ffreestanding\n - -I%s\n' "${INCLUDE_DIR}" > "${RUNTIME_DIR}/.clangd"
|
||||
|
||||
echo "✅ Generated ${RUNTIME_DIR}/.clangd"
|
||||
|
||||
Reference in New Issue
Block a user