struct generic_internal {
- struct list_head port_range;
+ struct list_head port_list;
uint_t num_port_ranges;
- struct list_head mem_range;
+ struct list_head mem_list;
uint_t num_mem_ranges;
- struct list_head irq_range;
+ struct list_head irq_list;
uint_t num_irq_ranges;
};
uint_t start;
uint_t end;
uint_t type;
- struct list_head range_list;
+ struct list_head range_link;
};
struct mem_range {
void * start;
void * end;
uint_t type;
- struct list_head range_list;
+ struct list_head range_link;
};
struct irq_range {
uint_t start;
uint_t end;
uint_t type;
- struct list_head range_list;
+ struct list_head range_link;
};
if (PORT_HOOKS) { // This is a runtime conditional on a #define
- struct port_range * tmp;
+ struct port_range * tmp = NULL;
- list_for_each_entry(tmp, &(state->port_range), range_list) {
+ list_for_each_entry(tmp, &(state->port_list), range_link) {
uint_t i = 0;
PrintDebug("generic: hooking ports 0x%x to 0x%x as %x\n",
if (MEM_HOOKS) { // This is a runtime conditional on a #define
struct mem_range * tmp;
- list_for_each_entry(tmp, &(state->mem_range), range_list) {
+ list_for_each_entry(tmp, &(state->mem_list), range_link) {
PrintDebug("generic: hooking addresses 0x%x to 0x%x\n",
tmp->start, tmp->end);
if (IRQ_HOOKS) { // This is a runtime conditional on a #define
struct irq_range * tmp;
- list_for_each_entry(tmp, &(state->irq_range), range_list) {
+ list_for_each_entry(tmp, &(state->irq_list), range_link) {
uint_t i;
PrintDebug("generic: hooking irqs 0x%x to 0x%x\n",
struct irq_range * tmp;
struct irq_range * cur;
- list_for_each_entry_safe(cur, tmp, &(state->irq_range), range_list) {
+ list_for_each_entry_safe(cur, tmp, &(state->irq_list), range_link) {
uint_t i;
PrintDebug("generic: unhooking irqs 0x%x to 0x%x\n",
}
}
+ list_del(&(cur->range_link));
+ state->num_irq_ranges--;
V3_Free(cur);
}
} else {
struct mem_range * tmp;
struct mem_range * cur;
- list_for_each_entry_safe(cur, tmp, &(state->mem_range), range_list) {
+ list_for_each_entry_safe(cur, tmp, &(state->mem_list), range_link) {
PrintDebug("generic: unhooking addresses 0x%x to 0x%x\n",
cur->start, cur->end);
cur->start, cur->end);
}
+ list_del(&(cur->range_link));
+ state->num_mem_ranges--;
V3_Free(cur);
}
} else {
struct port_range * tmp;
struct port_range * cur;
- list_for_each_entry_safe(cur, tmp, &(state->mem_range), range_list) {
+ list_for_each_entry_safe(cur, tmp, &(state->port_list), range_link) {
uint_t i;
PrintDebug("generic: unhooking ports 0x%x to 0x%x\n",
}
}
+ list_del(&(cur->range_link));
+ state->num_port_ranges--;
V3_Free(cur);
}
} else {
range->end = end;
range->type = type;
- list_add(&(state->port_range), &(range->range_list));
+
+ PrintDebug("generic: Adding Port Range: 0x%x to 0x%x as %x\n",
+ range->start, range->end,
+ (range->type == GENERIC_PRINT_AND_PASSTHROUGH) ? "print-and-passthrough" : "print-and-ignore");
+
+ list_add(&(range->range_link), &(state->port_list));
state->num_port_ranges++;
} else {
PrintDebug("generic: hooking IO ports not supported\n");
range->end = end;
range->type = type;
- list_add(&(state->port_range), &(range->range_list));
+ list_add(&(range->range_link), &(state->port_list));
state->num_mem_ranges++;
} else {
PrintDebug("generic: hooking memory not supported\n");
range->end = end;
range->type = type;
- list_add(&(state->port_range), &(range->range_list));
+ list_add(&(range->range_link), &(state->port_list));
state->num_irq_ranges++;
} else {
PrintDebug("generic: hooking IRQs not supported\n");
-struct vm_device *create_generic() {
+struct vm_device * create_generic() {
struct generic_internal * generic_state = (struct generic_internal *)V3_Malloc(sizeof(struct generic_internal));
generic_state->num_port_ranges = 0;
generic_state->num_mem_ranges = 0;
generic_state->num_irq_ranges = 0;
- INIT_LIST_HEAD(&(generic_state->port_range));
- INIT_LIST_HEAD(&(generic_state->mem_range));
- INIT_LIST_HEAD(&(generic_state->irq_range));
+ INIT_LIST_HEAD(&(generic_state->port_list));
+ INIT_LIST_HEAD(&(generic_state->mem_list));
+ INIT_LIST_HEAD(&(generic_state->irq_list));
struct vm_device * device = create_device("GENERIC", &dev_ops, generic_state);