From 640c5a5e95c4e84c61c57050260f5d8556eca4ae Mon Sep 17 00:00:00 2001 From: "Charles E. Youse" Date: Mon, 22 Jul 2019 15:49:25 -0700 Subject: [PATCH] boards/x86: add Intel64 (64-bit long-mode) QEMU target board Add qemu_x86_long board (with CONFIG_X86_LONGMODE=y) for testing. This requires adding support to soc/ia32 for long mode (trivial), and adding a quick 64- to 32-bit ELF conversion before invoking QEMU, which apparently doesn't like 64-bit kernel files. Signed-off-by: Charles E. Youse --- boards/x86/qemu_x86/Kconfig.board | 6 ++++++ boards/x86/qemu_x86/Kconfig.defconfig | 8 +++++++- boards/x86/qemu_x86/board.cmake | 8 +++++++- boards/x86/qemu_x86/qemu_x86_long.dts | 10 ++++++++++ boards/x86/qemu_x86/qemu_x86_long.yaml | 13 +++++++++++++ boards/x86/qemu_x86/qemu_x86_long_defconfig | 17 +++++++++++++++++ cmake/emu/qemu.cmake | 11 +++++++++++ soc/x86/ia32/linker.ld | 5 ++++- 8 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 boards/x86/qemu_x86/qemu_x86_long.dts create mode 100644 boards/x86/qemu_x86/qemu_x86_long.yaml create mode 100644 boards/x86/qemu_x86/qemu_x86_long_defconfig diff --git a/boards/x86/qemu_x86/Kconfig.board b/boards/x86/qemu_x86/Kconfig.board index 1f9e45c4d08..a9d58b59d67 100644 --- a/boards/x86/qemu_x86/Kconfig.board +++ b/boards/x86/qemu_x86/Kconfig.board @@ -6,3 +6,9 @@ config BOARD_QEMU_X86 select QEMU_TARGET select CPU_HAS_FPU select HAS_COVERAGE_SUPPORT + +config BOARD_QEMU_X86_LONG + bool "QEMU x86 (64-bit long mode)" + depends on SOC_IA32 + select QEMU_TARGET + select X86_LONGMODE diff --git a/boards/x86/qemu_x86/Kconfig.defconfig b/boards/x86/qemu_x86/Kconfig.defconfig index ada3a3a8715..1ed7b11d80b 100644 --- a/boards/x86/qemu_x86/Kconfig.defconfig +++ b/boards/x86/qemu_x86/Kconfig.defconfig @@ -2,7 +2,6 @@ if BOARD_QEMU_X86 - config BUILD_OUTPUT_BIN default n @@ -17,3 +16,10 @@ config FLASH_SIMULATOR endif endif # BOARD_QEMU_X86 + +if BOARD_QEMU_X86_LONG + +config BOARD + default "qemu_x86_long" + +endif # BOARD_QEMU_X86_LONG diff --git a/boards/x86/qemu_x86/board.cmake b/boards/x86/qemu_x86/board.cmake index e7105fc7269..880a59ba77e 100644 --- a/boards/x86/qemu_x86/board.cmake +++ b/boards/x86/qemu_x86/board.cmake @@ -6,7 +6,13 @@ if(NOT CONFIG_REBOOT) set(REBOOT_FLAG -no-reboot) endif() -set(QEMU_CPU_TYPE_${ARCH} qemu32,+nx,+pae) +if(CONFIG_X86_LONGMODE) + set(QEMU_binary_suffix x86_64) + set(QEMU_CPU_TYPE_${ARCH} qemu64,+x2apic) +else() + set(QEMU_CPU_TYPE_${ARCH} qemu32,+nx,+pae) +endif() + set(QEMU_FLAGS_${ARCH} -m 9 -cpu ${QEMU_CPU_TYPE_${ARCH}} diff --git a/boards/x86/qemu_x86/qemu_x86_long.dts b/boards/x86/qemu_x86/qemu_x86_long.dts new file mode 100644 index 00000000000..6bc21a91c61 --- /dev/null +++ b/boards/x86/qemu_x86/qemu_x86_long.dts @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2019 Intel Corp. + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "qemu_x86.dts" + +&flash0 { + reg = <0x00100000 DT_FLASH_SIZE>; +}; diff --git a/boards/x86/qemu_x86/qemu_x86_long.yaml b/boards/x86/qemu_x86/qemu_x86_long.yaml new file mode 100644 index 00000000000..570212723cc --- /dev/null +++ b/boards/x86/qemu_x86/qemu_x86_long.yaml @@ -0,0 +1,13 @@ +identifier: qemu_x86_long +name: QEMU Emulation for X86 (long mode) +type: qemu +arch: x86 +toolchain: + - zephyr + - xtools +simulation: qemu +testing: + default: true + ignore_tags: + - net + - bluetooth diff --git a/boards/x86/qemu_x86/qemu_x86_long_defconfig b/boards/x86/qemu_x86/qemu_x86_long_defconfig new file mode 100644 index 00000000000..37b16944610 --- /dev/null +++ b/boards/x86/qemu_x86/qemu_x86_long_defconfig @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_X86=y +CONFIG_SOC_IA32=y +CONFIG_BOARD_QEMU_X86_LONG=y +CONFIG_CPU_MINUTEIA=y +CONFIG_HPET_TIMER=y +CONFIG_HPET_TIMER_IRQ=2 +CONFIG_PIC_DISABLE=y +CONFIG_LOAPIC=y +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_NS16550=y +CONFIG_UART_CONSOLE=y +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=25000000 +CONFIG_TEST_RANDOM_GENERATOR=y +CONFIG_DEBUG_INFO=y diff --git a/cmake/emu/qemu.cmake b/cmake/emu/qemu.cmake index 5a0a46c6ac8..2b8ee3d8db3 100644 --- a/cmake/emu/qemu.cmake +++ b/cmake/emu/qemu.cmake @@ -233,6 +233,17 @@ elseif(QEMU_NET_STACK) endif() endif(QEMU_PIPE_STACK) +if(CONFIG_X86_LONGMODE) + # QEMU doesn't like 64-bit ELF files. Since we don't use any >4GB + # addresses, converting it to 32-bit is safe enough for emulation. + list(APPEND PRE_QEMU_COMMANDS + COMMAND + ${CMAKE_OBJCOPY} + -O elf32-i386 + $ + ) +endif() + if(CONFIG_X86_64) set(QEMU_KERNEL_FILE "${CMAKE_BINARY_DIR}/zephyr-qemu.elf") endif() diff --git a/soc/x86/ia32/linker.ld b/soc/x86/ia32/linker.ld index 7551dbe459c..a8e07633a54 100644 --- a/soc/x86/ia32/linker.ld +++ b/soc/x86/ia32/linker.ld @@ -45,5 +45,8 @@ MEMORY IDT_LIST : ORIGIN = 0xFFFF1000, LENGTH = 2K } +#ifdef CONFIG_X86_LONGMODE +#include +#else #include - +#endif