diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index 780305a..f864c62 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -1 +1,3 @@ +add_subdirectory("xtadk") + set_sdk_target("xtdk/" "include") diff --git a/sdk/cmake/functions.cmake b/sdk/cmake/functions.cmake index 4e1f7d4..76fcb86 100644 --- a/sdk/cmake/functions.cmake +++ b/sdk/cmake/functions.cmake @@ -59,6 +59,86 @@ function(add_module_linker_flags MODULE FLAGS) set_module_property(${MODULE} LINK_FLAGS ${FLAGS}) endfunction() +# This function compiles XT Assembly Development Kit +function(generate_xtadk TARGET_NAME SOURCE_FILES) + # Define the absolute destination path for the generated header file + set(HEADER_OUTPUT "${EXECTOS_BINARY_DIR}/sdk/includes/${TARGET_NAME}.h") + get_filename_component(HEADER_OUTPUT_DIRECTORY "${HEADER_OUTPUT}" DIRECTORY) + + # Tokenize global CXX flags into a list to ensure correct argument expansion + separate_arguments(COMPILER_FLAGS NATIVE_COMMAND "${CMAKE_CXX_FLAGS}") + + # Resolve and tokenize build-configuration specific flags + string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE) + if(BUILD_TYPE) + separate_arguments(BUILD_TYPE_SPECIFIC_FLAGS NATIVE_COMMAND "${CMAKE_CXX_FLAGS_${BUILD_TYPE}}") + endif() + + # Retrieve compiler definitions, include paths, and options + get_directory_property(COMPILE_DEFINITIONS COMPILE_DEFINITIONS) + get_directory_property(INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES) + get_directory_property(COMPILE_OPTIONS COMPILE_OPTIONS) + + # Initialize the final compiler argument list + set(COMPILER_ARGUMENTS "") + list(APPEND COMPILER_ARGUMENTS ${COMPILER_FLAGS} ${BUILD_TYPE_SPECIFIC_FLAGS}) + + # Transform definitions into MSVC-style + foreach(DEFINITION ${COMPILE_DEFINITIONS}) + list(APPEND COMPILER_ARGUMENTS "/D${DEFINITION}") + endforeach() + + # Transform include paths into MSVC-style + foreach(INCLUDE_PATH ${INCLUDE_DIRECTORIES}) + list(APPEND COMPILER_ARGUMENTS "/I${INCLUDE_PATH}") + endforeach() + + # Append all supplemental compiler options + list(APPEND COMPILER_ARGUMENTS ${COMPILE_OPTIONS}) + set(COLLECTED_ASSEMBLY_OUTPUTS "") + + # Iterate through each source file to create individual assembly generation rules + foreach(SOURCE_FILE_PATH ${SOURCE_FILES}) + # Extract the base filename + get_filename_component(FILENAME_WITHOUT_EXTENSION "${SOURCE_FILE_PATH}" NAME_WE) + + # Define the unique output path for the intermediate assembly file + set(CURRENT_ASSEMBLY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_WITHOUT_EXTENSION}.S") + list(APPEND COLLECTED_ASSEMBLY_OUTPUTS "${CURRENT_ASSEMBLY_OUTPUT}") + get_filename_component(CURRENT_ASSEMBLY_DIRECTORY "${CURRENT_ASSEMBLY_OUTPUT}" DIRECTORY) + + # Execute the compiler to generate assembly code + add_custom_command( + OUTPUT "${CURRENT_ASSEMBLY_OUTPUT}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${CURRENT_ASSEMBLY_DIRECTORY}" + COMMAND ${CMAKE_CXX_COMPILER} + ${COMPILER_ARGUMENTS} + /c /FAs /Fa${CURRENT_ASSEMBLY_OUTPUT} + ${SOURCE_FILE_PATH} + DEPENDS "${SOURCE_FILE_PATH}" + COMMENT "Generating XTADK Assembly: ${FILENAME_WITHOUT_EXTENSION}" + VERBATIM + COMMAND_EXPAND_LISTS + ) + endforeach() + + # Aggregate all generated assembly units into a single consolidated XTADK header + add_custom_command( + OUTPUT "${HEADER_OUTPUT}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${HEADER_OUTPUT_DIRECTORY}" + COMMAND xtadkgen ${COLLECTED_ASSEMBLY_OUTPUTS} -O "${HEADER_OUTPUT}" + DEPENDS ${COLLECTED_ASSEMBLY_OUTPUTS} + COMMENT "Generating XTADK header: ${TARGET_NAME}" + VERBATIM + ) + + # Establish the generation target and expose the header directory via an interface library + add_custom_target(${TARGET_NAME}_gen DEPENDS "${HEADER_OUTPUT}") + add_library(${TARGET_NAME} INTERFACE) + add_dependencies(${TARGET_NAME} ${TARGET_NAME}_gen) + target_include_directories(${TARGET_NAME} INTERFACE "${EXECTOS_BINARY_DIR}/sdk/includes") +endfunction() + # This function compiles an assembly bootsector file into a flat binary function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT) set(BINARY_NAME "${NAME}.bin") diff --git a/sdk/xtadk/CMakeLists.txt b/sdk/xtadk/CMakeLists.txt new file mode 100644 index 0000000..b18422b --- /dev/null +++ b/sdk/xtadk/CMakeLists.txt @@ -0,0 +1,14 @@ +# XT Assembly Development Kit +PROJECT(XTADK) + +# Specify include directories +include_directories( + ${EXECTOS_SOURCE_DIR}/sdk/xtdk + ${XTADK_SOURCE_DIR}/includes) + +# Specify list of XTADK source code files +list(APPEND XTADK_SOURCE + ${XTADK_SOURCE_DIR}/${ARCH}/ke.cc) + +# Generate assembly header from XTADK sources +generate_xtadk(xtadk "${XTADK_SOURCE}") diff --git a/sdk/xtadk/amd64/ke.cc b/sdk/xtadk/amd64/ke.cc new file mode 100644 index 0000000..56902fb --- /dev/null +++ b/sdk/xtadk/amd64/ke.cc @@ -0,0 +1,83 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtadk/amd64/ke.cc + * DESCRIPTION: ADK generator for AMD64 version of Kernel Library + * DEVELOPERS: Aiken Harris + */ + +#include +#include + + +/** + * Generates a definitions file for the Kernel Library used by the XTOS kernel assembly code + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTCLINK +XTAPI +VOID +GenerateAssemblyDefinitions(VOID) +{ + /* Generate KTRAP_FRAME offsets */ + ADK_OFFSET(KTRAP_FRAME, Xmm0); + ADK_OFFSET(KTRAP_FRAME, Xmm1); + ADK_OFFSET(KTRAP_FRAME, Xmm2); + ADK_OFFSET(KTRAP_FRAME, Xmm3); + ADK_OFFSET(KTRAP_FRAME, Xmm4); + ADK_OFFSET(KTRAP_FRAME, Xmm5); + ADK_OFFSET(KTRAP_FRAME, Xmm6); + ADK_OFFSET(KTRAP_FRAME, Xmm7); + ADK_OFFSET(KTRAP_FRAME, Xmm8); + ADK_OFFSET(KTRAP_FRAME, Xmm9); + ADK_OFFSET(KTRAP_FRAME, Xmm10); + ADK_OFFSET(KTRAP_FRAME, Xmm11); + ADK_OFFSET(KTRAP_FRAME, Xmm12); + ADK_OFFSET(KTRAP_FRAME, Xmm13); + ADK_OFFSET(KTRAP_FRAME, Xmm14); + ADK_OFFSET(KTRAP_FRAME, Xmm15); + ADK_OFFSET(KTRAP_FRAME, MxCsr); + ADK_OFFSET(KTRAP_FRAME, PreviousMode); + ADK_OFFSET(KTRAP_FRAME, Cr2); + ADK_OFFSET(KTRAP_FRAME, Cr3); + ADK_OFFSET(KTRAP_FRAME, Dr0); + ADK_OFFSET(KTRAP_FRAME, Dr1); + ADK_OFFSET(KTRAP_FRAME, Dr2); + ADK_OFFSET(KTRAP_FRAME, Dr3); + ADK_OFFSET(KTRAP_FRAME, Dr6); + ADK_OFFSET(KTRAP_FRAME, Dr7); + ADK_OFFSET(KTRAP_FRAME, SegDs); + ADK_OFFSET(KTRAP_FRAME, SegEs); + ADK_OFFSET(KTRAP_FRAME, SegFs); + ADK_OFFSET(KTRAP_FRAME, SegGs); + ADK_OFFSET(KTRAP_FRAME, Rax); + ADK_OFFSET(KTRAP_FRAME, Rbx); + ADK_OFFSET(KTRAP_FRAME, Rcx); + ADK_OFFSET(KTRAP_FRAME, Rdx); + ADK_OFFSET(KTRAP_FRAME, R8); + ADK_OFFSET(KTRAP_FRAME, R9); + ADK_OFFSET(KTRAP_FRAME, R10); + ADK_OFFSET(KTRAP_FRAME, R11); + ADK_OFFSET(KTRAP_FRAME, R12); + ADK_OFFSET(KTRAP_FRAME, R13); + ADK_OFFSET(KTRAP_FRAME, R14); + ADK_OFFSET(KTRAP_FRAME, R15); + ADK_OFFSET(KTRAP_FRAME, Rsi); + ADK_OFFSET(KTRAP_FRAME, Rdi); + ADK_OFFSET(KTRAP_FRAME, Rbp); + ADK_OFFSET(KTRAP_FRAME, Vector); + ADK_OFFSET(KTRAP_FRAME, ErrorCode); + ADK_OFFSET(KTRAP_FRAME, ExceptionFrame); + ADK_OFFSET(KTRAP_FRAME, Rip); + ADK_OFFSET(KTRAP_FRAME, SegCs); + ADK_OFFSET(KTRAP_FRAME, Flags); + ADK_OFFSET(KTRAP_FRAME, Rsp); + ADK_OFFSET(KTRAP_FRAME, SegSs); + + /* Generate KTRAP_FRAME size and REGISTERS_SIZE */ + ADK_SIZE(KTRAP_FRAME); + ADK_SIZE_FROM(REGISTERS_SIZE, KTRAP_FRAME, Rax); +} diff --git a/sdk/xtadk/i686/ke.cc b/sdk/xtadk/i686/ke.cc new file mode 100644 index 0000000..1574f17 --- /dev/null +++ b/sdk/xtadk/i686/ke.cc @@ -0,0 +1,57 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtadk/i686/ke.cc + * DESCRIPTION: ADK generator for i686 version of Kernel Library + * DEVELOPERS: Aiken Harris + */ + +#include +#include + + +/** + * Generates a definitions file for the Kernel Library used by the XTOS kernel assembly code + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTCLINK +XTAPI +VOID +GenerateAssemblyDefinitions(VOID) +{ + /* Generate KTRAP_FRAME offsets */ + ADK_OFFSET(KTRAP_FRAME, PreviousMode); + ADK_OFFSET(KTRAP_FRAME, Cr2); + ADK_OFFSET(KTRAP_FRAME, Cr3); + ADK_OFFSET(KTRAP_FRAME, Dr0); + ADK_OFFSET(KTRAP_FRAME, Dr1); + ADK_OFFSET(KTRAP_FRAME, Dr2); + ADK_OFFSET(KTRAP_FRAME, Dr3); + ADK_OFFSET(KTRAP_FRAME, Dr6); + ADK_OFFSET(KTRAP_FRAME, Dr7); + ADK_OFFSET(KTRAP_FRAME, SegDs); + ADK_OFFSET(KTRAP_FRAME, SegEs); + ADK_OFFSET(KTRAP_FRAME, SegFs); + ADK_OFFSET(KTRAP_FRAME, SegGs); + ADK_OFFSET(KTRAP_FRAME, Eax); + ADK_OFFSET(KTRAP_FRAME, Ebx); + ADK_OFFSET(KTRAP_FRAME, Ecx); + ADK_OFFSET(KTRAP_FRAME, Edx); + ADK_OFFSET(KTRAP_FRAME, Esi); + ADK_OFFSET(KTRAP_FRAME, Edi); + ADK_OFFSET(KTRAP_FRAME, Ebp); + ADK_OFFSET(KTRAP_FRAME, Vector); + ADK_OFFSET(KTRAP_FRAME, ErrorCode); + ADK_OFFSET(KTRAP_FRAME, Eip); + ADK_OFFSET(KTRAP_FRAME, SegCs); + ADK_OFFSET(KTRAP_FRAME, Flags); + ADK_OFFSET(KTRAP_FRAME, Esp); + ADK_OFFSET(KTRAP_FRAME, SegSs); + + /* Generate KTRAP_FRAME size and REGISTERS_SIZE */ + ADK_SIZE(KTRAP_FRAME); + ADK_SIZE_FROM(REGISTERS_SIZE, KTRAP_FRAME, Rax); +} diff --git a/sdk/xtadk/includes/adkdefs.h b/sdk/xtadk/includes/adkdefs.h new file mode 100644 index 0000000..839ae03 --- /dev/null +++ b/sdk/xtadk/includes/adkdefs.h @@ -0,0 +1,19 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtadk/adkdefs.h + * DESCRIPTION: Definitions for XTADK + * DEVELOPERS: Aiken Harris + */ + +#ifndef __XTADK_ADKDEFS_H +#define __XTADK_ADKDEFS_H + + +/* Macros for calculating structure size and offsets for assembler code */ +#define ADK_DEFINE(Symbol, Value) __asm__ volatile("\n\t# ==> " #Symbol " %c0" : : "i" ((SIZE_T)(Value))) +#define ADK_OFFSET(Structure, Member) ADK_DEFINE(Structure ## _ ## Member, FIELD_OFFSET(Structure, Member)) +#define ADK_SIZE(Structure) ADK_DEFINE(Structure ## _SIZE, sizeof(Structure)) +#define ADK_SIZE_FROM(Name, Structure, Member) ADK_DEFINE(Structure ## _ ## Name, sizeof(Structure) - FIELD_OFFSET(Structure, Member)) + +#endif /* __XTADK_ADKDEFS_H */ diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index 8c2e0b5..31ad0f3 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -91,15 +91,13 @@ set_specfile(xtoskrnl.spec xtoskrnl.exe) # Link static XTOS library add_library(libxtos ${XTOSKRNL_SOURCE}) +target_link_libraries(libxtos PRIVATE xtadk) # Link kernel executable -add_executable(xtoskrnl - ${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def) +add_executable(xtoskrnl ${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def) # Add linker libraries -target_link_libraries(xtoskrnl - PRIVATE - libxtos) +target_link_libraries(xtoskrnl PRIVATE libxtos) # Set proper binary name and install target set_target_properties(xtoskrnl PROPERTIES SUFFIX .exe)