Пример #1
0
/*
 * Allocate and fill in the hypcall page.
 */
static int
xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type)
{
	uint32_t base, regs[4];
	int i;

	if (xen_pv_domain()) {
		/* hypercall page is already set in the PV case */
		return (0);
	}

	base = xen_hvm_cpuid_base();
	if (base == 0)
		return (ENXIO);

	if (init_type == XEN_HVM_INIT_COLD) {
		int major, minor;

		do_cpuid(base + 1, regs);

		major = regs[0] >> 16;
		minor = regs[0] & 0xffff;
		printf("XEN: Hypervisor version %d.%d detected.\n", major,
			minor);

#ifdef SMP
		if (((major < 4) || (major == 4 && minor <= 5)) &&
		    msix_disable_migration == -1) {
			/*
			 * Xen hypervisors prior to 4.6.0 do not properly
			 * handle updates to enabled MSI-X table entries,
			 * so disable MSI-X interrupt migration in that
			 * case.
			 */
			if (bootverbose)
				printf(
"Disabling MSI-X interrupt migration due to Xen hypervisor bug.\n"
"Set machdep.msix_disable_migration=0 to forcefully enable it.\n");
			msix_disable_migration = 1;
		}
#endif
	}
Пример #2
0
/*
 * Allocate and fill in the hypcall page.
 */
static int
xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type)
{
	uint32_t base, regs[4];
	int i;

	if (xen_pv_domain()) {
		/* hypercall page is already set in the PV case */
		return (0);
	}

	base = xen_hvm_cpuid_base();
	if (base == 0)
		return (ENXIO);

	if (init_type == XEN_HVM_INIT_COLD) {
		do_cpuid(base + 1, regs);
		printf("XEN: Hypervisor version %d.%d detected.\n",
		    regs[0] >> 16, regs[0] & 0xffff);
	}
Пример #3
0
/*
 * Allocate and fill in the hypcall page.
 */
int
xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type)
{
	uint32_t regs[4];

	/* Legacy PVH will get here without the cpuid leaf being set. */
	if (cpuid_base == 0)
		cpuid_base = xen_hvm_cpuid_base();
	if (cpuid_base == 0)
		return (ENXIO);

	if (xen_domain() && init_type == XEN_HVM_INIT_LATE) {
		/*
		 * If the domain type is already set we can assume that the
		 * hypercall page has been populated too, so just print the
		 * version (and apply any quirks) and exit.
		 */
		hypervisor_version();
		return 0;
	}

	if (init_type == XEN_HVM_INIT_LATE)
		hypervisor_version();

	/*
	 * Find the hypercall pages.
	 */
	do_cpuid(cpuid_base + 2, regs);
	if (regs[0] != 1)
		return (EINVAL);

	wrmsr(regs[1], (init_type == XEN_HVM_INIT_EARLY)
	    ? ((vm_paddr_t)&hypercall_page - KERNBASE)
	    : vtophys(&hypercall_page));

	return (0);
}