From patchwork Wed Jan 20 17:37:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Thierry X-Patchwork-Id: 12033059 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 35A21C433E0 for ; Wed, 20 Jan 2021 17:43:00 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3E1A72070A for ; Wed, 20 Jan 2021 17:42:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3E1A72070A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=BGoflXPszrwB9P4fC5xXxCqKlsY0ZKF4rhy1xb79Zr4=; b=J8gwR1WUvsikzkwss5Bw0K3iAq dwVLDwptuzorLqlwD/knVALVi9dVHs/wqOjehKXU5/XOwH5UKx7SVucfYmGzsFsAnOaozeEByv2ci +rMBgAaYUAqDp9kRnBH0dLL+LWWUqNHeRcZ0gB13AaouOW3hTxFnX9G7LVIvYS9uoJmuZ6EPykqzp 6rTHoMoOZjYVvgN07PY/6oyYngbX/3JbaGi8kasGHEwdMH5B1gDQnbViH/gKoXMd26YAYtHhTKxhD PtZuHixX0qyjegV768F6MxyY6ZUBxzX2TKQBAKUNUAJtbjSI8F7hYTdhasCRsInq21CE4CiX/PLvv UUfMRu2w==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l2HTR-00044i-AU; Wed, 20 Jan 2021 17:40:53 +0000 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l2HQn-0002jE-Lp for linux-arm-kernel@lists.infradead.org; Wed, 20 Jan 2021 17:38:11 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1611164288; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=A108kjHRUQdQY86++G1ojoBlN5bivr2NbhXvZVQXIjs=; b=Y+0/3JP8sglXHNyza2hf9k8vGoYHEvWVm/jxvMG6KRBskLQM9BOHTdHe5/9y+Y9835ytxn GKOzwItp+rF/xJR8deFi7Kv8FUT7qQ3jrJD+qY5kjFpcjOfQ3+Yh6XvpzUNiXB87dLmRMS eIWt9AmZ3oW6/55BlVrjbAIKebfXTsE= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-562-sAonW4U-PHinI8IfOZYlWw-1; Wed, 20 Jan 2021 12:38:04 -0500 X-MC-Unique: sAonW4U-PHinI8IfOZYlWw-1 Received: by mail-wr1-f72.google.com with SMTP id v5so11966424wrr.0 for ; Wed, 20 Jan 2021 09:38:04 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=A108kjHRUQdQY86++G1ojoBlN5bivr2NbhXvZVQXIjs=; b=hKkkw05p2gwbtt7tnYDNvdnhxW0259qaQK/ptNGByQoYEbaovbODwFCjT0pHtlfpl5 LMgC4VX8ld+d3A4RgZ0T7v8maNQDC13guB/j2OUcJSsxMuY+MNZA/maRJUZ/s7de7dSs 1tgxuZoiLf3Ftse/uKJaxvuPy3pxylhnSse1gH2KYLMI0xrC9ftQ9TTcOcE/eFBE8Zxw N19n7TY2ivxVvHQSaWWaBUtQK8MGdKeiAG56mueTQnS/bvTHKAJm+Iez33vJFd1MYGP/ zSD7q0DvBGBINAUB20pxLfI/8NX+vjfUkS7q1kvTrNq186wUBgw7HnFFj3HTzDo/Vg5z Dltw== X-Gm-Message-State: AOAM530bHMSMo/2Kwu2sgWjhPP9KURiqDjyGypzN/ebQXFCJtq/MbYvC o7/5AItkQHhk1ZnkkcZN2pYPGkfE598oq0TGJ2FEIkjWljnUhFGhyFAqRXeThqZPNsRMC2ZONyS I0m8FuyD8dxc0+RXjaAQt+3Zqsp/EMfmjpsQ= X-Received: by 2002:a05:6000:1565:: with SMTP id 5mr10630084wrz.109.1611164283633; Wed, 20 Jan 2021 09:38:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJxHore5PrQor0sfd+uGXcmG2lRqPQ/wDMgFvw29tveC12LEpMiYbOmQdf62PWPDL7v7WxO8/w== X-Received: by 2002:a05:6000:1565:: with SMTP id 5mr10630076wrz.109.1611164283494; Wed, 20 Jan 2021 09:38:03 -0800 (PST) Received: from redfedo.redhat.com ([2a01:cb14:499:3d00:cd47:f651:9d80:157a]) by smtp.gmail.com with ESMTPSA id x11sm4948325wmi.4.2021.01.20.09.38.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jan 2021 09:38:03 -0800 (PST) From: Julien Thierry To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 00/17] objtool: add base support for arm64 Date: Wed, 20 Jan 2021 18:37:43 +0100 Message-Id: <20210120173800.1660730-1-jthierry@redhat.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jthierry@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210120_123809_792194_61329ADC X-CRM114-Status: GOOD ( 20.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, linux-efi@vger.kernel.org, michal.lkml@markovi.net, keescook@chromium.org, peterz@infradead.org, catalin.marinas@arm.com, masahiroy@kernel.org, broonie@kernel.org, linux-hardening@vger.kernel.org, jpoimboe@redhat.com, will@kernel.org, ardb@kernel.org, Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, This series enables objtool to start doing stack validation on arm64 kernel builds. It relies on the previous series I sent, refactoring the arm64 decoder [1]. First, the aarch64 instruction decoder needed to be made available to code under tools/. This is done in a similar manner to x86 instruction decoded. One limitation I encountered there is that most of aarch64 instruction decoder is __kprobe annotated. To bypass that it remove the kprobe include and had to add an empty __kprobe definition, but I'd welcome a proper solution to that. Then instruction semantics are progressively added so objtool can track the stack state through the execution flow. There are a few things that needed consideration: - Generation of constants within executable sections, these either caused objtool to fail decoding or to wrongly decode constants as jumps or other instructions affecting execution flow and causing confusion. To solve this, tracking locations referenced by instructions using literals was needed. - Jump tables from switch statements in aarch64 don't have enough information to link branches with the branch instruction leading to them. For this, we use a gcc plugin to add some information to establish those missing links in a format that is already supported by objtool With this, there are still some errors when building with objtool. A number of cleanups/annotations are needed on the arm64, as well as handling SYM_DATA objects in objtool. Those changes can be found on top of this branch here: git clone https://github.com/julien-thierry/linux.git -b objtoolxarm64-latest But it would be nice to have some feedback on this before I start submitting everyting. [1] https://lkml.org/lkml/2021/1/20/791 Thanks, Julien --> Julien Thierry (15): tools: Add some generic functions and headers tools: arm64: Make aarch64 instruction decoder available to tools tools: bug: Remove duplicate definition objtool: arm64: Add base definition for arm64 backend objtool: arm64: Decode add/sub instructions objtool: arm64: Decode jump and call related instructions objtool: arm64: Decode other system instructions objtool: arm64: Decode load/store instructions objtool: arm64: Decode LDR instructions objtool: arm64: Accept padding in code sections efi: libstub: Ignore relocations for .discard sections objtool: arm64: Implement functions to add switch tables alternatives objtool: arm64: Cache section with switch table information objtool: arm64: Handle supported relocations in alternatives objtool: arm64: Ignore replacement section for alternative callback Raphael Gault (2): gcc-plugins: objtool: Add plugin to detect switch table on arm64 objtool: arm64: Enable stack validation for arm64 arch/arm64/Kconfig | 2 + drivers/firmware/efi/libstub/Makefile | 2 +- scripts/Makefile.gcc-plugins | 2 + scripts/gcc-plugins/Kconfig | 4 + .../arm64_switch_table_detection_plugin.c | 85 + tools/arch/arm64/include/asm/aarch64-insn.h | 551 +++++++ tools/arch/arm64/lib/aarch64-insn.c | 1425 +++++++++++++++++ tools/include/asm-generic/bitops/__ffs.h | 11 + tools/include/linux/bug.h | 6 +- tools/include/linux/kernel.h | 21 + tools/include/linux/printk.h | 40 + tools/objtool/Makefile | 5 + tools/objtool/arch/arm64/Build | 8 + tools/objtool/arch/arm64/decode.c | 471 ++++++ .../arch/arm64/include/arch/cfi_regs.h | 14 + tools/objtool/arch/arm64/include/arch/elf.h | 6 + .../arch/arm64/include/arch/endianness.h | 9 + .../objtool/arch/arm64/include/arch/special.h | 23 + tools/objtool/arch/arm64/special.c | 134 ++ tools/objtool/arch/x86/decode.c | 5 + tools/objtool/check.c | 6 + tools/objtool/include/objtool/arch.h | 3 + tools/objtool/sync-check.sh | 5 + 23 files changed, 2832 insertions(+), 6 deletions(-) create mode 100644 scripts/gcc-plugins/arm64_switch_table_detection_plugin.c create mode 100644 tools/arch/arm64/include/asm/aarch64-insn.h create mode 100644 tools/arch/arm64/lib/aarch64-insn.c create mode 100644 tools/include/linux/printk.h create mode 100644 tools/objtool/arch/arm64/Build create mode 100644 tools/objtool/arch/arm64/decode.c create mode 100644 tools/objtool/arch/arm64/include/arch/cfi_regs.h create mode 100644 tools/objtool/arch/arm64/include/arch/elf.h create mode 100644 tools/objtool/arch/arm64/include/arch/endianness.h create mode 100644 tools/objtool/arch/arm64/include/arch/special.h create mode 100644 tools/objtool/arch/arm64/special.c --- 2.25.4