Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp556649ybt; Fri, 10 Jul 2020 06:50:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxxVL55mYL4QZU729Nk2syTL8BGopXnsqmVl4fVqCdfIkbTTHlaHo6fD4bhYJfgbEINATah X-Received: by 2002:a17:906:9387:: with SMTP id l7mr58959282ejx.274.1594389050975; Fri, 10 Jul 2020 06:50:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594389050; cv=none; d=google.com; s=arc-20160816; b=YRCJz5QssySbDYyJhobIMG2hIgI6pYFO4LioLlyusqgYnXxSWI7C49Rmds3Fe7z9WZ 0xb8ZJUvGJgVP94OVG7XG8KCpINgTy5fFTgIpRzmxw67KagvPmzzC5awN5G+yUjqaAxs wMnfwYI8oHddpLXELxNZPA13r+N1LRn85A1s4/I6wgTVOykdrQ1lWPEfB/iFV5im5qnV ibmjx4oc1pRXDD+XPDNBF06MGwMjmDWo6WLNgrzODIQsmewJBW258eqgknYyNJuvEqEL S9MP0HR/ptE0QqPm3/DNbWFX46ABn9owyMWX3FHiIfpvVYdWs4R55AyELVMa+3obep+y 73QQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=ftUjo8/D+te6PGr13fyKoPZlgB3ENcXncgvGuoPe7IA=; b=BmB/opWviXdyTYDbEU9MaJDGJklW4sOQ1t2O6Mg+7VErZ/Mfi2lOL3RiEv0lp1sPsL nqIvMgttO2cxFdsQ6lNjB9MjIEveU8YAonsKQyrY/XM/LXQARKIGaU+rdJWWzBwA9Jcp 9IvJCUwGEPue8qTjCb48NNtDVXv1wgi0My42Qwc9kwaG56SShnZUIIST5LBVb+KN783o 8URjUaALyz5KMflTXzzyL0BfOwZo6g/E1XREBrMB2dbKqzs+jEZP3h70aBXvGMu6Udkv s55IwMukOOZQvZjusGA0cFwyLauFXfyw+SeG36Lq9eUA9ez7kBhYxdjYpF3HWN6UPlGd nQ1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=pr0Ks08N; 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 d25si3861052eja.521.2020.07.10.06.50.27; Fri, 10 Jul 2020 06:50:50 -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=default header.b=pr0Ks08N; 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 S1727955AbgGJNuX (ORCPT + 99 others); Fri, 10 Jul 2020 09:50:23 -0400 Received: from mail.kernel.org ([198.145.29.99]:43714 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726965AbgGJNuW (ORCPT ); Fri, 10 Jul 2020 09:50:22 -0400 Received: from devnote2 (NE2965lan1.rev.em-net.ne.jp [210.141.244.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 075632064B; Fri, 10 Jul 2020 13:50:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1594389022; bh=In0YOJkA3w7O35oZQkhR6Xs3Z6653LLM+6Ev004T7dg=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=pr0Ks08N4TqEHRkkVNv/YzDtzu1bHPCyMMe1BkNX3T+JxjVueFzwsIadyMRsA8U/d sgDd2o4xNZqOv3gYmuYMo4SPJt82ZnVZJ6xXAb7qU0opCl6xhYh0FsRxwQ0hyAtW18 RljlWhtXhPIjUATorUHl1BRmj0VrBlnSUTJXJicI= Date: Fri, 10 Jul 2020 22:50:17 +0900 From: Masami Hiramatsu To: guoren@kernel.org Cc: palmerdabbelt@google.com, paul.walmsley@sifive.com, anup@brainfault.org, greentime.hu@sifive.com, zong.li@sifive.com, me@packi.ch, bjorn.topel@gmail.com, atish.patra@wdc.com, penberg@kernel.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-csky@vger.kernel.org, Guo Ren Subject: Re: [PATCH v2 6/6] riscv: Add KPROBES_ON_FTRACE supported Message-Id: <20200710225017.5ce329485e911f99e17cd483@kernel.org> In-Reply-To: <1594261154-69745-7-git-send-email-guoren@kernel.org> References: <1594261154-69745-1-git-send-email-guoren@kernel.org> <1594261154-69745-7-git-send-email-guoren@kernel.org> X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Guo, On Thu, 9 Jul 2020 02:19:14 +0000 guoren@kernel.org wrote: > +/* Ftrace callback handler for kprobes -- called under preepmt disabed */ > +void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, > + struct ftrace_ops *ops, struct pt_regs *regs) > +{ > + struct kprobe *p; > + struct kprobe_ctlblk *kcb; > + > + p = get_kprobe((kprobe_opcode_t *)ip); > + if (unlikely(!p) || kprobe_disabled(p)) > + return; > + > + kcb = get_kprobe_ctlblk(); > + if (kprobe_running()) { > + kprobes_inc_nmissed_count(p); > + } else { > + /* > + * The regs->epc hasn't been saved by SAVE_ALL in mcount-dyn.S > + * So no need to resume it, just for kprobe handler. > + */ > + instruction_pointer_set(regs, ip); > + __this_cpu_write(current_kprobe, p); > + kcb->kprobe_status = KPROBE_HIT_ACTIVE; > + if (!p->pre_handler || !p->pre_handler(p, regs)) { > + /* > + * Emulate singlestep (and also recover regs->pc) > + * as if there is a nop > + */ > + instruction_pointer_set(regs, > + (unsigned long)p->addr + MCOUNT_INSN_SIZE); > + if (unlikely(p->post_handler)) { > + kcb->kprobe_status = KPROBE_HIT_SSDONE; > + p->post_handler(p, regs, 0); > + } Hmm, don't you need restoring the previous instruction pointer here? If you don't support modifying the instruction pointer in the handler, it must not be compatible with kprobes. Now BPF function override and function error injection depends on this behevior, so could you consider to support it in the "ftrace" implementation at first? (And if it is enabled, you can enable the livepatch on RISCV too) Thank you, > + } > + > + /* > + * If pre_handler returns !0, it changes regs->pc. We have to > + * skip emulating post_handler. > + */ > + __this_cpu_write(current_kprobe, NULL); > + } > +} > +NOKPROBE_SYMBOL(kprobe_ftrace_handler); > + > +int arch_prepare_kprobe_ftrace(struct kprobe *p) > +{ > + p->ainsn.api.insn = NULL; > + return 0; > +} > -- > 2.7.4 > -- Masami Hiramatsu