From 728e1f057c6856963c722267ca8436bc7043100b Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 21 Feb 2026 23:25:31 +0000 Subject: [PATCH] cmake: add support for gdb debugging, cd-rom boot --- arch/x86_64/QEMU.cmake | 109 +++++++++++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 16 deletions(-) diff --git a/arch/x86_64/QEMU.cmake b/arch/x86_64/QEMU.cmake index 3f2c3eb..de36640 100644 --- a/arch/x86_64/QEMU.cmake +++ b/arch/x86_64/QEMU.cmake @@ -1,27 +1,34 @@ find_program(QEMU qemu-system-${TARGET_ARCH} REQUIRED) -find_program(LLDB lldb 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) + +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 $ + -kernel ${patched_kernel} -initrd ${sys_dir}/${bsp_name} - -m 1G -serial stdio + -m 1G -serial stdio -enable-kvm --append kernel.early-console=ttyS0 USES_TERMINAL - DEPENDS ${kernel_name} bsp) - -add_custom_target(debug-kernel - COMMAND - ${QEMU} - -kernel $ - -initrd ${sys_dir}/${bsp_name} - -m 1G -s -S & - ${LLDB} - -o "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" - -o "gdb-remote localhost:1234" - USES_TERMINAL - DEPENDS ${kernel_name} bsp) + DEPENDS ${patched_kernel} bsp) add_custom_target(run-kernel-monitor COMMAND @@ -31,3 +38,73 @@ add_custom_target(run-kernel-monitor -m 1G -monitor stdio USES_TERMINAL DEPENDS ${kernel_name} bsp) + +if (image_cdrom) + message(STATUS "QEMU: Enable CD-ROM boot") + add_custom_target(run-cdrom + COMMAND + ${QEMU} + -cdrom ${image_cdrom} + -m 1G + -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 $ + -initrd ${sys_dir}/${bsp_name} + -enable-kvm + -m 1G -s -S & + ${LLDB} + -o "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" + -o "gdb-remote localhost:1234" + USES_TERMINAL + DEPENDS ${kernel_name} bsp) + + if (image_cdrom) + message(STATUS "QEMU: Enable CD-ROM debug with LLDB") + add_custom_target(debug-cdrom + COMMAND + ${QEMU} + -cdrom ${image_cdrom} + -m 1G -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 $ + -initrd ${sys_dir}/${bsp_name} + -m 1G -s -S & + ${GDB} + -o "file ${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" + -o "remote localhost:1234" + USES_TERMINAL + DEPENDS ${kernel_name} bsp) + + if (image_cdrom) + message(STATUS "QEMU: Enable CD-ROM debug with GDB") + add_custom_target(debug-cdrom + COMMAND + ${QEMU} + -cdrom ${image_cdrom} + -m 1G -s -S & + ${GDB} -tui + -s "${CMAKE_BINARY_DIR}/kernel/${kernel_name}.debug" + -ex "target remote localhost:1234" + USES_TERMINAL + DEPENDS ${image_cdrom}) + endif () +endif () +