Received: by 10.223.148.5 with SMTP id 5csp7924038wrq; Thu, 18 Jan 2018 11:10:49 -0800 (PST) X-Google-Smtp-Source: ACJfBovdcQM/1dp2E52BcfgvWDUfoFgQONVxTrdzxRR26Gcm2/IleVrrapkkIfFDWg0092Ahnd0l X-Received: by 10.98.214.129 with SMTP id a1mr37705878pfl.221.1516302649700; Thu, 18 Jan 2018 11:10:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516302649; cv=none; d=google.com; s=arc-20160816; b=Oh3ULLgfhDThUAcoNxPI2L1ceihaWg6JYH6V2Eq2fNg1ymCs27SmB3zffjJnwAkGFT 8NIqSKgBIFIE298J3YgC0ywC2qUflgq/QPrPxrpWBX5HI/NUA8QdpHqN2FfFhg4RP3nf tzoKjrqYk2IixLQZ6y70fDz2700J5R7RxWc3+ZnHiAtcJnPqV4OFtjHRrNRCjJ5TSPCI Wj3485r0170d4msq3UpNdnJQFC7+BRTtqmCKBa2YUyQPwK9ElxSE3UO4sJbyES+jVQ2K NEow2SPZe1FU+ZRT95vv2DtvMxtl2mQaF/VvR1EYCNuSXYftQUyKrZH1FFsEpBCfK6M2 TVpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=Nuf0iDmXxPHecKVlQKMB2i6bdcLmKpntN6E0mQXqsKI=; b=iJ/JzlgdeEZNU9gOWY0RzUsZulBJml359u+F+sSzpmNVVEDE/tdnKvWNm7Edsa1x3O idaMYsUrqqwPbx5PDxIwxWQYMSz3eO+7QjG6mSGP+KTsCyYqfH3R0Wjo7F2BTWcCKd25 lXL8edoPSCop4o3ahIG/0t9iUTYBesJjklV8h43JkDxha+VgLy8lEbnikJEUeWUYGrfp e64rOd4Fv6mWPrUjDgkwZsVJHb6vFR9ufR/jdyM4zBelyhw9siv7boI+IPSV6JKMDUEW qwdBGNRDb24TnDMrYNqeJe1niWuTEgnkkMFiANYH8UxkHx648W5iJxUHRWGlLIJ8jV4V jG/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=basVoK/T; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k130si5714794pgc.358.2018.01.18.11.10.35; Thu, 18 Jan 2018 11:10:49 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=basVoK/T; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755959AbeARTJh (ORCPT + 99 others); Thu, 18 Jan 2018 14:09:37 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:43109 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755702AbeARTJe (ORCPT ); Thu, 18 Jan 2018 14:09:34 -0500 Received: by mail-pg0-f65.google.com with SMTP id n17so7484172pgf.10 for ; Thu, 18 Jan 2018 11:09:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=Nuf0iDmXxPHecKVlQKMB2i6bdcLmKpntN6E0mQXqsKI=; b=basVoK/TSrRZfN6cx6OZ3ujDWEIYSsVmn6/a4884UgHlBboBBm5pYnMiLKIFVhsHj0 5eYjSaKfmp5L3/jPiiRZhcRyzu+zC+N3Qw+6qQ1MkEhbPZUZgsIQiYfDNU0jE25Dq4LB r+0OOM3LD8ayXItV1yLwX73zO0ianONoJUdt8D9Ca6R90rFyZjZZlnMByhoF3p9rgbms CojmHOQPTX3oB/XYnZUGxZQ+sEQ5KxTBUrjlIjcSvP0TJZLw5nKZCrT2fVstfVCH/uVT 3PHvPn/UswExrPFVeXG5NkKPlZPNoutWchMqgB28MfNDFPK/s9mU0gpCCzpLBOdWz6uB HC5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition:in-reply-to:user-agent; bh=Nuf0iDmXxPHecKVlQKMB2i6bdcLmKpntN6E0mQXqsKI=; b=FtrIkRgY+2b/TfHhXOfs7qo7hVgYqEZ0VB19XARUC8+Mlqs/nalf2tl2qaUbdcGXzu M3WKPDhiEzKUDDpolHHr3Pbe3UxOtiN1+tQqTQyH8cMhcPzeFzceikwm/Gke845AN3r2 HMipCPNqLhek+/MH68YjTMO/ICThroAWvEh5udDaJ72jDHu3kloNg3SFGpYYwR+xc1Jt 3NkeXAzjyg1lWQn5jlG6fxmWHpo8mXbIKcTucHN4EXSBITjlfsohgDWSzwm7d8HwIPar oUPv49G56bapENTioCgsZzfCg3j0AOpLYrRu7V7rMTFYuzYW1khXNioBIUuK/caf6owY GkpQ== X-Gm-Message-State: AKwxytcs+GrWMJpLkkjPGoKTHB0biOZdkcgmOC8B8rqOIi/BN+bz7Ev3 0YSfkmjfcPBslw1vpu+BYsI= X-Received: by 10.101.88.130 with SMTP id d2mr24044269pgu.278.1516302574285; Thu, 18 Jan 2018 11:09:34 -0800 (PST) Received: from localhost (108-223-40-66.lightspeed.sntcca.sbcglobal.net. [108.223.40.66]) by smtp.gmail.com with ESMTPSA id t80sm12103263pgb.88.2018.01.18.11.09.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 11:09:33 -0800 (PST) Date: Thu, 18 Jan 2018 11:09:31 -0800 From: Guenter Roeck To: "Woodhouse, David" Cc: Andi Kleen , Paul Turner , LKML , Linus Torvalds , Greg Kroah-Hartman , Tim Chen , Dave Hansen , tglx@linutronix.de, Kees Cook , Rik van Riel , Peter Zijlstra , Andy Lutomirski , Jiri Kosina , gnomes@lxorguk.ukuu.org.uk, x86@kernel.org, thomas.lendacky@amd.com, Josh Poimboeuf Subject: Re: [v8,02/12] objtool: Allow alternatives to be ignored Message-ID: <20180118190931.GA27143@roeck-us.net> References: <1515707194-20531-3-git-send-email-dwmw@amazon.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1515707194-20531-3-git-send-email-dwmw@amazon.co.uk> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi folks, On Thu, Jan 11, 2018 at 09:46:24PM +0000, Woodhouse, David wrote: > Getting objtool to understand retpolines is going to be a bit of a > challenge. For now, take advantage of the fact that retpolines are > patched in with alternatives. Just read the original (sane) > non-alternative instruction, and ignore the patched-in retpoline. > > This allows objtool to understand the control flow *around* the > retpoline, even if it can't yet follow what's inside. This means the > ORC unwinder will fail to unwind from inside a retpoline, but will work > fine otherwise. > > Signed-off-by: Josh Poimboeuf > Signed-off-by: David Woodhouse > --- > tools/objtool/check.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- > tools/objtool/check.h | 2 +- > 2 files changed, 57 insertions(+), 7 deletions(-) > > diff --git a/tools/objtool/check.c b/tools/objtool/check.c > index de053fb..f40d46e 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -428,6 +428,40 @@ static void add_ignores(struct objtool_file *file) > } > > /* > + * FIXME: For now, just ignore any alternatives which add retpolines. This is > + * a temporary hack, as it doesn't allow ORC to unwind from inside a retpoline. > + * But it at least allows objtool to understand the control flow *around* the > + * retpoline. > + */ > +static int add_nospec_ignores(struct objtool_file *file) > +{ > + struct section *sec; > + struct rela *rela; > + struct instruction *insn; > + > + sec = find_section_by_name(file->elf, ".rela.discard.nospec"); > + if (!sec) > + return 0; > + > + list_for_each_entry(rela, &sec->rela_list, list) { > + if (rela->sym->type != STT_SECTION) { > + WARN("unexpected relocation symbol type in %s", sec->name); > + return -1; > + } > + > + insn = find_insn(file, rela->sym->sec, rela->addend); > + if (!insn) { > + WARN("bad .discard.nospec entry"); > + return -1; > + } > + > + insn->ignore_alts = true; > + } > + > + return 0; > +} > + > +/* > * Find the destination instructions for all jumps. > */ > static int add_jump_destinations(struct objtool_file *file) > @@ -509,11 +543,18 @@ static int add_call_destinations(struct objtool_file *file) > dest_off = insn->offset + insn->len + insn->immediate; > insn->call_dest = find_symbol_by_offset(insn->sec, > dest_off); > + /* > + * FIXME: Thanks to retpolines, it's now considered > + * normal for a function to call within itself. So > + * disable this warning for now. > + */ > +#if 0 > if (!insn->call_dest) { > WARN_FUNC("can't find call dest symbol at offset 0x%lx", > insn->sec, insn->offset, dest_off); > return -1; > } > +#endif This crashes for me in is_fentry_call(). Program received signal SIGSEGV, Segmentation fault. is_fentry_call (insn=, insn=) at check.c:1113 1113 if (insn->type == INSN_CALL && (gdb) info stack #0 is_fentry_call (insn=, insn=) at check.c:1113 #1 validate_branch (file=0x7ffffff7e440, first=0x7ffffff7e128, state=...) at check.c:1747 #2 0x0000000000404bd3 in validate_branch (file=0x7ffffff7e440, first=0x7ffffff7e128, state=...) at check.c:1770 #3 0x0000000000406783 in validate_functions (file=) at check.c:1933 #4 check (_objname=0x6bb9d0 "", _no_fp=40, no_unreachable=4, orc=false) at check.c:2006 #5 0x00000000004021c1 in handle_internal_command (argv=0x7fffffffe5c0, argc=4) at objtool.c:108 #6 main (argc=4, argv=0x7fffffffe5c0) at objtool.c:131 This is not entirely surprising, since insn->call_dest is NULL and is_fentry_call() doesn't expect that. How is this supposed to work ? What am I missing ? Guenter > } else if (rela->sym->type == STT_SECTION) { > insn->call_dest = find_symbol_by_offset(rela->sym->sec, > rela->addend+4); > @@ -678,12 +719,6 @@ static int add_special_section_alts(struct objtool_file *file) > return ret; > > list_for_each_entry_safe(special_alt, tmp, &special_alts, list) { > - alt = malloc(sizeof(*alt)); > - if (!alt) { > - WARN("malloc failed"); > - ret = -1; > - goto out; > - } > > orig_insn = find_insn(file, special_alt->orig_sec, > special_alt->orig_off); > @@ -694,6 +729,10 @@ static int add_special_section_alts(struct objtool_file *file) > goto out; > } > > + /* Ignore retpoline alternatives. */ > + if (orig_insn->ignore_alts) > + continue; > + > new_insn = NULL; > if (!special_alt->group || special_alt->new_len) { > new_insn = find_insn(file, special_alt->new_sec, > @@ -719,6 +758,13 @@ static int add_special_section_alts(struct objtool_file *file) > goto out; > } > > + alt = malloc(sizeof(*alt)); > + if (!alt) { > + WARN("malloc failed"); > + ret = -1; > + goto out; > + } > + > alt->insn = new_insn; > list_add_tail(&alt->list, &orig_insn->alts); > > @@ -1035,6 +1081,10 @@ static int decode_sections(struct objtool_file *file) > > add_ignores(file); > > + ret = add_nospec_ignores(file); > + if (ret) > + return ret; > + > ret = add_jump_destinations(file); > if (ret) > return ret; > diff --git a/tools/objtool/check.h b/tools/objtool/check.h > index 47d9ea7..dbadb30 100644 > --- a/tools/objtool/check.h > +++ b/tools/objtool/check.h > @@ -44,7 +44,7 @@ struct instruction { > unsigned int len; > unsigned char type; > unsigned long immediate; > - bool alt_group, visited, dead_end, ignore, hint, save, restore; > + bool alt_group, visited, dead_end, ignore, hint, save, restore, ignore_alts; > struct symbol *call_dest; > struct instruction *jump_dest; > struct list_head alts;