X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=f13dc1da6dc334ca1d8fda93bb69c26572c349eb;hb=1eb4663834440ff09c48fe9c95a0cc7ad6bbf2bc;hp=ee901ef39a75451912bf5609f234bef2e1d3791d;hpb=aad69eda8e2354cf146054e57ad25fe201a1cb52;p=palacios-OLD.git diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index ee901ef..f13dc1d 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -1,3 +1,23 @@ +/* + * 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 @@ -8,6 +28,7 @@ #define PrintDebug(fmt, args...) #endif + typedef enum {RESET, ICW1, ICW2, ICW3, ICW4, READY} pic_state_t; static const uint_t MASTER_PORT1 = 0x20; @@ -181,6 +202,30 @@ static int pic_raise_intr(void * private_data, int irq) { return 0; } + +static int pic_lower_intr(void *private_data, int irq) { + + struct pic_internal *state = (struct pic_internal*)private_data; + + PrintDebug("[pic_lower_intr] IRQ line %d now low\n", irq); + if (irq <= 7) { + + state->master_irr &= ~(1 << irq); + if ((state->master_irr & ~(state->master_imr)) == 0) { + PrintDebug("\t\tFIXME: Master maybe should do sth\n"); + } + } else if ((irq > 7) && (irq < 16)) { + + state->slave_irr &= ~(1 << (irq - 8)); + if ((state->slave_irr & (~(state->slave_imr))) == 0) { + PrintDebug("\t\tFIXME: Slave maybe should do sth\n"); + } + } + return 0; +} + + + static int pic_intr_pending(void * private_data) { struct pic_internal * state = (struct pic_internal*)private_data; @@ -193,9 +238,9 @@ static int pic_intr_pending(void * private_data) { } static int pic_get_intr_number(void * private_data) { - struct pic_internal * state = (struct pic_internal*)private_data; - int i=0; - int irq=-1; + struct pic_internal * state = (struct pic_internal *)private_data; + int i = 0; + int irq = -1; PrintDebug("8259 PIC: getnum: master_irr: 0x%x master_imr: 0x%x\n", i, state->master_irr, state->master_imr); PrintDebug("8259 PIC: getnum: slave_irr: 0x%x slave_imr: 0x%x\n", i, state->slave_irr, state->slave_imr); @@ -221,11 +266,11 @@ static int pic_get_intr_number(void * private_data) { } } - if (i==15 || i==6) { + if ((i == 15) || (i == 6)) { DumpPICState(state); } - if (i==16) { + if (i == 16) { return -1; } else { return irq; @@ -268,17 +313,21 @@ static int pic_end_irq(void * private_data, int 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, .begin_irq = pic_begin_irq, + .lower_intr = pic_lower_intr, + }; -int read_master_port1(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_master_port1(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; if (length != 1) { @@ -297,7 +346,7 @@ int read_master_port1(ushort_t port, void * dst, uint_t length, struct vm_device return 1; } -int read_master_port2(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_master_port2(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; if (length != 1) { @@ -311,7 +360,7 @@ int read_master_port2(ushort_t port, void * dst, uint_t length, struct vm_device } -int read_slave_port1(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_slave_port1(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; if (length != 1) { @@ -330,7 +379,7 @@ int read_slave_port1(ushort_t port, void * dst, uint_t length, struct vm_device return 1; } -int read_slave_port2(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { +static int read_slave_port2(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; if (length != 1) { @@ -344,7 +393,7 @@ int read_slave_port2(ushort_t port, void * dst, uint_t length, struct vm_device } -int write_master_port1(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_master_port1(ushort_t port, void * src, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; uchar_t cw = *(uchar_t *)src; @@ -406,7 +455,7 @@ int write_master_port1(ushort_t port, void * src, uint_t length, struct vm_devic return 1; } -int write_master_port2(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_master_port2(ushort_t port, void * src, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; uchar_t cw = *(uchar_t *)src; @@ -460,7 +509,7 @@ int write_master_port2(ushort_t port, void * src, uint_t length, struct vm_devic return 1; } -int write_slave_port1(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_slave_port1(ushort_t port, void * src, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; uchar_t cw = *(uchar_t *)src; @@ -519,7 +568,7 @@ int write_slave_port1(ushort_t port, void * src, uint_t length, struct vm_device return 1; } -int write_slave_port2(ushort_t port, void * src, uint_t length, struct vm_device * dev) { +static int write_slave_port2(ushort_t port, void * src, uint_t length, struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; uchar_t cw = *(uchar_t *)src; @@ -580,10 +629,10 @@ int write_slave_port2(ushort_t port, void * src, uint_t length, struct vm_device -int pic_init(struct vm_device * dev) { +static int pic_init(struct vm_device * dev) { struct pic_internal * state = (struct pic_internal*)dev->private_data; - set_intr_controller(dev->vm, &intr_ops, state); + v3_set_intr_controller(dev->vm, &intr_ops, state); state->master_irr = 0; state->master_isr = 0; @@ -609,20 +658,20 @@ int pic_init(struct vm_device * dev) { state->slave_state = ICW1; - dev_hook_io(dev, MASTER_PORT1, &read_master_port1, &write_master_port1); - dev_hook_io(dev, MASTER_PORT2, &read_master_port2, &write_master_port2); - dev_hook_io(dev, SLAVE_PORT1, &read_slave_port1, &write_slave_port1); - dev_hook_io(dev, SLAVE_PORT2, &read_slave_port2, &write_slave_port2); + v3_dev_hook_io(dev, MASTER_PORT1, &read_master_port1, &write_master_port1); + v3_dev_hook_io(dev, MASTER_PORT2, &read_master_port2, &write_master_port2); + v3_dev_hook_io(dev, SLAVE_PORT1, &read_slave_port1, &write_slave_port1); + v3_dev_hook_io(dev, SLAVE_PORT2, &read_slave_port2, &write_slave_port2); return 0; } -int pic_deinit(struct vm_device * dev) { - dev_unhook_io(dev, MASTER_PORT1); - dev_unhook_io(dev, MASTER_PORT2); - dev_unhook_io(dev, SLAVE_PORT1); - dev_unhook_io(dev, SLAVE_PORT2); +static int pic_deinit(struct vm_device * dev) { + v3_dev_unhook_io(dev, MASTER_PORT1); + v3_dev_unhook_io(dev, MASTER_PORT2); + v3_dev_unhook_io(dev, SLAVE_PORT1); + v3_dev_unhook_io(dev, SLAVE_PORT2); return 0; } @@ -642,12 +691,12 @@ static struct vm_device_ops dev_ops = { }; -struct vm_device * create_pic() { +struct vm_device * v3_create_pic() { struct pic_internal * state = NULL; state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal)); V3_ASSERT(state != NULL); - struct vm_device *device = create_device("8259A", &dev_ops, state); + struct vm_device *device = v3_create_device("8259A", &dev_ops, state); return device; }