2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2011, Peter Dinda <pdinda@northwestern.edu>
11 * Copyright (c) 2011, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Peter Dinda <pdinda@northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
21 #include <interfaces/vmm_host_dev.h>
22 #include <palacios/vmm.h>
23 #include <palacios/vmm_debug.h>
24 #include <palacios/vmm_types.h>
25 #include <palacios/vm_guest.h>
26 #include <palacios/vm_guest_mem.h>
28 struct v3_host_dev_hooks * host_dev_hooks = 0;
30 v3_host_dev_t v3_host_dev_open(char *impl,
33 v3_guest_dev_intr_t intr,
34 struct v3_vm_info *vm)
36 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
37 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->open != NULL);
39 return host_dev_hooks->open(impl,bus,gdev,intr,vm->host_priv_data);
42 int v3_host_dev_close(v3_host_dev_t hdev)
44 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks);
45 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->close);
47 return host_dev_hooks->close(hdev);
50 uint64_t v3_host_dev_read_io(v3_host_dev_t hdev,
55 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
56 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->read_io != NULL);
58 return host_dev_hooks->read_io(hdev,port,dst,len);
61 uint64_t v3_host_dev_write_io(v3_host_dev_t hdev,
66 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
67 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->write_io != NULL);
69 return host_dev_hooks->write_io(hdev,port,src,len);
72 uint64_t v3_host_dev_read_mem(v3_host_dev_t hdev,
77 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
78 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->read_mem != NULL);
80 return host_dev_hooks->read_mem(hdev,(void*)gpa,dst,len);
83 uint64_t v3_host_dev_write_mem(v3_host_dev_t hdev,
88 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
89 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->write_mem != NULL);
91 return host_dev_hooks->write_mem(hdev,(void*)gpa,src,len);
94 uint64_t v3_host_dev_read_config(v3_host_dev_t hdev,
99 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
100 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->read_config);
102 return host_dev_hooks->read_config(hdev,offset,dst,len);
105 uint64_t v3_host_dev_write_config(v3_host_dev_t hdev,
110 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
111 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->write_config);
113 return host_dev_hooks->write_config(hdev,offset,src,len);
118 int v3_host_dev_ack_irq(v3_host_dev_t hdev, uint8_t irq)
120 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks != NULL);
121 V3_ASSERT(VM_NONE, VCORE_NONE, host_dev_hooks->ack_irq);
123 return host_dev_hooks->ack_irq(hdev,irq);
127 int v3_host_dev_raise_irq(v3_host_dev_t hostdev,
128 v3_guest_dev_t guest_dev,
129 v3_guest_dev_intr_t intr,
133 intr(hostdev,guest_dev,irq,1);
136 struct vm_device *dev = (struct vm_device *) guest_dev;
138 if (dev && dev->vm) {
139 return v3_raise_irq(dev->vm,irq);
146 int v3_host_dev_lower_irq(v3_host_dev_t hostdev,
147 v3_guest_dev_t guest_dev,
148 v3_guest_dev_intr_t intr,
151 struct vm_device *dev = (struct vm_device *) guest_dev;
153 if (dev && dev->vm) {
155 intr(hostdev,guest_dev,irq,0);
158 return v3_lower_irq(dev->vm,irq);
166 uint64_t v3_host_dev_read_guest_mem(v3_host_dev_t hostdev,
167 v3_guest_dev_t guest_dev,
172 struct vm_device *dev = (struct vm_device *) guest_dev;
177 struct v3_vm_info *vm = dev->vm;
182 return v3_read_gpa_memory(&(vm->cores[0]), (addr_t)gpa, len, dst);
187 uint64_t v3_host_dev_write_guest_mem(v3_host_dev_t hostdev,
188 v3_guest_dev_t guest_dev,
193 struct vm_device *dev = (struct vm_device *) guest_dev;
198 struct v3_vm_info *vm = dev->vm;
203 return v3_write_gpa_memory(&(vm->cores[0]), (addr_t)gpa, len, src);
210 void V3_Init_Host_Device_Support(struct v3_host_dev_hooks * hooks) {
211 host_dev_hooks = hooks;
212 PrintDebug(VM_NONE, VCORE_NONE, "V3 host device interface inited\n");