1use nix::ioctl_readwrite_bad;
3use std::ffi::{c_char, c_int, c_uint, c_ulong};
4
5#[repr(C)]
6#[derive(Copy, Clone, Debug)]
7pub struct Hypercall {
8 pub op: c_ulong,
9 pub arg: [c_ulong; 5],
10}
11
12#[repr(C)]
13#[derive(Copy, Clone, Debug, Default)]
14pub struct MmapEntry {
15 pub va: u64,
16 pub mfn: u64,
17 pub npages: u64,
18}
19
20#[repr(C)]
21#[derive(Copy, Clone, Debug, Default)]
22pub struct MmapResource {
23 pub dom: u16,
24 pub typ: u32,
25 pub id: u32,
26 pub idx: u32,
27 pub num: u64,
28 pub addr: u64,
29}
30
31#[repr(C)]
32#[derive(Copy, Clone, Debug)]
33pub struct MmapBatch {
34 pub num: u32,
35 pub domid: u16,
36 pub addr: u64,
37 pub mfns: u64,
38 pub errors: u64,
39}
40
41#[repr(C)]
42#[derive(Clone, Debug)]
43pub struct Mmap {
44 pub num: c_int,
45 pub dom: u16,
46 pub entry: *mut MmapEntry,
47}
48
49const IOCTL_PRIVCMD_HYPERCALL: u64 = 0x305000;
50const IOCTL_PRIVCMD_MMAP: u64 = 0x105002;
51const IOCTL_PRIVCMD_MMAPBATCH_V2: u64 = 0x205004;
52const IOCTL_PRIVCMD_MMAP_RESOURCE: u64 = 0x205007;
53
54ioctl_readwrite_bad!(hypercall, IOCTL_PRIVCMD_HYPERCALL, Hypercall);
55ioctl_readwrite_bad!(mmap, IOCTL_PRIVCMD_MMAP, Mmap);
56ioctl_readwrite_bad!(mmapbatch, IOCTL_PRIVCMD_MMAPBATCH_V2, MmapBatch);
57ioctl_readwrite_bad!(mmap_resource, IOCTL_PRIVCMD_MMAP_RESOURCE, MmapResource);
58
59pub const HYPERVISOR_SET_TRAP_TABLE: c_ulong = 0;
60pub const HYPERVISOR_MMU_UPDATE: c_ulong = 1;
61pub const HYPERVISOR_SET_GDT: c_ulong = 2;
62pub const HYPERVISOR_STACK_SWITCH: c_ulong = 3;
63pub const HYPERVISOR_SET_CALLBACKS: c_ulong = 4;
64pub const HYPERVISOR_FPU_TASKSWITCH: c_ulong = 5;
65pub const HYPERVISOR_SCHED_OP_COMPAT: c_ulong = 6;
66pub const HYPERVISOR_PLATFORM_OP: c_ulong = 7;
67pub const HYPERVISOR_SET_DEBUGREG: c_ulong = 8;
68pub const HYPERVISOR_GET_DEBUGREG: c_ulong = 9;
69pub const HYPERVISOR_UPDATE_DESCRIPTOR: c_ulong = 10;
70pub const HYPERVISOR_MEMORY_OP: c_ulong = 12;
71pub const HYPERVISOR_MULTICALL: c_ulong = 13;
72pub const HYPERVISOR_UPDATE_VA_MAPPING: c_ulong = 14;
73pub const HYPERVISOR_SET_TIMER_OP: c_ulong = 15;
74pub const HYPERVISOR_EVENT_CHANNEL_OP_COMPAT: c_ulong = 16;
75pub const HYPERVISOR_XEN_VERSION: c_ulong = 17;
76pub const HYPERVISOR_CONSOLE_IO: c_ulong = 18;
77pub const HYPERVISOR_PHYSDEV_OP_COMPAT: c_ulong = 19;
78pub const HYPERVISOR_GRANT_TABLE_OP: c_ulong = 20;
79pub const HYPERVISOR_VM_ASSIST: c_ulong = 21;
80pub const HYPERVISOR_UPDATE_VA_MAPPING_OTHERDOMAIN: c_ulong = 22;
81pub const HYPERVISOR_IRET: c_ulong = 23;
82pub const HYPERVISOR_VCPU_OP: c_ulong = 24;
83pub const HYPERVISOR_SET_SEGMENT_BASE: c_ulong = 25;
84pub const HYPERVISOR_MMUEXT_OP: c_ulong = 26;
85pub const HYPERVISOR_XSM_OP: c_ulong = 27;
86pub const HYPERVISOR_NMI_OP: c_ulong = 28;
87pub const HYPERVISOR_SCHED_OP: c_ulong = 29;
88pub const HYPERVISOR_CALLBACK_OP: c_ulong = 30;
89pub const HYPERVISOR_XENOPROF_OP: c_ulong = 31;
90pub const HYPERVISOR_EVENT_CHANNEL_OP: c_ulong = 32;
91pub const HYPERVISOR_PHYSDEV_OP: c_ulong = 33;
92pub const HYPERVISOR_HVM_OP: c_ulong = 34;
93pub const HYPERVISOR_SYSCTL: c_ulong = 35;
94pub const HYPERVISOR_DOMCTL: c_ulong = 36;
95pub const HYPERVISOR_KEXEC_OP: c_ulong = 37;
96pub const HYPERVISOR_TMEM_OP: c_ulong = 38;
97pub const HYPERVISOR_XC_RESERVED_OP: c_ulong = 39;
98pub const HYPERVISOR_XENPMU_OP: c_ulong = 40;
99pub const HYPERVISOR_DM_OP: c_ulong = 41;
100
101pub const XEN_DOMCTL_CDF_HVM_GUEST: u32 = 1u32 << 0;
102pub const XEN_DOMCTL_CDF_HAP: u32 = 1u32 << 1;
103pub const XEN_DOMCTL_CDF_S3_INTEGRITY: u32 = 1u32 << 2;
104pub const XEN_DOMCTL_CDF_OOS_OFF: u32 = 1u32 << 3;
105pub const XEN_DOMCTL_CDF_XS_DOMAIN: u32 = 1u32 << 4;
106pub const XEN_DOMCTL_CDF_IOMMU: u32 = 1u32 << 5;
107
108pub const XEN_X86_EMU_LAPIC: u32 = 1 << 0;
109pub const XEN_X86_EMU_HPET: u32 = 1 << 1;
110pub const XEN_X86_EMU_PM: u32 = 1 << 2;
111pub const XEN_X86_EMU_RTC: u32 = 1 << 3;
112pub const XEN_X86_EMU_IOAPIC: u32 = 1 << 4;
113pub const XEN_X86_EMU_PIC: u32 = 1 << 5;
114pub const XEN_X86_EMU_VGA: u32 = 1 << 6;
115pub const XEN_X86_EMU_IOMMU: u32 = 1 << 7;
116pub const XEN_X86_EMU_PIT: u32 = 1 << 8;
117pub const XEN_X86_EMU_USE_PIRQ: u32 = 1 << 9;
118
119pub const XEN_X86_EMU_ALL: u32 = XEN_X86_EMU_LAPIC
120 | XEN_X86_EMU_HPET
121 | XEN_X86_EMU_PM
122 | XEN_X86_EMU_RTC
123 | XEN_X86_EMU_IOAPIC
124 | XEN_X86_EMU_PIC
125 | XEN_X86_EMU_VGA
126 | XEN_X86_EMU_IOMMU
127 | XEN_X86_EMU_PIT
128 | XEN_X86_EMU_USE_PIRQ;
129
130pub const XEN_DOMCTL_CREATEDOMAIN: u32 = 1;
131pub const XEN_DOMCTL_DESTROYDOMAIN: u32 = 2;
132pub const XEN_DOMCTL_PAUSEDOMAIN: u32 = 3;
133pub const XEN_DOMCTL_UNPAUSEDOMAIN: u32 = 4;
134pub const XEN_DOMCTL_GETDOMAININFO: u32 = 5;
135pub const XEN_DOMCTL_GETMEMLIST: u32 = 6;
136pub const XEN_DOMCTL_SETVCPUAFFINITY: u32 = 9;
137pub const XEN_DOMCTL_SHADOW_OP: u32 = 10;
138pub const XEN_DOMCTL_MAX_MEM: u32 = 11;
139pub const XEN_DOMCTL_SETVCPUCONTEXT: u32 = 12;
140pub const XEN_DOMCTL_GETVCPUCONTEXT: u32 = 13;
141pub const XEN_DOMCTL_GETVCPUINFO: u32 = 14;
142pub const XEN_DOMCTL_MAX_VCPUS: u32 = 15;
143pub const XEN_DOMCTL_SCHEDULER_OP: u32 = 16;
144pub const XEN_DOMCTL_SETDOMAINHANDLE: u32 = 17;
145pub const XEN_DOMCTL_SETDEBUGGING: u32 = 18;
146pub const XEN_DOMCTL_IRQ_PERMISSION: u32 = 19;
147pub const XEN_DOMCTL_IOMEM_PERMISSION: u32 = 20;
148pub const XEN_DOMCTL_IOPORT_PERMISSION: u32 = 21;
149pub const XEN_DOMCTL_HYPERCALL_INIT: u32 = 22;
150pub const XEN_DOMCTL_SETTIMEOFFSET: u32 = 24;
151pub const XEN_DOMCTL_GETVCPUAFFINITY: u32 = 25;
152pub const XEN_DOMCTL_RESUMEDOMAIN: u32 = 27;
153pub const XEN_DOMCTL_SENDTRIGGER: u32 = 28;
154pub const XEN_DOMCTL_SUBSCRIBE: u32 = 29;
155pub const XEN_DOMCTL_GETHVMCONTEXT: u32 = 33;
156pub const XEN_DOMCTL_SETHVMCONTEXT: u32 = 34;
157pub const XEN_DOMCTL_SET_ADDRESS_SIZE: u32 = 35;
158pub const XEN_DOMCTL_GET_ADDRESS_SIZE: u32 = 36;
159pub const XEN_DOMCTL_ASSIGN_DEVICE: u32 = 37;
160pub const XEN_DOMCTL_BIND_PT_IRQ: u32 = 38;
161pub const XEN_DOMCTL_MEMORY_MAPPING: u32 = 39;
162pub const XEN_DOMCTL_IOPORT_MAPPING: u32 = 40;
163pub const XEN_DOMCTL_PIN_MEM_CACHEATTR: u32 = 41;
164pub const XEN_DOMCTL_SET_EXT_VCPUCONTEXT: u32 = 42;
165pub const XEN_DOMCTL_GET_EXT_VCPUCONTEXT: u32 = 43;
166pub const XEN_DOMCTL_TEST_ASSIGN_DEVICE: u32 = 45;
167pub const XEN_DOMCTL_SET_TARGET: u32 = 46;
168pub const XEN_DOMCTL_DEASSIGN_DEVICE: u32 = 47;
169pub const XEN_DOMCTL_UNBIND_PT_IRQ: u32 = 48;
170pub const XEN_DOMCTL_SET_CPUID: u32 = 49;
171pub const XEN_DOMCTL_GET_DEVICE_GROUP: u32 = 50;
172pub const XEN_DOMCTL_SET_MACHINE_ADDRESS_SIZE: u32 = 51;
173pub const XEN_DOMCTL_GET_MACHINE_ADDRESS_SIZE: u32 = 52;
174pub const XEN_DOMCTL_SUPPRESS_SPURIOUS_PAGE_FAULTS: u32 = 53;
175pub const XEN_DOMCTL_DEBUG_OP: u32 = 54;
176pub const XEN_DOMCTL_GETHVMCONTEXT_PARTIAL: u32 = 55;
177pub const XEN_DOMCTL_VM_EVENT_OP: u32 = 56;
178pub const XEN_DOMCTL_MEM_SHARING_OP: u32 = 57;
179pub const XEN_DOMCTL_DISABLE_MIGRATE: u32 = 58;
180pub const XEN_DOMCTL_GETTSCINFO: u32 = 59;
181pub const XEN_DOMCTL_SETTSCINFO: u32 = 60;
182pub const XEN_DOMCTL_GETPAGEFRAMEINFO3: u32 = 61;
183pub const XEN_DOMCTL_SETVCPUEXTSTATE: u32 = 62;
184pub const XEN_DOMCTL_GETVCPUEXTSTATE: u32 = 63;
185pub const XEN_DOMCTL_SET_ACCESS_REQUIRED: u32 = 64;
186pub const XEN_DOMCTL_AUDIT_P2M: u32 = 65;
187pub const XEN_DOMCTL_SET_VIRQ_HANDLER: u32 = 66;
188pub const XEN_DOMCTL_SET_BROKEN_PAGE_P2M: u32 = 67;
189pub const XEN_DOMCTL_SETNODEAFFINITY: u32 = 68;
190pub const XEN_DOMCTL_GETNODEAFFINITY: u32 = 69;
191pub const XEN_DOMCTL_SET_MAX_EVTCHN: u32 = 70;
192pub const XEN_DOMCTL_CACHEFLUSH: u32 = 71;
193pub const XEN_DOMCTL_GET_VCPU_MSRS: u32 = 72;
194pub const XEN_DOMCTL_SET_VCPU_MSRS: u32 = 73;
195pub const XEN_DOMCTL_SETVNUMAINFO: u32 = 74;
196pub const XEN_DOMCTL_PSR_CMT_OP: u32 = 75;
197pub const XEN_DOMCTL_MONITOR_OP: u32 = 77;
198pub const XEN_DOMCTL_PSR_CAT_OP: u32 = 78;
199pub const XEN_DOMCTL_SOFT_RESET: u32 = 79;
200pub const XEN_DOMCTL_SET_GNTTAB_LIMITS: u32 = 80;
201pub const XEN_DOMCTL_VUART_OP: u32 = 81;
202pub const XEN_DOMCTL_SET_PAGING_MEMPOOL_SIZE: u32 = 86;
203pub const XEN_DOMCTL_GDBSX_GUESTMEMIO: u32 = 1000;
204pub const XEN_DOMCTL_GDBSX_PAUSEVCPU: u32 = 1001;
205pub const XEN_DOMCTL_GDBSX_UNPAUSEVCPU: u32 = 1002;
206pub const XEN_DOMCTL_GDBSX_DOMSTATUS: u32 = 1003;
207
208pub const XEN_DOMINF_DYING: u32 = 1u32 << 0;
209pub const XEN_DOMINF_HVM_GUEST: u32 = 1u32 << 1;
210pub const XEN_DOMINF_SHUTDOWN: u32 = 1u32 << 2;
211pub const XEN_DOMINF_PAUSED: u32 = 1u32 << 3;
212pub const XEN_DOMINF_BLOCKED: u32 = 1u32 << 4;
213pub const XEN_DOMINF_RUNNING: u32 = 1u32 << 5;
214pub const XEN_DOMINF_DEBUGGED: u32 = 1u32 << 6;
215pub const XEN_DOMINF_XS_DOMAIN: u32 = 1u32 << 7;
216pub const XEN_DOMINF_HAP: u32 = 1u32 << 8;
217
218#[repr(C)]
219#[derive(Copy, Clone)]
220pub struct DomCtl {
221 pub cmd: u32,
222 pub interface_version: u32,
223 pub domid: u32,
224 pub value: DomCtlValue,
225}
226
227#[repr(C)]
228#[derive(Copy, Clone)]
229pub struct DomCtlVcpuContext {
230 pub vcpu: u32,
231 pub ctx: u64,
232}
233
234#[repr(C)]
235#[derive(Copy, Clone)]
236pub struct AddressSize {
237 pub size: u32,
238}
239
240#[repr(C)]
241#[derive(Copy, Clone)]
242pub union DomCtlValue {
243 pub create_domain: CreateDomain,
244 pub create_domain2: CreateDomain2,
245 pub get_domain_info: GetDomainInfo,
246 pub max_mem: MaxMem,
247 pub max_cpus: MaxVcpus,
248 pub hypercall_init: HypercallInit,
249 pub vcpu_context: DomCtlVcpuContext,
250 pub address_size: AddressSize,
251 pub get_page_frame_info: GetPageFrameInfo3,
252 pub ioport_permission: IoPortPermission,
253 pub iomem_permission: IoMemPermission,
254 pub irq_permission: IrqPermission,
255 pub assign_device: AssignDevice,
256 pub hvm_context: HvmContext,
257 pub paging_mempool: PagingMempool,
258 pub set_domain_handle: SetDomainHandle,
259 pub pad: [u8; 128],
260}
261
262#[repr(C)]
263#[derive(Copy, Clone, Debug)]
264pub struct CreateDomain {
265 pub ssidref: u32,
266 pub handle: [u8; 16],
267 pub flags: u32,
268 pub iommu_opts: u32,
269 pub max_vcpus: u32,
270 pub max_evtchn_port: u32,
271 pub max_grant_frames: i32,
272 pub max_maptrack_frames: i32,
273 pub grant_opts: u32,
274 pub vmtrace_size: u32,
275 pub cpupool_id: u32,
276 pub arch_domain_config: ArchDomainConfig,
277}
278
279#[repr(C)]
280#[derive(Copy, Clone, Debug)]
281pub struct CreateDomain2 {
282 pub ssidref: u32,
283 pub handle: [u8; 16],
284 pub flags: u32,
285 pub iommu_opts: u32,
286 pub max_vcpus: u32,
287 pub max_evtchn_port: u32,
288 pub max_grant_frames: i32,
289 pub max_maptrack_frames: i32,
290 pub grant_opts: u32,
291 pub altp2m_opts: u32,
292 pub vmtrace_size: u32,
293 pub cpupool_id: u32,
294 pub arch_domain_config: ArchDomainConfig,
295}
296
297impl Default for CreateDomain {
298 fn default() -> Self {
299 CreateDomain {
300 ssidref: SECINITSID_DOMU,
301 handle: [0; 16],
302 flags: 0,
303 iommu_opts: 0,
304 max_vcpus: 1,
305 max_evtchn_port: 1023,
306 max_grant_frames: -1,
307 max_maptrack_frames: -1,
308 grant_opts: 2,
309 vmtrace_size: 0,
310 cpupool_id: 0,
311 arch_domain_config: ArchDomainConfig::default(),
312 }
313 }
314}
315
316impl CreateDomain {
317 pub fn to_cd_2(self) -> CreateDomain2 {
318 CreateDomain2 {
319 ssidref: self.ssidref,
320 handle: self.handle,
321 flags: self.flags,
322 iommu_opts: self.iommu_opts,
323 max_vcpus: self.max_vcpus,
324 max_evtchn_port: self.max_evtchn_port,
325 max_grant_frames: self.max_grant_frames,
326 max_maptrack_frames: self.max_maptrack_frames,
327 grant_opts: self.grant_opts,
328 altp2m_opts: 0,
329 vmtrace_size: self.vmtrace_size,
330 cpupool_id: self.cpupool_id,
331 arch_domain_config: self.arch_domain_config,
332 }
333 }
334}
335
336#[repr(C)]
337#[derive(Copy, Clone, Debug, Default)]
338pub struct SetDomainHandle {
339 pub handle: [u8; 16],
340}
341
342#[repr(C)]
343#[derive(Copy, Clone, Debug, Default)]
344pub struct GetDomainInfo {
345 pub domid: u16,
346 pub pad1: u16,
347 pub flags: u32,
348 pub total_pages: u64,
349 pub max_pages: u64,
350 pub outstanding_pages: u64,
351 pub shr_pages: u64,
352 pub paged_pages: u64,
353 pub shared_info_frame: u64,
354 pub cpu_time: u64,
355 pub number_online_vcpus: u32,
356 pub max_vcpu_id: u32,
357 pub ssidref: u32,
358 pub handle: [u8; 16],
359 pub cpupool: u32,
360 pub gpaddr_bits: u8,
361 pub pad2: [u8; 7],
362 pub arch: ArchDomainConfig,
363}
364
365#[repr(C)]
366#[derive(Copy, Clone, Debug)]
367pub struct GetPageFrameInfo3 {
368 pub num: u64,
369 pub array: c_ulong,
370}
371
372#[repr(C)]
373#[derive(Copy, Clone, Debug)]
374pub struct IoPortPermission {
375 pub first_port: u32,
376 pub nr_ports: u32,
377 pub allow: u8,
378}
379
380#[repr(C)]
381#[derive(Copy, Clone, Debug)]
382pub struct IoMemPermission {
383 pub first_mfn: u64,
384 pub nr_mfns: u64,
385 pub allow: u8,
386}
387
388#[repr(C)]
389#[derive(Copy, Clone, Debug)]
390pub struct IrqPermission {
391 pub pirq: u32,
392 pub allow: u8,
393 pub pad: [u8; 3],
394}
395
396#[repr(C)]
397#[derive(Copy, Clone, Debug, Default)]
398#[cfg(target_arch = "x86_64")]
399pub struct ArchDomainConfig {
400 pub emulation_flags: u32,
401 pub misc_flags: u32,
402}
403
404pub const X86_EMU_LAPIC: u32 = 1 << 0;
405
406#[repr(C)]
407#[derive(Copy, Clone, Debug, Default)]
408#[cfg(target_arch = "aarch64")]
409pub struct ArchDomainConfig {
410 pub gic_version: u8,
411 pub sve_v1: u8,
412 pub tee_type: u16,
413 pub nr_spis: u32,
414 pub clock_frequency: u32,
415}
416
417#[repr(C)]
418#[derive(Copy, Clone, Debug)]
419pub struct MaxMem {
420 pub max_memkb: u64,
421}
422
423#[repr(C)]
424#[derive(Copy, Clone, Debug)]
425pub struct MaxVcpus {
426 pub max_vcpus: u32,
427}
428
429#[repr(C)]
430#[derive(Copy, Clone, Debug)]
431pub struct HypercallInit {
432 pub gmfn: u64,
433}
434
435pub const XEN_DOMCTL_MIN_INTERFACE_VERSION: u32 = 0x00000015;
436pub const XEN_DOMCTL_MAX_INTERFACE_VERSION: u32 = 0x00000017;
437pub const XEN_DOMCTL_CREATE_DOMAIN2_INTERFACE_THRESHOLD: u32 = 0x00000017;
438
439pub const SECINITSID_DOMU: u32 = 12;
440
441#[repr(C)]
442#[derive(Copy, Clone, Debug)]
443pub struct XenCapabilitiesInfo {
444 pub capabilities: [c_char; 1024],
445}
446
447pub const XENVER_CAPABILITIES: u64 = 3;
448
449#[repr(C)]
450#[derive(Copy, Clone, Debug)]
451pub struct MemoryReservation {
452 pub extent_start: c_ulong,
453 pub nr_extents: c_ulong,
454 pub extent_order: c_uint,
455 pub mem_flags: c_uint,
456 pub domid: u16,
457}
458
459#[repr(C)]
460#[derive(Copy, Clone, Debug)]
461pub struct AddToPhysmap {
462 pub domid: u16,
463 pub size: u16,
464 pub space: u32,
465 pub idx: u64,
466 pub gpfn: u64,
467}
468
469#[repr(C)]
470#[derive(Copy, Clone, Debug)]
471pub struct MultiCallEntry {
472 pub op: c_ulong,
473 pub result: c_ulong,
474 pub args: [c_ulong; 6],
475}
476
477pub const XEN_MEM_POPULATE_PHYSMAP: u32 = 6;
478pub const XEN_MEM_MEMORY_MAP: u32 = 10;
479pub const XEN_MEM_SET_MEMORY_MAP: u32 = 13;
480pub const XEN_MEM_CLAIM_PAGES: u32 = 24;
481pub const XEN_MEM_ADD_TO_PHYSMAP: u32 = 7;
482
483#[repr(C)]
484#[derive(Copy, Clone, Debug)]
485pub struct MemoryMap {
486 pub count: c_uint,
487 pub buffer: c_ulong,
488}
489
490#[repr(C)]
491#[derive(Copy, Clone, Debug)]
492pub struct ForeignMemoryMap {
493 pub domid: u16,
494 pub map: MemoryMap,
495}
496
497#[repr(C)]
498#[derive(Copy, Clone, Debug)]
499pub struct VcpuGuestContextFpuCtx {
500 pub x: [c_char; 512],
501}
502
503impl Default for VcpuGuestContextFpuCtx {
504 fn default() -> Self {
505 VcpuGuestContextFpuCtx { x: [0; 512] }
506 }
507}
508
509#[repr(C)]
510#[derive(Copy, Clone, Debug, Default)]
511#[allow(non_camel_case_types)]
512pub struct x8664CpuUserRegs {
513 pub r15: u64,
514 pub r14: u64,
515 pub r13: u64,
516 pub r12: u64,
517 pub rbp: u64,
518 pub rbx: u64,
519 pub r11: u64,
520 pub r10: u64,
521 pub r9: u64,
522 pub r8: u64,
523 pub rax: u64,
524 pub rcx: u64,
525 pub rdx: u64,
526 pub rsi: u64,
527 pub rdi: u64,
528 pub error_code: u32,
529 pub entry_vector: u32,
530 pub rip: u64,
531 pub cs: u16,
532 _pad0: [u16; 1],
533 pub saved_upcall_mask: u8,
534 _pad1: [u8; 3],
535 pub rflags: u64,
536 pub rsp: u64,
537 pub ss: u16,
538 _pad2: [u16; 3],
539 pub es: u16,
540 _pad3: [u16; 3],
541 pub ds: u16,
542 _pad4: [u16; 3],
543 pub fs: u16,
544 _pad5: [u16; 3],
545 pub gs: u16,
546 _pad6: [u16; 3],
547}
548
549#[repr(C)]
550#[derive(Copy, Clone, Debug, Default)]
551pub struct TrapInfo {
552 pub vector: u8,
553 pub flags: u8,
554 pub cs: u16,
555 pub address: u64,
556}
557
558#[repr(C)]
559#[derive(Copy, Clone, Debug)]
560#[allow(non_camel_case_types)]
561pub struct x8664VcpuGuestContext {
562 pub fpu_ctx: VcpuGuestContextFpuCtx,
563 pub flags: u64,
564 pub user_regs: x8664CpuUserRegs,
565 pub trap_ctx: [TrapInfo; 256],
566 pub ldt_base: u64,
567 pub ldt_ents: u64,
568 pub gdt_frames: [u64; 16],
569 pub gdt_ents: u64,
570 pub kernel_ss: u64,
571 pub kernel_sp: u64,
572 pub ctrlreg: [u64; 8],
573 pub debugreg: [u64; 8],
574 pub event_callback_eip: u64,
575 pub failsafe_callback_eip: u64,
576 pub syscall_callback_eip: u64,
577 pub vm_assist: u64,
578 pub fs_base: u64,
579 pub gs_base_kernel: u64,
580 pub gs_base_user: u64,
581}
582
583impl Default for x8664VcpuGuestContext {
584 fn default() -> Self {
585 Self {
586 fpu_ctx: Default::default(),
587 flags: 0,
588 user_regs: Default::default(),
589 trap_ctx: [TrapInfo::default(); 256],
590 ldt_base: 0,
591 ldt_ents: 0,
592 gdt_frames: [0; 16],
593 gdt_ents: 0,
594 kernel_ss: 0,
595 kernel_sp: 0,
596 ctrlreg: [0; 8],
597 debugreg: [0; 8],
598 event_callback_eip: 0,
599 failsafe_callback_eip: 0,
600 syscall_callback_eip: 0,
601 vm_assist: 0,
602 fs_base: 0,
603 gs_base_kernel: 0,
604 gs_base_user: 0,
605 }
606 }
607}
608
609#[repr(C)]
610#[derive(Copy, Clone, Debug, Default)]
611pub struct Arm64CpuUserRegs {
612 pub x0: u64,
613 pub x1: u64,
614 pub x2: u64,
615 pub x3: u64,
616 pub x4: u64,
617 pub x5: u64,
618 pub x6: u64,
619 pub x7: u64,
620 pub x8: u64,
621 pub x9: u64,
622 pub x10: u64,
623 pub x11: u64,
624 pub x12: u64,
625 pub x13: u64,
626 pub x14: u64,
627 pub x15: u64,
628 pub x16: u64,
629 pub x17: u64,
630 pub x18: u64,
631 pub x19: u64,
632 pub x20: u64,
633 pub x21: u64,
634 pub x22: u64,
635 pub x23: u64,
636 pub x24: u64,
637 pub x25: u64,
638 pub x26: u64,
639 pub x27: u64,
640 pub x28: u64,
641 pub x29: u64,
642 pub x30: u64,
643 pub pc: u64,
644 pub cpsr: u64,
645 pub spsr_el1: u64,
646 pub spsr_fiq: u32,
647 pub spsr_irq: u32,
648 pub spsr_und: u32,
649 pub spsr_abt: u32,
650 pub sp_el0: u64,
651 pub sp_el1: u64,
652 pub elr_el1: u64,
653}
654
655#[repr(C)]
656#[derive(Copy, Clone, Debug, Default)]
657pub struct Arm64VcpuGuestContext {
658 pub flags: u32,
659 pub user_regs: x8664CpuUserRegs,
660 pub sctlr: u64,
661 pub ttbcr: u64,
662 pub ttbr0: u64,
663 pub ttbr1: u64,
664}
665
666pub union VcpuGuestContextAny {
667 #[cfg(target_arch = "aarch64")]
668 pub value: Arm64VcpuGuestContext,
669 #[cfg(target_arch = "x86_64")]
670 pub value: x8664VcpuGuestContext,
671}
672
673#[repr(C)]
674#[derive(Debug, Copy, Clone)]
675pub struct MmuExtOp {
676 pub cmd: c_uint,
677 pub arg1: c_ulong,
678 pub arg2: c_ulong,
679}
680
681pub const MMUEXT_PIN_L4_TABLE: u32 = 3;
682
683#[repr(C)]
684#[derive(Debug, Copy, Clone)]
685pub struct EvtChnAllocUnbound {
686 pub dom: u16,
687 pub remote_dom: u16,
688 pub port: u32,
689}
690
691#[repr(C, packed)]
692#[derive(Debug, Copy, Clone, Default)]
693pub struct E820Entry {
694 pub addr: u64,
695 pub size: u64,
696 pub typ: u32,
697}
698
699pub const E820_MAX: u32 = 1024;
700pub const E820_RAM: u32 = 1;
701pub const E820_RESERVED: u32 = 2;
702pub const E820_ACPI: u32 = 3;
703pub const E820_NVS: u32 = 4;
704pub const E820_UNUSABLE: u32 = 5;
705
706pub const PHYSDEVOP_MAP_PIRQ: u64 = 13;
707
708#[repr(C)]
709#[derive(Default, Clone, Copy, Debug)]
710pub struct PhysdevMapPirq {
711 pub domid: u16,
712 pub typ: c_int,
713 pub index: c_int,
714 pub pirq: c_int,
715 pub bus: c_int,
716 pub devfn: c_int,
717 pub entry_nr: u16,
718 pub table_base: u64,
719}
720
721pub const DOMCTL_DEV_RDM_RELAXED: u32 = 1;
722pub const DOMCTL_DEV_PCI: u32 = 0;
723pub const DOMCTL_DEV_DT: u32 = 1;
724
725#[repr(C)]
726#[derive(Default, Clone, Copy, Debug)]
727pub struct PciAssignDevice {
728 pub sbdf: u32,
729 pub padding: u64,
730}
731
732#[repr(C)]
733#[derive(Default, Clone, Copy, Debug)]
734pub struct AssignDevice {
735 pub device: u32,
736 pub flags: u32,
737 pub pci_assign_device: PciAssignDevice,
738}
739
740pub const DOMID_IO: u32 = 0x7FF1;
741pub const MEMFLAGS_POPULATE_ON_DEMAND: u32 = 1 << 16;
742
743pub struct PodTarget {
744 pub target_pages: u64,
745 pub total_pages: u64,
746 pub pod_cache_pages: u64,
747 pub pod_entries: u64,
748 pub domid: u16,
749}
750
751#[repr(C)]
752#[derive(Default, Clone, Copy, Debug)]
753pub struct HvmParam {
754 pub domid: u16,
755 pub pad: u8,
756 pub index: u32,
757 pub value: u64,
758}
759
760#[repr(C)]
761#[derive(Clone, Copy, Debug)]
762pub struct HvmContext {
763 pub size: u32,
764 pub buffer: u64,
765}
766
767#[repr(C)]
768#[derive(Clone, Copy, Debug)]
769pub struct PagingMempool {
770 pub size: u64,
771}
772
773#[repr(C)]
774#[derive(Clone, Copy, Debug)]
775pub struct SysctlCputopo {
776 pub core: u32,
777 pub socket: u32,
778 pub node: u32,
779}
780
781#[repr(C)]
782#[derive(Clone, Copy, Debug)]
783pub struct SysctlSetCpuFreqGov {
784 pub scaling_governor: [u8; 16],
785}
786
787#[repr(C)]
788#[derive(Clone, Copy)]
789pub union SysctlPmOpValue {
790 pub set_gov: SysctlSetCpuFreqGov,
791 pub opt_smt: u32,
792 pub pad: [u8; 128],
793}
794
795#[repr(C)]
796#[derive(Clone, Copy)]
797pub struct SysctlPmOp {
798 pub cmd: u32,
799 pub cpuid: u32,
800 pub value: SysctlPmOpValue,
801}
802
803#[repr(C)]
804#[derive(Clone, Copy, Debug)]
805pub struct SysctlCputopoinfo {
806 pub num_cpus: u32,
807 pub handle: c_ulong,
808}
809
810#[repr(C)]
811pub union SysctlValue {
812 pub console: SysctlReadconsole,
813 pub cputopoinfo: SysctlCputopoinfo,
814 pub pm_op: SysctlPmOp,
815 pub phys_info: SysctlPhysinfo,
816 pub pad: [u8; 128],
817}
818
819#[repr(C)]
820pub struct Sysctl {
821 pub cmd: u32,
822 pub interface_version: u32,
823 pub value: SysctlValue,
824}
825
826pub const XEN_SYSCTL_READCONSOLE: u32 = 1;
827pub const XEN_SYSCTL_PHYSINFO: u32 = 3;
828pub const XEN_SYSCTL_PM_OP: u32 = 12;
829pub const XEN_SYSCTL_CPUTOPOINFO: u32 = 16;
830
831pub const XEN_SYSCTL_MIN_INTERFACE_VERSION: u32 = 0x00000015;
832pub const XEN_SYSCTL_MAX_INTERFACE_VERSION: u32 = 0x00000020;
833pub const XEN_SYSCTL_PM_OP_SET_CPUFREQ_GOV: u32 = 0x12;
834pub const XEN_SYSCTL_PM_OP_SET_SCHED_OPT_STMT: u32 = 0x21;
835pub const XEN_SYSCTL_PM_OP_ENABLE_TURBO: u32 = 0x26;
836pub const XEN_SYSCTL_PM_OP_DISABLE_TURBO: u32 = 0x27;
837
838#[derive(Clone, Copy, Debug)]
839pub enum CpuId {
840 All,
841 Single(u32),
842}
843
844#[repr(C)]
845#[derive(Clone, Copy, Debug, Default)]
846pub struct SysctlPhysinfo {
847 pub threads_per_core: u32,
848 pub cores_per_socket: u32,
849 pub nr_cpus: u32,
850 pub max_cpu_id: u32,
851 pub nr_nodes: u32,
852 pub max_node_id: u32,
853 pub cpu_khz: u32,
854 pub capabilities: u32,
855 pub arch_capabilities: u32,
856 pub pad: u32,
857 pub total_pages: u64,
858 pub free_pages: u64,
859 pub scrub_pages: u64,
860 pub outstanding_pages: u64,
861 pub max_mfn: u64,
862 pub hw_cap: [u32; 8],
863}
864
865#[repr(C)]
866#[derive(Clone, Copy, Debug, Default)]
867pub struct SysctlReadconsole {
868 pub clear: u8,
869 pub incremental: u8,
870 pub pad: u16,
871 pub index: u32,
872 pub buffer: u64,
873 pub count: u32,
874}