Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp1560290pxv; Sat, 10 Jul 2021 07:58:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxavtPxK2mo3u+xselFMzIPn2gFIlmXekAZBtuFcqWDeyUeEMl2rOjGB8Z/X5NGcA2rRUwC X-Received: by 2002:a02:c7cc:: with SMTP id s12mr3272344jao.37.1625929087023; Sat, 10 Jul 2021 07:58:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625929087; cv=none; d=google.com; s=arc-20160816; b=TYF1yaosy40JVK0/HFXZYw+4zvnSyjvFEH0IeyLxIJQTRfz6rFYSgU68EofCDBHxsh VRQvHEjDR6RrIsUdYOcEQjN29Nhh8va0H3JDfo2OIrPwsYTv8Cb1jkft11ZeMJSAxP7k kqqTAbwphobUl9GIoXHDq6idY07Z3jaVPvns7nnUIyIFd9dBh9wJx5g3+9Br9iOxvdU0 e0Z/pQewWzXYdkS1ezlVBLWO+g+Y3ov33Jo1BjL53f5SyEkZIALjWCOqTQefqtuzhvt9 1lEUyEMzCS8fHDere02yhynUH2Aj5C7dDoJTYX3h9yfTPKzl1cVOmMPVjPVevAyFdO6x iVLw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Ctnv60D7sYlLKBzQJ//Df6dYjWuQ1J4cThxfX64Ijnc=; b=NmPhllnLLCTqtMl9OfkE1hYZOvkdB4ihRGG0ZahsLdwDYqwQGo9jHvIXcUMoDqcyjb 5r07+KeBuNckksnFNxawR1vEsem6nHqRRAdNuk6bU+Y5bkj7bVY7OL/k9YFy5jrnXVHR yujSnMGykbF13kbuENMBgd4Jmi/4nxS61q2KsgnzCbhqal7pFw/yuqSNfDebaZy/Mg3F GhPLvST+d/wUMccD0PAMwsxyx56TkDcgh5PTKS8a5MJqF+jaOGVAi5cwPuDY6zDMsSFP +zNymKyquj/kVNyIvWFKirXw5zkVjEvUnYFmVxTGmdtgLrOcnIYjbObgppxmvvhLPvgx ZGZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FG+sXtrs; 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 s21si10231553iow.73.2021.07.10.07.57.55; Sat, 10 Jul 2021 07:58:07 -0700 (PDT) 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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FG+sXtrs; 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 S232286AbhGJO65 (ORCPT + 99 others); Sat, 10 Jul 2021 10:58:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:58398 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232335AbhGJO6x (ORCPT ); Sat, 10 Jul 2021 10:58:53 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1C93A61356; Sat, 10 Jul 2021 14:56:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1625928968; bh=x8PNEapkwMCeHyZetcn1xOe4EMON80ikLqdwyrQ85HA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FG+sXtrsuVRuWSN9yOm4DP7ed3dpaRyeiLqN5Uu5Yj0dePFKcSZNh2lHgnCE1bgHt 3wLuPRjj4bhkTyBiTlivp9sHjSuBea9MAe3zy6E11z5JTnDbjq95thF/b4EbwyGw7D dzlo51FbJgDuMpvMgIEU2gajd0JqHkWrE+phS1kk5PtiD3SarNZY080VrP4z2F/aeA PWIMREi905Atn/1IxgDgkdLnlywFSCrO3VbMV1xK5hWa1fxp7EGUUGJcObnid0jYw6 Ky1XrpbhnMcrGz4Uyo9ZiPyXXlKPdj1Ad1MKlKgwguGIheYmzagm7g9qy90aX55BVw lTpE5HLvepdSQ== From: Masami Hiramatsu To: X86 ML , Ingo Molnar Cc: Steven Rostedt , Josh Poimboeuf , Masami Hiramatsu , Daniel Xu , linux-kernel@vger.kernel.org, bpf@vger.kernel.org, kuba@kernel.org, mingo@redhat.com, ast@kernel.org, Thomas Gleixner , Borislav Petkov , Peter Zijlstra , kernel-team@fb.com, yhs@fb.com, linux-ia64@vger.kernel.org, Abhishek Sagar , Andrii Nakryiko Subject: [PATCH -tip 5/6] kprobes: treewide: Use 'kprobe_opcode_t *' for the code address in get_optimized_kprobe() Date: Sat, 10 Jul 2021 23:56:04 +0900 Message-Id: <162592896455.1158485.17010884693268621190.stgit@devnote2> X-Mailer: git-send-email 2.25.1 In-Reply-To: <162592891873.1158485.768824457210707916.stgit@devnote2> References: <162592891873.1158485.768824457210707916.stgit@devnote2> User-Agent: StGit/0.19 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since get_optimized_kprobe() is only used inside kprobes, it doesn't need to use 'unsigned long' type for 'addr' parameter. Make it use 'kprobe_opcode_t *' for the 'addr' parameter and subsequent call of arch_within_optimized_kprobe() also should use 'kprobe_opcode_t *'. Note that MAX_OPTIMIZED_LENGTH and RELATIVEJUMP_SIZE are defined by byte-size, but the size of 'kprobe_opcode_t' depends on the architecture. Therefore, we must be careful when calculating addresses using those macros. Signed-off-by: Masami Hiramatsu --- arch/arm/probes/kprobes/opt-arm.c | 7 ++++--- arch/powerpc/kernel/optprobes.c | 6 +++--- arch/x86/kernel/kprobes/opt.c | 6 +++--- include/linux/kprobes.h | 2 +- kernel/kprobes.c | 10 +++++----- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/arch/arm/probes/kprobes/opt-arm.c b/arch/arm/probes/kprobes/opt-arm.c index c78180172120..dbef34ed933f 100644 --- a/arch/arm/probes/kprobes/opt-arm.c +++ b/arch/arm/probes/kprobes/opt-arm.c @@ -347,10 +347,11 @@ void arch_unoptimize_kprobes(struct list_head *oplist, } int arch_within_optimized_kprobe(struct optimized_kprobe *op, - unsigned long addr) + kprobe_opcode_t *addr) { - return ((unsigned long)op->kp.addr <= addr && - (unsigned long)op->kp.addr + RELATIVEJUMP_SIZE > addr); + return (op->kp.addr <= addr && + op->kp.addr + (RELATIVEJUMP_SIZE / sizeof(kprobe_opcode_t)) > addr); + } void arch_remove_optimized_kprobe(struct optimized_kprobe *op) diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c index c79899abcec8..325ba544883c 100644 --- a/arch/powerpc/kernel/optprobes.c +++ b/arch/powerpc/kernel/optprobes.c @@ -301,8 +301,8 @@ void arch_unoptimize_kprobes(struct list_head *oplist, struct list_head *done_li } } -int arch_within_optimized_kprobe(struct optimized_kprobe *op, unsigned long addr) +int arch_within_optimized_kprobe(struct optimized_kprobe *op, kprobe_opcode_t *addr) { - return ((unsigned long)op->kp.addr <= addr && - (unsigned long)op->kp.addr + RELATIVEJUMP_SIZE > addr); + return (op->kp.addr <= addr && + op->kp.addr + (RELATIVEJUMP_SIZE / sizeof(kprobe_opcode_t)) > addr); } diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c index 71425ebba98a..b4a54a52aa59 100644 --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -367,10 +367,10 @@ int arch_check_optimized_kprobe(struct optimized_kprobe *op) /* Check the addr is within the optimized instructions. */ int arch_within_optimized_kprobe(struct optimized_kprobe *op, - unsigned long addr) + kprobe_opcode_t *addr) { - return ((unsigned long)op->kp.addr <= addr && - (unsigned long)op->kp.addr + op->optinsn.size > addr); + return (op->kp.addr <= addr && + op->kp.addr + op->optinsn.size > addr); } /* Free optimized instruction slot */ diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 3d02917c837b..bb6d1e72a943 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -329,7 +329,7 @@ extern void arch_unoptimize_kprobes(struct list_head *oplist, struct list_head *done_list); extern void arch_unoptimize_kprobe(struct optimized_kprobe *op); extern int arch_within_optimized_kprobe(struct optimized_kprobe *op, - unsigned long addr); + kprobe_opcode_t *addr); extern void opt_pre_handler(struct kprobe *p, struct pt_regs *regs); diff --git a/kernel/kprobes.c b/kernel/kprobes.c index a99fd840b5c9..e30c639fe2cc 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -485,15 +485,15 @@ static int kprobe_queued(struct kprobe *p) * Return an optimized kprobe whose optimizing code replaces * instructions including 'addr' (exclude breakpoint). */ -static struct kprobe *get_optimized_kprobe(unsigned long addr) +static struct kprobe *get_optimized_kprobe(kprobe_opcode_t *addr) { int i; struct kprobe *p = NULL; struct optimized_kprobe *op; /* Don't check i == 0, since that is a breakpoint case. */ - for (i = 1; !p && i < MAX_OPTIMIZED_LENGTH; i++) - p = get_kprobe((void *)(addr - i)); + for (i = 1; !p && i < MAX_OPTIMIZED_LENGTH / sizeof(kprobe_opcode_t); i++) + p = get_kprobe(addr - i); if (p && kprobe_optready(p)) { op = container_of(p, struct optimized_kprobe, kp); @@ -967,7 +967,7 @@ static void __arm_kprobe(struct kprobe *p) lockdep_assert_held(&text_mutex); /* Find the overlapping optimized kprobes. */ - _p = get_optimized_kprobe((unsigned long)p->addr); + _p = get_optimized_kprobe(p->addr); if (unlikely(_p)) /* Fallback to unoptimized kprobe */ unoptimize_kprobe(_p, true); @@ -989,7 +989,7 @@ static void __disarm_kprobe(struct kprobe *p, bool reopt) if (!kprobe_queued(p)) { arch_disarm_kprobe(p); /* If another kprobe was blocked, re-optimize it. */ - _p = get_optimized_kprobe((unsigned long)p->addr); + _p = get_optimized_kprobe(p->addr); if (unlikely(_p) && reopt) optimize_kprobe(_p); }