# x86 general configuration options

# Copyright (c) 2014-2015 Wind River Systems, Inc.
# SPDX-License-Identifier: Apache-2.0

menu "X86 Architecture Options"
	depends on X86

config ARCH
	default "x86"

#
# CPU Families - the SoC configuration should select the right one.
#

config CPU_ATOM
	bool # hidden
	select CPU_HAS_FPU
	select ARCH_HAS_STACK_PROTECTION if X86_MMU && !X86_64
	select ARCH_HAS_USERSPACE if X86_MMU && !X86_64
	help
	  This option signifies the use of a CPU from the Atom family.

config CPU_MINUTEIA
	bool # hidden
	select ARCH_HAS_STACK_PROTECTION if X86_MMU && !X86_64
	select ARCH_HAS_USERSPACE if X86_MMU && !X86_64
	help
	  This option signifies the use of a CPU from the Minute IA family.

config CPU_APOLLO_LAKE
	bool # hidden
	select CPU_HAS_FPU
	select ARCH_HAS_STACK_PROTECTION if X86_MMU && !X86_64
	select ARCH_HAS_USERSPACE if X86_MMU && !X86_64
	help
	  This option signifies the use of a CPU from the Apollo Lake family.

#
# Configuration common to both IA32 and Intel64 sub-architectures.
#

config X86_64
	bool
	prompt "Run in 64-bit mode"
	default n
	select 64BIT
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select SCHED_IPI_SUPPORTED

config MAX_IRQ_LINES
	int "Number of IRQ lines"
	default 128
	range 0 224
	help
	  This option specifies the number of IRQ lines in the system. It
	  determines the size of the _irq_to_interrupt_vector_table, which
	  is used to track the association between vectors and IRQ numbers.

config IRQ_OFFLOAD_VECTOR
	int "IDT vector to use for IRQ offload"
	default 32
	range 32 255
	depends on IRQ_OFFLOAD

config XIP
	default n

config PIC_DISABLE
	bool "Disable PIC"
	help
	  This option disables all interrupts on the legacy i8259 PICs at boot.

choice
	prompt "Reboot implementation"
	depends on REBOOT
	default REBOOT_RST_CNT

	config REBOOT_RST_CNT
		bool "Reboot via RST_CNT register"
		help
		  Reboot via the RST_CNT register, going back to BIOS.
endchoice

config ACPI
	bool "ACPI (Advanced Configuration and Power Interface) support"
	default n
	help
	  Allow retrieval of platform configuration at runtime.

config X86_MEMMAP_ENTRIES
	int "Number of memory map entries"
	range 1 256
	default 1 if !MULTIBOOT_MEMMAP
	default 64 if MULTIBOOT_MEMMAP
	help
	  Maximum number of memory regions to hold in the memory map.

config MULTIBOOT
	bool "Generate multiboot header"
	default y
	help
	  Embed a multiboot header in the output executable. This is used
	  by some boot loaders (e.g., GRUB) when loading Zephyr. It is safe
	  to leave this option on if you're not sure. It only expands the
	  text segment by 12-16 bytes and is typically ignored if not needed.

if MULTIBOOT

config MULTIBOOT_INFO
	bool "Preserve multiboot information structure"
	default n
	help
	  Multiboot passes a pointer to an information structure to the
	  kernel entry point. Some drivers (e.g., the multiboot framebuffer
	  display driver) need to refer to information in this structure,
	  and so set this option to preserve the data in a permanent location.

config MULTIBOOT_MEMMAP
	bool "Use multiboot memory map if provided"
	default n
	select MULTIBOOT_INFO
	help
	  Use the multiboot memory map if the loader provides one.

config MULTIBOOT_FRAMEBUF
	bool "Multiboot framebuffer support"
	default n
	select DISPLAY
	select FRAMEBUF_DISPLAY
	select MULTIBOOT_INFO

if MULTIBOOT_FRAMEBUF

config MULTIBOOT_FRAMEBUF_X
	int "Multiboot framebuffer X pixels"
	default 640

config MULTIBOOT_FRAMEBUF_Y
	int "Multiboot framebuffer Y pixels"
	default 480

endif # MULTIBOOT_FRAMEBUF

endif # MULTIBOOT

config X86_VERY_EARLY_CONSOLE
	bool "Support very early boot printk"
	depends on PRINTK
	help
	  Non-emulated X86 devices often require special hardware to attach
	  a debugger, which may not be easily available. This option adds a
	  very minimal serial driver which gets initialized at the very
	  beginning of z_cstart(), via z_arch_kernel_init(). This driver enables
	  printk to emit messages to the 16550 UART port 0 instance in device
	  tree. This mini-driver assumes I/O to the UART is done via ports.

config X86_MMU
	bool "Enable Memory Management Unit"
	select MEMORY_PROTECTION
	depends on MP_NUM_CPUS = 1 # FIXME: Working through SMP issues
	help
	  This options enables the memory management unit present in x86
	  and creates a set of page tables at boot time that is runtime-
	  mutable.

config X86_MMU_PAGE_POOL_PAGES
	int "Number of pages to reserve for building page tables"
	default 16
	depends on X86_MMU
	help
	  Building page tables at boot requires a pool of free memory pages
	  to construct it. This can't be derived at build time, tune this
	  to your SoC's specific memory map.

config X86_NO_MELTDOWN
	bool
	help
	  This hidden option should be set on a per-SOC basis to indicate that
	  a particular SOC is not vulnerable to the Meltdown CPU vulnerability,
	  as described in CVE-2017-5754.

config X86_NO_SPECTRE_V1
	bool
	help
	  This hidden option should be set on a per-SOC basis to indicate that
	  a particular SOC is not vulnerable to the Spectre V1, V1.1, and V1.2
	  CPU vulnerabilities as described in CVE-2017-5753 and CVE-2018-3693.

config X86_NO_SPECTRE_V2
	bool
	help
	  This hidden option should be set on a per-SOC basis to indicate that
	  a particular SOC is not vulnerable to the Spectre V2 CPU
	  vulnerability, as described in CVE-2017-5715.

config X86_NO_SPECTRE_V4
	bool
	help
	  This hidden option should be set on a per-SOC basis to indicate that
	  a particular SOC is not vulnerable to the Spectre V4 CPU
	  vulnerability, as described in CVE-2018-3639.

config X86_NO_LAZY_FP
	bool
	help
	  This hidden option should be set on a per-SOC basis to indicate
	  that a particular SOC is not vulnerable to the Lazy FP CPU
	  vulnerability, as described in CVE-2018-3665.

config X86_NO_SPECULATIVE_VULNERABILITIES
	bool
	select X86_NO_MELTDOWN
	select X86_NO_SPECTRE_V1
	select X86_NO_SPECTRE_V2
	select X86_NO_SPECTRE_V4
	select X86_NO_LAZY_FP
	help
	  This hidden option should be set on a per-SOC basis to indicate that
	  a particular SOC does not perform any kind of speculative execution,
	  or is a newer chip which is immune to the class of vulnerabilities
	  which exploit speculative execution side channel attacks.

source "arch/x86/core/Kconfig.ia32"
source "arch/x86/core/Kconfig.intel64"

endmenu
