1# -*- python -*-
2#
3# Builtin libxl types
4#
5
6namespace("libxl_")
7
8libxl_defbool = Builtin("defbool", json_parse_type="JSON_STRING", passby=PASS_BY_REFERENCE, copy_fn=None,
9                        check_default_fn="libxl__defbool_is_default")
10libxl_domid = Builtin("domid", json_gen_fn = "yajl_gen_integer", json_parse_fn = "libxl__uint32_parse_json",
11                      json_parse_type = "JSON_INTEGER", autogenerate_json = False, copy_fn=None)
12libxl_devid = Builtin("devid", json_gen_fn = "yajl_gen_integer", json_parse_fn = "libxl__int_parse_json",
13                      json_parse_type = "JSON_INTEGER", autogenerate_json = False, signed = True, init_val="-1",
14                      copy_fn=None)
15libxl_uuid = Builtin("uuid", json_parse_type="JSON_STRING", passby=PASS_BY_REFERENCE, check_default_fn="libxl_uuid_is_nil",
16                     copy_fn="libxl_uuid_copy")
17libxl_mac = Builtin("mac", json_parse_type="JSON_STRING", passby=PASS_BY_REFERENCE, check_default_fn="libxl__mac_is_default",
18                    copy_fn="libxl_mac_copy")
19libxl_bitmap = Builtin("bitmap", json_parse_type="JSON_ARRAY", dispose_fn="libxl_bitmap_dispose", passby=PASS_BY_REFERENCE,
20                       check_default_fn="libxl_bitmap_is_empty", copy_fn="libxl_bitmap_copy_alloc")
21libxl_cpuid_policy_list = Builtin("cpuid_policy_list", dispose_fn="libxl_cpuid_dispose", passby=PASS_BY_REFERENCE,
22                                  json_parse_type="JSON_ARRAY", check_default_fn="libxl__cpuid_policy_is_empty",
23                                  copy_fn="libxl_cpuid_policy_list_copy")
24
25libxl_string_list = Builtin("string_list", dispose_fn="libxl_string_list_dispose", passby=PASS_BY_REFERENCE,
26                            json_parse_type="JSON_ARRAY", check_default_fn="libxl__string_list_is_empty",
27                            copy_fn="libxl_string_list_copy")
28libxl_key_value_list = Builtin("key_value_list", dispose_fn="libxl_key_value_list_dispose", passby=PASS_BY_REFERENCE,
29                               json_parse_type="JSON_MAP", check_default_fn="libxl__key_value_list_is_empty",
30                               copy_fn="libxl_key_value_list_copy")
31libxl_hwcap = Builtin("hwcap", passby=PASS_BY_REFERENCE, json_parse_type="JSON_ARRAY",
32                      check_default_fn="libxl__hwcap_is_default", copy_fn="libxl_hwcap_copy")
33libxl_ms_vm_genid = Builtin("ms_vm_genid", passby=PASS_BY_REFERENCE, check_default_fn="libxl_ms_vm_genid_is_zero",
34                            copy_fn="libxl_ms_vm_genid_copy")
35
36#
37# Specific integer types
38#
39
40MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT", json_gen_fn = "libxl__uint64_gen_json")
41
42#
43# Constants / Enumerations
44#
45
46libxl_error = Enumeration("error", [
47    (-1, "NONSPECIFIC"),
48    (-2, "VERSION"),
49    (-3, "FAIL"),
50    (-4, "NI"),
51    (-5, "NOMEM"),
52    (-6, "INVAL"),
53    (-7, "BADFAIL"),
54    (-8, "GUEST_TIMEDOUT"),
55    (-9, "TIMEDOUT"),
56    (-10, "NOPARAVIRT"),
57    (-11, "NOT_READY"),
58    (-12, "OSEVENT_REG_FAIL"),
59    (-13, "BUFFERFULL"),
60    (-14, "UNKNOWN_CHILD"),
61    (-15, "LOCK_FAIL"),
62    (-16, "JSON_CONFIG_EMPTY"),
63    (-17, "DEVICE_EXISTS"),
64    (-18, "CHECKPOINT_DEVOPS_DOES_NOT_MATCH"),
65    (-19, "CHECKPOINT_DEVICE_NOT_SUPPORTED"),
66    (-20, "VNUMA_CONFIG_INVALID"),
67    (-21, "DOMAIN_NOTFOUND"),
68    (-22, "ABORTED"),
69    (-23, "NOTFOUND"),
70    (-24, "DOMAIN_DESTROYED"), # Target domain ceased to exist during op
71    (-25, "FEATURE_REMOVED"), # For functionality that has been removed
72    (-26, "PROTOCOL_ERROR_QMP"),
73    (-27, "UNKNOWN_QMP_ERROR"),
74    (-28, "QMP_GENERIC_ERROR"), # unspecified qmp error
75    (-29, "QMP_COMMAND_NOT_FOUND"), # the requested command has not been found
76    (-30, "QMP_DEVICE_NOT_ACTIVE"), # a device has failed to be become active
77    (-31, "QMP_DEVICE_NOT_FOUND"), # the requested device has not been found
78    (-32, "QEMU_API"), # QEMU's replies don't contains expected members
79    ], value_namespace = "")
80
81libxl_domain_type = Enumeration("domain_type", [
82    (-1, "INVALID"),
83    (1, "HVM"),
84    (2, "PV"),
85    (3, "PVH"),
86    ], init_val = "LIBXL_DOMAIN_TYPE_INVALID")
87
88libxl_rdm_reserve_strategy = Enumeration("rdm_reserve_strategy", [
89    (0, "ignore"),
90    (1, "host"),
91    ])
92
93libxl_rdm_reserve_policy = Enumeration("rdm_reserve_policy", [
94    (-1, "invalid"),
95    (0, "strict"),
96    (1, "relaxed"),
97    ], init_val = "LIBXL_RDM_RESERVE_POLICY_INVALID")
98
99libxl_channel_connection = Enumeration("channel_connection", [
100    (0, "UNKNOWN"),
101    (1, "PTY"),
102    (2, "SOCKET"), # a listening Unix domain socket
103    ])
104
105libxl_device_model_version = Enumeration("device_model_version", [
106    (0, "UNKNOWN"),
107    (1, "QEMU_XEN_TRADITIONAL"), # Historical qemu-xen device model (qemu-dm)
108    (2, "QEMU_XEN"),             # Upstream based qemu-xen device model
109    ])
110
111libxl_console_type = Enumeration("console_type", [
112    (0, "UNKNOWN"),
113    (1, "SERIAL"),
114    (2, "PV"),
115    (3, "VUART"),
116    ])
117
118libxl_disk_format = Enumeration("disk_format", [
119    (0, "UNKNOWN"),
120    (1, "QCOW"),
121    (2, "QCOW2"),
122    (3, "VHD"),
123    (4, "RAW"),
124    (5, "EMPTY"),
125    (6, "QED"),
126    ])
127
128libxl_disk_backend = Enumeration("disk_backend", [
129    (0, "UNKNOWN"),
130    (1, "PHY"),
131    (2, "TAP"),
132    (3, "QDISK"),
133    ])
134
135libxl_nic_type = Enumeration("nic_type", [
136    (0, "UNKNOWN"),
137    (1, "VIF_IOEMU"),
138    (2, "VIF"),
139    ])
140
141libxl_action_on_shutdown = Enumeration("action_on_shutdown", [
142    (1, "DESTROY"),
143
144    (2, "RESTART"),
145    (3, "RESTART_RENAME"),
146
147    (4, "PRESERVE"),
148
149    (5, "COREDUMP_DESTROY"),
150    (6, "COREDUMP_RESTART"),
151
152    (7, "SOFT_RESET"),
153    ], init_val = "LIBXL_ACTION_ON_SHUTDOWN_DESTROY")
154
155libxl_trigger = Enumeration("trigger", [
156    (0, "UNKNOWN"),
157    (1, "POWER"),
158    (2, "SLEEP"),
159    (3, "NMI"),
160    (4, "INIT"),
161    (5, "RESET"),
162    (6, "S3RESUME"),
163    ])
164
165libxl_tsc_mode = Enumeration("tsc_mode", [
166    (0, "default"),
167    (1, "always_emulate"),
168    (2, "native"),
169    (3, "native_paravirt"),
170    ])
171
172libxl_gfx_passthru_kind = Enumeration("gfx_passthru_kind", [
173    (0, "default"),
174    (1, "igd"),
175    ])
176
177# Consistent with the values defined for HVM_PARAM_TIMER_MODE.
178libxl_timer_mode = Enumeration("timer_mode", [
179    (-1, "unknown"),
180    (0, "delay_for_missed_ticks"),
181    (1, "no_delay_for_missed_ticks"),
182    (2, "no_missed_ticks_pending"),
183    (3, "one_missed_tick_pending"),
184    ], init_val = "LIBXL_TIMER_MODE_DEFAULT",
185       check_default_fn = "libxl__timer_mode_is_default")
186
187libxl_bios_type = Enumeration("bios_type", [
188    (0, "unknown"),
189    (1, "rombios"),
190    (2, "seabios"),
191    (3, "ovmf"),
192    ])
193
194# Consistent with values defined in domctl.h
195# Except unknown which we have made up
196libxl_scheduler = Enumeration("scheduler", [
197    (0, "unknown"),
198    (4, "sedf"),
199    (5, "credit"),
200    (6, "credit2"),
201    (7, "arinc653"),
202    (8, "rtds"),
203    (9, "null"),
204    ])
205
206# Consistent with SHUTDOWN_* in sched.h (apart from UNKNOWN)
207libxl_shutdown_reason = Enumeration("shutdown_reason", [
208    (-1, "unknown"),
209    (0, "poweroff"),
210    (1, "reboot"),
211    (2, "suspend"),
212    (3, "crash"),
213    (4, "watchdog"),
214    (5, "soft_reset"),
215    ], init_val = "LIBXL_SHUTDOWN_REASON_UNKNOWN")
216
217libxl_vga_interface_type = Enumeration("vga_interface_type", [
218    (0, "UNKNOWN"),
219    (1, "CIRRUS"),
220    (2, "STD"),
221    (3, "NONE"),
222    (4, "QXL"),
223    ], init_val = "LIBXL_VGA_INTERFACE_TYPE_UNKNOWN")
224
225libxl_vendor_device = Enumeration("vendor_device", [
226    (0, "NONE"),
227    (1, "XENSERVER"),
228    ])
229
230libxl_viridian_enlightenment = Enumeration("viridian_enlightenment", [
231    (0, "base"),
232    (1, "freq"),
233    (2, "time_ref_count"),
234    (3, "reference_tsc"),
235    (4, "hcall_remote_tlb_flush"),
236    (5, "apic_assist"),
237    (6, "crash_ctl"),
238    (7, "synic"),
239    (8, "stimer"),
240    (9, "hcall_ipi"),
241    ])
242
243libxl_hdtype = Enumeration("hdtype", [
244    (1, "IDE"),
245    (2, "AHCI"),
246    ], init_val = "LIBXL_HDTYPE_IDE")
247
248# Consistent with the values defined for migration_stream.
249libxl_checkpointed_stream = Enumeration("checkpointed_stream", [
250    (0, "NONE"),
251    (1, "REMUS"),
252    (2, "COLO"),
253    ])
254
255libxl_vuart_type = Enumeration("vuart_type", [
256    (0, "unknown"),
257    (1, "sbsa_uart"),
258    ])
259
260libxl_vkb_backend = Enumeration("vkb_backend", [
261    (0, "UNKNOWN"),
262    (1, "QEMU"),
263    (2, "LINUX")
264    ])
265
266libxl_passthrough = Enumeration("passthrough", [
267    (0, "default"),
268    (1, "disabled"),
269    (2, "enabled"), # becomes {sync,share}_pt once defaults are evaluated
270    (3, "sync_pt"),
271    (4, "share_pt"),
272    ])
273
274#
275# Complex libxl types
276#
277
278libxl_ioport_range = Struct("ioport_range", [
279    ("first", uint32),
280    ("number", uint32),
281    ])
282
283libxl_iomem_range = Struct("iomem_range", [
284    # start host frame number to be mapped to the guest
285    ("start", uint64),
286    # number of frames to be mapped
287    ("number", uint64),
288    # guest frame number used as a start for the mapping
289    ("gfn", uint64, {'init_val': "LIBXL_INVALID_GFN"}),
290    ])
291
292libxl_vga_interface_info = Struct("vga_interface_info", [
293    ("kind",    libxl_vga_interface_type),
294    ])
295
296libxl_vnc_info = Struct("vnc_info", [
297    ("enable",        libxl_defbool),
298    # "address:port" that should be listened on
299    ("listen",        string),
300    ("passwd",        string),
301    ("display",       integer),
302    # If set then try to find an unused port
303    ("findunused",    libxl_defbool),
304    ])
305
306libxl_spice_info = Struct("spice_info", [
307    ("enable",      libxl_defbool),
308    # At least one of spice port or spicetls_post must be given
309    ("port",        integer),
310    ("tls_port",    integer),
311    # Interface to bind to
312    ("host",        string),
313    # enable client connection with no password
314    ("disable_ticketing", libxl_defbool),
315    ("passwd",      string),
316    ("agent_mouse", libxl_defbool),
317    ("vdagent",     libxl_defbool),
318    ("clipboard_sharing", libxl_defbool),
319    ("usbredirection", integer),
320    ("image_compression", string),
321    ("streaming_video", string),
322    ])
323
324libxl_sdl_info = Struct("sdl_info", [
325    ("enable",        libxl_defbool),
326    ("opengl",        libxl_defbool),
327    ("display",       string),
328    ("xauthority",    string),
329    ])
330
331libxl_dominfo = Struct("dominfo",[
332    ("uuid",        libxl_uuid),
333    ("domid",       libxl_domid),
334    ("ssidref",     uint32),
335    ("ssid_label",  string),
336    ("running",     bool),
337    ("blocked",     bool),
338    ("paused",      bool),
339    ("shutdown",    bool),
340    ("dying",       bool),
341    ("never_stop",  bool),
342
343    # Valid iff ->shutdown is true.
344    #
345    # Otherwise set to a value guaranteed not to clash with any valid
346    # LIBXL_SHUTDOWN_REASON_* constant.
347    ("shutdown_reason", libxl_shutdown_reason),
348    ("outstanding_memkb",  MemKB),
349    ("current_memkb",   MemKB),
350    ("shared_memkb", MemKB),
351    ("paged_memkb", MemKB),
352    ("max_memkb",   MemKB),
353    ("cpu_time",    uint64),
354    ("vcpu_max_id", uint32),
355    ("vcpu_online", uint32),
356    ("cpupool",     uint32),
357    ("domain_type", libxl_domain_type),
358    ], dir=DIR_OUT)
359
360libxl_cpupoolinfo = Struct("cpupoolinfo", [
361    ("poolid",      uint32),
362    ("pool_name",   string),
363    ("sched",       libxl_scheduler),
364    ("n_dom",       uint32),
365    ("cpumap",      libxl_bitmap)
366    ], dir=DIR_OUT)
367
368libxl_channelinfo = Struct("channelinfo", [
369    ("backend", string),
370    ("backend_id", uint32),
371    ("frontend", string),
372    ("frontend_id", uint32),
373    ("devid", libxl_devid),
374    ("state", integer),
375    ("evtch", integer),
376    ("rref", integer),
377    ("u", KeyedUnion(None, libxl_channel_connection, "connection",
378           [("unknown", None),
379            ("pty", Struct(None, [("path", string),])),
380            ("socket", None),
381           ])),
382    ], dir=DIR_OUT)
383
384libxl_vminfo = Struct("vminfo", [
385    ("uuid", libxl_uuid),
386    ("domid", libxl_domid),
387    ], dir=DIR_OUT)
388
389libxl_version_info = Struct("version_info", [
390    ("xen_version_major", integer),
391    ("xen_version_minor", integer),
392    ("xen_version_extra", string),
393    ("compiler",          string),
394    ("compile_by",        string),
395    ("compile_domain",    string),
396    ("compile_date",      string),
397    ("capabilities",      string),
398    ("changeset",         string),
399    ("virt_start",        uint64),
400    ("pagesize",          integer),
401    ("commandline",       string),
402    ("build_id",          string),
403    ], dir=DIR_OUT)
404
405libxl_domain_create_info = Struct("domain_create_info",[
406    ("type",         libxl_domain_type),
407    ("hap",          libxl_defbool),
408    ("oos",          libxl_defbool),
409    ("ssidref",      uint32),
410    ("ssid_label",   string),
411    ("name",         string),
412    ("domid",        libxl_domid),
413    ("uuid",         libxl_uuid),
414    ("xsdata",       libxl_key_value_list),
415    ("platformdata", libxl_key_value_list),
416    ("poolid",       uint32),
417    ("pool_name",    string),
418    ("run_hotplug_scripts",libxl_defbool),
419    ("driver_domain",libxl_defbool),
420    ("passthrough",  libxl_passthrough),
421    ("xend_suspend_evtchn_compat",libxl_defbool),
422    ], dir=DIR_IN)
423
424libxl_domain_restore_params = Struct("domain_restore_params", [
425    ("checkpointed_stream", integer),
426    ("stream_version", uint32, {'init_val': '1'}),
427    ("colo_proxy_script", string),
428    ("userspace_colo_proxy", libxl_defbool),
429    ])
430
431libxl_sched_params = Struct("sched_params",[
432    ("vcpuid",       integer, {'init_val': 'LIBXL_SCHED_PARAM_VCPU_INDEX_DEFAULT'}),
433    ("weight",       integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT'}),
434    ("cap",          integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_CAP_DEFAULT'}),
435    ("period",       integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT'}),
436    ("extratime",    integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT'}),
437    ("budget",       integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT'}),
438    ])
439
440libxl_vcpu_sched_params = Struct("vcpu_sched_params",[
441    ("sched",        libxl_scheduler),
442    ("vcpus",        Array(libxl_sched_params, "num_vcpus")),
443    ])
444
445libxl_domain_sched_params = Struct("domain_sched_params",[
446    ("sched",        libxl_scheduler),
447    ("weight",       integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT'}),
448    ("cap",          integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_CAP_DEFAULT'}),
449    ("period",       integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT'}),
450    ("budget",       integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT'}),
451    ("extratime",    integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT'}),
452
453    # The following three parameters ('slice' and 'latency') are deprecated,
454    # and will have no effect if used, since the SEDF scheduler has been removed.
455    # Note that 'period' and 'extratime' was an SDF parameter too, but it is still effective
456    # as they are now used (together with 'budget') by the RTDS scheduler.
457    ("slice",        integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT'}),
458    ("latency",      integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_LATENCY_DEFAULT'}),
459    ])
460
461libxl_vnode_info = Struct("vnode_info", [
462    ("memkb", MemKB),
463    ("distances", Array(uint32, "num_distances")), # distances from this node to other nodes
464    ("pnode", uint32), # physical node of this node
465    ("vcpus", libxl_bitmap), # vcpus in this node
466    ])
467
468libxl_gic_version = Enumeration("gic_version", [
469    (0, "DEFAULT"),
470    (0x20, "v2"),
471    (0x30, "v3")
472    ], init_val = "LIBXL_GIC_VERSION_DEFAULT")
473
474libxl_tee_type = Enumeration("tee_type", [
475    (0, "none"),
476    (1, "optee")
477    ], init_val = "LIBXL_TEE_TYPE_NONE")
478
479libxl_rdm_reserve = Struct("rdm_reserve", [
480    ("strategy",    libxl_rdm_reserve_strategy),
481    ("policy",      libxl_rdm_reserve_policy),
482    ])
483
484# Consistent with the values defined for HVM_PARAM_ALTP2M
485libxl_altp2m_mode = Enumeration("altp2m_mode", [
486    (0, "disabled"),
487    (1, "mixed"),
488    (2, "external"),
489    (3, "limited"),
490    ], init_val = "LIBXL_ALTP2M_MODE_DISABLED")
491
492libxl_domain_build_info = Struct("domain_build_info",[
493    ("max_vcpus",       integer),
494    ("avail_vcpus",     libxl_bitmap),
495    ("cpumap",          libxl_bitmap),
496    ("nodemap",         libxl_bitmap),
497    ("vcpu_hard_affinity", Array(libxl_bitmap, "num_vcpu_hard_affinity")),
498    ("vcpu_soft_affinity", Array(libxl_bitmap, "num_vcpu_soft_affinity")),
499    ("numa_placement",  libxl_defbool),
500    ("tsc_mode",        libxl_tsc_mode),
501    ("max_memkb",       MemKB),
502    ("target_memkb",    MemKB),
503    ("video_memkb",     MemKB),
504    ("shadow_memkb",    MemKB),
505    ("iommu_memkb",     MemKB),
506    ("rtc_timeoffset",  uint32),
507    ("exec_ssidref",    uint32),
508    ("exec_ssid_label", string),
509    ("localtime",       libxl_defbool),
510    ("disable_migrate", libxl_defbool),
511    ("cpuid",           libxl_cpuid_policy_list),
512    ("blkdev_start",    string),
513
514    ("vnuma_nodes", Array(libxl_vnode_info, "num_vnuma_nodes")),
515
516    ("max_grant_frames",    uint32, {'init_val': 'LIBXL_MAX_GRANT_DEFAULT'}),
517    ("max_maptrack_frames", uint32, {'init_val': 'LIBXL_MAX_GRANT_DEFAULT'}),
518
519    ("device_model_version", libxl_device_model_version),
520    ("device_model_stubdomain", libxl_defbool),
521    ("stubdomain_memkb",   MemKB),
522    ("stubdomain_kernel",  string),
523    ("stubdomain_ramdisk", string),
524    # if you set device_model you must set device_model_version too
525    ("device_model",     string),
526    ("device_model_ssidref", uint32),
527    ("device_model_ssid_label", string),
528    ("device_model_user", string),
529
530    # extra parameters pass directly to qemu, NULL terminated
531    ("extra",            libxl_string_list),
532    # extra parameters pass directly to qemu for PV guest, NULL terminated
533    ("extra_pv",         libxl_string_list),
534    # extra parameters pass directly to qemu for HVM guest, NULL terminated
535    ("extra_hvm",        libxl_string_list),
536    #  parameters for all type of scheduler
537    ("sched_params",     libxl_domain_sched_params),
538
539    ("ioports",          Array(libxl_ioport_range, "num_ioports")),
540    ("irqs",             Array(uint32, "num_irqs")),
541    ("iomem",            Array(libxl_iomem_range, "num_iomem")),
542    ("claim_mode",	     libxl_defbool),
543    ("event_channels",   uint32),
544    ("kernel",           string),
545    ("cmdline",          string),
546    ("ramdisk",          string),
547    # Given the complexity of verifying the validity of a device tree,
548    # libxl doesn't do any security check on it. It's the responsibility
549    # of the caller to provide only trusted device tree.
550    # Note that the partial device tree should avoid to use the phandle
551    # 65000 which is reserved by the toolstack.
552    ("device_tree",      string),
553    ("acpi",             libxl_defbool),
554    ("bootloader",       string),
555    ("bootloader_args",  libxl_string_list),
556    ("timer_mode",       libxl_timer_mode),
557    ("nested_hvm",       libxl_defbool),
558    ("apic",             libxl_defbool),
559    ("dm_restrict",      libxl_defbool),
560    ("tee",              libxl_tee_type),
561    ("u", KeyedUnion(None, libxl_domain_type, "type",
562                [("hvm", Struct(None, [("firmware",         string),
563                                       ("bios",             libxl_bios_type),
564                                       ("pae",              libxl_defbool),
565                                       ("apic",             libxl_defbool, {'deprecated_by': 'apic'}),
566                                       # The following acpi field is deprecated.
567                                       # Please use the unified acpi field above
568                                       # which works for both x86 and ARM.
569                                       ("acpi",             libxl_defbool),
570                                       ("acpi_s3",          libxl_defbool),
571                                       ("acpi_s4",          libxl_defbool),
572                                       ("acpi_laptop_slate",libxl_defbool),
573                                       ("nx",               libxl_defbool),
574                                       ("viridian",         libxl_defbool),
575                                       ("viridian_enable",  libxl_bitmap),
576                                       ("viridian_disable", libxl_bitmap),
577                                       ("timeoffset",       string),
578                                       ("hpet",             libxl_defbool),
579                                       ("vpt_align",        libxl_defbool),
580                                       ("mmio_hole_memkb",  MemKB),
581                                       ("timer_mode",       libxl_timer_mode, {'deprecated_by': 'timer_mode'}),
582                                       ("nested_hvm",       libxl_defbool, {'deprecated_by': 'nested_hvm'}),
583                                       # The u.hvm.altp2m field is used solely
584                                       # for x86 HVM guests and is maintained
585                                       # for legacy purposes.
586                                       ("altp2m",           libxl_defbool),
587                                       ("system_firmware",  string),
588                                       ("smbios_firmware",  string),
589                                       ("acpi_firmware",    string),
590                                       ("hdtype",           libxl_hdtype),
591                                       ("nographic",        libxl_defbool),
592                                       ("vga",              libxl_vga_interface_info),
593                                       ("vnc",              libxl_vnc_info),
594                                       # keyboard layout, default is en-us keyboard
595                                       ("keymap",           string),
596                                       ("sdl",              libxl_sdl_info),
597                                       ("spice",            libxl_spice_info),
598
599                                       ("gfx_passthru",     libxl_defbool),
600                                       ("gfx_passthru_kind", libxl_gfx_passthru_kind),
601
602                                       ("serial",           string),
603                                       ("boot",             string),
604                                       ("usb",              libxl_defbool),
605                                       ("usbversion",       integer),
606                                       # usbdevice:
607                                       # - "tablet" for absolute mouse,
608                                       # - "mouse" for PS/2 protocol relative mouse
609                                       ("usbdevice",        string),
610                                       ("vkb_device",       libxl_defbool),
611                                       ("soundhw",          string),
612                                       ("xen_platform_pci", libxl_defbool),
613                                       ("usbdevice_list",   libxl_string_list),
614                                       ("vendor_device",    libxl_vendor_device),
615                                       # See libxl_ms_vm_genid_generate()
616                                       ("ms_vm_genid",      libxl_ms_vm_genid),
617                                       ("serial_list",      libxl_string_list),
618                                       ("rdm", libxl_rdm_reserve),
619                                       ("rdm_mem_boundary_memkb", MemKB),
620                                       ("mca_caps",         uint64),
621                                       ])),
622                 ("pv", Struct(None, [("kernel", string, {'deprecated_by': 'kernel'}),
623                                      ("slack_memkb", MemKB),
624                                      ("bootloader", string, {'deprecated_by': 'bootloader'}),
625                                      ("bootloader_args", libxl_string_list, {'deprecated_by': 'bootloader_args'}),
626                                      ("cmdline", string, {'deprecated_by': 'cmdline'}),
627                                      ("ramdisk", string, {'deprecated_by': 'ramdisk'}),
628                                      ("features", string, {'const': True}),
629                                      # Use host's E820 for PCI passthrough.
630                                      ("e820_host", libxl_defbool),
631                                      ])),
632                 ("pvh", Struct(None, [("pvshim", libxl_defbool),
633                                       ("pvshim_path", string),
634                                       ("pvshim_cmdline", string),
635                                       ("pvshim_extra", string), # eg "loglvl=all guest_loglvl=all apic_verbosity=debug e820-verbose"
636                                       ])),
637                 ("invalid", None),
638                 ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")),
639
640
641    ("arch_arm", Struct(None, [("gic_version", libxl_gic_version),
642                               ("vuart", libxl_vuart_type),
643                              ])),
644    # Alternate p2m is not bound to any architecture or guest type, as it is
645    # supported by x86 HVM and ARM support is planned.
646    ("altp2m", libxl_altp2m_mode),
647
648    ], dir=DIR_IN,
649       copy_deprecated_fn="libxl__domain_build_info_copy_deprecated",
650)
651
652libxl_device_vfb = Struct("device_vfb", [
653    ("backend_domid", libxl_domid),
654    ("backend_domname",string),
655    ("devid",         libxl_devid),
656    ("vnc",           libxl_vnc_info),
657    ("sdl",           libxl_sdl_info),
658    # set keyboard layout, default is en-us keyboard
659    ("keymap",        string),
660    ])
661
662libxl_device_vkb = Struct("device_vkb", [
663    ("backend_domid", libxl_domid),
664    ("backend_domname", string),
665    ("devid", libxl_devid),
666    ("backend_type", libxl_vkb_backend),
667    ("unique_id", string),
668    ("feature_disable_keyboard", bool),
669    ("feature_disable_pointer", bool),
670    ("feature_abs_pointer", bool),
671    ("feature_raw_pointer", bool),
672    ("feature_multi_touch", bool),
673    ("width", uint32),
674    ("height", uint32),
675    ("multi_touch_width", uint32),
676    ("multi_touch_height", uint32),
677    ("multi_touch_num_contacts", uint32)
678    ])
679
680libxl_device_disk = Struct("device_disk", [
681    ("backend_domid", libxl_domid),
682    ("backend_domname", string),
683    ("pdev_path", string),
684    ("vdev", string),
685    ("backend", libxl_disk_backend),
686    ("format", libxl_disk_format),
687    ("script", string),
688    ("removable", integer),
689    ("readwrite", integer),
690    ("is_cdrom", integer),
691    ("direct_io_safe", bool),
692    ("discard_enable", libxl_defbool),
693    # Note that the COLO configuration settings should be considered unstable.
694    # They may change incompatibly in future versions of Xen.
695    ("colo_enable", libxl_defbool),
696    ("colo_restore_enable", libxl_defbool),
697    ("colo_host", string),
698    ("colo_port", integer),
699    ("colo_export", string),
700    ("active_disk", string),
701    ("hidden_disk", string)
702    ])
703
704libxl_device_nic = Struct("device_nic", [
705    ("backend_domid", libxl_domid),
706    ("backend_domname", string),
707    ("devid", libxl_devid),
708    ("mtu", integer),
709    ("model", string),
710    ("mac", libxl_mac),
711    ("ip", string),
712    ("bridge", string),
713    ("ifname", string),
714    ("script", string),
715    ("nictype", libxl_nic_type),
716    ("rate_bytes_per_interval", uint64),
717    ("rate_interval_usecs", uint32),
718    ("gatewaydev", string),
719    # Note that the COLO configuration settings should be considered unstable.
720    # They may change incompatibly in future versions of Xen.
721    ("coloft_forwarddev", string),
722    ("colo_sock_mirror_id", string),
723    ("colo_sock_mirror_ip", string),
724    ("colo_sock_mirror_port", string),
725    ("colo_sock_compare_pri_in_id", string),
726    ("colo_sock_compare_pri_in_ip", string),
727    ("colo_sock_compare_pri_in_port", string),
728    ("colo_sock_compare_sec_in_id", string),
729    ("colo_sock_compare_sec_in_ip", string),
730    ("colo_sock_compare_sec_in_port", string),
731    ("colo_sock_compare_notify_id", string),
732    ("colo_sock_compare_notify_ip", string),
733    ("colo_sock_compare_notify_port", string),
734    ("colo_sock_redirector0_id", string),
735    ("colo_sock_redirector0_ip", string),
736    ("colo_sock_redirector0_port", string),
737    ("colo_sock_redirector1_id", string),
738    ("colo_sock_redirector1_ip", string),
739    ("colo_sock_redirector1_port", string),
740    ("colo_sock_redirector2_id", string),
741    ("colo_sock_redirector2_ip", string),
742    ("colo_sock_redirector2_port", string),
743    ("colo_filter_mirror_queue", string),
744    ("colo_filter_mirror_outdev", string),
745    ("colo_filter_redirector0_queue", string),
746    ("colo_filter_redirector0_indev", string),
747    ("colo_filter_redirector0_outdev", string),
748    ("colo_filter_redirector1_queue", string),
749    ("colo_filter_redirector1_indev", string),
750    ("colo_filter_redirector1_outdev", string),
751    ("colo_compare_pri_in", string),
752    ("colo_compare_sec_in", string),
753    ("colo_compare_out", string),
754    ("colo_compare_notify_dev", string),
755    ("colo_sock_sec_redirector0_id", string),
756    ("colo_sock_sec_redirector0_ip", string),
757    ("colo_sock_sec_redirector0_port", string),
758    ("colo_sock_sec_redirector1_id", string),
759    ("colo_sock_sec_redirector1_ip", string),
760    ("colo_sock_sec_redirector1_port", string),
761    ("colo_filter_sec_redirector0_queue", string),
762    ("colo_filter_sec_redirector0_indev", string),
763    ("colo_filter_sec_redirector0_outdev", string),
764    ("colo_filter_sec_redirector1_queue", string),
765    ("colo_filter_sec_redirector1_indev", string),
766    ("colo_filter_sec_redirector1_outdev", string),
767    ("colo_filter_sec_rewriter0_queue", string),
768    ("colo_checkpoint_host", string),
769    ("colo_checkpoint_port", string)
770    ])
771
772libxl_device_pci = Struct("device_pci", [
773    ("func",      uint8),
774    ("dev",       uint8),
775    ("bus",       uint8),
776    ("domain",    integer),
777    ("vdevfn",    uint32),
778    ("vfunc_mask", uint32),
779    ("msitranslate", bool),
780    ("power_mgmt", bool),
781    ("permissive", bool),
782    ("seize", bool),
783    ("rdm_policy",      libxl_rdm_reserve_policy),
784    ])
785
786libxl_device_rdm = Struct("device_rdm", [
787    ("start", uint64),
788    ("size", uint64),
789    ("policy", libxl_rdm_reserve_policy),
790    ])
791
792libxl_usbctrl_type = Enumeration("usbctrl_type", [
793    (0, "AUTO"),
794    (1, "PV"),
795    (2, "DEVICEMODEL"),
796    (3, "QUSB"),
797    ])
798
799libxl_usbdev_type = Enumeration("usbdev_type", [
800    (1, "hostdev"),
801    ])
802
803libxl_device_usbctrl = Struct("device_usbctrl", [
804    ("type", libxl_usbctrl_type),
805    ("devid", libxl_devid),
806    ("version", integer),
807    ("ports", integer),
808    ("backend_domid", libxl_domid),
809    ("backend_domname", string),
810   ])
811
812libxl_device_usbdev = Struct("device_usbdev", [
813    ("ctrl", libxl_devid),
814    ("port", integer),
815    ("u", KeyedUnion(None, libxl_usbdev_type, "type",
816           [("hostdev", Struct(None, [
817                 ("hostbus",   uint8),
818                 ("hostaddr",  uint8)])),
819           ])),
820    ])
821
822libxl_device_dtdev = Struct("device_dtdev", [
823    ("path", string),
824    ])
825
826libxl_device_vtpm = Struct("device_vtpm", [
827    ("backend_domid",    libxl_domid),
828    ("backend_domname",  string),
829    ("devid",            libxl_devid),
830    ("uuid",             libxl_uuid),
831])
832
833libxl_device_p9 = Struct("device_p9", [
834    ("backend_domid",    libxl_domid),
835    ("backend_domname",  string),
836    ("tag",              string),
837    ("path",             string),
838    ("security_model",   string),
839    ("devid",            libxl_devid),
840])
841
842libxl_device_pvcallsif = Struct("device_pvcallsif", [
843    ("backend_domid",    libxl_domid),
844    ("backend_domname",  string),
845    ("devid",            libxl_devid),
846])
847
848libxl_device_channel = Struct("device_channel", [
849    ("backend_domid", libxl_domid),
850    ("backend_domname", string),
851    ("devid", libxl_devid),
852    ("name", string),
853    ("u", KeyedUnion(None, libxl_channel_connection, "connection",
854           [("unknown", None),
855            ("pty", None),
856            ("socket", Struct(None, [("path", string)])),
857           ])),
858])
859
860libxl_connector_param = Struct("connector_param", [
861    ("unique_id", string),
862    ("width", uint32),
863    ("height", uint32)
864    ])
865
866libxl_device_vdispl = Struct("device_vdispl", [
867    ("backend_domid", libxl_domid),
868    ("backend_domname", string),
869    ("devid", libxl_devid),
870    ("be_alloc", bool),
871    ("connectors", Array(libxl_connector_param, "num_connectors"))
872    ])
873
874libxl_vsnd_pcm_format = Enumeration("vsnd_pcm_format", [
875    (1,  "S8"),
876    (2,  "U8"),
877    (3,  "S16_LE"),
878    (4,  "S16_BE"),
879    (5,  "U16_LE"),
880    (6,  "U16_BE"),
881    (7,  "S24_LE"),
882    (8,  "S24_BE"),
883    (9,  "U24_LE"),
884    (10, "U24_BE"),
885    (11, "S32_LE"),
886    (12, "S32_BE"),
887    (13, "U32_LE"),
888    (14, "U32_BE"),
889    (15, "F32_LE"),
890    (16, "F32_BE"),
891    (17, "F64_LE"),
892    (18, "F64_BE"),
893    (19, "IEC958_SUBFRAME_LE"),
894    (20, "IEC958_SUBFRAME_BE"),
895    (21, "MU_LAW"),
896    (22, "A_LAW"),
897    (23, "IMA_ADPCM"),
898    (24, "MPEG"),
899    (25, "GSM")
900    ])
901
902libxl_vsnd_params = Struct("vsnd_params", [
903    ("sample_rates", Array(uint32, "num_sample_rates")),
904    ("sample_formats", Array(libxl_vsnd_pcm_format, "num_sample_formats")),
905    ("channels_min", uint32),
906    ("channels_max", uint32),
907    ("buffer_size", uint32)
908    ])
909
910libxl_vsnd_stream_type = Enumeration("vsnd_stream_type", [
911    (1, "P"),
912    (2, "C")
913    ])
914
915libxl_vsnd_stream = Struct("vsnd_stream", [
916    ("unique_id", string),
917    ("type", libxl_vsnd_stream_type),
918    ("params", libxl_vsnd_params)
919    ])
920
921libxl_vsnd_pcm = Struct("vsnd_pcm", [
922    ("name", string),
923    ("params", libxl_vsnd_params),
924    ("streams", Array(libxl_vsnd_stream, "num_vsnd_streams"))
925    ])
926
927libxl_device_vsnd = Struct("device_vsnd", [
928    ("backend_domid", libxl_domid),
929    ("backend_domname", string),
930    ("devid", libxl_devid),
931    ("short_name", string),
932    ("long_name", string),
933    ("params", libxl_vsnd_params),
934    ("pcms", Array(libxl_vsnd_pcm, "num_vsnd_pcms"))
935    ])
936
937libxl_domain_config = Struct("domain_config", [
938    ("c_info", libxl_domain_create_info),
939    ("b_info", libxl_domain_build_info),
940
941    ("disks", Array(libxl_device_disk, "num_disks")),
942    ("nics", Array(libxl_device_nic, "num_nics")),
943    ("pcidevs", Array(libxl_device_pci, "num_pcidevs")),
944    ("rdms", Array(libxl_device_rdm, "num_rdms")),
945    ("dtdevs", Array(libxl_device_dtdev, "num_dtdevs")),
946    ("vfbs", Array(libxl_device_vfb, "num_vfbs")),
947    ("vkbs", Array(libxl_device_vkb, "num_vkbs")),
948    ("vtpms", Array(libxl_device_vtpm, "num_vtpms")),
949    ("p9s", Array(libxl_device_p9, "num_p9s")),
950    ("pvcallsifs", Array(libxl_device_pvcallsif, "num_pvcallsifs")),
951    ("vdispls", Array(libxl_device_vdispl, "num_vdispls")),
952    ("vsnds", Array(libxl_device_vsnd, "num_vsnds")),
953    # a channel manifests as a console with a name,
954    # see docs/misc/channels.txt
955    ("channels", Array(libxl_device_channel, "num_channels")),
956    ("usbctrls", Array(libxl_device_usbctrl, "num_usbctrls")),
957    ("usbdevs", Array(libxl_device_usbdev, "num_usbdevs")),
958
959    ("on_poweroff", libxl_action_on_shutdown),
960    ("on_reboot", libxl_action_on_shutdown),
961    ("on_watchdog", libxl_action_on_shutdown),
962    ("on_crash", libxl_action_on_shutdown),
963    ("on_soft_reset", libxl_action_on_shutdown),
964    ], dir=DIR_IN)
965
966libxl_diskinfo = Struct("diskinfo", [
967    ("backend", string),
968    ("backend_id", uint32),
969    ("frontend", string),
970    ("frontend_id", uint32),
971    ("devid", libxl_devid),
972    ("state", integer),
973    ("evtch", integer),
974    ("rref", integer),
975    ], dir=DIR_OUT)
976
977libxl_nicinfo = Struct("nicinfo", [
978    ("backend", string),
979    ("backend_id", uint32),
980    ("frontend", string),
981    ("frontend_id", uint32),
982    ("devid", libxl_devid),
983    ("state", integer),
984    ("evtch", integer),
985    ("rref_tx", integer),
986    ("rref_rx", integer),
987    ], dir=DIR_OUT)
988
989libxl_vtpminfo = Struct("vtpminfo", [
990    ("backend", string),
991    ("backend_id", uint32),
992    ("frontend", string),
993    ("frontend_id", uint32),
994    ("devid", libxl_devid),
995    ("state", integer),
996    ("evtch", integer),
997    ("rref", integer),
998    ("uuid", libxl_uuid),
999    ], dir=DIR_OUT)
1000
1001libxl_usbctrlinfo = Struct("usbctrlinfo", [
1002    ("type", libxl_usbctrl_type),
1003    ("devid", libxl_devid),
1004    ("version", integer),
1005    ("ports", integer),
1006    ("backend", string),
1007    ("backend_id", uint32),
1008    ("frontend", string),
1009    ("frontend_id", uint32),
1010    ("state", integer),
1011    ("evtch", integer),
1012    ("ref_urb", integer),
1013    ("ref_conn", integer),
1014    ], dir=DIR_OUT)
1015
1016libxl_vcpuinfo = Struct("vcpuinfo", [
1017    ("vcpuid", uint32),
1018    ("cpu", uint32),
1019    ("online", bool),
1020    ("blocked", bool),
1021    ("running", bool),
1022    ("vcpu_time", uint64), # total vcpu time ran (ns)
1023    ("cpumap", libxl_bitmap), # current hard cpu affinity
1024    ("cpumap_soft", libxl_bitmap), # current soft cpu affinity
1025    ], dir=DIR_OUT)
1026
1027libxl_physinfo = Struct("physinfo", [
1028    ("threads_per_core", uint32),
1029    ("cores_per_socket", uint32),
1030
1031    ("max_cpu_id", uint32),
1032    ("nr_cpus", uint32),
1033    ("cpu_khz", uint32),
1034
1035    ("total_pages", uint64),
1036    ("free_pages", uint64),
1037    ("scrub_pages", uint64),
1038    ("outstanding_pages", uint64),
1039    ("sharing_freed_pages", uint64),
1040    ("sharing_used_frames", uint64),
1041    ("max_possible_mfn", uint64),
1042
1043    ("nr_nodes", uint32),
1044    ("hw_cap", libxl_hwcap),
1045
1046    ("cap_hvm", bool),
1047    ("cap_pv", bool),
1048    ("cap_hvm_directio", bool), # No longer HVM specific
1049    ("cap_hap", bool),
1050    ("cap_shadow", bool),
1051    ("cap_iommu_hap_pt_share", bool),
1052    ], dir=DIR_OUT)
1053
1054libxl_connectorinfo = Struct("connectorinfo", [
1055    ("unique_id", string),
1056    ("width", uint32),
1057    ("height", uint32),
1058    ("req_evtch", integer),
1059    ("req_rref", integer),
1060    ("evt_evtch", integer),
1061    ("evt_rref", integer),
1062    ], dir=DIR_OUT)
1063
1064libxl_vdisplinfo = Struct("vdisplinfo", [
1065    ("backend", string),
1066    ("backend_id", uint32),
1067    ("frontend", string),
1068    ("frontend_id", uint32),
1069    ("devid", libxl_devid),
1070    ("state", integer),
1071    ("be_alloc", bool),
1072    ("connectors", Array(libxl_connectorinfo, "num_connectors"))
1073    ], dir=DIR_OUT)
1074
1075libxl_streaminfo = Struct("streaminfo", [
1076    ("req_evtch", integer),
1077    ("req_rref", integer)
1078    ])
1079
1080libxl_pcminfo = Struct("pcminfo", [
1081    ("streams", Array(libxl_streaminfo, "num_vsnd_streams"))
1082    ])
1083
1084libxl_vsndinfo = Struct("vsndinfo", [
1085    ("backend", string),
1086    ("backend_id", uint32),
1087    ("frontend", string),
1088    ("frontend_id", uint32),
1089    ("devid", libxl_devid),
1090    ("state", integer),
1091    ("pcms", Array(libxl_pcminfo, "num_vsnd_pcms"))
1092    ])
1093
1094libxl_vkbinfo = Struct("vkbinfo", [
1095    ("backend", string),
1096    ("backend_id", uint32),
1097    ("frontend", string),
1098    ("frontend_id", uint32),
1099    ("devid", libxl_devid),
1100    ("state", integer),
1101    ("evtch", integer),
1102    ("rref", integer)
1103    ], dir=DIR_OUT)
1104
1105# NUMA node characteristics: size and free are how much memory it has, and how
1106# much of it is free, respectively. dists is an array of distances from this
1107# node to each other node.
1108libxl_numainfo = Struct("numainfo", [
1109    ("size", uint64),
1110    ("free", uint64),
1111    ("dists", Array(uint32, "num_dists")),
1112    ], dir=DIR_OUT)
1113
1114libxl_cputopology = Struct("cputopology", [
1115    ("core", uint32),
1116    ("socket", uint32),
1117    ("node", uint32),
1118    ], dir=DIR_OUT)
1119
1120libxl_pcitopology = Struct("pcitopology", [
1121    ("seg", uint16),
1122    ("bus", uint8),
1123    ("devfn", uint8),
1124    ("node", uint32),
1125    ], dir=DIR_OUT)
1126
1127libxl_sched_credit_params = Struct("sched_credit_params", [
1128    ("tslice_ms", integer),
1129    ("ratelimit_us", integer),
1130    ("vcpu_migr_delay_us", integer),
1131    ], dispose_fn=None)
1132
1133libxl_sched_credit2_params = Struct("sched_credit2_params", [
1134    ("ratelimit_us", integer),
1135    ], dispose_fn=None)
1136
1137libxl_domain_remus_info = Struct("domain_remus_info",[
1138    ("interval",             integer),
1139    ("allow_unsafe",         libxl_defbool),
1140    ("blackhole",            libxl_defbool),
1141    ("compression",          libxl_defbool),
1142    ("netbuf",               libxl_defbool),
1143    ("netbufscript",         string),
1144    ("diskbuf",              libxl_defbool),
1145    ("colo",                 libxl_defbool),
1146    ("userspace_colo_proxy", libxl_defbool)
1147    ])
1148
1149libxl_event_type = Enumeration("event_type", [
1150    (1, "DOMAIN_SHUTDOWN"),
1151    (2, "DOMAIN_DEATH"),
1152    (3, "DISK_EJECT"),
1153    (4, "OPERATION_COMPLETE"),
1154    (5, "DOMAIN_CREATE_CONSOLE_AVAILABLE"),
1155    ])
1156
1157libxl_ev_user = UInt(64)
1158
1159libxl_ev_link = Builtin("ev_link", json_parse_type="JSON_STRING", passby=PASS_BY_REFERENCE, private=True)
1160
1161libxl_event = Struct("event",[
1162    ("link",     libxl_ev_link),
1163     # for use by libxl; caller may use this once the event has been
1164     #   returned by libxl_event_{check,wait}
1165    ("domid",    libxl_domid),
1166    ("domuuid",  libxl_uuid),
1167    ("for_user", libxl_ev_user),
1168    ("u", KeyedUnion(None, libxl_event_type, "type",
1169          [("domain_shutdown", Struct(None, [
1170                                             ("shutdown_reason", uint8),
1171                                      ])),
1172           ("domain_death", None),
1173           ("disk_eject", Struct(None, [
1174                                        ("vdev", string),
1175                                        ("disk", libxl_device_disk),
1176                                 ])),
1177           ("operation_complete", Struct(None, [
1178                                        ("rc", integer),
1179                                 ])),
1180           ("domain_create_console_available", None),
1181           ]))])
1182
1183libxl_psr_cmt_type = Enumeration("psr_cmt_type", [
1184    (1, "CACHE_OCCUPANCY"),
1185    (2, "TOTAL_MEM_COUNT"),
1186    (3, "LOCAL_MEM_COUNT"),
1187    ])
1188
1189libxl_psr_cbm_type = Enumeration("psr_cbm_type", [
1190    (0, "UNKNOWN"),
1191    (1, "L3_CBM"),
1192    (2, "L3_CBM_CODE"),
1193    (3, "L3_CBM_DATA"),
1194    (4, "L2_CBM"),
1195    (5, "MBA_THRTL"),
1196    ])
1197
1198libxl_psr_cat_info = Struct("psr_cat_info", [
1199    ("id", uint32),
1200    ("cos_max", uint32),
1201    ("cbm_len", uint32),
1202    ("cdp_enabled", bool),
1203    ])
1204
1205libxl_psr_feat_type = Enumeration("psr_feat_type", [
1206    (1, "CAT"),
1207    (2, "MBA"),
1208    ])
1209
1210libxl_psr_hw_info = Struct("psr_hw_info", [
1211    ("id", uint32),
1212    ("u", KeyedUnion(None, libxl_psr_feat_type, "type",
1213          [("cat", Struct(None, [
1214                                    ("cos_max",     uint32),
1215                                    ("cbm_len",     uint32),
1216                                    ("cdp_enabled", bool),
1217                               ])),
1218           ("mba", Struct(None, [
1219                                    ("cos_max",     uint32),
1220                                    ("thrtl_max",   uint32),
1221                                    ("linear",      bool),
1222                               ])),
1223          ]))
1224    ], dir=DIR_OUT)
1225