From nobody Tue Feb 10 10:54:39 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1549391599661467.2243429865698; Tue, 5 Feb 2019 10:33:19 -0800 (PST) Received: from localhost ([127.0.0.1]:37545 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gr5Wz-0007wY-8j for importer@patchew.org; Tue, 05 Feb 2019 13:33:13 -0500 Received: from eggs.gnu.org ([209.51.188.92]:35881) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gr5GJ-0002LC-5k for qemu-devel@nongnu.org; Tue, 05 Feb 2019 13:16:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gr5GG-0003lD-Ns for qemu-devel@nongnu.org; Tue, 05 Feb 2019 13:15:59 -0500 Received: from mail-wm1-x342.google.com ([2a00:1450:4864:20::342]:53256) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gr5GG-0003Yc-Dp for qemu-devel@nongnu.org; Tue, 05 Feb 2019 13:15:56 -0500 Received: by mail-wm1-x342.google.com with SMTP id d15so4678074wmb.3 for ; Tue, 05 Feb 2019 10:15:41 -0800 (PST) Received: from 640k.lan ([93.56.166.5]) by smtp.gmail.com with ESMTPSA id p5sm8931665wmh.16.2019.02.05.10.15.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Feb 2019 10:15:39 -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; bh=mGgA8mhxRDL22XvQhvbdFvsJ+SEiVcBnIl4weZyYzLs=; b=vQzKyQbN6GK6Jlb/9hN1ajwn+4Ly0J4R832CS8HQurWbV3BeDnPdfBNEKausGpWQFd yBTdsqToIoW47YjQwi+7TT1+2IZGP7TBh/AQj1HSPFdvolMY0Bp+TGVmWfYtTSD/uXpe cdaJY2aATrGXVa2WL85NQ0uqnVa26RQJmcusShPTjQsuGIU41JI9W/QphIayB0w8jipI uBSfcheEJK16BzngO6dHryYYP4CHw5v5jnuMz5yiDeIqxaoExVSZZ9eJ9b2QWXjUXrNa pmz1YO+VPIesvCS414lf/ZJ7d+AQWZrf+nuv/vl4anqw0nz0qzrCc7eVSxPOd/N9N6bI jUjg== 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; bh=mGgA8mhxRDL22XvQhvbdFvsJ+SEiVcBnIl4weZyYzLs=; b=l14AbHhdyfHWZ0X3CjZAJIUIMAlkLqmqsUOkdMdDZpAnJ7EJP2AMtETQtHII2W6+gJ ZKoJ/RHI8xBaaYkHjHvHoClWJSFijSMQpIYvUKJLTUMuGkRwMv/Q4Swmva/7MP0uY9rS j8XlPydqaciTm7jx6xwxNqA8e4a4h5E/xvr4wFPSq/TEt0jkAsUeABdI8qMILgP/Y3N0 +6+K9mkMZ7wIKsyfnxNrDUHUUS0l+2lppSPxY9KJJ6ijzzNYesng0jNjHLVDE+FWMV1T Jvj0DaxitU9DjKCKdtK2ljMib196TWdD2HiNeAydctTtyodlaeggHVGtMDtTxGzLQLO1 JCHw== X-Gm-Message-State: AHQUAuY16vxD6zqwhtPxICZvbHo3SQ43jE1/nZCSuN7Uo5Jki/al/tZH p3USEf+Gl5bnYgq0P7OVLOH4ddB5 X-Google-Smtp-Source: AHgI3IbIYQZK5BH4xEsGMJiUWpsDTnUFfaA+YA5YvPmHgyfWB53y19wyPchLcGFGHedfTN4mNtuW3A== X-Received: by 2002:a1c:4807:: with SMTP id v7mr4882068wma.53.1549390540383; Tue, 05 Feb 2019 10:15:40 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 5 Feb 2019 19:14:22 +0100 Message-Id: <1549390526-24246-13-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1549390526-24246-1-git-send-email-pbonzini@redhat.com> References: <1549390526-24246-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::342 Subject: [Qemu-devel] [PULL 12/76] elf-ops.h: Add get_elf_note_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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Liam Merwick Introduce a routine which, given a pointer to a range of ELF Notes, searches through them looking for a note matching the type specified and returns a pointer to the matching ELF note. get_elf_note_type() is used by elf_load[32|64]() to find the specified note type required by the 'elf_note_fn' parameter added in the previous commit. Signed-off-by: Liam Merwick Signed-off-by: Paolo Bonzini Signed-off-by: Liam Merwick --- include/hw/elf_ops.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 75 insertions(+) diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h index 3438d6f..690f923 100644 --- a/include/hw/elf_ops.h +++ b/include/hw/elf_ops.h @@ -265,6 +265,51 @@ fail: return ret; } =20 +/* + * Given 'nhdr', a pointer to a range of ELF Notes, search through them + * for a note matching type 'elf_note_type' and return a pointer to + * the matching ELF note. + */ +static struct elf_note *glue(get_elf_note_type, SZ)(struct elf_note *nhdr, + elf_word note_size, + elf_word phdr_align, + elf_word elf_note_type) +{ + elf_word nhdr_size =3D sizeof(struct elf_note); + elf_word elf_note_entry_offset =3D 0; + elf_word note_type; + elf_word nhdr_namesz; + elf_word nhdr_descsz; + + if (nhdr =3D=3D NULL) { + return NULL; + } + + note_type =3D nhdr->n_type; + while (note_type !=3D elf_note_type) { + nhdr_namesz =3D nhdr->n_namesz; + nhdr_descsz =3D nhdr->n_descsz; + + elf_note_entry_offset =3D nhdr_size + + QEMU_ALIGN_UP(nhdr_namesz, phdr_align) + + QEMU_ALIGN_UP(nhdr_descsz, phdr_align); + + /* + * If the offset calculated in this iteration exceeds the + * supplied size, we are done and no matching note was found. + */ + if (elf_note_entry_offset > note_size) { + return NULL; + } + + /* skip to the next ELF Note entry */ + nhdr =3D (void *)nhdr + elf_note_entry_offset; + note_type =3D nhdr->n_type; + } + + return nhdr; +} + static int glue(load_elf, SZ)(const char *name, int fd, uint64_t (*elf_note_fn)(void *, void *, bool= ), uint64_t (*translate_fn)(void *, uint64_t), @@ -497,6 +542,36 @@ static int glue(load_elf, SZ)(const char *name, int fd, high =3D addr + mem_size; =20 data =3D NULL; + + } else if (ph->p_type =3D=3D PT_NOTE && elf_note_fn) { + struct elf_note *nhdr =3D NULL; + + file_size =3D ph->p_filesz; /* Size of the range of ELF notes = */ + data =3D g_malloc0(file_size); + if (ph->p_filesz > 0) { + if (lseek(fd, ph->p_offset, SEEK_SET) < 0) { + goto fail; + } + if (read(fd, data, file_size) !=3D file_size) { + goto fail; + } + } + + /* + * Search the ELF notes to find one with a type matching the + * value passed in via 'translate_opaque' + */ + nhdr =3D (struct elf_note *)data; + assert(translate_opaque !=3D NULL); + nhdr =3D glue(get_elf_note_type, SZ)(nhdr, file_size, ph->p_al= ign, + *(uint64_t *)translate_opaq= ue); + if (nhdr !=3D NULL) { + bool is64 =3D + sizeof(struct elf_note) =3D=3D sizeof(struct elf64_not= e); + elf_note_fn((void *)nhdr, (void *)&ph->p_align, is64); + } + g_free(data); + data =3D NULL; } } =20 --=20 1.8.3.1