xref: /kvmtool/x86/include/kvm/kvm-arch.h (revision 3ebd8e0bf30b6b7c04b1e42f2ac453594fd9205b)
1 #ifndef KVM__KVM_ARCH_H
2 #define KVM__KVM_ARCH_H
3 
4 #include "kvm/interrupt.h"
5 #include "kvm/segment.h"
6 
7 #include <stdbool.h>
8 #include <linux/types.h>
9 #include <time.h>
10 
11 /*
12  * The hole includes VESA framebuffer and PCI memory.
13  */
14 #define KVM_32BIT_MAX_MEM_SIZE  (1ULL << 32)
15 #define KVM_32BIT_GAP_SIZE	(768 << 20)
16 #define KVM_32BIT_GAP_START	(KVM_32BIT_MAX_MEM_SIZE - KVM_32BIT_GAP_SIZE)
17 
18 #define KVM_MMIO_START		KVM_32BIT_GAP_START
19 
20 /* This is the address that pci_get_io_space_block() starts allocating
21  * from.  Note that this is a PCI bus address (though same on x86).
22  */
23 #define KVM_PCI_MMIO_AREA	(KVM_MMIO_START + 0x1000000)
24 #define KVM_VIRTIO_MMIO_AREA	(KVM_MMIO_START + 0x2000000)
25 
26 struct kvm {
27 	int			sys_fd;		/* For system ioctls(), i.e. /dev/kvm */
28 	int			vm_fd;		/* For VM ioctls() */
29 	timer_t			timerid;	/* Posix timer for interrupts */
30 
31 	int			nrcpus;		/* Number of cpus to run */
32 
33 	u32			mem_slots;	/* for KVM_SET_USER_MEMORY_REGION */
34 
35 	u64			ram_size;
36 	void			*ram_start;
37 	u64			ram_pagesize;
38 
39 	bool			nmi_disabled;
40 
41 	bool			single_step;
42 
43 	u16			boot_selector;
44 	u16			boot_ip;
45 	u16			boot_sp;
46 
47 	struct interrupt_table	interrupt_table;
48 
49 	const char		*vmlinux;
50 	struct disk_image       **disks;
51 	int                     nr_disks;
52 
53 	char			*name;
54 
55 	int			vm_state;
56 };
57 
58 static inline void *guest_flat_to_host(struct kvm *kvm, unsigned long offset); /* In kvm.h */
59 
60 static inline void *guest_real_to_host(struct kvm *kvm, u16 selector, u16 offset)
61 {
62 	unsigned long flat = segment_to_flat(selector, offset);
63 
64 	return guest_flat_to_host(kvm, flat);
65 }
66 
67 #endif /* KVM__KVM_ARCH_H */
68