Ejemplo n.º 1
0
static int cmd_vcpu_pause(vmm_chardev_t *cdev, int id)
{
	int ret = VMM_EFAIL;
	vmm_vcpu_t *vcpu = vmm_manager_vcpu(id);
	if (vcpu) {
		;
		if ((ret = vmm_manager_vcpu_pause(vcpu))) {
			vmm_cprintf(cdev, "%s: Failed to pause\n", vcpu->name);
		} else {
			vmm_cprintf(cdev, "%s: Paused\n", vcpu->name);
		}
	} else {
		vmm_cprintf(cdev, "Failed to find vcpu\n");
	}
	return ret;
}
Ejemplo n.º 2
0
int vmm_vcpu_irq_wait_timeout(struct vmm_vcpu *vcpu, u64 nsecs)
{
	irq_flags_t flags;
	bool try_vcpu_pause = FALSE;

	/* Sanity Checks */
	if (!vcpu || !vcpu->is_normal) {
		return VMM_EFAIL;
	}

	/* Lock VCPU WFI */
	vmm_spin_lock_irqsave_lite(&vcpu->irqs.wfi.lock, flags);

	if (!vcpu->irqs.wfi.state &&
	    !arch_atomic_read(&vcpu->irqs.execute_pending)) {
		try_vcpu_pause = TRUE;

		/* Set wait for irq state */
		vcpu->irqs.wfi.state = TRUE;

		/* Start wait for irq timeout event */
		if (!nsecs) {
			nsecs = CONFIG_WFI_TIMEOUT_SECS * 1000000000ULL;
		}
		vmm_timer_event_start(vcpu->irqs.wfi.priv, nsecs);
	}

	/* Unlock VCPU WFI */
	vmm_spin_unlock_irqrestore_lite(&vcpu->irqs.wfi.lock, flags);

	/* Try to pause the VCPU */
	if (try_vcpu_pause) {
		vmm_manager_vcpu_pause(vcpu);
	}

	return VMM_OK;
}