From patchwork Fri Jan 24 00:51:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 1228654 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=amsat.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=rJXHPXxV; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 483glv2B3Sz9sRK for ; Fri, 24 Jan 2020 11:59:55 +1100 (AEDT) Received: from localhost ([::1]:36128 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iunKD-0001fH-9p for incoming@patchwork.ozlabs.org; Thu, 23 Jan 2020 19:59:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:44543) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iunCw-0002YN-4O for qemu-devel@nongnu.org; Thu, 23 Jan 2020 19:52:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iunCr-0005Xv-Qb for qemu-devel@nongnu.org; Thu, 23 Jan 2020 19:52:22 -0500 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]:33400) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iunCr-0005Wh-JW; Thu, 23 Jan 2020 19:52:17 -0500 Received: by mail-wr1-x443.google.com with SMTP id b6so93009wrq.0; Thu, 23 Jan 2020 16:52:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dGXYfTp1tAJSxkUbjHMAEY4QwD94q//Di6i1M2vBqg8=; b=rJXHPXxVsSFpjxXqwp+Qnd5zHRqmU2NWiYFTlyIhLD7zKrfxRIJhpj4aZW22Nx2XEI Z1TYLhpPwO8zrlDVbexQRPAaVJa+ua74BTDpFHcMWRI27MDG5OMOlnJUTcGdLFd86SgG DwkMVefqfPZBCCyfIuRyi2G9OcHvmaHBjBMog0VsXcTbrVaAOVRNhxsSbsXJAJVlaWSx OH9Mxjqbobm7mKzEJQJmP4kSnov/yBjCnZfUkQ5Au0fqSD8oQUXoeKqSECGiJDhOHzmy 9bQMRaZfeDV2YQwKFfZ60WbauHPx2uDjiDCcSaGbLR+wOxktxXbFZCr3/MTQtn7HuG9R f+BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=dGXYfTp1tAJSxkUbjHMAEY4QwD94q//Di6i1M2vBqg8=; b=E0aWRC1jbfTpCDJn26K94RKX9EdZQ60Os9hkKFINzmSUqkStu+WCvy3QrD7lnFNrog okD2qvbRUwUhyaoIH8xVqXTPtGpqXcHmyseMPFLg0iQJGzjBftiREpwzyIYf9cOe3mm4 PTNDJLS/OiY2h6g5DclJFKJzebO2dnyMCD6NV5E85xhhW1W1rT/ccdi0yRs0adwUZdaE rT684X6VrPLMB1umEyrXjbdetGxWipk9CA0hCTBw54QMsCKEouiFzUfEqSGyJSfnZW7Q NIhzHMEk/EnQgcl7bvPzb8r5yxYrd9zYHb70aaI8l2O17CQYkq2OobqdE8O+GINnNGlG f0qw== X-Gm-Message-State: APjAAAX5p2KvIeyGGKO2Ey00KKUC3PWlbAR6EsUhcfr73S/ncJWYKzsF lndqqs/x/50fSfY/idUDVyVxCe8X X-Google-Smtp-Source: APXvYqzJyMp4pn8qYZJFl0vNPC1Is6VnlD3AF/RY6fL1eC8lo+QlqVu1hOyynAuSp6/QOpWHZ8OGRw== X-Received: by 2002:a5d:6344:: with SMTP id b4mr832418wrw.414.1579827136244; Thu, 23 Jan 2020 16:52:16 -0800 (PST) Received: from x1w.redhat.com (113.red-83-57-172.dynamicip.rima-tde.net. [83.57.172.113]) by smtp.gmail.com with ESMTPSA id s139sm4598271wme.35.2020.01.23.16.52.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Jan 2020 16:52:15 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org, mrolnik@gmail.com, richard.henderson@linaro.org, me@xcancerberox.com.ar Subject: [PATCH rc2 18/25] hw/core/loader: Let load_elf populate the processor-specific flags Date: Fri, 24 Jan 2020 01:51:24 +0100 Message-Id: <20200124005131.16276-19-f4bug@amsat.org> X-Mailer: git-send-email 2.21.1 In-Reply-To: <20200124005131.16276-1-f4bug@amsat.org> References: <20200124005131.16276-1-f4bug@amsat.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::443 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , S.E.Harris@kent.ac.uk, Sagar Karandikar , Alistair Francis , Markus Armbruster , dovgaluk@ispras.ru, =?utf-8?q?Marc-Andr=C3=A9_Lu?= =?utf-8?q?reau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , aleksandar.m.mail@gmail.com, Laurent Vivier , thuth@redhat.com, Eduardo Habkost , Paolo Bonzini , =?utf-8?q?Alex_Benn=C3=A9e?= , qemu-riscv@nongnu.org, Bastian Koppelmann , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?b?w6k=?= , Palmer Dabbelt , Aleksandar Markovic , imammedo@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" One some architectures (like AVR) we can determine the cpu type by reading the ELF flags. Signed-off-by: Michael Rolnik Reviewed-by: Aleksandar Markovic Message-Id: <<20191218210329.1960-16-mrolnik@gmail.com> [PMD: Extracted from bigger patch, Replaced 'uint32_t *pe_flags' by 'int proc_flags'] Signed-off-by: Philippe Mathieu-Daudé --- include/hw/elf_ops.h | 6 +++++- include/hw/loader.h | 6 ++++-- hw/core/loader.c | 15 ++++++++------- hw/riscv/boot.c | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h index e07d276df7..5d0f9587d3 100644 --- a/include/hw/elf_ops.h +++ b/include/hw/elf_ops.h @@ -316,7 +316,8 @@ static int glue(load_elf, SZ)(const char *name, int fd, void *translate_opaque, int must_swab, uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr, - int elf_machine, int clear_lsb, int data_swab, + int *proc_flags, int elf_machine, + int clear_lsb, int data_swab, AddressSpace *as, bool load_rom, symbol_fn_t sym_cb) { @@ -389,6 +390,9 @@ static int glue(load_elf, SZ)(const char *name, int fd, } } + if (proc_flags) { + *proc_flags = (elf_sword)ehdr.e_flags; + } if (pentry) *pentry = (uint64_t)(elf_sword)ehdr.e_entry; diff --git a/include/hw/loader.h b/include/hw/loader.h index 48a96cd559..cc5ede7b90 100644 --- a/include/hw/loader.h +++ b/include/hw/loader.h @@ -101,6 +101,7 @@ const char *load_elf_strerror(int error); * @pentry: Populated with program entry point. Ignored if NULL. * @lowaddr: Populated with lowest loaded address. Ignored if NULL. * @highaddr: Populated with highest loaded address. Ignored if NULL. + * @proc_flags: Populated with ELF processor-specific flags. Ignore if NULL. * @bigendian: Expected ELF endianness. 0 for LE otherwise BE * @elf_machine: Expected ELF machine type * @clear_lsb: Set to mask off LSB of addresses (Some architectures use @@ -131,8 +132,9 @@ int load_elf_ram_sym(const char *filename, uint64_t (*elf_note_fn)(void *, void *, bool), uint64_t (*translate_fn)(void *, uint64_t), void *translate_opaque, uint64_t *pentry, - uint64_t *lowaddr, uint64_t *highaddr, int big_endian, - int elf_machine, int clear_lsb, int data_swab, + uint64_t *lowaddr, uint64_t *highaddr, int *proc_flags, + int big_endian, int elf_machine, + int clear_lsb, int data_swab, AddressSpace *as, bool load_rom, symbol_fn_t sym_cb); /** load_elf_ram: diff --git a/hw/core/loader.c b/hw/core/loader.c index 5099f27dc8..3bee2f8ae0 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -438,7 +438,7 @@ int load_elf_ram(const char *filename, { return load_elf_ram_sym(filename, elf_note_fn, translate_fn, translate_opaque, - pentry, lowaddr, highaddr, big_endian, + pentry, lowaddr, highaddr, NULL, big_endian, elf_machine, clear_lsb, data_swab, as, load_rom, NULL); } @@ -448,8 +448,9 @@ int load_elf_ram_sym(const char *filename, uint64_t (*elf_note_fn)(void *, void *, bool), uint64_t (*translate_fn)(void *, uint64_t), void *translate_opaque, uint64_t *pentry, - uint64_t *lowaddr, uint64_t *highaddr, int big_endian, - int elf_machine, int clear_lsb, int data_swab, + uint64_t *lowaddr, uint64_t *highaddr, int *proc_flags, + int big_endian, int elf_machine, + int clear_lsb, int data_swab, AddressSpace *as, bool load_rom, symbol_fn_t sym_cb) { int fd, data_order, target_data_order, must_swab, ret = ELF_LOAD_FAILED; @@ -490,13 +491,13 @@ int load_elf_ram_sym(const char *filename, if (e_ident[EI_CLASS] == ELFCLASS64) { ret = load_elf64(filename, fd, elf_note_fn, translate_fn, translate_opaque, must_swab, - pentry, lowaddr, highaddr, elf_machine, clear_lsb, - data_swab, as, load_rom, sym_cb); + pentry, lowaddr, highaddr, proc_flags, elf_machine, + clear_lsb, data_swab, as, load_rom, sym_cb); } else { ret = load_elf32(filename, fd, elf_note_fn, translate_fn, translate_opaque, must_swab, - pentry, lowaddr, highaddr, elf_machine, clear_lsb, - data_swab, as, load_rom, sym_cb); + pentry, lowaddr, highaddr, proc_flags, elf_machine, + clear_lsb, data_swab, as, load_rom, sym_cb); } fail: diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c index 027303d2a3..746ca1f795 100644 --- a/hw/riscv/boot.c +++ b/hw/riscv/boot.c @@ -119,7 +119,7 @@ target_ulong riscv_load_kernel(const char *kernel_filename, symbol_fn_t sym_cb) uint64_t kernel_entry, kernel_high; if (load_elf_ram_sym(kernel_filename, NULL, NULL, NULL, - &kernel_entry, NULL, &kernel_high, 0, + &kernel_entry, NULL, &kernel_high, NULL, 0, EM_RISCV, 1, 0, NULL, true, sym_cb) > 0) { return kernel_entry; }