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