From nobody Tue Jan 24 22:10:05 2023 X-Original-To: dev-commits-src-branches@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 4P1h3d6SyXz3bdb1; Tue, 24 Jan 2023 22:10:05 +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 4P1h3d26Hmz4Hmy; Tue, 24 Jan 2023 22:10:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674598205; 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=lBRXYVXicpRXzev05frwVuHNGXlh+jtAV6hnO9lp5Lc=; b=wI93yFylZ55JiT2RMiSGfGurN7AyhJrJW2Sd11aoVfnw44oRqQYJpVC8RSBBzkxeCpTDI+ HHhCQFPBTWXiS02eBKFzwHRf0xlqbAx3PR67iouu5vdfc5RNUO8/GsnEpaS7Ght1T4UHZM Xd2k5MqTyW3FVJyJ+stiCnlZtQar3PR7RmQZXE6jpHyoSrAKYs+iANAKM4yUzHAUwBn0JP nE4D3vF16tl/f35GV6cLf3mO5udLjPcGMbatsVOEZnFRiuEBTQmdu36vsGpy8jTdugqVdS 1EvBAW0Glvp0bCZnyVoJ+ZzVIEz3EoQM3MxeonlMYwirVYlia009vfHat6NoSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674598205; 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=lBRXYVXicpRXzev05frwVuHNGXlh+jtAV6hnO9lp5Lc=; b=sX66TTF3KCz6tBvnlmW9LsMJvCzwhiksS5U4vLSRLqRWsoQOD4Z1XOn3agybHG0MuNWmiI BG3mk9dbA/K62ara+QxUKfXbvhqhspd8EP40kmWhzNLQ+swUOqeI9sxmvkOEvK2VehcVfJ Rum7WsFzDH5SKyaCFc7zj1GzGbrf8UQ51TBXEhDBDH/zgwRym4FE8hHXKpr4EAzG4Nh/Gb RvXKtw4E4igo/L0bDN+KOopCHjLr2MeFkhtn7FD9wQwgUM16XmwE+UIFPoqv8/2sjsOsSa xr7deeqGdxOcRH4yrEoFxoe+O2p7JDwO1mHtOu+XkE+Ak6SFXMBngWyycQheAQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674598205; a=rsa-sha256; cv=none; b=yj0VdiTxKqSYwZmYEIaD98LSLpAeWEgW9WcMHKWQuQ16KO1gaJXAKpUNQJoCCxMOD/txpj pbbDJbChTMxZhyg2eac1dERYWB3PLTciQ9Or17gcC4mPgZk2tQKDH5JaKXBlbfHmFZWeTB isUdrnwOdvZ6Cnw86V0aFv1mqQv5R5ZQMjZlFnh2uTHwxBOEmddNJ+tFLoSSoWNHQtybXm 3Q6o/MxKoBjGAlBy+TdFb2f7m9fC4V28dO55qKEkRmCkFO9Qr85KP18/tW2hkYYk9H9cQD fj8ocOL4qFpxr5Axckd611cqIvYWaYK5accGg/nc77eG7UwK2reLmBEcuOVZZA== 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 4P1h3d1BpHzQT6; Tue, 24 Jan 2023 22:10:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30OMA5Hw073804; Tue, 24 Jan 2023 22:10:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30OMA5Mx073801; Tue, 24 Jan 2023 22:10:05 GMT (envelope-from git) Date: Tue, 24 Jan 2023 22:10:05 GMT Message-Id: <202301242210.30OMA5Mx073801@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Warner Losh Subject: git: a21fc0475e2b - stable/13 - loader: narrow the scope of gfx frame buffer wrt tg supported kernels List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: a21fc0475e2b2c4c5e97f5f905098958769f1a2f Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=a21fc0475e2b2c4c5e97f5f905098958769f1a2f commit a21fc0475e2b2c4c5e97f5f905098958769f1a2f Author: Warner Losh AuthorDate: 2021-12-14 21:38:43 +0000 Commit: Warner Losh CommitDate: 2023-01-24 21:49:18 +0000 loader: narrow the scope of gfx frame buffer wrt tg supported kernels Store whether or not we found a vbefb module (eg, a tg supported kernel) in the preloaded_file structure. This automatically resets on reload and eliminates load_elf knowing about any gfx_* interface. Restrict this to i386, which is the only place it's used. Update libi386 to check in the preloaded_file struct. Eliminate this from the teken_gfx structure. Rewrite the parsing code to be more inline. Check this from the same place we check for a relocatable amd64 kernel. Sponsored by: Netflix Reviewed by: manu, tsoome Differential Revision: https://reviews.freebsd.org/D33427 (cherry picked from commit aaaa5a2e68e256101c9737c30ad142f1c3f05131) --- stand/common/bootstrap.h | 3 ++ stand/common/gfx_fb.h | 1 - stand/common/load_elf.c | 85 ++++++++++++++++++++----------------------- stand/common/module.c | 2 - stand/i386/libi386/bootinfo.c | 2 +- stand/loader.mk | 3 -- 6 files changed, 44 insertions(+), 52 deletions(-) diff --git a/stand/common/bootstrap.h b/stand/common/bootstrap.h index ea03519f5b39..42b2c73f5774 100644 --- a/stand/common/bootstrap.h +++ b/stand/common/bootstrap.h @@ -232,6 +232,9 @@ struct preloaded_file #ifdef __amd64__ bool f_kernphys_relocatable; #endif +#if defined(__i386__) + bool f_tg_kernel_support; +#endif }; struct file_format diff --git a/stand/common/gfx_fb.h b/stand/common/gfx_fb.h index 5599ce7b3ae0..f5747e065daf 100644 --- a/stand/common/gfx_fb.h +++ b/stand/common/gfx_fb.h @@ -220,7 +220,6 @@ typedef struct teken_gfx { size_t tg_shadow_sz; /* units of pages */ teken_funcs_t *tg_functions; void *tg_private; - bool tg_kernel_supported; /* Loaded kernel is supported */ } teken_gfx_t; extern font_list_t fonts; diff --git a/stand/common/load_elf.c b/stand/common/load_elf.c index 7454c550c7f2..f3192c1c94fa 100644 --- a/stand/common/load_elf.c +++ b/stand/common/load_elf.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include #define FREEBSD_ELF #include -#include #include "bootstrap.h" @@ -91,8 +90,6 @@ static int __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef, Elf_Addr p, void *val, size_t len); static int __elfN(parse_modmetadata)(struct preloaded_file *mp, elf_file_t ef, Elf_Addr p_start, Elf_Addr p_end); -static bool __elfN(parse_vt_drv_set)(struct preloaded_file *mp, elf_file_t ef, - Elf_Addr p_start, Elf_Addr p_end); static symaddr_fn __elfN(symaddr); static char *fake_modname(const char *name); @@ -218,6 +215,43 @@ is_kernphys_relocatable(elf_file_t ef) } #endif +#ifdef __i386__ +static bool +is_tg_kernel_support(struct preloaded_file *fp, elf_file_t ef) +{ + Elf_Sym sym; + Elf_Addr p_start, p_end, v, p; + char vd_name[16]; + int error; + + if (__elfN(lookup_symbol)(ef, "__start_set_vt_drv_set", &sym, STT_NOTYPE) != 0) + return (false); + p_start = sym.st_value + ef->off; + if (__elfN(lookup_symbol)(ef, "__stop_set_vt_drv_set", &sym, STT_NOTYPE) != 0) + return (false); + p_end = sym.st_value + ef->off; + + /* + * Walk through vt_drv_set, each vt driver structure starts with + * static 16 chars for driver name. If we have "vbefb", return true. + */ + for (p = p_start; p < p_end; p += sizeof(Elf_Addr)) { + COPYOUT(p, &v, sizeof(v)); + + error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v)); + if (error == EOPNOTSUPP) + v += ef->off; + else if (error != 0) + return (false); + COPYOUT(v, &vd_name, sizeof(vd_name)); + if (strncmp(vd_name, "vbefb", sizeof(vd_name)) == 0) + return (true); + } + + return (false); +} +#endif + static int __elfN(load_elf_header)(char *filename, elf_file_t ef) { @@ -448,6 +482,9 @@ __elfN(loadfile_raw)(char *filename, uint64_t dest, err = 0; #ifdef __amd64__ fp->f_kernphys_relocatable = multiboot || is_kernphys_relocatable(&ef); +#endif +#ifdef __i386__ + fp->f_tg_kernel_support = is_tg_kernel_support(fp, &ef); #endif goto out; @@ -872,18 +909,6 @@ nosyms: ef->buckets = ef->hashtab + 2; ef->chains = ef->buckets + ef->nbuckets; - if (!gfx_state.tg_kernel_supported && - __elfN(lookup_symbol)(ef, "__start_set_vt_drv_set", &sym, - STT_NOTYPE) == 0) { - p_start = sym.st_value + ef->off; - if (__elfN(lookup_symbol)(ef, "__stop_set_vt_drv_set", &sym, - STT_NOTYPE) == 0) { - p_end = sym.st_value + ef->off; - gfx_state.tg_kernel_supported = - __elfN(parse_vt_drv_set)(fp, ef, p_start, p_end); - } - } - if (__elfN(lookup_symbol)(ef, "__start_set_modmetadata_set", &sym, STT_NOTYPE) != 0) return 0; @@ -1084,36 +1109,6 @@ out: return (err); } -/* - * Walk through vt_drv_set, each vt driver structure starts with - * static 16 chars for driver name. If we have "vbefb", return true. - */ -static bool -__elfN(parse_vt_drv_set)(struct preloaded_file *fp, elf_file_t ef, - Elf_Addr p_start, Elf_Addr p_end) -{ - Elf_Addr v, p; - char vd_name[16]; - int error; - - p = p_start; - while (p < p_end) { - COPYOUT(p, &v, sizeof(v)); - - error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v)); - if (error == EOPNOTSUPP) - v += ef->off; - else if (error != 0) - return (false); - COPYOUT(v, &vd_name, sizeof(vd_name)); - if (strncmp(vd_name, "vbefb", sizeof(vd_name)) == 0) - return (true); - p += sizeof(Elf_Addr); - } - - return (false); -} - int __elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef, Elf_Addr p_start, Elf_Addr p_end) diff --git a/stand/common/module.c b/stand/common/module.c index 8e9e72c8a004..29864932bb9d 100644 --- a/stand/common/module.c +++ b/stand/common/module.c @@ -278,8 +278,6 @@ unload(void) } loadaddr = 0; unsetenv("kernelname"); - /* Reset tg_kernel_supported to allow next load to check it again. */ - gfx_state.tg_kernel_supported = false; } COMMAND_SET(unload, "unload", "unload all modules", command_unload); diff --git a/stand/i386/libi386/bootinfo.c b/stand/i386/libi386/bootinfo.c index 57f926b76589..bdf409b00ec0 100644 --- a/stand/i386/libi386/bootinfo.c +++ b/stand/i386/libi386/bootinfo.c @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$"); void bi_load_vbe_data(struct preloaded_file *kfp) { - if (!gfx_state.tg_kernel_supported) { + if (!kfp->f_tg_kernel_support) { /* * Loaded kernel does not have vt/vbe backend, * switch console to text mode. diff --git a/stand/loader.mk b/stand/loader.mk index bad2fe107ee9..aa88122cb7a1 100644 --- a/stand/loader.mk +++ b/stand/loader.mk @@ -29,9 +29,6 @@ SRCS+= metadata.c SRCS+= load_elf64.c reloc_elf64.c SRCS+= metadata.c .endif -# elf loaders set frame buffer things, so add includes for that. -CFLAGS.load_elf32.c += -I$(SRCTOP)/sys/teken -I${SRCTOP}/contrib/pnglite -CFLAGS.load_elf64.c += -I$(SRCTOP)/sys/teken -I${SRCTOP}/contrib/pnglite .if ${LOADER_DISK_SUPPORT:Uyes} == "yes" CFLAGS.part.c+= -DHAVE_MEMCPY -I${SRCTOP}/sys/contrib/zlib