# 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
	select CPU_HAS_FPU
	select ARCH_HAS_STACK_PROTECTION if X86_MMU
	select ARCH_HAS_USERSPACE if X86_MMU
	select X86_CPU_HAS_MMX
	select X86_CPU_HAS_SSE
	select X86_CPU_HAS_SSE2
	select X86_CPU_HAS_SSE3
	select CPU_HAS_DCACHE
	select CPU_HAS_ICACHE
	help
	  This option signifies the use of a CPU from the Atom family.

config CPU_APOLLO_LAKE
	bool
	select CPU_HAS_FPU
	select ARCH_HAS_STACK_PROTECTION if X86_MMU
	select ARCH_HAS_USERSPACE if X86_MMU
	select X86_MMU
	select X86_CPU_HAS_MMX
	select X86_CPU_HAS_SSE
	select X86_CPU_HAS_SSE2
	select X86_CPU_HAS_SSE3
	select X86_CPU_HAS_SSSE3
	select X86_CPU_HAS_SSE41
	select X86_CPU_HAS_SSE42
	select CPU_HAS_DCACHE
	select CPU_HAS_ICACHE
	help
	  This option signifies the use of a CPU from the Apollo Lake family.

config CPU_LAKEMONT
	bool
	select CPU_HAS_FPU
	select ARCH_HAS_STACK_PROTECTION if X86_MMU
	select ARCH_HAS_USERSPACE if X86_MMU
	select X86_CPU_HAS_MMX
	select X86_CPU_HAS_SSE
	select X86_CPU_HAS_SSE2
	select X86_CPU_HAS_SSE3
	select X86_CPU_HAS_SSSE3
	select CPU_HAS_DCACHE
	select CPU_HAS_ICACHE
	help
	  This option signifies the use of a CPU from the Lakemont family.

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

config X86_64
	bool "Run in 64-bit mode"
	select 64BIT
	select USE_SWITCH
	select USE_SWITCH_SUPPORTED
	select SCHED_IPI_SUPPORTED
	select X86_MMU
	select X86_CPU_HAS_MMX
	select X86_CPU_HAS_SSE
	select X86_CPU_HAS_SSE2
	select X86_MMX
	select X86_SSE
	select X86_SSE2

menu "x86 Features"

config X86_CPU_HAS_MMX
	bool

config X86_CPU_HAS_SSE
	bool

config X86_CPU_HAS_SSE2
	bool

config X86_CPU_HAS_SSE3
	bool

config X86_CPU_HAS_SSSE3
	bool

config X86_CPU_HAS_SSE41
	bool

config X86_CPU_HAS_SSE42
	bool

config X86_CPU_HAS_SSE4A
	bool

if FPU || X86_64

config X86_MMX
	bool "MMX Support"
	depends on X86_CPU_HAS_MMX
	help
	  This option enables MMX support, and the use of MMX registers
	  by threads.

config X86_SSE
	bool "SSE Support"
	depends on X86_CPU_HAS_SSE
	help
	  This option enables SSE support, and the use of SSE registers
	  by threads.

config X86_SSE2
	bool "SSE2 Support"
	depends on X86_CPU_HAS_SSE2
	select X86_SSE
	help
	  This option enables SSE2 support.

config X86_SSE3
	bool "SSE3 Support"
	depends on X86_CPU_HAS_SSE3
	select X86_SSE
	help
	  This option enables SSE3 support.

config X86_SSSE3
	bool "SSSE3 (Supplemental SSE3) Support"
	depends on X86_CPU_HAS_SSSE3
	select X86_SSE
	help
	  This option enables Supplemental SSE3 support.

config X86_SSE41
	bool "SSE4.1 Support"
	depends on X86_CPU_HAS_SSE41
	select X86_SSE
	help
	  This option enables SSE4.1 support.

config X86_SSE42
	bool "SSE4.2 Support"
	depends on X86_CPU_HAS_SSE42
	select X86_SSE
	help
	  This option enables SSE4.2 support.

config X86_SSE4A
	bool "SSE4A Support"
	depends on X86_CPU_HAS_SSE4A
	select X86_SSE
	help
	  This option enables SSE4A support.

config X86_SSE_FP_MATH
	bool "Compiler-generated SSEx instructions for floating point math"
	depends on X86_SSE
	help
	  This option allows the compiler to generate SSEx instructions for
	  performing floating point math. This can greatly improve performance
	  when exactly the same operations are to be performed on multiple
	  data objects; however, it can also significantly reduce performance
	  when preemptive task switches occur because of the larger register
	  set that must be saved and restored.

	  Disabling this option means that the compiler utilizes only the
	  x87 instruction set for floating point operations.

endif # FPU || X86_64

endmenu

config SRAM_OFFSET
	default 0x100000 if X86_PC_COMPATIBLE
	help
	  A lot of x86 that resemble PCs have many reserved physical memory
	  regions within the first megabyte. Specify an offset from the
	  beginning of RAM to load the kernel in physical memory, avoiding these
	  regions.

	  Note that this does not include the "locore" which contains real mode
	  bootstrap code within the first 64K of physical memory.

	  This value normally need to be page-aligned.

config KERNEL_VM_OFFSET
	default 0x100000 if MMU

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 33
	range 32 255
	depends on IRQ_OFFLOAD

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 PCIE_MMIO_CFG
	bool "Use MMIO PCI configuration space access"
	select ACPI
	help
	  Selects the use of the memory-mapped PCI Express Extended
	  Configuration Space instead of the traditional 0xCF8/0xCFC
	  IO Port registers.

config KERNEL_VM_SIZE
	default 0x40000000 if ACPI

config X86_PC_COMPATIBLE
	bool
	default y
	select ARCH_HAS_RESERVED_PAGE_FRAMES
	select HAS_SRAM_OFFSET
	help
	  Hidden option to signal building for PC-compatible platforms
	  with BIOS, ACPI, etc.

config X86_MEMMAP
	bool "Use memory map"
	select ARCH_HAS_RESERVED_PAGE_FRAMES
	help
	  Enable the use of memory map to identify regions of memory.

	  The memory map can be populated via Multiboot
	  (CONFIG_MULTIBOOT=y and CONFIG_MULTIBOOT_MEMMAP=y) or
	  can be manually defined via x86_memmap[].

config X86_MEMMAP_ENTRIES
	int "Number of memory map entries"
	depends on X86_MEMMAP
	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"
	depends on X86_PC_COMPATIBLE
	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"
	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"
	select MULTIBOOT_INFO
	select X86_MEMMAP
	help
	  Use the multiboot memory map if the loader provides one.

endif # MULTIBOOT

config EXCEPTION_DEBUG
	bool "Unhandled exception debugging"
	default y
	depends on LOG
	help
	  Install handlers for various CPU exception/trap vectors to
	  make debugging them easier, at a small expense in code size.
	  This prints out the specific exception vector and any associated
	  error codes.

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 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 "Memory Management Unit"
	select MMU
	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_COMMON_PAGE_TABLE
	bool "Use a single page table for all threads"
	default n
	depends on USERSPACE
	depends on !SMP
	depends on !X86_KPTI
	help
	  If this option is enabled, userspace memory domains will not have their
	  own page tables. Instead, context switching operations will modify
	  page tables in place. This is much slower, but uses much less RAM
	  for page tables.

config X86_MAX_ADDITIONAL_MEM_DOMAINS
	int "Maximum number of memory domains"
	default 3
	depends on X86_MMU && USERSPACE && !X86_COMMON_PAGE_TABLE
	help
	  The initial page tables at boot are pre-allocated, and used for the
	  default memory domain. Instantiation of additional memory domains
	  if common page tables are in use requires a pool of free pinned
	  memory pages for constructing page tables.

	  Zephyr test cases assume 3 additional domains can be instantiated.

config X86_EXTRA_PAGE_TABLE_PAGES
	int "Reserve extra pages in page table"
	default 1 if X86_PAE && (KERNEL_VM_BASE != SRAM_BASE_ADDRESS)
	default 0
	depends on X86_MMU
	help
	  The whole page table is pre-allocated at build time and is
	  dependent on the range of address space. This allows reserving
	  extra pages (of size CONFIG_MMU_PAGE_SIZE) to the page table
	  so that gen_mmu.py can make use of these extra pages.

	  Says 0 unless absolutely sure that this is necessary.

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, V1.2, and
	  swapgs CPU vulnerabilities as described in CVE-2017-5753,
	  CVE-2018-3693, and CVE-2019-1125.

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.

config DISABLE_SSBD
	bool "Disable Speculative Store Bypass"
	depends on USERSPACE
	default y if !X86_NO_SPECTRE_V4
	help
	  This option will disable Speculative Store Bypass in order to
	  mitigate against certain kinds of side channel attacks.  Quoting
	  the "Speculative Execution Side Channels" document, version 2.0:

	      When SSBD is set, loads will not execute speculatively
	      until the addresses of all older stores are known.  This
	      ensure s that a load does not speculatively consume stale
	      data values due to bypassing an older store on the same
	      logical processor.

	  If enabled, this applies to all threads in the system.

	  Even if enabled, will have no effect on CPUs that do not
	  require this feature.

config ENABLE_EXTENDED_IBRS
	bool "Extended IBRS"
	depends on USERSPACE
	default y if !X86_NO_SPECTRE_V2
	help
	  This option will enable the Extended Indirect Branch Restricted
	  Speculation 'always on' feature. This mitigates Indirect Branch
	  Control vulnerabilities (aka Spectre V2).

config X86_BOUNDS_CHECK_BYPASS_MITIGATION
	bool
	depends on USERSPACE
	default y if !X86_NO_SPECTRE_V1
	select BOUNDS_CHECK_BYPASS_MITIGATION
	help
	  Hidden config to select arch-independent option to enable
	  Spectre V1 mitigations by default if the CPU is not known
	  to be immune to it.

config X86_KPTI
	bool "Kernel page table isolation"
	default y
	depends on USERSPACE
	depends on !X86_NO_MELTDOWN
	help
	  Implements kernel page table isolation to mitigate Meltdown exploits
	  to read Kernel RAM. Incurs a significant performance cost for
	  user thread interrupts and system calls, and significant footprint
	  increase for additional page tables and trampoline stacks.

config X86_EFI
	bool "EFI"
	default y
	depends on BUILD_OUTPUT_EFI
	help
	  Enable EFI support. This means you build your image with zefi
	  support. See arch/x86/zefi/README.txt for more information.

config X86_EFI_CONSOLE
	bool
	depends on X86_EFI && X86_64 && !X86_VERY_EARLY_CONSOLE
	select EFI_CONSOLE
	default y
	help
	  This enables the use of the UEFI console device as the
	  Zephyr printk handler.  It requires that no interferences
	  with hardware used by the firmware console (e.g. a UART or
	  framebuffer) happens from Zephyr code, and that all memory
	  used by the firmware environment and its page tables be
	  separate and preserved.  In general this is safe to assume,
	  but no automatic checking exists at runtime to verify.
	  Likewise be sure to disable any other console/printk
	  drivers!

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

endmenu
