From nobody Thu Feb 22 10:31:28 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4TgTvj10B3z5CMDW; Thu, 22 Feb 2024 10:31:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TgTvh5F6Bz4kn0; Thu, 22 Feb 2024 10:31:28 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708597888; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=W/YYLxXq4VEz9QxlqfODU+aiqHoTVJdDmUvFK6B1dXM=; b=LoxiWS7AaydXHYMxI7OQecFF8HnNtr6ZFrAX7VWy9P2PHOu06Jxd1oHMQjtd/2L85TPV6w H48jdRvPFUb33oDj05wzbwOZH9wXPfzqqYvfCd2eoqvBqS0+mstkt4dn55qZEmapQSxp3s /mfSSJd0Q6soWBXbSkxK5k8ZN7Fr5j4Or/6iERXM7SDct2RuBUyAGsViqd2UMeUSctJSAO 1tL+Iq955Y/TH9XJ1zSvVfzB7BgYPfrDTq/pjjBmVSiqyW2S68giIHF0C763Td0+3l3I6M hdbibn4jepPzJipuViZglhjOrGIMH3CYTtzqzVewUAwi4oOr0vxD/S50dTItuw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708597888; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=W/YYLxXq4VEz9QxlqfODU+aiqHoTVJdDmUvFK6B1dXM=; b=D4SAGvUM2I6N0KjewYKTe0gi/cEgmCg+4Lz5KsE+WnrnvANg5oK5JYHZ7ufPpBEAUHjeKp 29C5qlIo/2XMSqg13/Jg4iSNuSuEaqgKrkyrk6G41b5m9cwi9Fn01CGRxxzdF6DpKf76zE 4FpMc4fk7z4plHdHf0LirRZ7Q0PpvvZtyo1qdPwfnSQY5iXl+jUrm9n6YTiL0Gju5hm2uM 4Vf/rgh59Up+oFIHjm4abO/gI0GILOMTgCmxlTnda4PdbIY7nrCcjfPInypos+syCJ40Xp YR3o2VYR5d1jor4SPyuDQluN+YEAhCQl5m9TP95Z4HoqPl/6FSMGumzwVW7owA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1708597888; a=rsa-sha256; cv=none; b=h0JIHwQ2GWc0aqg6NbbP/uxkVScWYJ4zaJGzKQ76GWm4PMP+OZ7wU0DA92LuNot35aXNbu acib96Lqkw+QpzVcIoHzm/HghdE5MCWx1iqD6XQcpaYZ7oicXyCirBYq4mat4Ob3P3EJTt 9UFu7VgvAwlIag4PFqJDRmE2qZUhGwFcHHsMLdDonZaaViZq60C88hME+k9IG64gtqvapC unr+S4NS/odktH9ncwas5V2vw3AeMXFxXKNtFbpcEYrllUhUsL0X67ykrknmfT64FiQqGE 2ESCRLte62ZIfx3eknP02+bwdRSMuen/RXtOkUHkO8ccC3AGC7q+i5PC8JviRQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4TgTvh4LkgzS75; Thu, 22 Feb 2024 10:31:28 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41MAVS5F018341; Thu, 22 Feb 2024 10:31:28 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41MAVSjF018338; Thu, 22 Feb 2024 10:31:28 GMT (envelope-from git) Date: Thu, 22 Feb 2024 10:31:28 GMT Message-Id: <202402221031.41MAVSjF018338@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Roger Pau =?utf-8?Q?Monn=C3=A9?= Subject: git: 8f5406c77f1b - main - x86/xen: implement early init hook List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: royger X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8f5406c77f1b7009c36df4e025fd8789a46d33ce Auto-Submitted: auto-generated The branch main has been updated by royger: URL: https://cgit.FreeBSD.org/src/commit/?id=8f5406c77f1b7009c36df4e025fd8789a46d33ce commit 8f5406c77f1b7009c36df4e025fd8789a46d33ce Author: Roger Pau MonnĂ© AuthorDate: 2024-02-02 10:56:32 +0000 Commit: Roger Pau MonnĂ© CommitDate: 2024-02-22 10:08:05 +0000 x86/xen: implement early init hook Unify the HVM and PVH early setup, byt making both rely on the hypervisor initialization hook part of identify_hypervisor(). The current initialization takes care of the hypercall page, the sahred info page and does any fixup necessary to metadata video console information if FreeBSD is booted as the initial domain (so the video console is handed from Xen into FreeBSD). Note this has the nice side effect of also allowing to use the Xen console on HVM guests, which allows to get rid of the QEMU emulated uart and still get a nice text console. Sponsored by: Cloud Software Group Reviewed by: markj Differential revision: https://reviews.freebsd.org/D43764 --- sys/x86/include/xen/xen-os.h | 2 - sys/x86/x86/identcpu.c | 10 ++++- sys/x86/xen/hvm.c | 105 +++++-------------------------------------- sys/x86/xen/pv.c | 17 +------ 4 files changed, 22 insertions(+), 112 deletions(-) diff --git a/sys/x86/include/xen/xen-os.h b/sys/x86/include/xen/xen-os.h index ec0d4b1ab9f1..d3f21e2a6c45 100644 --- a/sys/x86/include/xen/xen-os.h +++ b/sys/x86/include/xen/xen-os.h @@ -52,8 +52,6 @@ extern int xen_disable_pv_disks; /* tunable for disabling PV nics */ extern int xen_disable_pv_nics; -extern uint32_t xen_cpuid_base; - /* compatibility for accessing xen_ulong_t with atomics */ #define atomic_clear_xen_ulong atomic_clear_long #define atomic_set_xen_ulong atomic_set_long diff --git a/sys/x86/x86/identcpu.c b/sys/x86/x86/identcpu.c index 6df138bccba1..919dda722d71 100644 --- a/sys/x86/x86/identcpu.c +++ b/sys/x86/x86/identcpu.c @@ -67,6 +67,10 @@ #include #include +#ifdef XENHVM +#include +#endif + #ifdef __i386__ #define IDENTBLUE_CYRIX486 0 #define IDENTBLUE_IBMCPU 1 @@ -1345,7 +1349,11 @@ static struct { int vm_guest; void (*init)(void); } vm_cpuids[] = { - { "XenVMMXenVMM", VM_GUEST_XEN }, /* XEN */ + { "XenVMMXenVMM", VM_GUEST_XEN, +#ifdef XENHVM + &xen_early_init, +#endif + }, /* XEN */ { "Microsoft Hv", VM_GUEST_HV }, /* Microsoft Hyper-V */ { "VMwareVMware", VM_GUEST_VMWARE }, /* VMware VM */ { "KVMKVMKVM", VM_GUEST_KVM }, /* KVM */ diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c index 6336602c8bc4..17500516debf 100644 --- a/sys/x86/xen/hvm.c +++ b/sys/x86/xen/hvm.c @@ -104,22 +104,6 @@ void xen_emergency_print(const char *str, size_t size) outsb(XEN_HVM_DEBUGCONS_IOPORT, str, size); } -uint32_t xen_cpuid_base; - -static uint32_t -xen_hvm_cpuid_base(void) -{ - uint32_t base, regs[4]; - - for (base = 0x40000000; base < 0x40010000; base += 0x100) { - do_cpuid(base, regs); - if (!memcmp("XenVMMXenVMM", ®s[1], 12) - && (regs[0] - base) >= 2) - return (base); - } - return (0); -} - static void hypervisor_quirks(unsigned int major, unsigned int minor) { @@ -156,38 +140,6 @@ hypervisor_version(void) hypervisor_quirks(major, minor); } -/* - * Allocate and fill in the hypcall page. - */ -int -xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type) -{ - uint32_t regs[4]; - - if (xen_cpuid_base != 0) - /* Already setup. */ - goto out; - - xen_cpuid_base = xen_hvm_cpuid_base(); - if (xen_cpuid_base == 0) - return (ENXIO); - - /* - * Find the hypercall pages. - */ - do_cpuid(xen_cpuid_base + 2, regs); - if (regs[0] != 1) - return (EINVAL); - - wrmsr(regs[1], (init_type == XEN_HVM_INIT_EARLY) - ? (vm_paddr_t)((uintptr_t)&hypercall_page - KERNBASE) - : vtophys(&hypercall_page)); - -out: - hypervisor_version(); - return (0); -} - /* * Translate linear to physical address when still running on the bootloader * created page-tables. @@ -336,12 +288,14 @@ xen_early_init(void) uint32_t regs[4]; int rc; - xen_cpuid_base = xen_hvm_cpuid_base(); - if (xen_cpuid_base == 0) + if (hv_high < hv_base + 2) { + xc_printf("Invalid maximum leaves for hv_base\n"); + vm_guest = VM_GUEST_VM; return; + } /* Find the hypercall pages. */ - do_cpuid(xen_cpuid_base + 2, regs); + do_cpuid(hv_base + 2, regs); if (regs[0] != 1) { xc_printf("Invalid number of hypercall pages %u\n", regs[0]); @@ -362,33 +316,6 @@ xen_early_init(void) fixup_console(); } -static void -xen_hvm_init_shared_info_page(void) -{ - struct xen_add_to_physmap xatp; - - if (xen_pv_domain()) { - /* - * Already setup in the PV case, shared_info is passed inside - * of the start_info struct at start of day. - */ - return; - } - - if (HYPERVISOR_shared_info == NULL) { - HYPERVISOR_shared_info = malloc(PAGE_SIZE, M_XENHVM, M_NOWAIT); - if (HYPERVISOR_shared_info == NULL) - panic("Unable to allocate Xen shared info page"); - } - - xatp.domid = DOMID_SELF; - xatp.idx = 0; - xatp.space = XENMAPSPACE_shared_info; - xatp.gpfn = vtophys(HYPERVISOR_shared_info) >> PAGE_SHIFT; - if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) - panic("HYPERVISOR_memory_op failed"); -} - static int set_percpu_callback(unsigned int vcpu) { @@ -505,32 +432,29 @@ xen_hvm_disable_emulated_devices(void) static void xen_hvm_init(enum xen_hvm_init_type init_type) { - int error; - int i; + unsigned int i; if (!xen_domain() || init_type == XEN_HVM_INIT_CANCELLED_SUSPEND) return; - error = xen_hvm_init_hypercall_stubs(init_type); + hypervisor_version(); switch (init_type) { case XEN_HVM_INIT_LATE: - if (error != 0) - return; - setup_xen_features(); #ifdef SMP cpu_ops = xen_hvm_cpu_ops; #endif break; case XEN_HVM_INIT_RESUME: - if (error != 0) - panic("Unable to init Xen hypercall stubs on resume"); - /* Clear stale vcpu_info. */ CPU_FOREACH(i) DPCPU_ID_SET(i, vcpu_info, NULL); + + if (map_shared_info() != 0) + panic("cannot map Xen shared info page"); + break; default: panic("Unsupported HVM initialization type"); @@ -540,13 +464,6 @@ xen_hvm_init(enum xen_hvm_init_type init_type) xen_evtchn_needs_ack = false; xen_hvm_set_callback(NULL); - /* - * On (PV)HVM domains we need to request the hypervisor to - * fill the shared info page, for PVH guest the shared_info page - * is passed inside the start_info struct and is already set, so this - * functions are no-ops. - */ - xen_hvm_init_shared_info_page(); xen_hvm_disable_emulated_devices(); } diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c index e33fa41c83d7..0e6492b124b8 100644 --- a/sys/x86/xen/pv.c +++ b/sys/x86/xen/pv.c @@ -147,12 +147,9 @@ isxen(void) } #define CRASH(...) do { \ - if (isxen()) { \ + if (isxen()) \ xc_printf(__VA_ARGS__); \ - HYPERVISOR_shutdown(SHUTDOWN_crash); \ - } else { \ - halt(); \ - } \ + halt(); \ } while (0) uint64_t @@ -162,16 +159,6 @@ hammer_time_xen(vm_paddr_t start_info_paddr) uint64_t physfree; char *kenv; - if (isxen()) { - vm_guest = VM_GUEST_XEN; - xen_early_init(); - if (xen_cpuid_base == 0) { - xc_printf( - "ERROR: failed to initialize hypercall page\n"); - HYPERVISOR_shutdown(SHUTDOWN_crash); - } - } - start_info = (struct hvm_start_info *)(start_info_paddr + KERNBASE); if (start_info->magic != XEN_HVM_START_MAGIC_VALUE) { CRASH("Unknown magic value in start_info struct: %#x\n",