addr_t irq_state = v3_lock_irqsave(intr_state->irq_lock);
list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {
- ctrl->ctrl_ops->lower_intr(ctrl->priv_data, irq);
+ ctrl->ctrl_ops->lower_intr(info, ctrl->priv_data, irq);
}
v3_unlock_irqrestore(intr_state->irq_lock, irq_state);
addr_t irq_state = v3_lock_irqsave(intr_state->irq_lock);
list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {
- ctrl->ctrl_ops->raise_intr(ctrl->priv_data, irq);
+ ctrl->ctrl_ops->raise_intr(info, ctrl->priv_data, irq);
}
v3_unlock_irqrestore(intr_state->irq_lock, irq_state);
}
+void v3_clear_pending_intr(struct guest_info * core) {
+ struct v3_intr_state * intr_state = &(core->intr_state);
+
+ intr_state->irq_pending = 0;
+
+}
+
v3_intr_type_t v3_intr_pending(struct guest_info * info) {
struct v3_intr_state * intr_state = &(info->intr_state);
if (ret == V3_INVALID_INTR) {
list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {
- if (ctrl->ctrl_ops->intr_pending(ctrl->priv_data) == 1) {
+ if (ctrl->ctrl_ops->intr_pending(info, ctrl->priv_data) == 1) {
ret = V3_EXTERNAL_IRQ;
break;
}
if (!ret) {
list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {
- if (ctrl->ctrl_ops->intr_pending(ctrl->priv_data)) {
- uint_t intr_num = ctrl->ctrl_ops->get_intr_number(ctrl->priv_data);
+ if (ctrl->ctrl_ops->intr_pending(info, ctrl->priv_data)) {
+ uint_t intr_num = ctrl->ctrl_ops->get_intr_number(info, ctrl->priv_data);
// PrintDebug("[get_intr_number] intr_number = %d\n", intr_num);
ret = intr_num;
// PrintDebug("[injecting_intr] External_Irq with intr_num = %x\n", intr_num);
list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {
- ctrl->ctrl_ops->begin_irq(ctrl->priv_data, intr_num);
+ ctrl->ctrl_ops->begin_irq(info, ctrl->priv_data, intr_num);
}
v3_unlock_irqrestore(intr_state->irq_lock, irq_state);