* redistribute, and modify it as specified in the file "V3VEE_LICENSE".
*/
-#include <devices/para_net.h>
+
#include <palacios/vmm.h>
+#include <palacios/vmm_dev_mgr.h>
#include <palacios/vm_guest_mem.h>
#include <palacios/vmm_hypercall.h>
addr_t pkt_gpa = info->vm_regs.rbx;
int pkt_len = info->vm_regs.rcx;
uchar_t * pkt = V3_Malloc(pkt_len);
+
+ if (!pkt) {
+ PrintError(info->vm_info, info, "Cannot allocate in transmit!\n");
+ return -1;
+ }
- PrintDebug("Transmitting Packet\n");
+ PrintDebug(info->vm_info, info, "Transmitting Packet\n");
if (read_guest_pa_memory(info, pkt_gpa, pkt_len, pkt) != -1) {
return -1;
uint_t pkt_len = 0;
uchar_t * pkt = NULL;
- PrintDebug("Receiving Packet\n");
+ PrintDebug(info->vm_info, info, "Receiving Packet\n");
return -1;
if (write_guest_pa_memory(info, pkt_gpa, pkt_len, pkt) != -1) {
addr_t mac_gpa = info->vm_regs.rbx;
- PrintDebug("Returning MAC ADDR\n");
+ PrintDebug(info->vm_info, info, "Returning MAC ADDR\n");
if (write_guest_pa_memory(info, mac_gpa, 6, nic->mac_addr) != 6) {
- PrintError("Could not write mac address\n");
+ PrintError(info->vm_info, info, "Could not write mac address\n");
return -1;
}
return 0;
}
-static int net_init(struct vm_device * dev) {
- struct nic_state * nic = (struct nic_state *)dev->private_data;
-
- v3_register_hypercall(dev->vm, TX_HYPERCALL, tx_call, nic);
- v3_register_hypercall(dev->vm, RX_HYPERCALL, rx_call, nic);
- v3_register_hypercall(dev->vm, MACADDR_HYPERCALL, macaddr_call, nic);
- nic->mac_addr[0] = 0x52;
- nic->mac_addr[1] = 0x54;
- nic->mac_addr[2] = 0x00;
- nic->mac_addr[3] = 0x12;
- nic->mac_addr[4] = 0x34;
- nic->mac_addr[5] = 0x56;
+static int net_free(struct vm_device * dev) {
return 0;
}
-static int net_deinit(struct vm_device * dev) {
- return 0;
-}
-
-
-static struct vm_device_ops dev_ops = {
- .init = net_init,
- .deinit = net_deinit,
+static struct v3_device_ops dev_ops = {
+ .free = net_free,
.reset = NULL,
.start = NULL,
.stop = NULL,
};
-struct vm_device * v3_create_para_net() {
+
+
+static int net_init(struct guest_info * vm, v3_cfg_tree_t * cfg) {
struct nic_state * state = NULL;
+ char * dev_id = v3_cfg_val(cfg, "ID");
state = (struct nic_state *)V3_Malloc(sizeof(struct nic_state));
- PrintDebug("Creating VMNet Device\n");
+ if (!state) {
+ PrintError(info->vm_info, info, "Cannot allocate in init\n");
+ return -1;
+ }
+
+ PrintDebug(info->vm_info, info, "Creating VMNet Device\n");
+
+ struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, state);
+
+ if (v3_attach_device(vm, dev) == -1) {
+ PrintError(info->vm_info, info, "Could not attach device %s\n", dev_id);
+ return -1;
+ }
- struct vm_device * device = v3_create_device("VMNET", &dev_ops, state);
- return device;
+ v3_register_hypercall(vm, TX_HYPERCALL, tx_call, state);
+ v3_register_hypercall(vm, RX_HYPERCALL, rx_call, state);
+ v3_register_hypercall(vm, MACADDR_HYPERCALL, macaddr_call, state);
+
+ state->mac_addr[0] = 0x52;
+ state->mac_addr[1] = 0x54;
+ state->mac_addr[2] = 0x00;
+ state->mac_addr[3] = 0x12;
+ state->mac_addr[4] = 0x34;
+ state->mac_addr[5] = 0x56;
+
+ return 0;
}
+
+
+device_register("VMNET", net_init)