diff --git a/CMakeLists.txt b/CMakeLists.txt index 712f8782..14e9b9a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,19 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) if(DEFINED SYSCONF_INSTALL_DIR) set(CMAKE_INSTALL_SYSCONFDIR "${SYSCONF_INSTALL_DIR}") endif() + +if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(BUILD_TARGET "smp-x86" CACHE STRING "Build target: smp-x86 | smp-arm64") +elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(BUILD_TARGET "smp-arm64" CACHE STRING "Build target: smp-x86 | smp-arm64") +endif() + +if (BUILD_TARGET STREQUAL "smp-x86") + set(ARCH "x86_64") +elseif (BUILD_TARGET STREQUAL "smp-arm64") + set(ARCH "arm64") +endif() + include(GNUInstallDirs) include(CMakeParseArguments) include(Kbuild) @@ -39,15 +52,7 @@ if (ENABLE_LINUX_WORK_IRQ_FOR_IKC) add_definitions(-DIHK_IKC_USE_LINUX_WORK_IRQ) endif() -if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(BUILD_TARGET "smp-x86" CACHE STRING "Build target: smp-x86 | smp-arm64") -elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - set(BUILD_TARGET "smp-arm64" CACHE STRING "Build target: smp-x86 | smp-arm64") -endif() -if (BUILD_TARGET STREQUAL "smp-x86") - set(ARCH "x86_64") -elseif (BUILD_TARGET STREQUAL "smp-arm64") - set(ARCH "arm64") +if (BUILD_TARGET STREQUAL "smp-arm64") foreach(i RANGE 1 120) add_definitions(-DPOSTK_DEBUG_ARCH_DEP_${i} -DPOSTK_DEBUG_TEMP_FIX_${i}) set(KBUILD_C_FLAGS "${KBUILD_C_FLAGS} -DPOSTK_DEBUG_ARCH_DEP_${i} -DPOSTK_DEBUG_TEMP_FIX_${i}") @@ -81,6 +86,24 @@ elseif (BUILD_TARGET STREQUAL "smp-arm64") endif() set_property(CACHE BUILD_TARGET PROPERTY STRINGS smp-x86 smp-arm64) +# define MAP_KERNEL_START + +set(tmpdir ${CMAKE_CURRENT_BINARY_DIR}/tmp.resolve_MODULES_END) +file(REMOVE_RECURSE ${tmpdir}) +file(MAKE_DIRECTORY ${tmpdir}) +file(WRITE ${tmpdir}/driver.c "#include \n") +file(APPEND ${tmpdir}/driver.c "unsigned long MAP_KERNEL_START = MODULES_END - (1UL << 23);\n") +file(WRITE ${tmpdir}/Makefile "obj-m := driver.o\n") +file(APPEND ${tmpdir}/Makefile "all:\n") +file(APPEND ${tmpdir}/Makefile "\tmake ${KBUILD_MAKE_FLAGS_STR} -C ${KERNEL_DIR} M=${tmpdir} modules\n") + +execute_process(COMMAND make -C ${tmpdir}) +execute_process(COMMAND bash -c "offset=`readelf -S ${tmpdir}/driver.ko | grep .data | sed 's/.* //g'`; echo $((0x$offset))" + OUTPUT_VARIABLE MAP_KERNEL_START_OFFSET OUTPUT_STRIP_TRAILING_WHITESPACE) +execute_process(COMMAND bash -c "dd if=${tmpdir}/driver.ko bs=1 skip=${MAP_KERNEL_START_OFFSET} count=8 2>/dev/null | od -tx8 -Ax | head -1 | sed 's|.* |0x|g'" + OUTPUT_VARIABLE MAP_KERNEL_START OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(ENABLE_MEMDUMP ON) option(ENABLE_PERF "Enable perf support" ON) option(ENABLE_RUSAGE "Enable rusage support" ON) @@ -155,6 +178,7 @@ add_subdirectory(executer/kernel/mcctrl) add_subdirectory(executer/user) add_subdirectory(kernel) add_subdirectory(tools/mcstat) +add_subdirectory(tools/crash) configure_file(scripts/mcreboot-smp.sh.in mcreboot.sh @ONLY) configure_file(scripts/mcstop+release-smp.sh.in mcstop+release.sh @ONLY) @@ -190,6 +214,7 @@ message("KERNEL_DIR: ${KERNEL_DIR}") message("SYSTEM_MAP: ${SYSTEM_MAP}") message("VMLINUX: ${VMLINUX}") message("KBUILD_C_FLAGS: ${KBUILD_C_FLAGS}") +message("MAP_KERNEL_START: ${MAP_KERNEL_START}") message("ENABLE_MEMDUMP: ${ENABLE_MEMDUMP}") message("ENABLE_PERF: ${ENABLE_PERF}") message("ENABLE_RUSAGE: ${ENABLE_RUSAGE}") diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index f1b162cc..e530feda 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -10,7 +10,7 @@ #include #include -#define KERNEL_RAM_VADDR MAP_KERNEL_START +/* KERNEL_RAM_VADDR is defined by cmake */ //#ifndef CONFIG_SMP //# define PTE_FLAGS PTE_TYPE_PAGE | PTE_AF diff --git a/arch/arm64/kernel/include/arch-memory.h b/arch/arm64/kernel/include/arch-memory.h index 9799db66..f5341f5f 100644 --- a/arch/arm64/kernel/include/arch-memory.h +++ b/arch/arm64/kernel/include/arch-memory.h @@ -56,7 +56,8 @@ extern char _end[]; #endif /* !__ASSEMBLY__ */ /* - * MAP_KERNEL_START is HOST MODULES_END - 8MiB + * MAP_KERNEL_START is HOST MODULES_END - 8MiB. + * It's defined by cmake. */ #if (VA_BITS == 39 && GRANULE_SIZE == _SZ4KB) /* ARM64_MEMORY_LAYOUT=1 */ # @@ -67,7 +68,6 @@ extern char _end[]; # define MAP_VMAP_SIZE UL(0x0000000100000000) # define MAP_FIXED_START UL(0xffffffbffbdfd000) # define MAP_ST_START UL(0xffffffc000000000) -# define MAP_KERNEL_START UL(0xffffff8007800000) # #elif (VA_BITS == 42 && GRANULE_SIZE == _SZ64KB) /* ARM64_MEMORY_LAYOUT=3 */ # @@ -78,7 +78,6 @@ extern char _end[]; # define MAP_VMAP_SIZE UL(0x0000000100000000) # define MAP_FIXED_START UL(0xfffffdfffbdd0000) # define MAP_ST_START UL(0xfffffe0000000000) -# define MAP_KERNEL_START UL(0xfffffc0007800000) # #elif (VA_BITS == 48 && GRANULE_SIZE == _SZ4KB) /* ARM64_MEMORY_LAYOUT=2 */ # @@ -89,7 +88,6 @@ extern char _end[]; # define MAP_VMAP_SIZE UL(0x0000000100000000) # define MAP_FIXED_START UL(0xffff7ffffbdfd000) # define MAP_ST_START UL(0xffff800000000000) -# define MAP_KERNEL_START UL(0xffff000007800000) # #elif (VA_BITS == 48 && GRANULE_SIZE == _SZ64KB) /* ARM64_MEMORY_LAYOUT=4 */ # @@ -100,7 +98,6 @@ extern char _end[]; # define MAP_VMAP_SIZE UL(0x0000000100000000) # define MAP_FIXED_START UL(0xffff7ffffbdd0000) # define MAP_ST_START UL(0xffff800000000000) -# define MAP_KERNEL_START UL(0xffff000007800000) # #else # error address space is not defined. diff --git a/arch/x86_64/kboot/main.c b/arch/x86_64/kboot/main.c index 6e77ce98..bbc5beb4 100644 --- a/arch/x86_64/kboot/main.c +++ b/arch/x86_64/kboot/main.c @@ -18,7 +18,7 @@ extern char data_start[], data_end[]; #define LARGE_PAGE_MASK (~((unsigned long)LARGE_PAGE_SIZE - 1)) #define MAP_ST_START 0xffff800000000000UL -#define MAP_KERNEL_START 0xffffffff80000000UL +/* MAP_KERNEL_START is defined by cmake */ #define PTL4_SHIFT 39 #define PTL3_SHIFT 30 diff --git a/arch/x86_64/kernel/include/arch-memory.h b/arch/x86_64/kernel/include/arch-memory.h index 6f86e939..e067a5e1 100644 --- a/arch/x86_64/kernel/include/arch-memory.h +++ b/arch/x86_64/kernel/include/arch-memory.h @@ -67,8 +67,8 @@ * Placing the LWK image in the virtual address space at the end of * the Linux modules section enables us to map the LWK TEXT in Linux * as well, so that Linux can also call into LWK text. + * It's defined by cmake. */ -#define MAP_KERNEL_START 0xFFFFFFFFFE800000UL #define STACK_TOP(region) ((region)->user_end) #define MAP_VMAP_SIZE 0x0000000100000000UL diff --git a/cmake/modules/Kbuild.cmake b/cmake/modules/Kbuild.cmake index 53875566..82fb8957 100644 --- a/cmake/modules/Kbuild.cmake +++ b/cmake/modules/Kbuild.cmake @@ -14,6 +14,28 @@ mark_as_advanced( KBUILD_MAKE_FLAGS ) +if (${CMAKE_GENERATOR} STREQUAL Ninja) + set(MAKE "make") + list(APPEND KBUILD_MAKE_FLAGS "-j") +else () + set(MAKE "$(MAKE)") +endif () + +# Convert McKernel "arm64" into Linux "aarch64" +if ("${ARCH}" STREQUAL "arm64") + set(LINUX_ARCH "aarch64") +else () + set(LINUX_ARCH "${ARCH}") +endif () + +if (NOT "${LINUX_ARCH}" STREQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}") + string(REGEX REPLACE "ld$" "" CROSS_COMPILE "${CMAKE_LINKER}") + list(APPEND KBUILD_MAKE_FLAGS "ARCH=${ARCH}") + list(APPEND KBUILD_MAKE_FLAGS "CROSS_COMPILE=${CROSS_COMPILE}") +endif() + +string(REPLACE ";" " " KBUILD_MAKE_FLAGS_STR "${KBUILD_MAKE_FLAGS}") + function(kmod MODULE_NAME) cmake_parse_arguments(KMOD "" "INSTALL_DEST" "C_FLAGS;SOURCES;EXTRA_SYMBOLS;DEPENDS" ${ARGN}) @@ -33,25 +55,6 @@ endif(ENABLE_WERROR) configure_file(${CMAKE_SOURCE_DIR}/cmake/modules/Kbuild.in ${CMAKE_CURRENT_BINARY_DIR}/Kbuild) - if (${CMAKE_GENERATOR} STREQUAL Ninja) - set(MAKE "make") - list(APPEND KBUILD_MAKE_FLAGS "-j") - else () - set(MAKE "$(MAKE)") - endif () - - # Convert McKernel "arm64" into Linux "aarch64" - if ("${ARCH}" STREQUAL "arm64") - set(LINUX_ARCH "aarch64") - else () - set(LINUX_ARCH "${ARCH}") - endif () - - if (NOT "${LINUX_ARCH}" STREQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}") - string(REGEX REPLACE "ld$" "" CROSS_COMPILE "${CMAKE_LINKER}") - list(APPEND KBUILD_MAKE_FLAGS "ARCH=${ARCH};CROSS_COMPILE=${CROSS_COMPILE}") - endif() - string(REGEX REPLACE "\\.c(;|$)" ".o.cmd\\1" KMOD_O_CMD "${KMOD_SOURCES}") string(REGEX REPLACE "[^/;]+(;|$)" ".\\0" KMOD_O_CMD "${KMOD_O_CMD}") diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index bcc5c638..710f78d2 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -6,7 +6,8 @@ configure_file(include/swapfmt.h.in include/swapfmt.h) execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=include OUTPUT_VARIABLE SYSTEM_INCLUDE OUTPUT_STRIP_TRAILING_WHITESPACE) -add_definitions(-D__KERNEL__ -DIHK_OS_MANYCORE) +add_definitions(-D__KERNEL__ -DIHK_OS_MANYCORE + -DMAP_KERNEL_START=${MAP_KERNEL_START}UL -DKERNEL_RAM_VADDR=${MAP_KERNEL_START}) add_compile_options(-ffreestanding -O2 -nostdinc -isystem ${SYSTEM_INCLUDE} -fno-omit-frame-pointer) include_directories( "${CMAKE_CURRENT_BINARY_DIR}/include" @@ -163,12 +164,17 @@ elseif (BUILD_TARGET STREQUAL "smp-arm64") add_definitions(-DCONFIG_ARM64_SVE) endif() +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/config/${LINKER_SCRIPT}.in + ${CMAKE_CURRENT_BINARY_DIR}/config/${LINKER_SCRIPT} + @ONLY + ) add_executable(mckernel.img ${MCKERNEL_SRCS}) set_target_properties(mckernel.img PROPERTIES INSTALL_RPATH "") set_target_properties(mckernel.img PROPERTIES LINK_FLAGS - "-e arch_start -T ${CMAKE_CURRENT_SOURCE_DIR}/config/${LINKER_SCRIPT} --build-id") + "-e arch_start -T ${CMAKE_CURRENT_BINARY_DIR}/config/${LINKER_SCRIPT} --build-id") install(TARGETS "mckernel.img" DESTINATION "${MCKERNELDIR}") diff --git a/kernel/config/smp-arm64_type1.lds b/kernel/config/smp-arm64_type1.lds.in similarity index 94% rename from kernel/config/smp-arm64_type1.lds rename to kernel/config/smp-arm64_type1.lds.in index dbaaaef8..dca9b9d7 100644 --- a/kernel/config/smp-arm64_type1.lds +++ b/kernel/config/smp-arm64_type1.lds.in @@ -6,7 +6,7 @@ PHDRS } SECTIONS { - . = 0xffffff8007800000; /* KERNEL_START */ + . = @MAP_KERNEL_START@; _head = .; .text : { diff --git a/kernel/config/smp-arm64_type2.lds b/kernel/config/smp-arm64_type2.lds.in similarity index 94% rename from kernel/config/smp-arm64_type2.lds rename to kernel/config/smp-arm64_type2.lds.in index f4b49bcf..0742cdf7 100644 --- a/kernel/config/smp-arm64_type2.lds +++ b/kernel/config/smp-arm64_type2.lds.in @@ -6,7 +6,7 @@ PHDRS } SECTIONS { - . = 0xffff000007800000; /* KERNEL_START */ + . = @MAP_KERNEL_START@; _head = .; .text : { diff --git a/kernel/config/smp-arm64_type3.lds b/kernel/config/smp-arm64_type3.lds.in similarity index 94% rename from kernel/config/smp-arm64_type3.lds rename to kernel/config/smp-arm64_type3.lds.in index af327411..3ee6130f 100644 --- a/kernel/config/smp-arm64_type3.lds +++ b/kernel/config/smp-arm64_type3.lds.in @@ -6,7 +6,7 @@ PHDRS } SECTIONS { - . = 0xfffffc0007800000; /* KERNEL_START */ + . = @MAP_KERNEL_START@; _head = .; .text : { diff --git a/kernel/config/smp-arm64_type4.lds b/kernel/config/smp-arm64_type4.lds.in similarity index 94% rename from kernel/config/smp-arm64_type4.lds rename to kernel/config/smp-arm64_type4.lds.in index 2b91defa..bb558283 100644 --- a/kernel/config/smp-arm64_type4.lds +++ b/kernel/config/smp-arm64_type4.lds.in @@ -6,7 +6,7 @@ PHDRS } SECTIONS { - . = 0xffff000007800000; /* KERNEL_START */ + . = @MAP_KERNEL_START@; _head = .; .text : { diff --git a/kernel/config/smp-x86.lds b/kernel/config/smp-x86.lds.in similarity index 95% rename from kernel/config/smp-x86.lds rename to kernel/config/smp-x86.lds.in index a8cfdc0a..d0d1e7ba 100644 --- a/kernel/config/smp-x86.lds +++ b/kernel/config/smp-x86.lds.in @@ -5,7 +5,7 @@ PHDRS } SECTIONS { - . = 0xFFFFFFFFFE801000; + . = @MAP_KERNEL_START@ + 0x1000; _head = .; .text : { diff --git a/tools/crash/CMakeLists.txt b/tools/crash/CMakeLists.txt new file mode 100644 index 00000000..3a7491b3 --- /dev/null +++ b/tools/crash/CMakeLists.txt @@ -0,0 +1,9 @@ +configure_file(mckernel.mk.in mckernel.mk @ONLY) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mckernel.mk + DESTINATION ${CMAKE_INSTALL_DATADIR}/tool/crash/) + +foreach(file IN ITEMS mckernel.c README) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${file} + DESTINATION ${CMAKE_INSTALL_DATADIR}/tool/crash/) +endforeach() diff --git a/tools/crash/mckernel.c b/tools/crash/mckernel.c index 5b070399..46f7372c 100644 --- a/tools/crash/mckernel.c +++ b/tools/crash/mckernel.c @@ -83,7 +83,7 @@ static struct mck_size_table { #ifdef X86_64 #define MAP_FIXED_START 0xffff860000000000UL -#define MAP_KERNEL_START 0xffffffff80000000UL +/* MAP_KERNEL_START is defined by cmake */ #define MAP_ST_START 0xffff800000000000UL unsigned long LINUX_PAGE_OFFSET = -1UL; unsigned long x86_kernel_phys_base = -1UL; diff --git a/tools/crash/mckernel.mk b/tools/crash/mckernel.mk.in similarity index 93% rename from tools/crash/mckernel.mk rename to tools/crash/mckernel.mk.in index 4f40e07c..294f395a 100644 --- a/tools/crash/mckernel.mk +++ b/tools/crash/mckernel.mk.in @@ -51,4 +51,4 @@ endif all: mckernel.so mckernel.so: $(INCDIR)/defs.h mckernel.c - gcc -Wall -g -I$(INCDIR) -shared -rdynamic -o mckernel.so mckernel.c -fPIC -D$(TARGET) $(TARGET_CFLAGS) $(GDB_FLAGS) + gcc -Wall -g -I$(INCDIR) -shared -rdynamic -o mckernel.so mckernel.c -fPIC -D$(TARGET) -DMAP_KERNEL_START=@MAP_KERNEL_START@UL $(TARGET_CFLAGS) $(GDB_FLAGS)