Automate generation of assembly offsets from C structures via XTADK
This commit is contained in:
@@ -1 +1,3 @@
|
|||||||
|
add_subdirectory("xtadk")
|
||||||
|
|
||||||
set_sdk_target("xtdk/" "include")
|
set_sdk_target("xtdk/" "include")
|
||||||
|
|||||||
@@ -59,6 +59,86 @@ function(add_module_linker_flags MODULE FLAGS)
|
|||||||
set_module_property(${MODULE} LINK_FLAGS ${FLAGS})
|
set_module_property(${MODULE} LINK_FLAGS ${FLAGS})
|
||||||
endfunction()
|
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
|
# This function compiles an assembly bootsector file into a flat binary
|
||||||
function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
function(compile_bootsector NAME SOURCE BASEADDR ENTRYPOINT)
|
||||||
set(BINARY_NAME "${NAME}.bin")
|
set(BINARY_NAME "${NAME}.bin")
|
||||||
|
|||||||
14
sdk/xtadk/CMakeLists.txt
Normal file
14
sdk/xtadk/CMakeLists.txt
Normal file
@@ -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}")
|
||||||
83
sdk/xtadk/amd64/ke.cc
Normal file
83
sdk/xtadk/amd64/ke.cc
Normal file
@@ -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 <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtkmapi.h>
|
||||||
|
#include <adkdefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
57
sdk/xtadk/i686/ke.cc
Normal file
57
sdk/xtadk/i686/ke.cc
Normal file
@@ -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 <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtkmapi.h>
|
||||||
|
#include <adkdefs.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
19
sdk/xtadk/includes/adkdefs.h
Normal file
19
sdk/xtadk/includes/adkdefs.h
Normal file
@@ -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 <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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 */
|
||||||
@@ -91,15 +91,13 @@ set_specfile(xtoskrnl.spec xtoskrnl.exe)
|
|||||||
|
|
||||||
# Link static XTOS library
|
# Link static XTOS library
|
||||||
add_library(libxtos ${XTOSKRNL_SOURCE})
|
add_library(libxtos ${XTOSKRNL_SOURCE})
|
||||||
|
target_link_libraries(libxtos PRIVATE xtadk)
|
||||||
|
|
||||||
# Link kernel executable
|
# Link kernel executable
|
||||||
add_executable(xtoskrnl
|
add_executable(xtoskrnl ${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def)
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def)
|
|
||||||
|
|
||||||
# Add linker libraries
|
# Add linker libraries
|
||||||
target_link_libraries(xtoskrnl
|
target_link_libraries(xtoskrnl PRIVATE libxtos)
|
||||||
PRIVATE
|
|
||||||
libxtos)
|
|
||||||
|
|
||||||
# Set proper binary name and install target
|
# Set proper binary name and install target
|
||||||
set_target_properties(xtoskrnl PROPERTIES SUFFIX .exe)
|
set_target_properties(xtoskrnl PROPERTIES SUFFIX .exe)
|
||||||
|
|||||||
Reference in New Issue
Block a user