From nobody Wed Feb 11 05:59:54 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 151585518087468.91537050643842; Sat, 13 Jan 2018 06:53:00 -0800 (PST) Received: from localhost ([::1]:42640 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eaNB5-0003DI-Qv for importer@patchew.org; Sat, 13 Jan 2018 09:52:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47225) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eaN7R-0000UJ-9L for qemu-devel@nongnu.org; Sat, 13 Jan 2018 09:49:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eaN7O-0007KU-6C for qemu-devel@nongnu.org; Sat, 13 Jan 2018 09:49:13 -0500 Received: from mout.kundenserver.de ([212.227.126.131]:60494) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eaN7N-0007Io-RE for qemu-devel@nongnu.org; Sat, 13 Jan 2018 09:49:10 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue004 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MSVlI-1eSlrb3WfE-00RVq2; Sat, 13 Jan 2018 15:48:52 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Sat, 13 Jan 2018 15:48:45 +0100 Message-Id: <20180113144847.8403-2-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180113144847.8403-1-laurent@vivier.eu> References: <20180113144847.8403-1-laurent@vivier.eu> X-Provags-ID: V03:K0:mLqEX76g+ctjGZJDslD8JYKRdHdcRnM4pEVC+WwEwi0QKArfhDR S/DpRa65L5ST8mPgnUU1s63qWlNJT/takZeCXEB034Bb+YrTGEY+qtHr0HLGGDPD0qTu9xQ qI12Je9Szs75sNOEGFBSOGqytxJ0Z+hgB58K19GV1qyv8zE5R+W6q8qfIJXds/GFyTK4Ny4 5UpP0niZR1zGXeE0v+0sg== X-UI-Out-Filterresults: notjunk:1;V01:K0:k77uPJwFPXM=:yAfMs12RT/7xOWyoWSFZs3 djtHRkRDcJteYY2EK0gpsVfZRfd5BrFt1CxMAwpW9+GjKd7P2vJ4dAxKukLNKcc5efAQaAl37 20vZkNehy6K4rwfTruTrAXavQqv5T6Q6uZuPJgxgYhLoE4K3GgU3Ba1FVh4JJzcq/K9H5J2NB JtfTlkRdqIRxPC2rF3hdejLQn9qOjlkzq9Ayf1SfQAfHsny8cHEj3EErTrV/puwm/BIi0M67P 9ksLeouIMlu7qN0RMwz1bi/l5TorlK/k0kxjaKC8KR47O/s8LAAMWxd/Fjq6ar+Gc8wfX+Jnu olmUXxSaOQBqG8wmSH1XRl1LIhFXAHJGuhBT9GyGaQ7YQi9y32dHBcUkW0/Fm33EG3Q0ZD3Ia tccETZOrkscQgvez/t0WiTYoeEM9VX6HxGzsPXufltu8Ey0HE+yg6jUchAgVMeiHgpqXjIu0+ yWzG3ffv9jjkv0MdAMuVi5TKmqO9P+rTjOARQOftYiQiKQzKi95bZ4uzKKh2greFD67WC9ohN loyeDWGlZiMd/g1nnemD7oMeYQi6YH6q/nUL0KQdygNj0BgB5yJbP5B49m1TQTx9M+DdWOjPs NoSsknjSJPpIHc68OboQI7trhEJoV4AD2Hui8ql4c3Is7NzCcViP+x3TNlFJVpZ2Rl9969YmG mnSF534FLp0SBxsKHMMP+LX045fliF6ORdXXynz1Ft9PgVAkLzmk0fbtfD27doEjguaiI+FXa UKI31vK8stNgvq9UgZv5QKX4NF3wkanIksDcjQ== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.131 Subject: [Qemu-devel] [PATCH 1/3] linux-user: introduce functions to detect CPU type X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , YunQiang Su , Riku Voipio , Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Laurent Vivier , Aaron Sierra Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: YunQiang Su Move CPU type name selection to a function, and add a function to return ELF e_flags. [lv: splitted the patch and some cleanup in get_elf_eflags()] Signed-off-by: Laurent Vivier --- Notes: YunQiang Su, please add your Signed-off-by that was missing in your original patch. linux-user/elfload.c | 37 +++++++++++++++++++ linux-user/main.c | 101 +++++++++++++++++++++++++++--------------------= ---- linux-user/qemu.h | 1 + 3 files changed, 91 insertions(+), 48 deletions(-) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 20f3d8c2c3..03244f5e97 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2376,6 +2376,43 @@ give_up: g_free(syms); } =20 +int get_elf_eflags(int fd, uint32_t *eflags) +{ + struct elfhdr ehdr; + off_t offset; + int ret; + + /* Read ELF header */ + offset =3D lseek(fd, 0, SEEK_SET); + if (offset =3D=3D (off_t) -1) { + return -1; + } + ret =3D read(fd, &ehdr, sizeof(ehdr)); + if (ret < sizeof(ehdr)) { + return -1; + } + offset =3D lseek(fd, offset, SEEK_SET); + if (offset =3D=3D (off_t) -1) { + return -1; + } + + /* Check ELF signature */ + if (!elf_check_ident(&ehdr)) { + return -1; + } + + /* check header */ + bswap_ehdr(&ehdr); + if (!elf_check_ehdr(&ehdr)) { + return -1; + } + + /* return architecture id */ + *eflags =3D ehdr.e_flags; + + return 0; +} + int load_elf_binary(struct linux_binprm *bprm, struct image_info *info) { struct image_info interp_info; diff --git a/linux-user/main.c b/linux-user/main.c index 450eb3ce65..9ce90ae634 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -4254,6 +4254,49 @@ static int parse_args(int argc, char **argv) return optind; } =20 +static const char *get_cpu_model(int fd) +{ +#if defined(TARGET_I386) +#ifdef TARGET_X86_64 + return "qemu64"; +#else + return "qemu32"; +#endif +#elif defined(TARGET_ARM) + return "any"; +#elif defined(TARGET_UNICORE32) + return "any"; +#elif defined(TARGET_M68K) + return "any"; +#elif defined(TARGET_SPARC) +#ifdef TARGET_SPARC64 + return "TI UltraSparc II"; +#else + return "Fujitsu MB86904"; +#endif +#elif defined(TARGET_MIPS) +#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64) + return "5KEf"; +#else + return "24Kf"; +#endif +#elif defined TARGET_OPENRISC + return "or1200"; +#elif defined(TARGET_PPC) +# ifdef TARGET_PPC64 + return "POWER8"; +# else + return "750"; +# endif +#elif defined TARGET_SH4 + return "sh7785"; +#elif defined TARGET_S390X + return "qemu"; +#else + return "any"; +#endif +} + int main(int argc, char **argv, char **envp) { struct target_pt_regs regs1, *regs =3D ®s1; @@ -4318,46 +4361,17 @@ int main(int argc, char **argv, char **envp) =20 init_qemu_uname_release(); =20 + execfd =3D qemu_getauxval(AT_EXECFD); + if (execfd =3D=3D 0) { + execfd =3D open(filename, O_RDONLY); + if (execfd < 0) { + printf("Error while loading %s: %s\n", filename, strerror(errn= o)); + _exit(EXIT_FAILURE); + } + } + if (cpu_model =3D=3D NULL) { -#if defined(TARGET_I386) -#ifdef TARGET_X86_64 - cpu_model =3D "qemu64"; -#else - cpu_model =3D "qemu32"; -#endif -#elif defined(TARGET_ARM) - cpu_model =3D "any"; -#elif defined(TARGET_UNICORE32) - cpu_model =3D "any"; -#elif defined(TARGET_M68K) - cpu_model =3D "any"; -#elif defined(TARGET_SPARC) -#ifdef TARGET_SPARC64 - cpu_model =3D "TI UltraSparc II"; -#else - cpu_model =3D "Fujitsu MB86904"; -#endif -#elif defined(TARGET_MIPS) -#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64) - cpu_model =3D "5KEf"; -#else - cpu_model =3D "24Kf"; -#endif -#elif defined TARGET_OPENRISC - cpu_model =3D "or1200"; -#elif defined(TARGET_PPC) -# ifdef TARGET_PPC64 - cpu_model =3D "POWER8"; -# else - cpu_model =3D "750"; -# endif -#elif defined TARGET_SH4 - cpu_model =3D "sh7785"; -#elif defined TARGET_S390X - cpu_model =3D "qemu"; -#else - cpu_model =3D "any"; -#endif + cpu_model =3D get_cpu_model(execfd); } tcg_exec_init(0); /* NOTE: we need to init the CPU at this stage to get @@ -4450,15 +4464,6 @@ int main(int argc, char **argv, char **envp) cpu->opaque =3D ts; task_settid(ts); =20 - execfd =3D qemu_getauxval(AT_EXECFD); - if (execfd =3D=3D 0) { - execfd =3D open(filename, O_RDONLY); - if (execfd < 0) { - printf("Error while loading %s: %s\n", filename, strerror(errn= o)); - _exit(EXIT_FAILURE); - } - } - ret =3D loader_exec(execfd, filename, target_argv, target_environ, reg= s, info, &bprm); if (ret !=3D 0) { diff --git a/linux-user/qemu.h b/linux-user/qemu.h index 4edd7d0c08..c2a701163c 100644 --- a/linux-user/qemu.h +++ b/linux-user/qemu.h @@ -188,6 +188,7 @@ int loader_exec(int fdexec, const char *filename, char = **argv, char **envp, struct target_pt_regs * regs, struct image_info *infop, struct linux_binprm *); =20 +int get_elf_eflags(int fd, uint32_t *eflags); int load_elf_binary(struct linux_binprm *bprm, struct image_info *info); int load_flt_binary(struct linux_binprm *bprm, struct image_info *info); =20 --=20 2.14.3