config BR2_PACKAGE_HOST_QEMU_ARCH_SUPPORTS
	bool
	default y if BR2_arm
	default y if BR2_armeb
	default y if BR2_aarch64
	default y if BR2_i386
	default y if BR2_m68k
	default y if BR2_microblazeel
	default y if BR2_microblazebe
	default y if BR2_mips
	default y if BR2_mipsel
	default y if BR2_nios2
	default y if BR2_or1k
	default y if BR2_powerpc
	default y if BR2_powerpc64
	default y if BR2_powerpc64le
	default y if BR2_riscv
	default y if BR2_s390x
	default y if BR2_sh
	default y if BR2_sparc
	default y if BR2_sparc64
	default y if BR2_xtensa
	default y if BR2_x86_64
	depends on !BR2_x86_steamroller && !BR2_x86_core_avx2
	depends on !BR2_powerpc_620 && !BR2_powerpc_630

config BR2_PACKAGE_HOST_QEMU_SYSTEM_ARCH_SUPPORTS
	bool
	default y if BR2_PACKAGE_HOST_QEMU_ARCH_SUPPORTS
	default y if BR2_mips64
	default y if BR2_mips64el

config BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORTS
	bool
	default y if BR2_PACKAGE_HOST_QEMU_ARCH_SUPPORTS

comment "host-qemu needs a host gcc >= 8"
	depends on BR2_PACKAGE_HOST_QEMU_SYSTEM_ARCH_SUPPORTS || \
		BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORT
	depends on !BR2_HOST_GCC_AT_LEAST_8

config BR2_PACKAGE_HOST_QEMU
	bool "host qemu"
	depends on BR2_PACKAGE_HOST_QEMU_SYSTEM_ARCH_SUPPORTS || BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORTS
	depends on BR2_HOST_GCC_AT_LEAST_8
	select BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE \
		if !BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE && BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORTS
	select BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE \
		if !BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORTS
	help
	  QEMU is a generic and open source machine emulator and
	  virtualizer.

	  This option builds an emulator for your selected architecture.

	  http://www.qemu.org

if BR2_PACKAGE_HOST_QEMU

comment "Emulators selection"

config BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE
	bool "Enable system emulation"
	depends on BR2_PACKAGE_HOST_QEMU_SYSTEM_ARCH_SUPPORTS
	help
	  Enables the build of the system emulator, which allows to
	  boot an entire system in Qemu.

config BR2_PACKAGE_HOST_QEMU_LINUX_USER_MODE
	bool "Enable Linux user-land emulation"
	depends on BR2_PACKAGE_HOST_QEMU_USER_ARCH_SUPPORTS
	help
	  Enables the build of the user-land emulator, which allows to
	  run user-space applications.

	  Note that system calls made by the emulated user-land are
	  serviced by the running host kernel. Therefore, if the
	  kernel headers used by your target are more recent than
	  the running host kernel, you may run into invalid system
	  calls, which may yield surprising effects.

config BR2_PACKAGE_HOST_QEMU_USER_MODE_ARGS
	string
	default "-cpu Nehalem,check=false" if BR2_x86_corei7

config BR2_PACKAGE_HOST_QEMU_VDE2
	bool "VDE2 support"
	help
	  Enables VDE2 support. VDE2 stands for Virtual Distributed
	  Ethernet and can be used to create virtual switches to
	  "plug" both physical and virtual machines in them.

config BR2_PACKAGE_HOST_QEMU_VIRTFS
	bool "Virtual filesystem support"
	depends on BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE
	help
	  Enables support for virtual filesystem in Qemu allowing
	  shared filesystem between Qemu and its emulated target.

config BR2_PACKAGE_HOST_QEMU_USB
	bool "USB passthrough support"
	help
	  Enables USB passthrough support from guest to host.

endif
