X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fsimple_pic.c;h=96907df2823ad31b190b1ed9286d99846dd72f70;hp=bbc58f3ccc781b89b23320dec142fd047f4190c0;hb=571979dad8fc2138a7e11c4fe61e812a0a0b17d1;hpb=f9bb3db89469169bb5775dc031d89e570c6fed70 diff --git a/palacios/src/devices/simple_pic.c b/palacios/src/devices/simple_pic.c index bbc58f3..96907df 100644 --- a/palacios/src/devices/simple_pic.c +++ b/palacios/src/devices/simple_pic.c @@ -1,82 +1,101 @@ -/* Northwestern University */ -/* (c) 2008, Jack Lange */ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + -#include #include #include #include struct pic_internal { - int pending_irq; + int pending_irq; }; static int pic_intr_pending(void * private_data) { - struct pic_internal * data = (struct pic_internal *)private_data; + struct pic_internal * data = (struct pic_internal *)private_data; - return (data->pending_irq > 0); + return (data->pending_irq > 0); } static int pic_raise_intr(void * private_data, int irq) { - struct pic_internal * data = (struct pic_internal *)private_data; + struct pic_internal * data = (struct pic_internal *)private_data; - data->pending_irq = irq; + data->pending_irq = irq; - return 0; + return 0; } static int pic_get_intr_number(void * private_data) { - struct pic_internal * data = (struct pic_internal *)private_data; + struct pic_internal * data = (struct pic_internal *)private_data; - return data->pending_irq; + return data->pending_irq; } static struct intr_ctrl_ops intr_ops = { - .intr_pending = pic_intr_pending, - .get_intr_number = pic_get_intr_number, - .raise_intr = pic_raise_intr + .intr_pending = pic_intr_pending, + .get_intr_number = pic_get_intr_number, + .raise_intr = pic_raise_intr }; -int pic_init_device(struct vm_device * dev) { - struct pic_internal * data = (struct pic_internal *)dev->private_data; - set_intr_controller(dev->vm, &intr_ops, data); - data->pending_irq = 0; - return 0; + +static int pic_free(struct vm_device * dev) { + return 0; } -int pic_deinit_device(struct vm_device * dev) { - return 0; -} +static struct v3_device_ops dev_ops = { + .free = pic_free, + .reset = NULL, + .start = NULL, + .stop = NULL +}; -static struct vm_device_ops dev_ops = { - .init = pic_init_device, - .deinit = pic_deinit_device, - .reset = NULL, - .start = NULL, - .stop = NULL -}; +static int pic_init(struct guest_info * vm, void * cfg_data) { + struct pic_internal * state = NULL; + state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal)); + V3_ASSERT(state != NULL); + + struct vm_device * dev = v3_allocate_device("SIMPLE_PIC", &dev_ops, state); -struct vm_device * create_simple_pic() { - struct pic_internal * state = NULL; - state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal)); - V3_ASSERT(state != NULL); + if (v3_attach_device(vm, dev) == -1) { + PrintError("Could not attach device %s\n", "SIMPLE_PIC"); + return -1; + } - struct vm_device * pic_dev = create_device("Simple Pic", &dev_ops, state); + v3_register_intr_controller(vm, &intr_ops, state); + state->pending_irq = 0; - return pic_dev; + return 0; } + +device_register("SIMPLE_PIC", pic_init)