-static int apic_free(struct vm_device * dev) {
- struct apic_dev_state * apic_dev = (struct apic_dev_state *)dev->private_data;
+static int apic_free(struct apic_dev_state * apic_dev) {
int i = 0;
+ struct v3_vm_info * vm = NULL;
- for (i = 0; i < dev->vm->num_cores; i++) {
+ for (i = 0; i < apic_dev->num_apics; i++) {
struct apic_state * apic = &(apic_dev->apics[i]);
- struct guest_info * core = &(dev->vm->cores[i]);
+ struct guest_info * core = apic->core;
+ vm = core->vm_info;
// unregister intr controller
}
- v3_unhook_msr(dev->vm, BASE_ADDR_MSR);
+ v3_unhook_msr(vm, BASE_ADDR_MSR);
V3_Free(apic_dev);
return 0;
static struct v3_device_ops dev_ops = {
- .free = apic_free,
+ .free = (int (*)(void *))apic_free,
};
apic_dev->num_apics = vm->num_cores;
- struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, apic_dev);
+ struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, apic_dev);
- if (v3_attach_device(vm, dev) == -1) {
+ if (dev == NULL) {
PrintError("apic: Could not attach device %s\n", dev_id);
V3_Free(apic_dev);
return -1;
if (apic->timer == NULL) {
PrintError("APIC: Failed to attach timer to core %d\n", i);
- v3_detach_device(dev);
+ v3_remove_device(dev);
return -1;
}