Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp2595525pxu; Mon, 14 Dec 2020 06:29:44 -0800 (PST) X-Google-Smtp-Source: ABdhPJxEFkVx+mClpCeNMohmM7twmbGLYHGMaa7CpvBPliV5Dhayrls4uplLJLFEPdMFCtiQ6Et7 X-Received: by 2002:a17:906:c097:: with SMTP id f23mr23203083ejz.136.1607956183964; Mon, 14 Dec 2020 06:29:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607956183; cv=none; d=google.com; s=arc-20160816; b=qXf+S+Htq6yaXQhhtUmMnJJgJGxfiLtVhJwpap8/MdX88giAU02bnnfm0iSnh+yKk0 zyPl6628IZmj4zCq+QVl7thuIW7DFvtgy1tQNbU3gRiA7/vgOh6tnWg4XJ8TP6aZ8ImO kpDtJtSyk9Q7mJud7/YaXG5eFYudrtU7wwF9f0b47gL419Ic6b7XS/nFZ/eYIN+UF0CV pQ4zn2/n2GPLHONRzCBVckAKfrCD+A0XWTDh6bbTPq74b801dne7K1X4/tF/omjEsMPb dc8n5mEn+MKlFogzPX9Xq/LmHbtmC3WYbPnA0tgodew6G0JMiuXXSjtHCqTNRWumdanP cAJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=PTGP6VORFNhdPrxJqjL3eTmtRdLbBiWJoRfFZsZxWrc=; b=XMTmQe5KJsxryVG1slwQZE7OK9LeE5wGEmPQOV+BS9A4IsMyY955Jt/kV9Q8NFAVwv kzcWHYF0D9+W3zAnaFnKjzCZVp8tKwAanu1ovtIOHdA41HAMN8FTUE6HZiNH2Byj36sP 645AopBlC/kV0A+cBmZyeVOt9fbls80f/otEnwnj7gcT+OVXfYRVgyWoArBLlLDqu2dS 6+FKDkABwGJ70kIAS8GIjxqajINBzAcCVGUWDyE70Yw5q22jrHEBHVI9hoUiuV5P3Pq2 +t+n49nVH/RAJSijBl0b9u0hyGGZtTQR8xIxVaVam7Cupr/fSktNL1mL4FHhecQDVXlC vqmQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o6si2884377ejj.354.2020.12.14.06.29.21; Mon, 14 Dec 2020 06:29:43 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391257AbgLNLC6 convert rfc822-to-8bit (ORCPT + 99 others); Mon, 14 Dec 2020 06:02:58 -0500 Received: from us-smtp-delivery-44.mimecast.com ([207.211.30.44]:37752 "EHLO us-smtp-delivery-44.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731623AbgLNK4X (ORCPT ); Mon, 14 Dec 2020 05:56:23 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-31-hK8Ri1aVPY6DZtEOKKuEVA-1; Mon, 14 Dec 2020 05:55:25 -0500 X-MC-Unique: hK8Ri1aVPY6DZtEOKKuEVA-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DE7DF809DCE; Mon, 14 Dec 2020 10:55:21 +0000 (UTC) Received: from krava.redhat.com (unknown [10.40.194.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id 87B9F7047D; Mon, 14 Dec 2020 10:55:18 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: Alexei Starovoitov , Song Liu , lkml , Peter Zijlstra , Ingo Molnar , Mark Rutland , Namhyung Kim , Alexander Shishkin , Michael Petlan , Ian Rogers , Stephane Eranian , Alexei Budankov , Andi Kleen , Adrian Hunter Subject: [PATCH 02/15] bpf: Add size arg to build_id_parse function Date: Mon, 14 Dec 2020 11:54:44 +0100 Message-Id: <20201214105457.543111-3-jolsa@kernel.org> In-Reply-To: <20201214105457.543111-1-jolsa@kernel.org> References: <20201214105457.543111-1-jolsa@kernel.org> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: kernel.org Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset=WINDOWS-1252 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It's possible to have other build id types (other than default SHA1). Currently there's also ld support for MD5 build id. Adding size argument to build_id_parse function, that returns (if defined) size of the parsed build id, so we can recognize the build id type. Cc: Alexei Starovoitov Cc: Song Liu Signed-off-by: Jiri Olsa --- include/linux/buildid.h | 3 ++- kernel/bpf/stackmap.c | 2 +- lib/buildid.c | 29 +++++++++++++++++++++-------- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/include/linux/buildid.h b/include/linux/buildid.h index 08028a212589..40232f90db6e 100644 --- a/include/linux/buildid.h +++ b/include/linux/buildid.h @@ -6,6 +6,7 @@ #define BUILD_ID_SIZE_MAX 20 -int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id); +int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, + __u32 *size); #endif diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index d21512fbfa9a..4fcf6018f35a 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -199,7 +199,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, for (i = 0; i < trace_nr; i++) { vma = find_vma(current->mm, ips[i]); - if (!vma || build_id_parse(vma, id_offs[i].build_id)) { + if (!vma || build_id_parse(vma, id_offs[i].build_id, NULL)) { /* per entry fall back to ips */ id_offs[i].status = BPF_STACK_BUILD_ID_IP; id_offs[i].ip = ips[i]; diff --git a/lib/buildid.c b/lib/buildid.c index 4a4f520c0e29..6156997c3895 100644 --- a/lib/buildid.c +++ b/lib/buildid.c @@ -12,6 +12,7 @@ */ static inline int parse_build_id(void *page_addr, unsigned char *build_id, + __u32 *size, void *note_start, Elf32_Word note_size) { @@ -38,6 +39,8 @@ static inline int parse_build_id(void *page_addr, nhdr->n_descsz); memset(build_id + nhdr->n_descsz, 0, BUILD_ID_SIZE_MAX - nhdr->n_descsz); + if (size) + *size = nhdr->n_descsz; return 0; } new_offs = note_offs + sizeof(Elf32_Nhdr) + @@ -50,7 +53,8 @@ static inline int parse_build_id(void *page_addr, } /* Parse build ID from 32-bit ELF */ -static int get_build_id_32(void *page_addr, unsigned char *build_id) +static int get_build_id_32(void *page_addr, unsigned char *build_id, + __u32 *size) { Elf32_Ehdr *ehdr = (Elf32_Ehdr *)page_addr; Elf32_Phdr *phdr; @@ -65,7 +69,7 @@ static int get_build_id_32(void *page_addr, unsigned char *build_id) for (i = 0; i < ehdr->e_phnum; ++i) { if (phdr[i].p_type == PT_NOTE && - !parse_build_id(page_addr, build_id, + !parse_build_id(page_addr, build_id, size, page_addr + phdr[i].p_offset, phdr[i].p_filesz)) return 0; @@ -74,7 +78,8 @@ static int get_build_id_32(void *page_addr, unsigned char *build_id) } /* Parse build ID from 64-bit ELF */ -static int get_build_id_64(void *page_addr, unsigned char *build_id) +static int get_build_id_64(void *page_addr, unsigned char *build_id, + __u32 *size) { Elf64_Ehdr *ehdr = (Elf64_Ehdr *)page_addr; Elf64_Phdr *phdr; @@ -89,7 +94,7 @@ static int get_build_id_64(void *page_addr, unsigned char *build_id) for (i = 0; i < ehdr->e_phnum; ++i) { if (phdr[i].p_type == PT_NOTE && - !parse_build_id(page_addr, build_id, + !parse_build_id(page_addr, build_id, size, page_addr + phdr[i].p_offset, phdr[i].p_filesz)) return 0; @@ -97,8 +102,16 @@ static int get_build_id_64(void *page_addr, unsigned char *build_id) return -EINVAL; } -/* Parse build ID of ELF file mapped to vma */ -int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id) +/* + * Parse build ID of ELF file mapped to vma + * @vma: vma object + * @build_id: buffer to store build id, at least BUILD_ID_SIZE long + * @size: returns actual build id size in case of success + * + * Returns 0 on success, otherwise error (< 0). + */ +int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, + __u32 *size) { Elf32_Ehdr *ehdr; struct page *page; @@ -126,9 +139,9 @@ int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id) goto out; if (ehdr->e_ident[EI_CLASS] == ELFCLASS32) - ret = get_build_id_32(page_addr, build_id); + ret = get_build_id_32(page_addr, build_id, size); else if (ehdr->e_ident[EI_CLASS] == ELFCLASS64) - ret = get_build_id_64(page_addr, build_id); + ret = get_build_id_64(page_addr, build_id, size); out: kunmap_atomic(page_addr); put_page(page); -- 2.26.2