1 #ifndef _HVM_H
2 #define _HVM_H
3 
4 /** @file
5  *
6  * Xen HVM driver
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <stdint.h>
13 #include <ipxe/xen.h>
14 #include <xen/hvm/hvm_op.h>
15 #include <xen/hvm/params.h>
16 
17 /** Minimum CPUID base */
18 #define HVM_CPUID_MIN 0x40000000UL
19 
20 /** Maximum CPUID base */
21 #define HVM_CPUID_MAX 0x4000ff00UL
22 
23 /** Increment between CPUID bases */
24 #define HVM_CPUID_STEP 0x00000100UL
25 
26 /** Magic signature */
27 #define HVM_CPUID_MAGIC "XenVMMXenVMM"
28 
29 /** Get Xen version */
30 #define HVM_CPUID_VERSION 1
31 
32 /** Get number of hypercall pages */
33 #define HVM_CPUID_PAGES 2
34 
35 /** PCI MMIO BAR */
36 #define HVM_MMIO_BAR PCI_BASE_ADDRESS_1
37 
38 /** A Xen HVM device */
39 struct hvm_device {
40 	/** Xen hypervisor */
41 	struct xen_hypervisor xen;
42 	/** CPUID base */
43 	uint32_t cpuid_base;
44 	/** Length of hypercall table */
45 	size_t hypercall_len;
46 	/** MMIO base address */
47 	unsigned long mmio;
48 	/** Current offset within MMIO address space */
49 	size_t mmio_offset;
50 	/** Length of MMIO address space */
51 	size_t mmio_len;
52 };
53 
54 /**
55  * Get HVM parameter value
56  *
57  * @v xen		Xen hypervisor
58  * @v index		Parameter index
59  * @v value		Value to fill in
60  * @ret xenrc		Xen status code
61  */
xen_hvm_get_param(struct xen_hypervisor * xen,unsigned int index,uint64_t * value)62 static inline int xen_hvm_get_param ( struct xen_hypervisor *xen,
63 				      unsigned int index, uint64_t *value ) {
64 	struct xen_hvm_param param;
65 	int xenrc;
66 
67 	param.domid = DOMID_SELF;
68 	param.index = index;
69 	xenrc = xen_hypercall_2 ( xen, __HYPERVISOR_hvm_op, HVMOP_get_param,
70 				  virt_to_phys ( &param ) );
71 	*value = param.value;
72 	return xenrc;
73 }
74 
75 #endif /* _HVM_H */
76