X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=470d87888a2f7040e789b5152d153852ab7df889;hb=4b93282ac2e60cd4d74b1e0be8ac758933140413;hp=ee901ef39a75451912bf5609f234bef2e1d3791d;hpb=10d90467d53345f6b3c1ec575f34266253858333;p=palacios.git diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index ee901ef..470d878 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -8,6 +8,13 @@ #define PrintDebug(fmt, args...) #endif +#ifdef DEBUG_RAMDISK +#define Ramdisk_Print_Pic(_f, _a...) PrintTrace("\n8259a.c(%d) "_f, __LINE__, ## _a) +#else +#define Ramdisk_Print_Pic(_f, _a...) +#endif + + typedef enum {RESET, ICW1, ICW2, ICW3, ICW4, READY} pic_state_t; static const uint_t MASTER_PORT1 = 0x20; @@ -181,6 +188,32 @@ static int pic_raise_intr(void * private_data, int irq) { return 0; } + +/*Zheng 07/30/2008*/ + +static int pic_lower_intr(void *private_data, int irq_no) { + + struct pic_internal *state = (struct pic_internal*)private_data; + + Ramdisk_Print_Pic("[pic_lower_intr] IRQ line %d now low\n", (unsigned) irq_no); + if (irq_no <= 7) { + + state->master_irr &= ~(1 << irq_no); + if ((state->master_irr & ~(state->master_imr)) == 0) { + Ramdisk_Print_Pic("\t\tFIXME: Master maybe should do sth\n"); + } + } else if ((irq_no > 7) && (irq_no <= 15)) { + + state->slave_irr &= ~(1 << (irq_no - 8)); + if ((state->slave_irr & (~(state->slave_imr))) == 0) { + Ramdisk_Print_Pic("\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; @@ -268,11 +301,15 @@ static int pic_end_irq(void * private_data, int irq) { } */ + +/*Zheng 07/30/2008*/ 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, //Zheng added + };