xref: /openbmc/qemu/include/hw/xen/interface/hvm/params.h (revision 3e34860a3a03f969ad0720ec9c12ea10e88738a6)
1*8ac98aedSDavid Woodhouse /* SPDX-License-Identifier: MIT */
250c88402SJoao Martins /*
350c88402SJoao Martins  * Copyright (c) 2007, Keir Fraser
450c88402SJoao Martins  */
550c88402SJoao Martins 
650c88402SJoao Martins #ifndef __XEN_PUBLIC_HVM_PARAMS_H__
750c88402SJoao Martins #define __XEN_PUBLIC_HVM_PARAMS_H__
850c88402SJoao Martins 
950c88402SJoao Martins #include "hvm_op.h"
1050c88402SJoao Martins 
1150c88402SJoao Martins /* These parameters are deprecated and their meaning is undefined. */
1250c88402SJoao Martins #if defined(__XEN__) || defined(__XEN_TOOLS__)
1350c88402SJoao Martins 
1450c88402SJoao Martins #define HVM_PARAM_PAE_ENABLED                4
1550c88402SJoao Martins #define HVM_PARAM_DM_DOMAIN                 13
1650c88402SJoao Martins #define HVM_PARAM_MEMORY_EVENT_CR0          20
1750c88402SJoao Martins #define HVM_PARAM_MEMORY_EVENT_CR3          21
1850c88402SJoao Martins #define HVM_PARAM_MEMORY_EVENT_CR4          22
1950c88402SJoao Martins #define HVM_PARAM_MEMORY_EVENT_INT3         23
2050c88402SJoao Martins #define HVM_PARAM_NESTEDHVM                 24
2150c88402SJoao Martins #define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP  25
2250c88402SJoao Martins #define HVM_PARAM_BUFIOREQ_EVTCHN           26
2350c88402SJoao Martins #define HVM_PARAM_MEMORY_EVENT_MSR          30
2450c88402SJoao Martins 
2550c88402SJoao Martins #endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
2650c88402SJoao Martins 
2750c88402SJoao Martins /*
2850c88402SJoao Martins  * Parameter space for HVMOP_{set,get}_param.
2950c88402SJoao Martins  */
3050c88402SJoao Martins 
3150c88402SJoao Martins #define HVM_PARAM_CALLBACK_IRQ 0
3250c88402SJoao Martins #define HVM_PARAM_CALLBACK_IRQ_TYPE_MASK xen_mk_ullong(0xFF00000000000000)
3350c88402SJoao Martins /*
3450c88402SJoao Martins  * How should CPU0 event-channel notifications be delivered?
3550c88402SJoao Martins  *
3650c88402SJoao Martins  * If val == 0 then CPU0 event-channel notifications are not delivered.
3750c88402SJoao Martins  * If val != 0, val[63:56] encodes the type, as follows:
3850c88402SJoao Martins  */
3950c88402SJoao Martins 
4050c88402SJoao Martins #define HVM_PARAM_CALLBACK_TYPE_GSI      0
4150c88402SJoao Martins /*
4250c88402SJoao Martins  * val[55:0] is a delivery GSI.  GSI 0 cannot be used, as it aliases val == 0,
4350c88402SJoao Martins  * and disables all notifications.
4450c88402SJoao Martins  */
4550c88402SJoao Martins 
4650c88402SJoao Martins #define HVM_PARAM_CALLBACK_TYPE_PCI_INTX 1
4750c88402SJoao Martins /*
4850c88402SJoao Martins  * val[55:0] is a delivery PCI INTx line:
4950c88402SJoao Martins  * Domain = val[47:32], Bus = val[31:16] DevFn = val[15:8], IntX = val[1:0]
5050c88402SJoao Martins  */
5150c88402SJoao Martins 
5250c88402SJoao Martins #if defined(__i386__) || defined(__x86_64__)
5350c88402SJoao Martins #define HVM_PARAM_CALLBACK_TYPE_VECTOR   2
5450c88402SJoao Martins /*
5550c88402SJoao Martins  * val[7:0] is a vector number.  Check for XENFEAT_hvm_callback_vector to know
5650c88402SJoao Martins  * if this delivery method is available.
5750c88402SJoao Martins  */
5850c88402SJoao Martins #elif defined(__arm__) || defined(__aarch64__)
5950c88402SJoao Martins #define HVM_PARAM_CALLBACK_TYPE_PPI      2
6050c88402SJoao Martins /*
6150c88402SJoao Martins  * val[55:16] needs to be zero.
6250c88402SJoao Martins  * val[15:8] is interrupt flag of the PPI used by event-channel:
6350c88402SJoao Martins  *  bit 8: the PPI is edge(1) or level(0) triggered
6450c88402SJoao Martins  *  bit 9: the PPI is active low(1) or high(0)
6550c88402SJoao Martins  * val[7:0] is a PPI number used by event-channel.
6650c88402SJoao Martins  * This is only used by ARM/ARM64 and masking/eoi the interrupt associated to
6750c88402SJoao Martins  * the notification is handled by the interrupt controller.
6850c88402SJoao Martins  */
6950c88402SJoao Martins #define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_MASK      0xFF00
7050c88402SJoao Martins #define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_LOW_LEVEL 2
7150c88402SJoao Martins #endif
7250c88402SJoao Martins 
7350c88402SJoao Martins /*
7450c88402SJoao Martins  * These are not used by Xen. They are here for convenience of HVM-guest
7550c88402SJoao Martins  * xenbus implementations.
7650c88402SJoao Martins  */
7750c88402SJoao Martins #define HVM_PARAM_STORE_PFN    1
7850c88402SJoao Martins #define HVM_PARAM_STORE_EVTCHN 2
7950c88402SJoao Martins 
8050c88402SJoao Martins #define HVM_PARAM_IOREQ_PFN    5
8150c88402SJoao Martins 
8250c88402SJoao Martins #define HVM_PARAM_BUFIOREQ_PFN 6
8350c88402SJoao Martins 
8450c88402SJoao Martins #if defined(__i386__) || defined(__x86_64__)
8550c88402SJoao Martins 
8650c88402SJoao Martins /*
8750c88402SJoao Martins  * Viridian enlightenments
8850c88402SJoao Martins  *
8950c88402SJoao Martins  * (See http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BDEF-79EEF16E880B/Hypervisor%20Top%20Level%20Functional%20Specification%20v4.0.docx)
9050c88402SJoao Martins  *
9150c88402SJoao Martins  * To expose viridian enlightenments to the guest set this parameter
9250c88402SJoao Martins  * to the desired feature mask. The base feature set must be present
9350c88402SJoao Martins  * in any valid feature mask.
9450c88402SJoao Martins  */
9550c88402SJoao Martins #define HVM_PARAM_VIRIDIAN     9
9650c88402SJoao Martins 
9750c88402SJoao Martins /* Base+Freq viridian feature sets:
9850c88402SJoao Martins  *
9950c88402SJoao Martins  * - Hypercall MSRs (HV_X64_MSR_GUEST_OS_ID and HV_X64_MSR_HYPERCALL)
10050c88402SJoao Martins  * - APIC access MSRs (HV_X64_MSR_EOI, HV_X64_MSR_ICR and HV_X64_MSR_TPR)
10150c88402SJoao Martins  * - Virtual Processor index MSR (HV_X64_MSR_VP_INDEX)
10250c88402SJoao Martins  * - Timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and
10350c88402SJoao Martins  *   HV_X64_MSR_APIC_FREQUENCY)
10450c88402SJoao Martins  */
10550c88402SJoao Martins #define _HVMPV_base_freq 0
10650c88402SJoao Martins #define HVMPV_base_freq  (1 << _HVMPV_base_freq)
10750c88402SJoao Martins 
10850c88402SJoao Martins /* Feature set modifications */
10950c88402SJoao Martins 
11050c88402SJoao Martins /* Disable timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and
11150c88402SJoao Martins  * HV_X64_MSR_APIC_FREQUENCY).
11250c88402SJoao Martins  * This modification restores the viridian feature set to the
11350c88402SJoao Martins  * original 'base' set exposed in releases prior to Xen 4.4.
11450c88402SJoao Martins  */
11550c88402SJoao Martins #define _HVMPV_no_freq 1
11650c88402SJoao Martins #define HVMPV_no_freq  (1 << _HVMPV_no_freq)
11750c88402SJoao Martins 
11850c88402SJoao Martins /* Enable Partition Time Reference Counter (HV_X64_MSR_TIME_REF_COUNT) */
11950c88402SJoao Martins #define _HVMPV_time_ref_count 2
12050c88402SJoao Martins #define HVMPV_time_ref_count  (1 << _HVMPV_time_ref_count)
12150c88402SJoao Martins 
12250c88402SJoao Martins /* Enable Reference TSC Page (HV_X64_MSR_REFERENCE_TSC) */
12350c88402SJoao Martins #define _HVMPV_reference_tsc 3
12450c88402SJoao Martins #define HVMPV_reference_tsc  (1 << _HVMPV_reference_tsc)
12550c88402SJoao Martins 
12650c88402SJoao Martins /* Use Hypercall for remote TLB flush */
12750c88402SJoao Martins #define _HVMPV_hcall_remote_tlb_flush 4
12850c88402SJoao Martins #define HVMPV_hcall_remote_tlb_flush (1 << _HVMPV_hcall_remote_tlb_flush)
12950c88402SJoao Martins 
13050c88402SJoao Martins /* Use APIC assist */
13150c88402SJoao Martins #define _HVMPV_apic_assist 5
13250c88402SJoao Martins #define HVMPV_apic_assist (1 << _HVMPV_apic_assist)
13350c88402SJoao Martins 
13450c88402SJoao Martins /* Enable crash MSRs */
13550c88402SJoao Martins #define _HVMPV_crash_ctl 6
13650c88402SJoao Martins #define HVMPV_crash_ctl (1 << _HVMPV_crash_ctl)
13750c88402SJoao Martins 
13850c88402SJoao Martins /* Enable SYNIC MSRs */
13950c88402SJoao Martins #define _HVMPV_synic 7
14050c88402SJoao Martins #define HVMPV_synic (1 << _HVMPV_synic)
14150c88402SJoao Martins 
14250c88402SJoao Martins /* Enable STIMER MSRs */
14350c88402SJoao Martins #define _HVMPV_stimer 8
14450c88402SJoao Martins #define HVMPV_stimer (1 << _HVMPV_stimer)
14550c88402SJoao Martins 
14650c88402SJoao Martins /* Use Synthetic Cluster IPI Hypercall */
14750c88402SJoao Martins #define _HVMPV_hcall_ipi 9
14850c88402SJoao Martins #define HVMPV_hcall_ipi (1 << _HVMPV_hcall_ipi)
14950c88402SJoao Martins 
15050c88402SJoao Martins /* Enable ExProcessorMasks */
15150c88402SJoao Martins #define _HVMPV_ex_processor_masks 10
15250c88402SJoao Martins #define HVMPV_ex_processor_masks (1 << _HVMPV_ex_processor_masks)
15350c88402SJoao Martins 
15450c88402SJoao Martins /* Allow more than 64 VPs */
15550c88402SJoao Martins #define _HVMPV_no_vp_limit 11
15650c88402SJoao Martins #define HVMPV_no_vp_limit (1 << _HVMPV_no_vp_limit)
15750c88402SJoao Martins 
15850c88402SJoao Martins /* Enable vCPU hotplug */
15950c88402SJoao Martins #define _HVMPV_cpu_hotplug 12
16050c88402SJoao Martins #define HVMPV_cpu_hotplug (1 << _HVMPV_cpu_hotplug)
16150c88402SJoao Martins 
16250c88402SJoao Martins #define HVMPV_feature_mask \
16350c88402SJoao Martins         (HVMPV_base_freq | \
16450c88402SJoao Martins          HVMPV_no_freq | \
16550c88402SJoao Martins          HVMPV_time_ref_count | \
16650c88402SJoao Martins          HVMPV_reference_tsc | \
16750c88402SJoao Martins          HVMPV_hcall_remote_tlb_flush | \
16850c88402SJoao Martins          HVMPV_apic_assist | \
16950c88402SJoao Martins          HVMPV_crash_ctl | \
17050c88402SJoao Martins          HVMPV_synic | \
17150c88402SJoao Martins          HVMPV_stimer | \
17250c88402SJoao Martins          HVMPV_hcall_ipi | \
17350c88402SJoao Martins          HVMPV_ex_processor_masks | \
17450c88402SJoao Martins          HVMPV_no_vp_limit | \
17550c88402SJoao Martins          HVMPV_cpu_hotplug)
17650c88402SJoao Martins 
17750c88402SJoao Martins #endif
17850c88402SJoao Martins 
17950c88402SJoao Martins /*
18050c88402SJoao Martins  * Set mode for virtual timers (currently x86 only):
18150c88402SJoao Martins  *  delay_for_missed_ticks (default):
18250c88402SJoao Martins  *   Do not advance a vcpu's time beyond the correct delivery time for
18350c88402SJoao Martins  *   interrupts that have been missed due to preemption. Deliver missed
18450c88402SJoao Martins  *   interrupts when the vcpu is rescheduled and advance the vcpu's virtual
18550c88402SJoao Martins  *   time stepwise for each one.
18650c88402SJoao Martins  *  no_delay_for_missed_ticks:
18750c88402SJoao Martins  *   As above, missed interrupts are delivered, but guest time always tracks
18850c88402SJoao Martins  *   wallclock (i.e., real) time while doing so.
18950c88402SJoao Martins  *  no_missed_ticks_pending:
19050c88402SJoao Martins  *   No missed interrupts are held pending. Instead, to ensure ticks are
19150c88402SJoao Martins  *   delivered at some non-zero rate, if we detect missed ticks then the
19250c88402SJoao Martins  *   internal tick alarm is not disabled if the VCPU is preempted during the
19350c88402SJoao Martins  *   next tick period.
19450c88402SJoao Martins  *  one_missed_tick_pending:
19550c88402SJoao Martins  *   Missed interrupts are collapsed together and delivered as one 'late tick'.
19650c88402SJoao Martins  *   Guest time always tracks wallclock (i.e., real) time.
19750c88402SJoao Martins  */
19850c88402SJoao Martins #define HVM_PARAM_TIMER_MODE   10
19950c88402SJoao Martins #define HVMPTM_delay_for_missed_ticks    0
20050c88402SJoao Martins #define HVMPTM_no_delay_for_missed_ticks 1
20150c88402SJoao Martins #define HVMPTM_no_missed_ticks_pending   2
20250c88402SJoao Martins #define HVMPTM_one_missed_tick_pending   3
20350c88402SJoao Martins 
20450c88402SJoao Martins /* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
20550c88402SJoao Martins #define HVM_PARAM_HPET_ENABLED 11
20650c88402SJoao Martins 
20750c88402SJoao Martins /* Identity-map page directory used by Intel EPT when CR0.PG=0. */
20850c88402SJoao Martins #define HVM_PARAM_IDENT_PT     12
20950c88402SJoao Martins 
21050c88402SJoao Martins /* ACPI S state: currently support S0 and S3 on x86. */
21150c88402SJoao Martins #define HVM_PARAM_ACPI_S_STATE 14
21250c88402SJoao Martins 
21350c88402SJoao Martins /* TSS used on Intel when CR0.PE=0. */
21450c88402SJoao Martins #define HVM_PARAM_VM86_TSS     15
21550c88402SJoao Martins 
21650c88402SJoao Martins /* Boolean: Enable aligning all periodic vpts to reduce interrupts */
21750c88402SJoao Martins #define HVM_PARAM_VPT_ALIGN    16
21850c88402SJoao Martins 
21950c88402SJoao Martins /* Console debug shared memory ring and event channel */
22050c88402SJoao Martins #define HVM_PARAM_CONSOLE_PFN    17
22150c88402SJoao Martins #define HVM_PARAM_CONSOLE_EVTCHN 18
22250c88402SJoao Martins 
22350c88402SJoao Martins /*
22450c88402SJoao Martins  * Select location of ACPI PM1a and TMR control blocks. Currently two locations
22550c88402SJoao Martins  * are supported, specified by version 0 or 1 in this parameter:
22650c88402SJoao Martins  *   - 0: default, use the old addresses
22750c88402SJoao Martins  *        PM1A_EVT == 0x1f40; PM1A_CNT == 0x1f44; PM_TMR == 0x1f48
22850c88402SJoao Martins  *   - 1: use the new default qemu addresses
22950c88402SJoao Martins  *        PM1A_EVT == 0xb000; PM1A_CNT == 0xb004; PM_TMR == 0xb008
23050c88402SJoao Martins  * You can find these address definitions in <hvm/ioreq.h>
23150c88402SJoao Martins  */
23250c88402SJoao Martins #define HVM_PARAM_ACPI_IOPORTS_LOCATION 19
23350c88402SJoao Martins 
23450c88402SJoao Martins /* Params for the mem event rings */
23550c88402SJoao Martins #define HVM_PARAM_PAGING_RING_PFN   27
23650c88402SJoao Martins #define HVM_PARAM_MONITOR_RING_PFN  28
23750c88402SJoao Martins #define HVM_PARAM_SHARING_RING_PFN  29
23850c88402SJoao Martins 
23950c88402SJoao Martins /* SHUTDOWN_* action in case of a triple fault */
24050c88402SJoao Martins #define HVM_PARAM_TRIPLE_FAULT_REASON 31
24150c88402SJoao Martins 
24250c88402SJoao Martins #define HVM_PARAM_IOREQ_SERVER_PFN 32
24350c88402SJoao Martins #define HVM_PARAM_NR_IOREQ_SERVER_PAGES 33
24450c88402SJoao Martins 
24550c88402SJoao Martins /* Location of the VM Generation ID in guest physical address space. */
24650c88402SJoao Martins #define HVM_PARAM_VM_GENERATION_ID_ADDR 34
24750c88402SJoao Martins 
24850c88402SJoao Martins /*
24950c88402SJoao Martins  * Set mode for altp2m:
25050c88402SJoao Martins  *  disabled: don't activate altp2m (default)
25150c88402SJoao Martins  *  mixed: allow access to all altp2m ops for both in-guest and external tools
25250c88402SJoao Martins  *  external: allow access to external privileged tools only
25350c88402SJoao Martins  *  limited: guest only has limited access (ie. control VMFUNC and #VE)
25450c88402SJoao Martins  *
25550c88402SJoao Martins  * Note that 'mixed' mode has not been evaluated for safety from a
25650c88402SJoao Martins  * security perspective.  Before using this mode in a
25750c88402SJoao Martins  * security-critical environment, each subop should be evaluated for
25850c88402SJoao Martins  * safety, with unsafe subops blacklisted in XSM.
25950c88402SJoao Martins  */
26050c88402SJoao Martins #define HVM_PARAM_ALTP2M       35
26150c88402SJoao Martins #define XEN_ALTP2M_disabled      0
26250c88402SJoao Martins #define XEN_ALTP2M_mixed         1
26350c88402SJoao Martins #define XEN_ALTP2M_external      2
26450c88402SJoao Martins #define XEN_ALTP2M_limited       3
26550c88402SJoao Martins 
26650c88402SJoao Martins /*
26750c88402SJoao Martins  * Size of the x87 FPU FIP/FDP registers that the hypervisor needs to
26850c88402SJoao Martins  * save/restore.  This is a workaround for a hardware limitation that
26950c88402SJoao Martins  * does not allow the full FIP/FDP and FCS/FDS to be restored.
27050c88402SJoao Martins  *
27150c88402SJoao Martins  * Valid values are:
27250c88402SJoao Martins  *
27350c88402SJoao Martins  * 8: save/restore 64-bit FIP/FDP and clear FCS/FDS (default if CPU
27450c88402SJoao Martins  *    has FPCSDS feature).
27550c88402SJoao Martins  *
27650c88402SJoao Martins  * 4: save/restore 32-bit FIP/FDP, FCS/FDS, and clear upper 32-bits of
27750c88402SJoao Martins  *    FIP/FDP.
27850c88402SJoao Martins  *
27950c88402SJoao Martins  * 0: allow hypervisor to choose based on the value of FIP/FDP
28050c88402SJoao Martins  *    (default if CPU does not have FPCSDS).
28150c88402SJoao Martins  *
28250c88402SJoao Martins  * If FPCSDS (bit 13 in CPUID leaf 0x7, subleaf 0x0) is set, the CPU
28350c88402SJoao Martins  * never saves FCS/FDS and this parameter should be left at the
28450c88402SJoao Martins  * default of 8.
28550c88402SJoao Martins  */
28650c88402SJoao Martins #define HVM_PARAM_X87_FIP_WIDTH 36
28750c88402SJoao Martins 
28850c88402SJoao Martins /*
28950c88402SJoao Martins  * TSS (and its size) used on Intel when CR0.PE=0. The address occupies
29050c88402SJoao Martins  * the low 32 bits, while the size is in the high 32 ones.
29150c88402SJoao Martins  */
29250c88402SJoao Martins #define HVM_PARAM_VM86_TSS_SIZED 37
29350c88402SJoao Martins 
29450c88402SJoao Martins /* Enable MCA capabilities. */
29550c88402SJoao Martins #define HVM_PARAM_MCA_CAP 38
29650c88402SJoao Martins #define XEN_HVM_MCA_CAP_LMCE   (xen_mk_ullong(1) << 0)
29750c88402SJoao Martins #define XEN_HVM_MCA_CAP_MASK   XEN_HVM_MCA_CAP_LMCE
29850c88402SJoao Martins 
29950c88402SJoao Martins #define HVM_NR_PARAMS 39
30050c88402SJoao Martins 
30150c88402SJoao Martins #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
302