in vboxguest/vboxguest_core.c [1776:1826]
irqreturn_t vbg_core_isr(int irq, void *dev_id)
{
struct vbg_dev *gdev = dev_id;
struct vmmdev_events *req = gdev->ack_events_req;
bool mouse_position_changed = false;
unsigned long flags;
u32 events = 0;
int rc;
if (!gdev->mmio->V.V1_04.have_events)
return IRQ_NONE;
/* Get and acknowlegde events. */
req->header.rc = VERR_INTERNAL_ERROR;
req->events = 0;
rc = vbg_req_perform(gdev, req);
if (rc < 0) {
vbg_err("Error performing events req, rc: %d\n", rc);
return IRQ_NONE;
}
events = req->events;
if (events & VMMDEV_EVENT_MOUSE_POSITION_CHANGED) {
mouse_position_changed = true;
events &= ~VMMDEV_EVENT_MOUSE_POSITION_CHANGED;
}
if (events & VMMDEV_EVENT_HGCM) {
wake_up(&gdev->hgcm_wq);
events &= ~VMMDEV_EVENT_HGCM;
}
if (events & VMMDEV_EVENT_BALLOON_CHANGE_REQUEST) {
schedule_work(&gdev->mem_balloon.work);
events &= ~VMMDEV_EVENT_BALLOON_CHANGE_REQUEST;
}
if (events) {
spin_lock_irqsave(&gdev->event_spinlock, flags);
gdev->pending_events |= events;
spin_unlock_irqrestore(&gdev->event_spinlock, flags);
wake_up(&gdev->event_wq);
}
if (mouse_position_changed)
vbg_linux_mouse_event(gdev);
return IRQ_HANDLED;
}