# Zircon Kernel Commandline Options

{# DO NOT EDIT THIS FILE DIRECTLY #}
{# Instead see //zircon/kernel/lib/boot-options:markdown. #}
{# Run `fx set core.x64 --args="update_goldens='true'" --with //zircon/kernel/lib/boot-options:check-markdown` #}
{# Then `fx build` and //docs/gen/boot-options.md will be updated. #}

## Options common to all machines

### aslr.disable=\<bool>

**Default:** `false`

If this option is set, the system will not use Address Space Layout
Randomization.

### aslr.entropy_bits=\<uint8_t>

**Default:** `0x1e`

For address spaces that use ASLR this controls the number of bits of entropy in
the randomization. Higher entropy results in a sparser address space and uses
more memory for page tables. Valid values range from 0-36.

### kernel.cprng-reseed-require.hw-rng=\<bool>

**Default:** `false`

When enabled and if HW RNG fails at reseeding, CPRNG panics.

### kernel.cprng-reseed-require.jitterentropy=\<bool>

**Default:** `false`

When enabled and if jitterentropy fails at reseeding, CPRNG panics.

### kernel.cprng-seed-require.hw-rng=\<bool>

**Default:** `false`

When enabled and if HW RNG fails at initial seeding, CPRNG panics.

### kernel.cprng-disable.jitterentropy=\<bool>

**Default:** `false`

Determines whether jitterentropy will be used as an entropy source (used for testing)

### kernel.cprng-disable.hw-rng=\<bool>

**Default:** `false`

Determines whether HW RNG will be used as an entropy source (used for testing)

### kernel.cprng-seed-require.jitterentropy=\<bool>

**Default:** `false`

When enabled and if jitterentropy fails initial seeding, CPRNG panics.

### kernel.cprng-seed-require.cmdline=\<bool>

**Default:** `false`

When enabled and if you do not provide entropy input from the kernel command
line, CPRNG panics.

### kernel.entropy-mixin=\<hexadecimal>


Provides entropy to be mixed into the kernel's CPRNG.  The value must be a
string of lowercase hexadecimal digits.

The original value will be scrubbed from memory as soon as possible and will be
redacted from all diagnostic output.

### kernel.jitterentropy.bs=\<uint32_t>

**Default:** `0x40`

Sets the "memory block size" parameter for jitterentropy. When jitterentropy is
performing memory operations (to increase variation in CPU timing), the memory
will be accessed in blocks of this size.

### kernel.jitterentropy.bc=\<uint32_t>

**Default:** `0x200`

Sets the "memory block count" parameter for jitterentropy. When jitterentropy
is performing memory operations (to increase variation in CPU timing), this
controls how many blocks (of size `kernel.jitterentropy.bs`) are accessed.

### kernel.jitterentropy.ml=\<uint32_t>

**Default:** `0x20`

Sets the "memory loops" parameter for jitterentropy. When jitterentropy is
performing memory operations (to increase variation in CPU timing), this
controls how many times the memory access routine is repeated. This parameter
is only used when `kernel.jitterentropy.raw` is true. If the value of this
parameter is `0` or if `kernel.jitterentropy.raw` is `false`, then
jitterentropy chooses the number of loops is a random-ish way.

### kernel.jitterentropy.ll=\<uint32_t>

**Default:** `0x1`

Sets the "LFSR loops" parameter for jitterentropy. When
jitterentropy is performing CPU-intensive LFSR operations (to increase variation
in CPU timing), this controls how many times the LFSR routine is repeated.  This
parameter is only used when `kernel.jitterentropy.raw` is true. If the value of
this parameter is `0` or if `kernel.jitterentropy.raw` is `false`, then
jitterentropy chooses the number of loops is a random-ish way.

### kernel.jitterentropy.raw=\<bool>

**Default:** `true`

When true, the jitterentropy entropy collector will return raw,
unprocessed samples. When false, the raw samples will be processed by
jitterentropy, producing output data that looks closer to uniformly random. Note
that even when set to false, the CPRNG will re-process the samples, so the
processing inside of jitterentropy is somewhat redundant.

### kernel.lockup-detector.critical-section-threshold-ms=\<uint64_t>

**Default:** `0xbb8`

When a CPU remains in a designated critical section for longer than
this threshold, a KERNEL OOPS will be emitted.

See also `k lockup status` and
[lockup detector](/zircon/kernel/lib/lockup_detector/README.md).

When 0, critical section lockup detection is disabled.

When kernel.lockup-detector.heartbeat-period-ms is 0, critical section lockup
detection is disabled.

### kernel.lockup-detector.critical-section-fatal-threshold-ms=\<uint64_t>

**Default:** `0x2710`

When a CPU remains in a designated critical section for longer than this
threshold, a crashlog will be generated and the system will reboot, indicating a
reboot reason of `SOFTWARE_WATCHDOG` as it does.

See also `k lockup status` and
[lockup detector](/zircon/kernel/lib/lockup_detector/README.md).

When 0, critical section crashlog generation and reboot is disabled.

When kernel.lockup-detector.heartbeat-period-ms is 0, critical section lockup
detection is disabled.

### kernel.lockup-detector.heartbeat-period-ms=\<uint64_t>

**Default:** `0x3e8`

How frequently a secondary CPU should emit a heartbeat via kernel timer.  This
value should be large enough to not impact system performance, but should be
smaller than the heartbeat age threshold.  1000 is a reasonable value.

See also [lockup detector](/zircon/kernel/lib/lockup_detector/README.md).

When 0, heartbeat detection is disabled.

### kernel.lockup-detector.heartbeat-age-threshold-ms=\<uint64_t>

**Default:** `0xbb8`

The maximum age of a secondary CPU's last heartbeat before it is considered to
be locked up.  This value should be larger than the heartbeat period, but small
enough so as to not miss short-lived lockup events.  3000 is a reasonable value.

See also [lockup detector](/zircon/kernel/lib/lockup_detector/README.md).

When 0, heartbeat detection is disabled.

### kernel.lockup-detector.heartbeat-age-fatal-threshold-ms=\<uint64_t>

**Default:** `0x2710`

The maximum age of a CPU's last heartbeat before it is considered to be locked
up, triggering generation of a crashlog indicating a reboot reason of
`SOFTWARE_WATCHDOG` followed by a reboot.

See also [lockup detector](/zircon/kernel/lib/lockup_detector/README.md).

When 0, heartbeat crashlog generation and reboot is disabled.

### kernel.lockup-detector.diagnostic-query-timeout-ms=\<uint64_t>

**Default:** `0x64`

The maximum amount of time to spend trying to get diagnostic data from an
unresponsive CPU before giving up.

When 0, querying for diagnostic data is disabled.

### kernel.oom.behavior=\[reboot | jobkill\]

**Default:** `reboot`

This option can be used to configure the behavior of the kernel when
encountering an out-of-memory (OOM) situation. Valid values are `jobkill`, and
`reboot`.

If set to `jobkill`, when encountering OOM, the kernel attempts to kill jobs that
have the `ZX_PROP_JOB_KILL_ON_OOM` bit set to recover memory.

If set to `reboot`, when encountering OOM, the kernel signals an out-of-memory
event (see `zx_system_get_event()`), waits some period, and then reboots the
system. The length of the wait period is set by the
`kernel.oom.reboot-timeout-ms` boot option.

### kernel.oom.reboot-timeout-ms=\<uint32_t>

**Default:** `0xc350`

This option sets the amount of time the kernel will wait before rebooting the
system when it encounters an out-of-memory (OOM) situation. This option is
only relevant when `kernel.oom.behavior` is set to `reboot`.

### kernel.mexec-force-high-ramdisk=\<bool>

**Default:** `false`

This option is intended for test use only. When set to `true` it forces the
mexec syscall to place the ramdisk for the following kernel in high memory
(64-bit address space, >= 4GiB offset).

### kernel.mexec-pci-shutdown=\<bool>

**Default:** `true`

If false, this option leaves PCI devices running when calling mexec.

### kernel.oom.enable=\<bool>

**Default:** `true`

This option turns on the out-of-memory (OOM) kernel thread, which kills
processes or reboots the system (per `kernel.oom.behavior`), when the PMM has
less than `kernel.oom.outofmemory-mb` free memory.

An OOM can be manually triggered by the command `k pmm oom`, which will cause
free memory to fall below the `kernel.oom.outofmemory-mb` threshold. An
allocation rate can be provided with `k pmm oom <rate>`, where `<rate>` is in MB.
This will cause the specified amount of memory to be allocated every second,
which can be useful for observing memory pressure state transitions.

Refer to `kernel.oom.outofmemory-mb`, `kernel.oom.critical-mb`,
`kernel.oom.warning-mb`, and `zx_system_get_event()` for further details on
memory pressure state transitions.

The current memory availability state can be queried with the command
`k pmm mem_avail_state info`.

### kernel.oom.outofmemory-mb=\<uint64_t>

**Default:** `0x32`

This option specifies the free-memory threshold at which the out-of-memory (OOM)
thread will trigger an out-of-memory event and begin killing processes, or
rebooting the system.

### kernel.oom.critical-mb=\<uint64_t>

**Default:** `0x96`

This option specifies the free-memory threshold at which the out-of-memory
(OOM) thread will trigger a critical memory pressure event, signaling that
processes should free up memory.

### kernel.oom.warning-mb=\<uint64_t>

**Default:** `0x12c`

This option specifies the free-memory threshold at which the out-of-memory
(OOM) thread will trigger a warning memory pressure event, signaling that
processes should slow down memory allocations.

### kernel.oom.debounce-mb=\<uint64_t>

**Default:** `0x1`

This option specifies the memory debounce value used when computing the memory
pressure state based on the free-memory thresholds
(`kernel.oom.outofmemory-mb`, `kernel.oom.critical-mb` and
`kernel.oom.warning-mb`). Transitions between memory availability states are
debounced by not leaving a state until the amount of free memory is at least
`kernel.oom.debounce-mb` outside of that state.

For example, consider the case where `kernel.oom.critical-mb` is set to 100 MB
and `kernel.oom.debounce-mb` set to 5 MB. If we currently have 90 MB of free
memory on the system, i.e. we're in the Critical state, free memory will have to
increase to at least 105 MB (100 MB + 5 MB) for the state to change from
Critical to Warning.

### kernel.oom.evict-at-warning=\<bool>

**Default:** `false`

This option triggers eviction of file pages at the Warning pressure state,
in addition to the default behavior, which is to evict at the Critical and OOM
states.

### kernel.oom.evict-continuous=\<bool>

**Default:** `false`

This option configures kernel eviction to run continually in the background to try and
keep the system out of memory pressure, as opposed to triggering one-shot eviction only at
memory pressure level transitions.

### kernel.oom.hysteresis-seconds=\<uint64_t>

**Default:** `0xa`

This option specifies the hysteresis interval (in seconds) between memory
pressure state transitions. Note that hysteresis is only applicable for
transitions from a state with less free memory to a state with more free memory;
transitions in the opposite direction are not delayed.

### kernel.oom.imminent-oom-delta-mb=\<uint64_t>

**Default:** `0xa`

This option specifies the delta (in MB) above the out-of-memory threshold at which an
imminent-out-of-memory event will be signaled. This signal is intended to be used for
capturing diagnostic memory information close to the OOM, since capturing state exactly
at the OOM might not be possible.

For example, if `kernel.oom.outofmemory-mb` is set to 50 and `kernel.oom.imminent-oom-delta-mb`
is set to 20, an imminent-out-of-memory event will be signaled at 70MB (i.e. 50MB + 20MB)
free memory, while out-of-memory will be signaled at 50MB free memory.

### kernel.oom.trigger-on-alloc-failure=\<bool>

**Default:** `true`

This option controls whether potentially user-visible PMM allocation failures due to running out of
memory trigger an OOM response.

### kernel.phys.next=\<string>

**Default:** `physboot`

The name of the file within the kernel storage filesystem physload will load.

### kernel.phys.verbose=\<bool>

**Default:** `true`

This controls the degree of logging to the serial console in the kernel's early
boot phase; if false, only error-related logging will take place.

One utility of this option is for benchmarking: synchronous, single-threaded
UART writing can be relatively costly (10 chars/ms) to the entire time
spent in physboot and it is desirable to exclude this sort of work from
holistic time measurements.

### kernel.phys.backtrace-max=\<uint32_t>

**Default:** `0x40`

When there is a crash in the kernel's early boot phase, it can print out
backtraces on the serial console; it prints both a backtrace based on frame
pointers and, when built to use shadow call stacks also a parallel backtrace
based on the shadow call stack.  Each backtrace will print no more than this
many frames.  (Most backtraces will end with the outermost frame before hitting
the limit.)  Setting the limit to zero prints unlimited frames, which for the
frame-pointers backtrace can get into an infinite loop with some bugs.

### kernel.phys.print-stack-max=\<uint32_t>

**Default:** `0x400`

When there is a crash in the kernel's early boot phase, it can print out stack
contents on the serial console.  This is the maximum size (in bytes) of stack
memory that will be dumped; the actual amount dumped depends on stack depth.
Each 16 bytes of stack is printed on one line using up to 75 characters.

### kernel.ppb.borrow-in-supplypages=\<bool>

**Default:** `false`

This controls whether zx_pager_supply_pages can borrow loaned pages.  If true,
zx_pager_supply_pages will copy supplied page contents into borrowed pages, if
any loaned pages are available and the supplied pages aren't already loaned,
else zx_pager_supply_pages will install the supplied pages into the VMO.  If
false, zx_pager_supply_pages will install the supplied pages into the VMO
(regardless of whether they are already loaned or not).

### kernel.ppb.borrow-on-mru=\<bool>

**Default:** `false`

This controls whether non-loaned pages will be replaced with loaned pages (if
any loaned pages are available) when non-loaned pages are moved to the MRU
queue.  This moving is done lazily under normal circumstances, but near OOM as
eviction proceeds, any pages that should be in the MRU queue are moved to the
MRU queue.

### kernel.ppb.loan=\<bool>

**Default:** `false`

This controls whether ZX_VMO_OP_DECOMMIT is enabled on a contiguous VMO.  If
true, decommit on a contiguous VMO can work and return ZX_OK.  The pages are
loaned to the rest of the system for potential borrowing.  If false, decommit
will return ZX_ERR_NOT_SUPPORTED.

### kernel.ppb.replace-on-unloan=\<bool>

**Default:** `false`

This controls what happens when a loaned page is re-committed to its original
contiguous VMO. If false, the page is evicted from where it is loaned from,
requiring that content to be faulted back in. If true, the contents are copied
to a new page that is swapped in to replace the loaned page.

### kernel.render-dlog-to-crashlog=\<bool>

**Default:** `false`

When set to true, as much of the recent kernel debuglog as will fit will be
appended to the generated crashlog during a kernel panic to assist in debugging.

### kernel.serial=\[none | legacy | qemu | \<type>,\<base>,\<irq>\]

**Default:** `none`

This controls what serial port is used.  If provided, it overrides the serial
port described by the system's bootdata.  The kernel debug serial port is
a reserved resource and may not be used outside of the kernel.

If set to "none", the kernel debug serial port will be disabled and will not
be reserved, allowing the default serial port to be used outside the kernel.

### kernel.vdso.always_use_next=\<bool>

**Default:** `false`

If this option is set, the kernel will supply userspace with the "next" vDSO
rather than the "stable" vDSO as the default vDSO.

### vdso.ticks_get_force_syscall=\<bool>

**Default:** `false`

If this option is set, the `zx_ticks_get` vDSO call will be forced to be a true
syscall, even if the hardware cycle counter registers are accessible from
user-mode.

### vdso.clock_get_monotonic_force_syscall=\<bool>

**Default:** `false`

If this option is set, the `zx_clock_get_monotonic` vDSO call will be forced to
be a true syscall, instead of simply performing a transformation of the tick
counter in user-mode.

### kernel.userpager.overtime_wait_seconds=\<uint64_t>

**Default:** `0x14`

This option configures how long a user pager fault may block before being
considered overtime and printing an information message to the debuglog and
continuing to wait. A value of 0 indicates a wait is never considered to be
overtime.

### kernel.userpager.overtime_timeout_seconds=\<uint64_t>

**Default:** `0x12c`

This option configures how long a user pager fault may block before being
aborted. For a hardware page fault, the faulting thread will terminate with a
fatal page fault exception. For a software page fault triggered by a syscall,
the syscall will fail with `ZX_ERR_TIMED_OUT`. A value of 0 indicates a page
fault is never aborted due to a time out.

### kernel.heap-max-size-mb=\<uint64_t>

**Default:** `0x800`

This option configures the maximum size of the heap. Only has effect if kernel
has been compiled to use a virtual heap.

### kernel.heap.alloc_fill_threshold=\<uint64_t>

**Default:** `0x0`

When set, the kernel heap will fill allocations below this size (in bytes).

### kernel.bufferchain.reserve-pages=\<uint64_t>

**Default:** `0x20`

Specifies the number of pages per CPU to reserve for buffer chain allocations
(channel messages). Higher values reduce contention on the PMM when the
system is under load at the cost of using more memory when the system is
idle.

TODO(https://fxbug.dev/42147481): Determine an upper bound for this value to prevent
consuming too much memory.

### kernel.bypass-debuglog=\<bool>

**Default:** `false`

When enabled, forces output to the console instead of buffering it. The reason
we have both a compile switch and a cmdline parameter is to facilitate prints
in the kernel before cmdline is parsed to be forced to go to the console.
The compile switch setting overrides the cmdline parameter (if both are present).
Note that both the compile switch and the cmdline parameter have the side effect
of disabling irq driven uart Tx.

### kernel.debug_uart_poll=\<bool>

**Default:** `false`

If true, will periodically poll UART and forwards its contents into the console.

### kernel.enable-debugging-syscalls=\<bool>

**Default:** `false`

When disabled, certain debugging-related syscalls will fail with
`ZX_ERR_NOT_SUPPORTED`. These are:

* `zx_debug_send_command()`
* `zx_ktrace_control()`
* `zx_ktrace_init()`
* `zx_ktrace_read()`
* `zx_ktrace_write()`
* `zx_mtrace_control()`
* `zx_object_get_property()` with `ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID`
* `zx_process_write_memory()`
* `zx_system_mexec()`
* `zx_system_mexec_payload_get()`
* `zx_thread_write_state()` (When using the `ZX_THREAD_STATE_DEBUG_REGS` kind.)
* `zx_vmo_op_range()` with `ZX_VMO_OP_CACHE_INVALIDATE`

### kernel.enable-serial-syscalls=\[false | true | output-only\]

**Default:** `false`

When `false`, both `zx_debug_read()` and `zx_debug_write()` will fail with
`ZX_ERR_NOT_SUPPORTED`.

When `output-only`, `zx_debug_read()` will fail with `ZX_ERR_NOT_SUPPORTED`, but `zx_debug_write()`
will work normally.

When `true`, both will work normally.

### kernel.entropy-test.src=\[hw_rng | jitterentropy\]

**Default:** `hw_rng`

When running an entropy collector quality test, use the provided entropy source.
This option is ignored unless the kernel was built with `ENABLE_ENTROPY_COLLECTOR_TEST=1`.

### kernel.entropy-test.len=\<uint64_t>

**Default:** `0x100000`

When running an entropy collector quality test, collect the provided number of
bytes.

The maximum value can be increased by defining `ENTROPY_COLLECTOR_TEST_MAXLEN` as such value.

### kernel.force-watchdog-disabled=\<bool>

**Default:** `false`

When set, the system will attempt to disable any hardware watchdog timer armed
and passed by the bootloader as soon as it possibly can in the boot sequence,
presuming that the bootloader provides enough information to know how to disable
the WDT at all.

### kernel.halt-on-panic=\<bool>

**Default:** `false`

If this option is set, the system will halt on a kernel panic instead
of rebooting. To enable halt-on-panic, pass the kernel command line
argument `kernel.halt-on-panic=true`.

Since the kernel can't reliably draw to a framebuffer when the GPU is enabled,
the system will reboot by default if the kernel crashes or panics.

If the kernel crashes and the system reboots, the log from the kernel panic will
appear at `/boot/log/last-panic.txt`, suitable for viewing, downloading, etc.

> Please attach your `last-panic.txt` and `zircon.elf` files to any kernel
> panic bugs you file.

If there's a `last-panic.txt`, that indicates that this is the first successful
boot since a kernel panic occurred.

It is not "sticky" -- if you reboot cleanly, it will be gone, and if you crash
again it will be replaced.

### ktrace.bufsize=\<uint32_t>

**Default:** `0x20`

This option specifies the number of megabytes allocated for ktrace records.

### ktrace.grpmask=\<uint32_t>

**Default:** `0x0`

This option specifies what ktrace records are emitted.
The value is a bitmask of KTRACE\_GRP\_\* values from zircon/ktrace.h.
Hex values may be specified as 0xNNN.

### kernel.memory-limit-dbg=\<bool>

**Default:** `true`

This option enables verbose logging from the memory limit library.

### kernel.memory-limit-mb=\<uint64_t>

**Default:** `0x0`

This option sets an upper-bound in megabytes for the system memory.
If set to zero, then no upper-bound is set.

For example, choosing a low enough value would allow a user simulating a system with
less physical memory than it actually has.

### kernel.page-scanner.enable-eviction=\<bool>

**Default:** `true`

When set, allows the page scanner to evict user pager backed pages. Eviction can
reduce memory usage and prevent out of memory scenarios, but removes some
timing predictability from system behavior.

### kernel.page-scanner.discardable-evictions-percent=\<uint32_t>

**Default:** `0x14`

Percentage of page evictions, that should be satisfied from
discardable VMOs, as opposed to pager-backed VMOs. For example, if this value
is set to `X` and the kernel needs to reclaim `N` pages to relieve memory
pressure, it will evict `(N * X / 100)` pages from discardable VMOs, and the
remaining `(N * (100 - X) / 100)` pages from pager-backed VMOs.

Note that the kernel will try its best to honor this ratio between discardable
and pager-backed pages evicted, but the actual numbers might not be exact.

### kernel.page-scanner.page-table-eviction-policy=\[always | never | on_request\]

**Default:** `always`

Sets the reclamation policy for user page tables that are not accessed.

When `on_request`, only performs eviction on request, such as in response to a
low memory scenario.

When `never`, page tables are never evicted.

When `always`, Unused page tables are evicted periodically. The period can be controlled by
`kernel.page-scanner.page-table-eviction-period`.

### kernel.page-scanner.page-table-eviction-period=\<uint32_t>

**Default:** `0xa`

Sets the rate, in seconds, that page tables will be scanned. Any page tables not used between two
successive scans are candidates for eviction.

This option only has an effect if `kernel.page-scanner.page-table-eviction-policy=always`.

### kernel.page-scanner.min-aging-interval=\<uint32_t>

**Default:** `0x2`

Sets the minimum time, in seconds, between successive aging events. Higher values here will provide
a more stable active set with less chance of thrashing like behavior and less time spent harvesting
page access information. Lower values will allow for smaller active sets, increasing opportunities
for eviction.

This value should be less than or equal to `kernel.page-scanner.max-aging-interval`.

### kernel.page-scanner.max-aging-interval=\<uint32_t>

**Default:** `0xf`

Sets the maximum time, in seconds, between successive aging events. This time is the potential worst
case coarseness of page age information, and higher values can result in not having sufficient age
information to perform eviction if system behavior rapidly changes. Lower values will cause pages to
lose fidelity information by accumulating in the oldest bucket increasing the chance that when
eviction happens a sub-optimal page is chosen.

This value should be greater than or equal to `kernel.page-scanner.min-aging-interval`.

### kernel.page-scanner.accessed-scan-interval=\<uint32_t>

**Default:** `0x3`

Sets the time, in seconds, between harvesting page access information. Lower values provide greater
age fidelity and will improve accuracy of page reclamation choices at the expense of increased CPU
time spent harvesting.

There is no benefit to setting this to be lower than the `kernel.page-scanner.min-aging-interval`.

### kernel.page-scanner.active-ratio-multiplier=\<uint32_t>

**Default:** `0x2`

Controls the allowable ratio of active pages, compared to inactive pages, before aging is triggered.
The ratio is represented as a multiplier to simplify the kernel algorithm which is
`should_age = active_page_count * active_ratio_multiplier > inactive_page_count`. Higher multipliers
will result in more frequent aging events and hence less pages being in the active set. A multiplier
of 0 will disable aging based on the active page ratio.

The active ratio only triggers aging in the period between the `kernel.page-scanner.min-aging-interval`
and the `kernel.page-scanner.max-aging-interval`, and as such has no effect if the intervals are
equal.

### kernel.page-scanner.eviction-interval-seconds=\<uint32_t>

**Default:** `0xa`

This option specifies the periodic interval (in seconds) at which kernel eviction
will run in the background to try and keep the system out of memory pressure.
This will only take effect if continuous eviction is enabled with
`kernel.oom.evict-continuous`. If this value is lower than the page queue
rotation / aging interval (10s by default), it will be ignored and the eviction
interval will instead be set equal to the page queue rotation interval.

### kernel.page-scanner.start-at-boot=\<bool>

**Default:** `true`

This option causes the kernels active memory scanner to be initially
enabled on startup. You can also enable and disable it using the kernel
console. If you disable the scanner, you can have additional system
predictability since it removes time based and background memory eviction.

Every action the scanner performs can be individually configured and disabled.
If all actions are disabled then enabling the scanner has no effect.

### kernel.page-scanner.zero-page-scans-per-second=\<uint64_t>

**Default:** `0x4e20`

This option configures the maximal number of candidate pages the zero
page scanner will consider every second.

Setting to zero means no zero page scanning will occur. This can provide
additional system predictability for benchmarking or other workloads.

The page scanner must be running for this option to have any effect. It can be
enabled at boot with the `kernel.page-scanner.start-at-boot` option.

This value was chosen to consume, in the worst case, 5% CPU on a lower-end
arm device. Individual configurations may wish to tune this higher (or lower)
as needed.

### kernel.page-scanner.lru-action=\[none | evict_only | compress_only | evict_and_compress\]

**Default:** `none`

Sets any reclamation action to take on old pages in the LRU queue. These actions occur regardless of
memory pressure. If the `none` action is specified then pages will not be reclaimed just because
they are old.

Supported actions are:
- `none`
- `evict_only`
- `compress_only`
- `evict_and_compress`

### kernel.compression.random-debug-compress=\<bool>

**Default:** `false`

Enables a testing option that causes the VM to random immediately compress pages, regardless of
their age. This is intended to facilitate testing of the compression paths without needing to wait
for pages to age and put the system into a low memory state. It is an error to enable this option
if the kernel is not built with debugging assertions enabled, or if a compression and storage
strategy are not set.

### kernel.compression.strategy=\[none | lz4\]

**Default:** `none`

Supported compression strategies are:
- `none`
- `lz4`

This option selects the desired compression strategy to be used when a page needs to be compressed.
If `none` is set then `kernel.compression.storage-strategy` must also be `none`. Selecting `none`
effectively disables compression.

### kernel.compression.storage-strategy=\[none | tri_page\]

**Default:** `none`

Supported compression storage strategies are:
- `none`
- `tri_page`

This option selects the desired storage strategy to be used for storing data that has been
compressed. If `none` is set then `kernel.compression.strategy` must also be `none`.

### kernel.compression.threshold=\<uint32_t>

**Default:** `0x46`

This option controls the compression threshold that must be achieved for a compressed page to be
stored. Pages that do not achieve this threshold will continue to be stored uncompressed instead.

The option is a percentage, with a value of 100 meaning a page just needs to compress to at least
its original size, and a value of 0 meaning that page would need to compress to a zero size.

Valid values are between 1 and 100, inclusive.

### kernel.compression.lz4.acceleration=\<uint32_t>

**Default:** `0xb`

This option controls the acceleration factor provided to the LZ4 compression implementation. Refer
to the current LZ4 implementation for how this value will be interpreted.

### kernel.compression.at_memory_pressure=\<bool>

**Default:** `false`

This option controls whether page compression should be performed in response to memory pressure.

For this option to have any effect kernel.page-scanner.enable-eviction needs to be enabled and both
kernel.compression.strategy and kernel.compression.storage-strategy need to be set.

### kernel.compression.reclaim_anonymous=\<bool>

**Default:** `false`

This option controls whether anonymous pages are placed in the reclaimable page queues and have
associated age information. Enabling this adds a small overhead to anonymous pages for age tracking,
but is required for options like "kernel.compression.at_memory_pressure" to have any effect.

### kernel.compression.reclaim_zero_forks=\<bool>

**Default:** `false`

This option is similar to "kernel.compression.reclaim_anonymous" but applies to the zero forks of
anonymous pages. Enabling this makes the "kernel.page-scanner.zero-page-scans-per-second" option
have no effect, and it is an error to enable this without enabling "kernel.compression.reclaim_anonymous".

### kernel.pmm-checker.action=\<string>

**Default:** `oops`

Supported actions:
- `oops`
- `panic`

This option specifies which action is taken when the PMM checker detects
corruption.

When `oops`, a non-fatal kernel OOPS will be emitted when corruption is detected.

When `panic` a fatal kernel panic will occur when corruption is detected.

### kernel.pmm-checker.enable=\<bool>

**Default:** `false`

This controls whether the PMM's use-after-free checker is enabled.
The PMM checker can be expensive and is intended for use in debug and
development builds.  See also "k pmm checker".

### kernel.pmm-checker.fill-size=\<uint64_t>

**Default:** `0x1000`

This option specifies how many bytes of each free page is filled or checked when
the PMM's use-after-free checker is enabled.  Valid values are multiples of 8,
between 8 and PAGE_SIZE, inclusive.

### kernel.pmm.alloc-random-should-wait=\<bool>

**Default:** `false`

Enables a testing option that causes the PMM to randomly fail wait-able page allocations with
ZX_ERR_SHOULD_WAIT, regardless of the current memory level. This is intended to facilitate testing
of the waiting paths without needing to put the system into a low memory state. It is an error to
enable this option if the kernel is not built with debugging assertions enabled.

### kernel.portobserver.reserve-pages=\<uint64_t>

**Default:** `0x8`

Specifies the number of pages per CPU to reserve for port observer (async
wait) allocations. Higher values reduce contention on the PMM when the system
is under load at the cost of using more memory when the system is idle.

### kernel.portpacket.reserve-pages=\<uint64_t>

**Default:** `0x1`

Specifies the number of pages per CPU to reserve for port packet (port_queue)
allocations. Higher values reduce contention on the PMM when the system is
under load at the cost of using more memory when the system is idle.

### kernel.root-job.behavior=\[halt | reboot | bootloader | recovery | shutdown\]

**Default:** `reboot`

This option specifies what action the kernel should take when the root job is
either terminated, or has no jobs and no processes.

When `halt`, will halt the system.

When `reboot`, will reboot the system.

When `bootloader`, will reboot the system into the bootloader.

When `recovery`, will reboot the system into the recovery partition.

When `shutdown`, will shutdown the system.

### kernel.root-job.notice=\<string>


The option allows a notice to be printed when the root job is either terminated, or has no jobs
 and no processes.

### kernel.shell=\<bool>

**Default:** `false`

Tells the kernel to start its own shell on the kernel console instead of a userspace sh.

### kernel.shell.script=\<string>


Tells the kernel to run a canned script of `kernel.shell` commands. If
`kernel.shell` is also specified, the kernel shell command prompt comes
after the script completes unless the script shuts down the system.
Since whitespace on the kernel command line separates different boot options,
`+` characters in the script are replaced with spaces to allow for commands
with arguments, and `;` characters can separate commands in the script.

### kernel.smp.ht=\<bool>

**Default:** `true`

This option specifies whether the HyperThreading (HT) logical CPUs should be enabled or not.

### kernel.test.ram.reserve=\<std::optional<RamReservation>>


Specifies a range of physical RAM to be reserved for testing purposes.
This should be written as just SIZE (an integer byte quantity, which should
be page-aligned) but will be read back as SIZE,ADDRESS after the kernel
assigns an address in early boot.

### kernel.port.max-observers=\<uint64_t>

**Default:** `0xc350`

Specifies the maximum number of observers any single port may have. When this limit is reached, a
Zircon exception is raised in the process that crosses the limit. This value should be high enough
that well behaved programs will not hit the limit, but low enough to terminate misbehaving programs
before they impact the system.

### kernel.experimental.serial_migration=\<bool>

**Default:** `false`

**TODO(https://fxbug.dev/42170495)**

Temporary flag to assist on serial driver migration from kernel's implementation to
ulib/uart implementation.

### kernel.select=\<string>

**Default:** `zircon`

The name of the kernel package to boot from the STORAGE_KERNEL item in the ZBI.

### kernel.scheduler.prefer-little-cpus=\<bool>

**Default:** `false`

When searching for a CPU on which to place a task, prefer little cores over big cores.  Enabling
this option trades off improved performance in favor of reduced power consumption.

DEPRECATED - This option is scheduled to be removed in an upcoming release.  Do not take any
critical dependencies on it.


## Options available only on arm64 machines

### kernel.arm64.disable_spec_mitigations=\<bool>

**Default:** `false`

If set, disables all speculative execution information leak mitigations.

If unset, the per-mitigation defaults will be used.

### kernel.arm64.event-stream.enable=\<bool>

**Default:** `true`

When enabled, each ARM cpu will enable an event stream generator, which per-cpu
sets the hidden event flag at a particular rate. This has the effect of kicking
cpus out of any WFE states they may be sitting in.

### kernel.arm64.event-stream.freq-hz=\<uint32_t>

**Default:** `0x2710`

If the event stream is enabled, specifies the frequency at which it will attempt
to run. The resolution is limited, so the driver will only be able to pick the
nearest power of 2 from the cpu timer counter.

### kernel.arm64.debug.dap-rom-soc=\<string>


If set, tries to initialize the dap debug aperture at a hard coded address for the particular
system on chip. Currently accepted values are amlogic-t931g, amlogic-s905d2, amlogic-s905d3g, and
amlogic-a311d.

### kernel.smp.maxcpus=\<uint32_t>

**Default:** `0x10`

This option caps the number of CPUs to initialize.  It cannot be greater than *SMP\_MAX\_CPUS*
for a specific architecture.

Note: The default value may vary for each architecture.

### kernel.phys.psci-reset=\[disabled | shutdown | reboot | reboot-bootloader | reboot-recovery\]

**Default:** `reboot`

This option determines what kind of PSCI reset operation (if any)
the early boot kernel will use if it needs to panic and crash.
If this is "disabled", the machine may enter an infinite loop on panic.

### kernel.arm64.phys.mmu=\<bool>

**Default:** `true`

This enables use of the MMU and caches during the kernel's early boot phase.

### kernel.arm64.enable-asid=\<bool>

**Default:** `true`

This enables use of ASIDs. True by default if the underlying hardware supports 16-bit ASIDs.

### kernel.arm64.alternate-vbar=\[none | auto | arch3 | arch1 | psci | smccc10\]

**Default:** `auto`

This selects the alternate exception vector implementation used to work around
CPU-specific issues on entry to EL1 from EL0.  Values can be:
 * `none` - No mitigations performed in early EL0 exception paths.
 * `auto` (default) - Select SMCCC function identifier based on availability
   reported by firmware via SMCCC / PSCI interfaces. Then each individual CPU
   queries the firmware for whether the workaround is needed at all. If the
   firmware is not SMCCC >= 1.1 that reports it supports the
   SMCCC_ARCH_WORKAROUND_3 and/or SMCCC_ARCH_WORKAROUND_1 function identifiers,
   then this has the same effect as `none`. If the firmware does support it,
   then each CPU either uses the firmware workaround or not, according to what
   the firmware says is needed on that CPU. Either way, alternative spectre
   mitigations, that are either redundant with the firmware workaround or not
   needed if the firmware workaround is not needed, are disabled.
 * `arch3` - Always use SMCCC_ARCH_WORKAROUND_3 on every CPU.  **This may have
   unpredictable effects if the firmware does not support SMCCC 1.1 or does not
   support SMCCC_ARCH_WORKAROUND_3.** This makes every CPU do what `auto` will
   select for each individual CPU that the firmware says should use it, when
   the firmware supports the function. This also disables alternative spectre
   mitigations that are redundant with SMCCC_ARCH_WORKAROUND_3.
 * `arch1` - Always use SMCCC_ARCH_WORKAROUND_1 on every CPU.  **This may have
   unpredictable effects if the firmware does not support SMCCC 1.1 or does not
   support SMCCC_ARCH_WORKAROUND_1.** This makes every CPU do what `auto` will
   select for each individual CPU that the firmware says should use it, when
   the firmware supports the "1" function but not the "3" function. This also
   disables alternative spectre mitigations that are redundant with
   SMCCC_ARCH_WORKAROUND_1.
 * `psci` - Always use PSCI_VERSION with SMCCC 1.1 calling conventions, on
   every CPU.  **This may have unpredictable effects if the firmware does not
   support SMCCC 1.1.** Currently `auto` never selects this behavior for any
   CPU.
 * `smccc10` - Always use PSCI_VERSION with SMCCC 1.0 calling conventions, on
   every CPU.  This is safe on all systems, though has it more overhead than
   SMCCC 1.1 options and may not be necessary on all CPUs.  Currently `auto`
   never selects this behavior for any CPU.
As on SoCs with heterogeneous cores, a different selection should be made for
each individual CPU, values other than `auto` should only be used in testing.


## Options available only on riscv64 machines

### kernel.smp.maxcpus=\<uint32_t>

**Default:** `0x10`

This option caps the number of CPUs to initialize.  It cannot be greater than *SMP\_MAX\_CPUS*
for a specific architecture.

Note: The default value may vary for each architecture.

### kernel.riscv64.enable-asid=\<bool>

**Default:** `true`

This enables use of ASIDs. True by default if the underlying hardware supports 16-bit ASIDs.


## Options available only on x86 machines

### kernel.x86.disable_spec_mitigations=\<bool>

**Default:** `false`

If set, disables all speculative execution information leak mitigations.

If unset, the per-mitigation defaults will be used.

### kernel.x86.hwp=\<bool>

**Default:** `true`

This settings enables HWP (hardware P-states) on supported chips. This feature
lets Intel CPUs automatically scale their own clock speed.

### kernel.x86.hwp_policy=\[bios-specified | performance | balanced | power-save | stable-performance\]

**Default:** `bios-specified`

Set a power/performance tradeoff policy of the CPU. x86 CPUs with HWP
(hardware P-state) support can be configured to autonomusly scale their
frequency to favour different policies.

Currently supported policies are:

*   `bios-specified`: Use the power/performance tradeoff policy
    specified in firmware/BIOS settings. If no policy is available, falls back
    to `balanced`.
*   `performance`: Maximise performance.
*   `balanced`: Balance performance / power savings.
*   `power-save`: Reduce power usage, at the cost of lower performance.
*   `stable-performance`: Use settings that keep system performance consistent.
    This may be useful for benchmarking, for example, where keeping performance
    predictable is more important than maximising performance.

### kernel.x86.md_clear_on_user_return=\<bool>

**Default:** `true`

MDS (Microarchitectural Data Sampling) is a family of speculative execution
information leak bugs that allow the contents of recent loads or stores to be
inferred by hostile code, regardless of privilege level (CVE-2019-11091,
CVE-2018-12126, CVE-2018-12130, CVE-2018-12127). For example, this could allow
user code to read recent kernel loads/stores.

To avoid this bug, it is required that all microarchitectural structures
that could leak data be flushed on trust level transitions. Also, it is
important that trust levels do not concurrently execute on a single physical
processor core.

This option controls whether microarchitectual structures are flushed on
the kernel to user exit path, if possible. It may have a negative performance
impact.

*   If set to true (the default), structures are flushed if the processor is
    vulnerable.
*   If set to false, no flush is executed on structures.

### kernel.x86.spec_store_bypass_disable=\<bool>

**Default:** `false`

Spec-store-bypass (Spectre V4) is a speculative execution information leak
vulnerability that affects many Intel and AMD x86 CPUs. It targets memory
disambiguation hardware to infer the contents of recent stores. The attack
only affects same-privilege-level, intra-process data.

This command line option controls whether a mitigation is enabled. The
mitigation has negative performance impacts.

* If true, the mitigation is enabled on CPUs that need it.
* If false (the default), the mitigation is not enabled.

### kernel.x86.turbo=\<bool>

**Default:** `true`

Turbo Boost or Core Performance Boost are mechanisms that allow processors to
dynamically vary their performance at runtime based on available thermal and
electrical budget. This may provide improved interactive performance at the cost
of performance variability. Some workloads may benefit from disabling Turbo; if
this command line flag is set to false, turbo is disabled for all CPUs in the
system.

### kernel.x86.enable_pcid=\<bool>

**Default:** `true`

This option controls whether PCIDs are used, if there is sufficient CPU support.
If this option is enabled and there is not sufficient CPU support, then this
option has no effect.

### kernel.smp.maxcpus=\<uint32_t>

**Default:** `0x20`

This option caps the number of CPUs to initialize.  It cannot be greater than *SMP\_MAX\_CPUS* 
for a specific architecture.

Note: The default value may vary for each architecture.

### kernel.enable_suspend=\<bool>

**Default:** `false`

Enable the kernel to go to the S3 (Suspend to RAM) ACPI power state.

### kernel.wallclock=\[auto | tsc | pit | hpet\]

**Default:** `auto`

This option can be used to force the selection of a particular wall clock on pc builds.

{# DO NOT EDIT THIS FILE DIRECTLY #}
{# Instead see the top of the file for instructions. #}
