File Index
Files and directories
Sign in
FILE

hvhdk_mini.h

File preview with syntax highlighting.

linux-6.19.14/include/hyperv/hvhdk_mini.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Type definitions for the Microsoft Hypervisor.
  4 */
  5#ifndef _HV_HVHDK_MINI_H
  6#define _HV_HVHDK_MINI_H
  7
  8#include "hvgdk_mini.h"
  9
 10/*
 11 * Doorbell connection_info flags.
 12 */
 13#define HV_DOORBELL_FLAG_TRIGGER_SIZE_MASK  0x00000007
 14#define HV_DOORBELL_FLAG_TRIGGER_SIZE_ANY   0x00000000
 15#define HV_DOORBELL_FLAG_TRIGGER_SIZE_BYTE  0x00000001
 16#define HV_DOORBELL_FLAG_TRIGGER_SIZE_WORD  0x00000002
 17#define HV_DOORBELL_FLAG_TRIGGER_SIZE_DWORD 0x00000003
 18#define HV_DOORBELL_FLAG_TRIGGER_SIZE_QWORD 0x00000004
 19#define HV_DOORBELL_FLAG_TRIGGER_ANY_VALUE  0x80000000
 20
 21/* Each generic set contains 64 elements */
 22#define HV_GENERIC_SET_SHIFT		(6)
 23#define HV_GENERIC_SET_MASK		(63)
 24
 25enum hv_generic_set_format {
 26	HV_GENERIC_SET_SPARSE_4K,
 27	HV_GENERIC_SET_ALL,
 28};
 29#define HV_GENERIC_SET_FORMAT hv_generic_set_format
 30
 31enum hv_scheduler_type {
 32	HV_SCHEDULER_TYPE_LP		= 1, /* Classic scheduler w/o SMT */
 33	HV_SCHEDULER_TYPE_LP_SMT	= 2, /* Classic scheduler w/ SMT */
 34	HV_SCHEDULER_TYPE_CORE_SMT	= 3, /* Core scheduler */
 35	HV_SCHEDULER_TYPE_ROOT		= 4, /* Root / integrated scheduler */
 36	HV_SCHEDULER_TYPE_MAX
 37};
 38
 39/* HV_STATS_AREA_TYPE */
 40enum hv_stats_area_type {
 41	HV_STATS_AREA_SELF = 0,
 42	HV_STATS_AREA_PARENT = 1,
 43	HV_STATS_AREA_INTERNAL = 2,
 44	HV_STATS_AREA_COUNT
 45};
 46
 47enum hv_stats_object_type {
 48	HV_STATS_OBJECT_HYPERVISOR		= 0x00000001,
 49	HV_STATS_OBJECT_LOGICAL_PROCESSOR	= 0x00000002,
 50	HV_STATS_OBJECT_PARTITION		= 0x00010001,
 51	HV_STATS_OBJECT_VP			= 0x00010002
 52};
 53
 54union hv_stats_object_identity {
 55	/* hv_stats_hypervisor */
 56	struct {
 57		u8 reserved[15];
 58		u8 stats_area_type;
 59	} __packed hv;
 60
 61	/* hv_stats_logical_processor */
 62	struct {
 63		u32 lp_index;
 64		u8 reserved[11];
 65		u8 stats_area_type;
 66	} __packed lp;
 67
 68	/* hv_stats_partition */
 69	struct {
 70		u64 partition_id;
 71		u8  reserved[7];
 72		u8  stats_area_type;
 73	} __packed partition;
 74
 75	/* hv_stats_vp */
 76	struct {
 77		u64 partition_id;
 78		u32 vp_index;
 79		u16 flags;
 80		u8  reserved;
 81		u8  stats_area_type;
 82	} __packed vp;
 83};
 84
 85enum hv_partition_property_code {
 86	/* Privilege properties */
 87	HV_PARTITION_PROPERTY_PRIVILEGE_FLAGS			= 0x00010000,
 88	HV_PARTITION_PROPERTY_SYNTHETIC_PROC_FEATURES		= 0x00010001,
 89
 90	/* Resource properties */
 91	HV_PARTITION_PROPERTY_GPA_PAGE_ACCESS_TRACKING		= 0x00050005,
 92	HV_PARTITION_PROPERTY_UNIMPLEMENTED_MSR_ACTION		= 0x00050017,
 93
 94	/* Compatibility properties */
 95	HV_PARTITION_PROPERTY_PROCESSOR_XSAVE_FEATURES		= 0x00060002,
 96	HV_PARTITION_PROPERTY_XSAVE_STATES                      = 0x00060007,
 97	HV_PARTITION_PROPERTY_MAX_XSAVE_DATA_SIZE		= 0x00060008,
 98	HV_PARTITION_PROPERTY_PROCESSOR_CLOCK_FREQUENCY		= 0x00060009,
 99
100	/* Extended properties with larger property values */
101	HV_PARTITION_PROPERTY_VMM_CAPABILITIES			= 0x00090007,
102};
103
104#define HV_PARTITION_VMM_CAPABILITIES_BANK_COUNT		1
105#define HV_PARTITION_VMM_CAPABILITIES_RESERVED_BITFIELD_COUNT	59
106
107struct hv_partition_property_vmm_capabilities {
108	u16 bank_count;
109	u16 reserved[3];
110	union {
111		u64 as_uint64[HV_PARTITION_VMM_CAPABILITIES_BANK_COUNT];
112		struct {
113			u64 map_gpa_preserve_adjustable: 1;
114			u64 vmm_can_provide_overlay_gpfn: 1;
115			u64 vp_affinity_property: 1;
116#if IS_ENABLED(CONFIG_ARM64)
117			u64 vmm_can_provide_gic_overlay_locations: 1;
118#else
119			u64 reservedbit3: 1;
120#endif
121			u64 assignable_synthetic_proc_features: 1;
122			u64 reserved0: HV_PARTITION_VMM_CAPABILITIES_RESERVED_BITFIELD_COUNT;
123		} __packed;
124	};
125} __packed;
126
127enum hv_snp_status {
128	HV_SNP_STATUS_NONE = 0,
129	HV_SNP_STATUS_AVAILABLE = 1,
130	HV_SNP_STATUS_INCOMPATIBLE = 2,
131	HV_SNP_STATUS_PSP_UNAVAILABLE = 3,
132	HV_SNP_STATUS_PSP_INIT_FAILED = 4,
133	HV_SNP_STATUS_PSP_BAD_FW_VERSION = 5,
134	HV_SNP_STATUS_BAD_CONFIGURATION = 6,
135	HV_SNP_STATUS_PSP_FW_UPDATE_IN_PROGRESS = 7,
136	HV_SNP_STATUS_PSP_RB_INIT_FAILED = 8,
137	HV_SNP_STATUS_PSP_PLATFORM_STATUS_FAILED = 9,
138	HV_SNP_STATUS_PSP_INIT_LATE_FAILED = 10,
139};
140
141enum hv_system_property {
142	/* Add more values when needed */
143	HV_SYSTEM_PROPERTY_SLEEP_STATE = 3,
144	HV_SYSTEM_PROPERTY_SCHEDULER_TYPE = 15,
145	HV_DYNAMIC_PROCESSOR_FEATURE_PROPERTY = 21,
146	HV_SYSTEM_PROPERTY_CRASHDUMPAREA = 47,
147};
148
149#define HV_PFN_RANGE_PGBITS 24  /* HV_SPA_PAGE_RANGE_ADDITIONAL_PAGES_BITS */
150union hv_pfn_range {            /* HV_SPA_PAGE_RANGE */
151	u64 as_uint64;
152	struct {
153		/* 39:0: base pfn.  63:40: additional pages */
154		u64 base_pfn : 64 - HV_PFN_RANGE_PGBITS;
155		u64 add_pfns : HV_PFN_RANGE_PGBITS;
156	} __packed;
157};
158
159enum hv_sleep_state {
160	HV_SLEEP_STATE_S1 = 1,
161	HV_SLEEP_STATE_S2 = 2,
162	HV_SLEEP_STATE_S3 = 3,
163	HV_SLEEP_STATE_S4 = 4,
164	HV_SLEEP_STATE_S5 = 5,
165	/*
166	 * After hypervisor has received this, any follow up sleep
167	 * state registration requests will be rejected.
168	 */
169	HV_SLEEP_STATE_LOCK = 6
170};
171
172enum hv_dynamic_processor_feature_property {
173	/* Add more values when needed */
174	HV_X64_DYNAMIC_PROCESSOR_FEATURE_MAX_ENCRYPTED_PARTITIONS = 13,
175	HV_X64_DYNAMIC_PROCESSOR_FEATURE_SNP_STATUS = 16,
176};
177
178struct hv_input_get_system_property {
179	u32 property_id; /* enum hv_system_property */
180	union {
181		u32 as_uint32;
182#if IS_ENABLED(CONFIG_X86)
183		/* enum hv_dynamic_processor_feature_property */
184		u32 hv_processor_feature;
185#endif
186		/* More fields to be filled in when needed */
187	};
188} __packed;
189
190struct hv_output_get_system_property {
191	union {
192		u32 scheduler_type; /* enum hv_scheduler_type */
193#if IS_ENABLED(CONFIG_X86)
194		u64 hv_processor_feature_value;
195#endif
196		union hv_pfn_range hv_cda_info; /* CrashdumpAreaAddress */
197		u64 hv_tramp_pa;                /* CrashdumpTrampolineAddress */
198	};
199} __packed;
200
201struct hv_sleep_state_info {
202	u32 sleep_state; /* enum hv_sleep_state */
203	u8 pm1a_slp_typ;
204	u8 pm1b_slp_typ;
205} __packed;
206
207struct hv_input_set_system_property {
208	u32 property_id; /* enum hv_system_property */
209	u32 reserved;
210	union {
211		/* More fields to be filled in when needed */
212		struct hv_sleep_state_info set_sleep_state_info;
213
214		/*
215		 * Add a reserved field to ensure the union is 8-byte aligned as
216		 * existing members may not be. This is a temporary measure
217		 * until all remaining members are added.
218		 */
219		 u64 reserved0[8];
220	};
221} __packed;
222
223struct hv_input_enter_sleep_state {     /* HV_INPUT_ENTER_SLEEP_STATE */
224	u32 sleep_state;        /* enum hv_sleep_state */
225} __packed;
226
227struct hv_input_map_stats_page {
228	u32 type; /* enum hv_stats_object_type */
229	u32 padding;
230	union hv_stats_object_identity identity;
231} __packed;
232
233struct hv_input_map_stats_page2 {
234	u32 type; /* enum hv_stats_object_type */
235	u32 padding;
236	union hv_stats_object_identity identity;
237	u64 map_location;
238} __packed;
239
240struct hv_output_map_stats_page {
241	u64 map_location;
242} __packed;
243
244struct hv_input_unmap_stats_page {
245	u32 type; /* enum hv_stats_object_type */
246	u32 padding;
247	union hv_stats_object_identity identity;
248} __packed;
249
250struct hv_proximity_domain_flags {
251	u32 proximity_preferred : 1;
252	u32 reserved : 30;
253	u32 proximity_info_valid : 1;
254} __packed;
255
256struct hv_proximity_domain_info {
257	u32 domain_id;
258	struct hv_proximity_domain_flags flags;
259} __packed;
260
261/* HvDepositMemory hypercall */
262struct hv_deposit_memory {	/* HV_INPUT_DEPOSIT_MEMORY */
263	u64 partition_id;
264	u64 gpa_page_list[];
265} __packed;
266
267struct hv_input_withdraw_memory {
268	u64 partition_id;
269	struct hv_proximity_domain_info proximity_domain_info;
270} __packed;
271
272struct hv_output_withdraw_memory {
273	DECLARE_FLEX_ARRAY(u64, gpa_page_list);
274} __packed;
275
276/* HV Map GPA (Guest Physical Address) Flags */
277#define HV_MAP_GPA_PERMISSIONS_NONE	       0x0
278#define HV_MAP_GPA_READABLE		       0x1
279#define HV_MAP_GPA_WRITABLE		       0x2
280#define HV_MAP_GPA_KERNEL_EXECUTABLE	       0x4
281#define HV_MAP_GPA_USER_EXECUTABLE	       0x8
282#define HV_MAP_GPA_EXECUTABLE		       0xC
283#define HV_MAP_GPA_PERMISSIONS_MASK	       0xF
284#define HV_MAP_GPA_ADJUSTABLE		    0x8000
285#define HV_MAP_GPA_NO_ACCESS		   0x10000
286#define HV_MAP_GPA_NOT_CACHED		  0x200000
287#define HV_MAP_GPA_LARGE_PAGE		0x80000000
288
289struct hv_input_map_gpa_pages {
290	u64 target_partition_id;
291	u64 target_gpa_base;
292	u32 map_flags;
293	u32 padding;
294	u64 source_gpa_page_list[];
295} __packed;
296
297union hv_gpa_page_access_state_flags {
298	struct {
299		u64 clear_accessed : 1;
300		u64 set_accessed : 1;
301		u64 clear_dirty : 1;
302		u64 set_dirty : 1;
303		u64 reserved : 60;
304	} __packed;
305	u64 as_uint64;
306};
307
308struct hv_input_get_gpa_pages_access_state {
309	u64  partition_id;
310	union hv_gpa_page_access_state_flags flags;
311	u64 hv_gpa_page_number;
312} __packed;
313
314union hv_gpa_page_access_state {
315	struct {
316		u8 accessed : 1;
317		u8 dirty : 1;
318		u8 reserved: 6;
319	};
320	u8 as_uint8;
321} __packed;
322
323enum hv_crashdump_action {
324	HV_CRASHDUMP_NONE = 0,
325	HV_CRASHDUMP_SUSPEND_ALL_VPS,
326	HV_CRASHDUMP_PREPARE_FOR_STATE_SAVE,
327	HV_CRASHDUMP_STATE_SAVED,
328	HV_CRASHDUMP_ENTRY,
329};
330
331struct hv_partition_event_root_crashdump_input {
332	u32 crashdump_action; /* enum hv_crashdump_action */
333} __packed;
334
335struct hv_input_disable_hyp_ex {   /* HV_X64_INPUT_DISABLE_HYPERVISOR_EX */
336	u64 rip;
337	u64 arg;
338} __packed;
339
340struct hv_crashdump_area {	   /* HV_CRASHDUMP_AREA */
341	u32 version;
342	union {
343		u32 flags_as_uint32;
344		struct {
345			u32 cda_valid : 1;
346			u32 cda_unused : 31;
347		} __packed;
348	};
349	/* more unused fields */
350} __packed;
351
352union hv_partition_event_input {
353	struct hv_partition_event_root_crashdump_input crashdump_input;
354};
355
356enum hv_partition_event {
357	HV_PARTITION_EVENT_ROOT_CRASHDUMP = 2,
358};
359
360struct hv_input_notify_partition_event {
361	u32 event;      /* enum hv_partition_event */
362	union hv_partition_event_input input;
363} __packed;
364
365struct hv_lp_startup_status {
366	u64 hv_status;
367	u64 substatus1;
368	u64 substatus2;
369	u64 substatus3;
370	u64 substatus4;
371	u64 substatus5;
372	u64 substatus6;
373} __packed;
374
375struct hv_input_add_logical_processor {
376	u32 lp_index;
377	u32 apic_id;
378	struct hv_proximity_domain_info proximity_domain_info;
379} __packed;
380
381struct hv_output_add_logical_processor {
382	struct hv_lp_startup_status startup_status;
383} __packed;
384
385enum {	/* HV_SUBNODE_TYPE */
386	HV_SUBNODE_ANY		= 0,
387	HV_SUBNODE_SOCKET,
388	HV_SUBNODE_CLUSTER,
389	HV_SUBNODE_L3,
390	HV_SUBNODE_COUNT,
391	HV_SUBNODE_INVALID	= -1
392};
393
394struct hv_create_vp {	/* HV_INPUT_CREATE_VP */
395	u64 partition_id;
396	u32 vp_index;
397	u8 padding[3];
398	u8 subnode_type;
399	u64 subnode_id;
400	struct hv_proximity_domain_info proximity_domain_info;
401	u64 flags;
402} __packed;
403
404/* HV_INTERRUPT_TRIGGER_MODE */
405enum hv_interrupt_trigger_mode {
406	HV_INTERRUPT_TRIGGER_MODE_EDGE	= 0,
407	HV_INTERRUPT_TRIGGER_MODE_LEVEL	= 1,
408};
409
410/* HV_DEVICE_INTERRUPT_DESCRIPTOR */
411struct hv_device_interrupt_descriptor {
412	u32 interrupt_type;
413	u32 trigger_mode;
414	u32 vector_count;
415	u32 reserved;
416	struct hv_device_interrupt_target target;
417} __packed;
418
419/* HV_INPUT_MAP_DEVICE_INTERRUPT */
420struct hv_input_map_device_interrupt {
421	u64 partition_id;
422	u64 device_id;
423	u32 flags;
424	u32 base_irt_idx;
425	struct hv_interrupt_entry logical_interrupt_entry;
426	struct hv_device_interrupt_descriptor interrupt_descriptor;
427} __packed;
428
429/* HV_OUTPUT_MAP_DEVICE_INTERRUPT */
430struct hv_output_map_device_interrupt {
431	struct hv_interrupt_entry interrupt_entry;
432	u64 ext_status_deprecated[5];
433} __packed;
434
435/* HV_INPUT_UNMAP_DEVICE_INTERRUPT */
436struct hv_input_unmap_device_interrupt {
437	u64 partition_id;
438	u64 device_id;
439	struct hv_interrupt_entry interrupt_entry;
440	u32 flags;
441} __packed;
442
443#define HV_SOURCE_SHADOW_NONE		    0x0
444#define HV_SOURCE_SHADOW_BRIDGE_BUS_RANGE   0x1
445
446struct hv_send_ipi_ex { /* HV_INPUT_SEND_SYNTHETIC_CLUSTER_IPI_EX */
447	u32 vector;
448	u32 reserved;
449	struct hv_vpset vp_set;
450} __packed;
451
452typedef u16 hv_pci_rid;		/* HV_PCI_RID */
453typedef u16 hv_pci_segment;	/* HV_PCI_SEGMENT */
454typedef u64 hv_logical_device_id;
455union hv_pci_bdf {	/* HV_PCI_BDF */
456	u16 as_uint16;
457
458	struct {
459		u8 function : 3;
460		u8 device : 5;
461		u8 bus;
462	};
463} __packed;
464
465union hv_pci_bus_range {
466	u16 as_uint16;
467
468	struct {
469		u8 subordinate_bus;
470		u8 secondary_bus;
471	};
472} __packed;
473
474enum hv_device_type {		/* HV_DEVICE_TYPE */
475	HV_DEVICE_TYPE_LOGICAL	= 0,
476	HV_DEVICE_TYPE_PCI	= 1,
477	HV_DEVICE_TYPE_IOAPIC	= 2,
478	HV_DEVICE_TYPE_ACPI	= 3,
479};
480
481union hv_device_id {		/* HV_DEVICE_ID */
482	u64 as_uint64;
483
484	struct {
485		u64 reserved0 : 62;
486		u64 device_type : 2;
487	};
488
489	/* HV_DEVICE_TYPE_LOGICAL */
490	struct {
491		u64 id : 62;
492		u64 device_type : 2;
493	} logical;
494
495	/* HV_DEVICE_TYPE_PCI */
496	struct {
497		union {
498			hv_pci_rid rid;
499			union hv_pci_bdf bdf;
500		};
501
502		hv_pci_segment segment;
503		union hv_pci_bus_range shadow_bus_range;
504
505		u16 phantom_function_bits : 2;
506		u16 source_shadow : 1;
507
508		u16 rsvdz0 : 11;
509		u16 device_type : 2;
510	} pci;
511
512	/* HV_DEVICE_TYPE_IOAPIC */
513	struct {
514		u8 ioapic_id;
515		u8 rsvdz0;
516		u16 rsvdz1;
517		u16 rsvdz2;
518
519		u16 rsvdz3 : 14;
520		u16 device_type : 2;
521	} ioapic;
522
523	/* HV_DEVICE_TYPE_ACPI */
524	struct {
525		u32 input_mapping_base;
526		u32 input_mapping_count : 30;
527		u32 device_type : 2;
528	} acpi;
529} __packed;
530
531#endif /* _HV_HVHDK_MINI_H */
~/ Read-only file preview.