From nobody Wed Nov 27 14:22:52 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1698808205826649.339427749417; Tue, 31 Oct 2023 20:10:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qy1au-0003xn-Hd; Tue, 31 Oct 2023 23:08:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qy1aq-0003wA-Dv for qemu-devel@nongnu.org; Tue, 31 Oct 2023 23:08:32 -0400 Received: from mail.loongson.cn ([114.242.206.163]) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qy1am-0005qx-TG for qemu-devel@nongnu.org; Tue, 31 Oct 2023 23:08:32 -0400 Received: from loongson.cn (unknown [10.2.5.185]) by gateway (Coremail) with SMTP id _____8Cx2eoqwUFl1yM2AA--.35204S3; Wed, 01 Nov 2023 11:08:26 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.185]) by localhost.localdomain (Coremail) with SMTP id AQAAf8CxvdwdwUFltsk3AA--.55379S8; Wed, 01 Nov 2023 11:08:25 +0800 (CST) From: Song Gao To: qemu-devel@nongnu.org Cc: richard.henderson@linaro.org, philmd@linaro.org, laurent@vivier.eu, maobibo@loongson.cn Subject: [PATCH v2 6/6] linux-user/loongarch64: Add LASX sigcontext save/restore Date: Wed, 1 Nov 2023 11:08:16 +0800 Message-Id: <20231101030816.2353416-7-gaosong@loongson.cn> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231101030816.2353416-1-gaosong@loongson.cn> References: <20231101030816.2353416-1-gaosong@loongson.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: AQAAf8CxvdwdwUFltsk3AA--.55379S8 X-CM-SenderInfo: 5jdr20tqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=114.242.206.163; envelope-from=gaosong@loongson.cn; helo=mail.loongson.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1698808207574100002 Content-Type: text/plain; charset="utf-8" Signed-off-by: Song Gao Reviewed-by: Richard Henderson --- linux-user/loongarch64/signal.c | 68 ++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/linux-user/loongarch64/signal.c b/linux-user/loongarch64/signa= l.c index 9c9b446a91..39ea82c814 100644 --- a/linux-user/loongarch64/signal.c +++ b/linux-user/loongarch64/signal.c @@ -49,6 +49,14 @@ struct target_lsx_context { abi_uint fcsr; } QEMU_ALIGNED(LSX_CTX_ALIGN); =20 +#define LASX_CTX_MAGIC 0x41535801 +#define LASX_CTX_ALIGN 32 +struct target_lasx_context { + abi_ulong regs[4 * 32]; + abi_ulong fcc; + abi_uint fcsr; +} QEMU_ALIGNED(LASX_CTX_ALIGN); + #define CONTEXT_INFO_ALIGN 16 struct target_sctx_info { abi_uint magic; @@ -93,6 +101,7 @@ struct extctx_layout { unsigned int flags; struct ctx_layout fpu; struct ctx_layout lsx; + struct ctx_layout lasx; struct ctx_layout end; }; =20 @@ -125,10 +134,12 @@ static abi_ptr setup_extcontext(CPULoongArchState *en= v, /* For qemu, there is no lazy fp context switch, so fp always present.= */ extctx->flags =3D SC_USED_FP; =20 - if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { + if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, ASXE)) { + sp =3D extframe_alloc(extctx, &extctx->lasx, + sizeof(struct target_lasx_context), LASX_CTX_ALIGN= , sp); + } else if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { sp =3D extframe_alloc(extctx, &extctx->lsx, sizeof(struct target_lsx_context), LSX_CTX_ALIGN, = sp); - } else { sp =3D extframe_alloc(extctx, &extctx->fpu, sizeof(struct target_fpu_context), FPU_CTX_ALIGN, = sp); @@ -155,7 +166,24 @@ static void setup_sigframe(CPULoongArchState *env, * Set extension context */ =20 - if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { + if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, ASXE)) { + struct target_lasx_context *lasx_ctx; + info =3D extctx->lasx.haddr; + + __put_user(LASX_CTX_MAGIC, &info->magic); + __put_user(extctx->lasx.size, &info->size); + + lasx_ctx =3D (struct target_lasx_context *)(info + 1); + + for (i =3D 0; i < 32; ++i) { + __put_user(env->fpr[i].vreg.UD(0), &lasx_ctx->regs[4 * i]); + __put_user(env->fpr[i].vreg.UD(1), &lasx_ctx->regs[4 * i + 1]); + __put_user(env->fpr[i].vreg.UD(2), &lasx_ctx->regs[4 * i + 2]); + __put_user(env->fpr[i].vreg.UD(3), &lasx_ctx->regs[4 * i + 3]); + } + __put_user(read_fcc(env), &lasx_ctx->fcc); + __put_user(env->fcsr0, &lasx_ctx->fcsr); + } else if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { struct target_lsx_context *lsx_ctx; info =3D extctx->lsx.haddr; =20 @@ -230,6 +258,15 @@ static bool parse_extcontext(struct extctx_layout *ext= ctx, abi_ptr frame) extctx->lsx.size =3D size; extctx->size +=3D size; break; + case LASX_CTX_MAGIC: + if (size < (sizeof(struct target_sctx_info) + + sizeof(struct target_lasx_context))) { + return false; + } + extctx->lasx.gaddr =3D frame; + extctx->lasx.size =3D size; + extctx->size +=3D size; + break; default: return false; } @@ -250,7 +287,21 @@ static void restore_sigframe(CPULoongArchState *env, __get_user(env->gpr[i], &sc->sc_regs[i]); } =20 - if (extctx->lsx.haddr) { + if (extctx->lasx.haddr) { + struct target_lasx_context *lasx_ctx =3D + extctx->lasx.haddr + sizeof(struct target_sctx_info); + + for (i =3D 0; i < 32; ++i) { + __get_user(env->fpr[i].vreg.UD(0), &lasx_ctx->regs[4 * i]); + __get_user(env->fpr[i].vreg.UD(1), &lasx_ctx->regs[4 * i + 1]); + __get_user(env->fpr[i].vreg.UD(2), &lasx_ctx->regs[4 * i + 2]); + __get_user(env->fpr[i].vreg.UD(3), &lasx_ctx->regs[4 * i + 3]); + } + __get_user(fcc, &lasx_ctx->fcc); + write_fcc(env, fcc); + __get_user(env->fcsr0, &lasx_ctx->fcsr); + restore_fp_status(env); + } else if (extctx->lsx.haddr) { struct target_lsx_context *lsx_ctx =3D extctx->lsx.haddr + sizeof(struct target_sctx_info); =20 @@ -314,7 +365,10 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, return; } =20 - if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { + if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, ASXE)) { + extctx.lasx.haddr =3D (void *)frame + (extctx.lasx.gaddr - frame_a= ddr); + extctx.end.haddr =3D (void *)frame + (extctx.end.gaddr - frame_add= r); + } else if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { extctx.lsx.haddr =3D (void *)frame + (extctx.lsx.gaddr - frame_add= r); extctx.end.haddr =3D (void *)frame + (extctx.end.gaddr - frame_add= r); } else { @@ -364,7 +418,9 @@ long do_rt_sigreturn(CPULoongArchState *env) goto badframe; } =20 - if (extctx.lsx.gaddr) { + if (extctx.lasx.gaddr) { + extctx.lasx.haddr =3D (void *)frame + (extctx.lasx.gaddr - frame_a= ddr); + } else if (extctx.lsx.gaddr) { extctx.lsx.haddr =3D (void *)frame + (extctx.lsx.gaddr - frame_add= r); } else if (extctx.fpu.gaddr) { extctx.fpu.haddr =3D (void *)frame + (extctx.fpu.gaddr - frame_add= r); --=20 2.25.1