find_program(QEMU qemu-system-${TARGET_ARCH} REQUIRED) if (NOT QEMU) message(STATUS "QEMU: Cannot find qemu-system-${TARGET_ARCH}. Direct-kernel boot unavailable") return() endif () find_program(LLDB lldb) find_program(GDB gdb) set(patched_kernel ${CMAKE_CURRENT_BINARY_DIR}/kernel/${kernel_name}.elf32) set(generic_flags -m 1G) set(no_debug_flags) if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux") message(STATUS "QEMU: Enabling KVM acceleration") set(no_debug_flags ${no_debug_flags} -enable-kvm) else () message(STATUS "QEMU: Host system is not Linux. KVM acceleration unavailable") endif () add_custom_command(OUTPUT ${patched_kernel} DEPENDS ${kernel_name} COMMAND ${CMAKE_COMMAND} -E copy $ ${patched_kernel} COMMAND ${BUILD_TOOLS_DIR}/e64patch ${patched_kernel} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Patching kernel elf64 image" ) message(STATUS "QEMU: Enable direct-kernel boot") add_custom_target(run-kernel COMMAND ${QEMU} -kernel ${patched_kernel} -initrd ${sys_dir}/${bsp_name} ${generic_flags} ${no_debug_flags} -serial stdio --append kernel.early-console=ttyS0 USES_TERMINAL DEPENDS ${patched_kernel} bsp) add_custom_target(run-kernel-monitor COMMAND ${QEMU} -kernel ${patched_kernel} -initrd ${sys_dir}/${bsp_name} ${generic_flags} ${no_debug_flags} -monitor stdio USES_TERMINAL DEPENDS ${patched_kernel} bsp) if (image_cdrom) message(STATUS "QEMU: Enable CD-ROM boot") add_custom_target(run-cdrom COMMAND ${QEMU} -cdrom ${image_cdrom} ${generic_flags} ${no_debug_flags} -serial stdio USES_TERMINAL DEPENDS ${image_cdrom}) endif () if (LLDB) message(STATUS "QEMU: Enable direct-kernel debug with LLDB") add_custom_target(debug-kernel COMMAND ${QEMU} -kernel ${patched_kernel} -initrd ${sys_dir}/${bsp_name} ${generic_flags} -s -S & ${LLDB} -o "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" -o "gdb-remote localhost:1234" USES_TERMINAL DEPENDS ${patched_kernel} bsp) if (image_cdrom) message(STATUS "QEMU: Enable CD-ROM debug with LLDB") add_custom_target(debug-cdrom COMMAND ${QEMU} -cdrom ${image_cdrom} ${generic_flags} -s -S & ${LLDB} -o "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" -o "target remote localhost:1234" USES_TERMINAL DEPENDS cdrom) endif () elseif (GDB) message(STATUS "QEMU: Enable direct-kernel debug with GDB") add_custom_target(debug-kernel COMMAND ${QEMU} -kernel ${patched_kernel} -initrd ${sys_dir}/${bsp_name} ${generic_flags} -s -S & ${GDB} -tui -ex "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" -ex "target remote localhost:1234" USES_TERMINAL DEPENDS ${patched_kernel} bsp) if (image_cdrom) message(STATUS "QEMU: Enable CD-ROM debug with GDB") add_custom_target(debug-cdrom COMMAND ${QEMU} -cdrom ${image_cdrom} ${generic_flags} -s -S & ${GDB} -tui -ex "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" -ex "target remote localhost:1234" USES_TERMINAL DEPENDS ${image_cdrom}) endif () endif ()