Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp1369309ybh; Sun, 8 Mar 2020 01:54:48 -0800 (PST) X-Google-Smtp-Source: ADFU+vsQMaOxbD/aZnXsz8NpbLioOOU1dFZn6EyBxkXzK3fJ0A8e42mi6TCY+Rgrjmtb5f/ciA6Q X-Received: by 2002:aca:ad54:: with SMTP id w81mr8302248oie.172.1583661288533; Sun, 08 Mar 2020 01:54:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583661288; cv=none; d=google.com; s=arc-20160816; b=JxqmqW/+Y33MuThRmE+KyhuoM+YXDPgPmOq/7b7cSnqQ5zY0Q8I383Q4OocKRhPCkm y3BsS/FszagGM3Bkwx09V/PDVeVif9v+umzfFB567e7nQpxCDaN+UhmH+NAxH1bsG8iM Rxhn6dtlDBrV5v9yGjuRZXJwWRjT53qie8SnubpFM7kOBZA45CJf5WaMR6Q3fsWuOEo7 RIEP1HB0ao6MsNrKLsOpWCIqwOjDMHyG+jo7FBcGA11sd3zK3LqnucBdRruZjdD6dbbS OAaRU2WI6/1bGUdIEgo6pQIBjmYLWjMvBjW8UFRM/fQojVLrx92fJuS0pZHI09RCK0L2 QZpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=28Q2EwggePJKeUzxJXf5yW5CGr19hSOhg0zGEI8zzoY=; b=vdQJbO+TpluvlcHs6UrJGwX0fq8bK2UwrLxPFoitVRpm31/5MDv7RwCph4Q6prKJPb oCeS/hCwFZl17a/osLORE1Bg1D31X8OI9V7GBo0IVvmLeoTTwYlAqiudHyVM7ZO4E/DR wBJmQIQs42UjE1Ss7AWu8Gm6vPjIwYC7L6WWfffrPLKohLZQZB/ID/KWOc6OHn7C7Ri4 ulGo/fJKxsb5TAZsrZzkKzMCxI9sHTSlJ96EDPpH9uDM/+68ZKZ+sOyl9cImTJaBsyRr GPQdPh4G8kYEmVBZeN3nyMAl9yrynCWV/2dqEkr6fHN7HEkosOmSr81/gDEM+N/FiG/Y DDrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ILwKeyhs; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h14si4761967otn.229.2020.03.08.01.54.37; Sun, 08 Mar 2020 01:54:48 -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=pass header.i=@kernel.org header.s=default header.b=ILwKeyhs; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726645AbgCHJxw (ORCPT + 99 others); Sun, 8 Mar 2020 05:53:52 -0400 Received: from mail.kernel.org ([198.145.29.99]:38182 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726674AbgCHJxt (ORCPT ); Sun, 8 Mar 2020 05:53:49 -0400 Received: from localhost.localdomain (unknown [89.208.247.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 98AFD2084E; Sun, 8 Mar 2020 09:53:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583661228; bh=vOPL8owgSgHX9PhVmLyiyNWhrKKGWBWr9Xmd6jc428Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ILwKeyhsd6982qjaUQJRvl39FmYnrOLOuWH1SlhJ59HzVUtZHnuy6I0NtkIEOY4lf iVTai79VidqtS7UMB2Zyi7M4n9NYwRYygwzj+eQOFfqCdD4I+himIPosKG8D2XwBiz hd8KYJJxgSShjgWRn+8BwX2MjB3PNCgz0xugvjfY= From: guoren@kernel.org To: paul.walmsley@sifive.com, palmer@dabbelt.com, Anup.Patel@wdc.com, greentime.hu@sifive.com Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, arnd@arndb.de, linux-csky@vger.kernel.org, linux-riscv@lists.infradead.org, Guo Ren , Dave Martin Subject: [RFC PATCH V3 11/11] riscv: Add sigcontext save/restore Date: Sun, 8 Mar 2020 17:49:54 +0800 Message-Id: <20200308094954.13258-12-guoren@kernel.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20200308094954.13258-1-guoren@kernel.org> References: <20200308094954.13258-1-guoren@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Guo Ren This patch add sigcontext save/restore and it's very similar to fpu. Signed-off-by: Guo Ren --- arch/riscv/include/uapi/asm/sigcontext.h | 1 + arch/riscv/kernel/signal.c | 40 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/arch/riscv/include/uapi/asm/sigcontext.h b/arch/riscv/include/uapi/asm/sigcontext.h index 84f2dfcfdbce..f74b3c814423 100644 --- a/arch/riscv/include/uapi/asm/sigcontext.h +++ b/arch/riscv/include/uapi/asm/sigcontext.h @@ -17,6 +17,7 @@ struct sigcontext { struct user_regs_struct sc_regs; union __riscv_fp_state sc_fpregs; + struct __riscv_v_state sc_vregs; }; #endif /* _UAPI_ASM_RISCV_SIGCONTEXT_H */ diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c index 17ba190e84a5..4295c00e8934 100644 --- a/arch/riscv/kernel/signal.c +++ b/arch/riscv/kernel/signal.c @@ -83,6 +83,40 @@ static long save_fp_state(struct pt_regs *regs, #define restore_fp_state(task, regs) (0) #endif +#ifdef CONFIG_VECTOR +static long restore_v_state(struct pt_regs *regs, + struct __riscv_v_state *sc_vregs) +{ + long err; + struct __riscv_v_state __user *state = sc_vregs; + + err = __copy_from_user(¤t->thread.vstate, state, sizeof(*state)); + if (unlikely(err)) + return err; + + vstate_restore(current, regs); + + return err; +} + +static long save_v_state(struct pt_regs *regs, + struct __riscv_v_state *sc_vregs) +{ + long err; + struct __riscv_v_state __user *state = sc_vregs; + + vstate_save(current, regs); + err = __copy_to_user(state, ¤t->thread.vstate, sizeof(*state)); + if (unlikely(err)) + return err; + + return err; +} +#else +#define save_v_state(task, regs) (0) +#define restore_v_state(task, regs) (0) +#endif + static long restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) { @@ -92,6 +126,9 @@ static long restore_sigcontext(struct pt_regs *regs, /* Restore the floating-point state. */ if (has_fpu) err |= restore_fp_state(regs, &sc->sc_fpregs); + /* Restore the vector state. */ + if (has_vector) + err |= restore_v_state(regs, &sc->sc_vregs); return err; } @@ -145,6 +182,9 @@ static long setup_sigcontext(struct rt_sigframe __user *frame, /* Save the floating-point state. */ if (has_fpu) err |= save_fp_state(regs, &sc->sc_fpregs); + /* Save the vector state. */ + if (has_vector) + err |= save_v_state(regs, &sc->sc_vregs); return err; } -- 2.17.0