From mboxrd@z Thu Jan 1 00:00:00 1970 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=-7.0 required=3.0 tests=INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 BBEA2C43387 for ; Fri, 21 Dec 2018 10:28:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9333D2176F for ; Fri, 21 Dec 2018 10:28:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389605AbeLUK2E (ORCPT ); Fri, 21 Dec 2018 05:28:04 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39810 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389541AbeLUK2D (ORCPT ); Fri, 21 Dec 2018 05:28:03 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A3B5AA3403; Fri, 21 Dec 2018 10:28:02 +0000 (UTC) Received: from f28server.default (ovpn-116-118.phx2.redhat.com [10.3.116.118]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7FD985D737; Fri, 21 Dec 2018 10:27:59 +0000 (UTC) From: Daniel Bristot de Oliveira To: linux-kernel@vger.kernel.org Cc: Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Greg Kroah-Hartman , Masami Hiramatsu , "Steven Rostedt (VMware)" , Jiri Kosina , Josh Poimboeuf , "Peter Zijlstra (Intel)" , Chris von Recklinghausen , Jason Baron , Scott Wood , Marcelo Tosatti , Clark Williams , x86@kernel.org Subject: [PATCH V3 5/9] x86/alternative: Split text_poke_bp() into tree steps Date: Fri, 21 Dec 2018 11:27:30 +0100 Message-Id: <67c326c50f8efa728d3040d3563f258949ff32c4.1545228276.git.bristot@redhat.com> In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 21 Dec 2018 10:28:02 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org text_poke_bp() updates instructions on live kernel on SMP in three steps: 1) add a int3 trap to the address that will be patched 2) update all but the first byte of the patched range 3) replace the first byte (int3) by the first byte of This patch creates one function for each of these steps. Signed-off-by: Daniel Bristot de Oliveira Acked-by: Jiri Kosina Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Borislav Petkov Cc: "H. Peter Anvin" Cc: Greg Kroah-Hartman Cc: Masami Hiramatsu Cc: "Steven Rostedt (VMware)" Cc: Jiri Kosina Cc: Josh Poimboeuf Cc: "Peter Zijlstra (Intel)" Cc: Chris von Recklinghausen Cc: Jason Baron Cc: Scott Wood Cc: Marcelo Tosatti Cc: Clark Williams Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org --- arch/x86/kernel/alternative.c | 38 +++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index ebeac487a20c..6f5ad8587de0 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -767,6 +767,29 @@ int poke_int3_handler(struct pt_regs *regs) } +static void text_poke_bp_set_handler(void *addr, void *handler, + unsigned char int3) +{ + bp_int3_handler = handler; + bp_int3_addr = (u8 *)addr + sizeof(int3); + text_poke(addr, &int3, sizeof(int3)); +} + +static void patch_all_but_first_byte(void *addr, const void *opcode, + size_t len, unsigned char int3) +{ + /* patch all but the first byte */ + text_poke((char *)addr + sizeof(int3), + (const char *) opcode + sizeof(int3), + len - sizeof(int3)); +} + +static void patch_first_byte(void *addr, const void *opcode, unsigned char int3) +{ + /* patch the first byte */ + text_poke(addr, opcode, sizeof(int3)); +} + /** * text_poke_bp() -- update instructions on live kernel on SMP * @addr: address to patch @@ -791,27 +814,21 @@ void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler) { unsigned char int3 = 0xcc; - bp_int3_handler = handler; - bp_int3_addr = (u8 *)addr + sizeof(int3); - bp_patching_in_progress = true; - lockdep_assert_held(&text_mutex); + bp_patching_in_progress = true; /* * Corresponding read barrier in int3 notifier for making sure the * in_progress and handler are correctly ordered wrt. patching. */ smp_wmb(); - text_poke(addr, &int3, sizeof(int3)); + text_poke_bp_set_handler(addr, handler, int3); on_each_cpu(do_sync_core, NULL, 1); if (len - sizeof(int3) > 0) { - /* patch all but the first byte */ - text_poke((char *)addr + sizeof(int3), - (const char *) opcode + sizeof(int3), - len - sizeof(int3)); + patch_all_but_first_byte(addr, opcode, len, int3); /* * According to Intel, this core syncing is very likely * not necessary and we'd be safe even without it. But @@ -820,8 +837,7 @@ void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler) on_each_cpu(do_sync_core, NULL, 1); } - /* patch the first byte */ - text_poke(addr, opcode, sizeof(int3)); + patch_first_byte(addr, opcode, int3); on_each_cpu(do_sync_core, NULL, 1); /* -- 2.17.1