From nobody Thu Feb 22 10:31:25 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 4TgTvd6zKLz5CM81; Thu, 22 Feb 2024 10:31:25 +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 4TgTvd45xmz4kvW; Thu, 22 Feb 2024 10:31:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708597885; 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=NXN3QMFAv30+qKzFEmdzCMIEisk+jQ2WeSOPOFmnwLw=; b=h6AS92pKkr5vpr4PBozBQFJvyUPw6XsU5aiPW+u0gVcTxSd4Lb/ewxtnBpub4Ef/XrGarf XiHwv7BGWs1L8msB20QKtBY9dU0c7NFeh1Y5cxicEW8+M3MYzZSmjEjT2Bb8GpnK6J6J/1 puGKG6MPRFHHc3HH7PCTId24JKDicW+RDWsvGYvg2Y43i42/apV7lwOdTav8n4OG51w5cV n9YrAhFHqo6aCLWAlTsPPIN8ZGBUnOnTL+xG7hj3C/rWhgpZRNJwejeurVlz6DhHaAe7W9 9rhaNiK853UgfLr7C3/5j+KCW9yuZo/iwkvF7k97t6dbG3bFFcCY6LB1u1y8jQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708597885; 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=NXN3QMFAv30+qKzFEmdzCMIEisk+jQ2WeSOPOFmnwLw=; b=oUTm2gz782u/gA1ujo4LJXgaifjk320mxohlgee6d85CcCte7vRA2mE8zJMRMdowqQ5yk2 +n/wzwhfU5y87PtUVG6WwPKFj3uodFOgKTJtt/EHwD460aGObZ6heQssGUTSGX1iYaoxjO WqULwBlpEyx+G7t5E3TtfPLlfPm1wqCHhSTKTkCkgwvLh4k+Luk+tPA+gKQK/KPAKP8hVb w78KQ+dnb7XduRPZ9eu7AQYDm8NX22QFy7XClO59IVHoyPuUce3haueoTLcHR1JR78IOi0 erxCsbjo5mdRpOTBbtQcBX1rxGQfpzFLqZVNEVGpvKBuRr9UaP9wooDzXBz5Rg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1708597885; a=rsa-sha256; cv=none; b=QLpCA255sIgKegPdXCwScGHpZ2i2BmvlETWkPIPo+nQXFxqyNhQktQZ3m7Begsnkoa/fPQ ybzX5sXqPh6+dv06HJNiN+70lxGOdppe9xnfknuZ2/cgbji/HkvHYxN6JCCr9m1yUkrSO9 yGuHpiaFdx2J8+wGzsxM7QfVa5ODuJ1UV/DxQMsD8ikQfjV51Rd45S+sgVLi3WwbaUMpCW tsiYbGrzcLtFFDXcHK+qL9wgsC5YM/Z/vwUmIolUCzWA28cmWZXgGbZe/agE6k3CgZGUNk OsEj+zNhZjhACtJWLQQjLZdpCkgGJxOWF/2ies9LJdXMgdsdTWbKFTOIcHN2TA== 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 4TgTvd2MYyzSdk; Thu, 22 Feb 2024 10:31:25 +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 41MAVPJr018169; Thu, 22 Feb 2024 10:31:25 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41MAVP4J018166; Thu, 22 Feb 2024 10:31:25 GMT (envelope-from git) Date: Thu, 22 Feb 2024 10:31:25 GMT Message-Id: <202402221031.41MAVP4J018166@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: 027b66d64b54 - main - x86/xen: do video console fixup as part of early initialization 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: 027b66d64b547b2133c11b596a7e308ea8c83ccb Auto-Submitted: auto-generated The branch main has been updated by royger: URL: https://cgit.FreeBSD.org/src/commit/?id=027b66d64b547b2133c11b596a7e308ea8c83ccb commit 027b66d64b547b2133c11b596a7e308ea8c83ccb Author: Roger Pau Monné AuthorDate: 2024-02-02 10:29:57 +0000 Commit: Roger Pau Monné CommitDate: 2024-02-22 10:08:05 +0000 x86/xen: do video console fixup as part of early initialization When FreeBSD is running as dom0 the video console metadata provided by the bootloader might not be accurate, as Xen has very likely taken over the console and possibly changed the mode. Adjust the video console information in the kernel metadata as part of early Xen initialization. Sponsored by: Cloud Software Group Reviewed by: imp Differential revision: https://reviews.freebsd.org/D43934 --- sys/x86/xen/hvm.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ sys/x86/xen/pv.c | 83 ---------------------------------------------------- 2 files changed, 87 insertions(+), 83 deletions(-) diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c index 9dc9360d719c..85f274175ac6 100644 --- a/sys/x86/xen/hvm.c +++ b/sys/x86/xen/hvm.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,7 @@ #include #include #include +#include #include #include @@ -246,6 +248,87 @@ map_shared_info(void) return (rc); } +static void +fixup_console(void) +{ + struct xen_platform_op op = { + .cmd = XENPF_get_dom0_console, + }; + xenpf_dom0_console_t *console = &op.u.dom0_console; + union { + struct efi_fb efi; + struct vbe_fb vbe; + } *fb = NULL; + int size; + caddr_t kmdp; + + kmdp = preload_search_by_type("elf kernel"); + if (kmdp == NULL) + kmdp = preload_search_by_type("elf64 kernel"); + if (kmdp == NULL) { + xc_printf("Unable to find kernel metadata\n"); + return; + } + + size = HYPERVISOR_platform_op(&op); + if (size < 0) { + xc_printf("Failed to get video console info: %d\n", size); + return; + } + + switch (console->video_type) { + case XEN_VGATYPE_VESA_LFB: + fb = (__typeof__ (fb))preload_search_info(kmdp, + MODINFO_METADATA | MODINFOMD_VBE_FB); + + if (fb == NULL) { + xc_printf("No VBE FB in kernel metadata\n"); + return; + } + + _Static_assert(offsetof(struct vbe_fb, fb_bpp) == + offsetof(struct efi_fb, fb_mask_reserved) + + sizeof(fb->efi.fb_mask_reserved), + "Bad structure overlay\n"); + fb->vbe.fb_bpp = console->u.vesa_lfb.bits_per_pixel; + /* FALLTHROUGH */ + case XEN_VGATYPE_EFI_LFB: + if (fb == NULL) { + fb = (__typeof__ (fb))preload_search_info(kmdp, + MODINFO_METADATA | MODINFOMD_EFI_FB); + if (fb == NULL) { + xc_printf("No EFI FB in kernel metadata\n"); + return; + } + } + + fb->efi.fb_addr = console->u.vesa_lfb.lfb_base; + if (size > + offsetof(xenpf_dom0_console_t, u.vesa_lfb.ext_lfb_base)) + fb->efi.fb_addr |= + (uint64_t)console->u.vesa_lfb.ext_lfb_base << 32; + fb->efi.fb_size = console->u.vesa_lfb.lfb_size << 16; + fb->efi.fb_height = console->u.vesa_lfb.height; + fb->efi.fb_width = console->u.vesa_lfb.width; + fb->efi.fb_stride = (console->u.vesa_lfb.bytes_per_line << 3) / + console->u.vesa_lfb.bits_per_pixel; +#define FBMASK(c) \ + ((~0u << console->u.vesa_lfb.c ## _pos) & \ + (~0u >> (32 - console->u.vesa_lfb.c ## _pos - \ + console->u.vesa_lfb.c ## _size))) + fb->efi.fb_mask_red = FBMASK(red); + fb->efi.fb_mask_green = FBMASK(green); + fb->efi.fb_mask_blue = FBMASK(blue); + fb->efi.fb_mask_reserved = FBMASK(rsvd); +#undef FBMASK + break; + + default: + xc_printf("Video console type unsupported\n"); + return; + } +} + /* Early initialization when running as a Xen guest. */ void xen_early_init(void) @@ -273,6 +356,10 @@ xen_early_init(void) vm_guest = VM_GUEST_VM; return; } + + if (xen_initial_domain()) + /* Fixup video console information in case Xen changed the mode. */ + fixup_console(); } static void diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c index 515e5c58d304..e33fa41c83d7 100644 --- a/sys/x86/xen/pv.c +++ b/sys/x86/xen/pv.c @@ -319,87 +319,6 @@ xen_pvh_parse_symtab(void) } #endif -static void -fixup_console(void) -{ - struct xen_platform_op op = { - .cmd = XENPF_get_dom0_console, - }; - xenpf_dom0_console_t *console = &op.u.dom0_console; - union { - struct efi_fb efi; - struct vbe_fb vbe; - } *fb = NULL; - int size; - caddr_t kmdp; - - kmdp = preload_search_by_type("elf kernel"); - if (kmdp == NULL) - kmdp = preload_search_by_type("elf64 kernel"); - if (kmdp == NULL) { - xc_printf("Unable to find kernel metadata\n"); - return; - } - - size = HYPERVISOR_platform_op(&op); - if (size < 0) { - xc_printf("Failed to get video console info: %d\n", size); - return; - } - - switch (console->video_type) { - case XEN_VGATYPE_VESA_LFB: - fb = (__typeof__ (fb))preload_search_info(kmdp, - MODINFO_METADATA | MODINFOMD_VBE_FB); - - if (fb == NULL) { - xc_printf("No VBE FB in kernel metadata\n"); - return; - } - - _Static_assert(offsetof(struct vbe_fb, fb_bpp) == - offsetof(struct efi_fb, fb_mask_reserved) + - sizeof(fb->efi.fb_mask_reserved), - "Bad structure overlay\n"); - fb->vbe.fb_bpp = console->u.vesa_lfb.bits_per_pixel; - /* FALLTHROUGH */ - case XEN_VGATYPE_EFI_LFB: - if (fb == NULL) { - fb = (__typeof__ (fb))preload_search_info(kmdp, - MODINFO_METADATA | MODINFOMD_EFI_FB); - if (fb == NULL) { - xc_printf("No EFI FB in kernel metadata\n"); - return; - } - } - - fb->efi.fb_addr = console->u.vesa_lfb.lfb_base; - if (size > - offsetof(xenpf_dom0_console_t, u.vesa_lfb.ext_lfb_base)) - fb->efi.fb_addr |= - (uint64_t)console->u.vesa_lfb.ext_lfb_base << 32; - fb->efi.fb_size = console->u.vesa_lfb.lfb_size << 16; - fb->efi.fb_height = console->u.vesa_lfb.height; - fb->efi.fb_width = console->u.vesa_lfb.width; - fb->efi.fb_stride = (console->u.vesa_lfb.bytes_per_line << 3) / - console->u.vesa_lfb.bits_per_pixel; -#define FBMASK(c) \ - ((~0u << console->u.vesa_lfb.c ## _pos) & \ - (~0u >> (32 - console->u.vesa_lfb.c ## _pos - \ - console->u.vesa_lfb.c ## _size))) - fb->efi.fb_mask_red = FBMASK(red); - fb->efi.fb_mask_green = FBMASK(green); - fb->efi.fb_mask_blue = FBMASK(blue); - fb->efi.fb_mask_reserved = FBMASK(rsvd); -#undef FBMASK - break; - - default: - xc_printf("Video console type unsupported\n"); - return; - } -} - static caddr_t xen_pvh_parse_preload_data(uint64_t modulep) { @@ -479,8 +398,6 @@ xen_pvh_parse_preload_data(uint64_t modulep) strlcpy(bootmethod, "UEFI", sizeof(bootmethod)); else strlcpy(bootmethod, "BIOS", sizeof(bootmethod)); - - fixup_console(); } else { /* Parse the extra boot information given by Xen */ if (start_info->cmdline_paddr != 0)