From nobody Sat Sep 6 14:44:48 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1756887323; cv=none; d=zohomail.com; s=zohoarc; b=K2nmKBWeDVIc8rdEJjUdZA5gUc8rKSh3egJ9wvqYjlNFuZw/O6FMikCceqoYQoRj5f8Db8uuqlSIA6pedvDCQAIJLFDKr4iXDN6qSJWFwZAv3LdkZc1PrKLYLIlwqeD1gTFfEEQGlK6ypmwD2idotc216myYjR07IVq1Vvr+LiA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756887323; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Y8yvSBFdg6/w+t6lod7oj6WNKUXqjZ+id/3TLdUhnCs=; b=awGeIPQxnuWGH4kzBHvhmD9I7zKZ/HIPyTsKCey0nwQnlT8+LF2j16oJ01BR1hHFi9wGGlnBPqNxz6Upj259tOMHT+CFQWdDpAXryOrUSVmA5karvjinmkl2T23cNrAyrK12uPxL5tTwlRa9iXypIn4ZJsQ27PrBY46EMsXwuSE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 175688732306118.1268369499237; Wed, 3 Sep 2025 01:15:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utidj-0002lm-3p; Wed, 03 Sep 2025 04:14:47 -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 1utidf-0002kp-El; Wed, 03 Sep 2025 04:14:43 -0400 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1utidc-0001ic-GT; Wed, 03 Sep 2025 04:14:42 -0400 Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-24c89867a17so5596995ad.1; Wed, 03 Sep 2025 01:14:39 -0700 (PDT) Received: from lima-default (123.253.189.97.qld.leaptel.network. [123.253.189.97]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-24c9a46bcf1sm8806555ad.3.2025.09.03.01.14.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Sep 2025 01:14:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756887278; x=1757492078; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Y8yvSBFdg6/w+t6lod7oj6WNKUXqjZ+id/3TLdUhnCs=; b=QD78kuM88NIjf1I582Or4hrgAXGFcElkDvv0RDSU975g3cHWTiaKk0sVm07Y+3QicC vGn1TUj2X7RJ8PlxbdaEiKEE4llYKZp74DLrRisn9sBRS/ezTeWlmlj3AUGbzi2tPAe8 CYNz6PBdjL5XrK3vfBvXcwme2vUoeurOao1AYzQeqjp9T9JTGI8ZIcLGFTXTn3TBisi0 cUYVH5ODJqMos/NJMrO7TxNJHqTr+HjmHj1TY/gqweCJdcLk6e2sHcuR8BdKLZ0A1JOc BGWupHf2xBSE54k7ZYXuoolxay2bltzceCBQRqhXWuDoB/eiJTKva4drDjE/KdgsqLV8 PLBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756887278; x=1757492078; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y8yvSBFdg6/w+t6lod7oj6WNKUXqjZ+id/3TLdUhnCs=; b=pZ0Xf8Vf43ck/GmzR+/JZ8M0Pm2KOkvGsMAvWn1tPKO8GEtnFvCkCsWjdCCl/8Qwt/ nQsqtJelXoZ+zzKdwoH+Q/9qsZaBO203C5E9RmSwIdQQuL8Tyr81EbC55PclI6T1Awvh f8UeraBQTpx8GnPKPXeGvKxHfDglmYvw57UvRU8sgb9XDtDjaqKfOGO7rvVtVhT1hG1d hbmcLZ9AK5gCnRxC+4iPfdrXRxJSZ7SdYDGA5UXLGEkOu+MVqMi8bUuritTWT/HexnGL n8UbilMJVP9RDpj2t09KIQ9qAN/5bGde5CufKcW1cpVdcCi6QyAJJMuuyUlQprANHX6o UJDw== X-Forwarded-Encrypted: i=1; AJvYcCU2QUXxvLC3jrfvgTpeGUM2nMiT77Hl8oc+eB9/acEYZdIeT4bQDezt3TDVTYo5vCZ/ji5uW1Z/Jre1@nongnu.org X-Gm-Message-State: AOJu0YzfgD4joUuPqnXZzq4/dNU0DwS9qPGN8vxuz6razTdi3hTEPftY QOvB8FPc0C5W63seruNOY/PJ2NE0jXFEi34N6ziA6+4KOXJ6xn/K/wglXwrCGA== X-Gm-Gg: ASbGncvY5ZsGb6iSuUSxb3q+pvKTzQ8l1UMxFsNt8aMZTDKDXTvcoDQ91O8WVhIY5Iu y6wz4UTN6o9aM6qwJEfKgFlKQZgaAZSqfpBb+ZPWpR9VgIqQK9cHjcrA/a+KugV/9Agv3s+zhTz a+uGAujRBrjLNvyCASm/dmLNbMW2Uw64sQwOdjaJLL/LOiao07Zd2axg1V5Ik6ID6oomO7JbZQa tb5BAEdxLG1rreLSWkV7dD81xCftZcf79MJdWfZX4FY/vZtv8uJiWZTXDbUETtfoxRJLIiR0ClA 75XoMZMy2N7NRpUllNHL8FhedNe4nWrre6qx4/AZef17DZnwZ3nYDJzM+OMdKRekgCo1o6+AX82 rnnX5ZMlxLeOwx91k/ZNrpSAEHG51XiHjKTvJFDtsbuzQMVMwgCmZBXyKbh7p8t9KVcBkTSWmPQ Qvv9A= X-Google-Smtp-Source: AGHT+IGWlSzX5PITXxqII30tvw4U0jA/SpacMQqK+RBFUNSiiBT14jsJVm+aNonu5ibkMVIHcfFwEA== X-Received: by 2002:a17:902:dac2:b0:24a:b5a1:10cd with SMTP id d9443c01a7336-24ab5a1122fmr147329255ad.52.1756887277992; Wed, 03 Sep 2025 01:14:37 -0700 (PDT) From: Nicholas Piggin To: qemu-riscv@nongnu.org Cc: Nicholas Piggin , Laurent Vivier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-devel@nongnu.org Subject: [PATCH v2 1/4] tests/tcg/riscv64: Add a user signal handling test Date: Wed, 3 Sep 2025 18:14:14 +1000 Message-ID: <20250903081417.338515-2-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250903081417.338515-1-npiggin@gmail.com> References: <20250903081417.338515-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::631; envelope-from=npiggin@gmail.com; helo=mail-pl1-x631.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1756887324405116600 Content-Type: text/plain; charset="utf-8" Add a few basic signal handling tests for user emulation. Signed-off-by: Nicholas Piggin --- tests/tcg/riscv64/Makefile.target | 5 + tests/tcg/riscv64/test-signal-handling.c | 303 +++++++++++++++++++++++ 2 files changed, 308 insertions(+) create mode 100644 tests/tcg/riscv64/test-signal-handling.c diff --git a/tests/tcg/riscv64/Makefile.target b/tests/tcg/riscv64/Makefile= .target index 8f4690ac57..0c89c46c4f 100644 --- a/tests/tcg/riscv64/Makefile.target +++ b/tests/tcg/riscv64/Makefile.target @@ -5,6 +5,11 @@ VPATH +=3D $(SRC_PATH)/tests/tcg/riscv64 TESTS +=3D test-div TESTS +=3D noexec =20 +# Test signal handling. +TESTS +=3D test-signal-handling +test-signal-handling: CFLAGS +=3D -march=3Drv64gcv +run-test-signal-handling: QEMU_OPTS +=3D -cpu rv64,v=3Don + # Disable compressed instructions for test-noc TESTS +=3D test-noc test-noc: LDFLAGS =3D -nostdlib -static diff --git a/tests/tcg/riscv64/test-signal-handling.c b/tests/tcg/riscv64/t= est-signal-handling.c new file mode 100644 index 0000000000..e9c0170c74 --- /dev/null +++ b/tests/tcg/riscv64/test-signal-handling.c @@ -0,0 +1,303 @@ +/* + * Test for linux-user signal handling. + * + * This ensures that integer and fp register values are + * saved as expected in the sigcontext, created by a SIGILL. + * + * TODO: Register restore is not explicitly verified, except + * for advancing pc, and the restoring of registers that were + * clobbered by the compiler in the signal handler. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * This horrible hack seems to be required when including + * signal.h and asm/sigcontext.h, to prevent sigcontext + * redefinition by bits/sigcontext.h :( + * + * bits/sigcontext.h does not have the extended state or + * RISCV_V_MAGIC, etc. It could have just been introduced + * as a new type. + */ +#define _BITS_SIGCONTEXT_H 1 +#include + +static uint64_t *initial_gvalues; +static uint64_t *final_gvalues; +static uint64_t *signal_gvalues; +static double *initial_fvalues; +static double *final_fvalues; +static double *signal_fvalues; + +extern unsigned long unimp_addr[]; + +static bool got_signal =3D false; + +#define BT_BUF_SIZE 100 + +static void *find_callchain_root(void) +{ + int nptrs; + void *buffer[BT_BUF_SIZE]; + + nptrs =3D backtrace(buffer, BT_BUF_SIZE); + + return buffer[nptrs - 1]; +} + +static void *callchain_root; + +static void ILL_handler(int signo, siginfo_t *info, void *context) +{ + ucontext_t *uc =3D context; + struct sigcontext *sc =3D (struct sigcontext *)&uc->uc_mcontext; + + got_signal =3D true; + + assert(unimp_addr =3D=3D info->si_addr); + assert(sc->sc_regs.pc =3D=3D (unsigned long)info->si_addr); + + /* Ensure stack unwind through the signal frame is not broken */ + assert(callchain_root =3D=3D find_callchain_root()); + + for (int i =3D 0; i < 31; i++) { + ((uint64_t *)signal_gvalues)[i] =3D ((unsigned long *)&sc->sc_regs= .ra)[i]; + } + + for (int i =3D 0; i < 32; i++) { + ((uint64_t *)signal_fvalues)[i] =3D sc->sc_fpregs.d.f[i]; + } + /* Test sc->sc_fpregs.d.fcsr ? */ + + sc->sc_regs.pc +=3D 4; +} + +static void init_test(void) +{ + int i; + + callchain_root =3D find_callchain_root(); + + initial_gvalues =3D malloc(8 * 31); + memset(initial_gvalues, 0, 8 * 31); + final_gvalues =3D malloc(8 * 31); + memset(final_gvalues, 0, 8 * 31); + signal_gvalues =3D malloc(8 * 31); + memset(signal_gvalues, 0, 8 * 31); + + initial_fvalues =3D malloc(8 * 32); + memset(initial_fvalues, 0, 8 * 32); + for (i =3D 0; i < 32 ; i++) { + initial_fvalues[i] =3D 3.142 * (i + 1); + } + final_fvalues =3D malloc(8 * 32); + memset(final_fvalues, 0, 8 * 32); + signal_fvalues =3D malloc(8 * 32); + memset(signal_fvalues, 0, 8 * 32); +} + +static void run_test(void) +{ + asm volatile( + /* Save initial values from gp registers */ +" mv t0, %[initial_gvalues] \n" +" sd x1, 0x0(t0) \n" +" sd x2, 0x8(t0) \n" +" sd x3, 0x10(t0) \n" +" sd x4, 0x18(t0) \n" +" sd x5, 0x20(t0) \n" +" sd x6, 0x28(t0) \n" +" sd x7, 0x30(t0) \n" +" sd x8, 0x38(t0) \n" +" sd x9, 0x40(t0) \n" +" sd x10, 0x48(t0) \n" +" sd x11, 0x50(t0) \n" +" sd x12, 0x58(t0) \n" +" sd x13, 0x60(t0) \n" +" sd x14, 0x68(t0) \n" +" sd x15, 0x70(t0) \n" +" sd x16, 0x78(t0) \n" +" sd x17, 0x80(t0) \n" +" sd x18, 0x88(t0) \n" +" sd x19, 0x90(t0) \n" +" sd x20, 0x98(t0) \n" +" sd x21, 0xa0(t0) \n" +" sd x22, 0xa8(t0) \n" +" sd x23, 0xb0(t0) \n" +" sd x24, 0xb8(t0) \n" +" sd x25, 0xc0(t0) \n" +" sd x26, 0xc8(t0) \n" +" sd x27, 0xd0(t0) \n" +" sd x28, 0xd8(t0) \n" +" sd x29, 0xe0(t0) \n" +" sd x30, 0xe8(t0) \n" +" sd x31, 0xf0(t0) \n" + /* Load initial values into float registers */ +" mv t0, %[initial_fvalues] \n" +" fld f0, 0x0(t0) \n" +" fld f1, 0x8(t0) \n" +" fld f2, 0x10(t0) \n" +" fld f3, 0x18(t0) \n" +" fld f4, 0x20(t0) \n" +" fld f5, 0x28(t0) \n" +" fld f6, 0x30(t0) \n" +" fld f7, 0x38(t0) \n" +" fld f8, 0x40(t0) \n" +" fld f9, 0x48(t0) \n" +" fld f10, 0x50(t0) \n" +" fld f11, 0x58(t0) \n" +" fld f12, 0x60(t0) \n" +" fld f13, 0x68(t0) \n" +" fld f14, 0x70(t0) \n" +" fld f15, 0x78(t0) \n" +" fld f16, 0x80(t0) \n" +" fld f17, 0x88(t0) \n" +" fld f18, 0x90(t0) \n" +" fld f19, 0x98(t0) \n" +" fld f20, 0xa0(t0) \n" +" fld f21, 0xa8(t0) \n" +" fld f22, 0xb0(t0) \n" +" fld f23, 0xb8(t0) \n" +" fld f24, 0xc0(t0) \n" +" fld f25, 0xc8(t0) \n" +" fld f26, 0xd0(t0) \n" +" fld f27, 0xd8(t0) \n" +" fld f28, 0xe0(t0) \n" +" fld f29, 0xe8(t0) \n" +" fld f30, 0xf0(t0) \n" +" fld f31, 0xf8(t0) \n" + /* Trigger the SIGILL */ +".global unimp_addr \n" +"unimp_addr: \n" +" unimp \n" +" nop \n" + /* Save final values from gp registers */ +" mv t0, %[final_gvalues] \n" +" sd x1, 0x0(t0) \n" +" sd x2, 0x8(t0) \n" +" sd x3, 0x10(t0) \n" +" sd x4, 0x18(t0) \n" +" sd x5, 0x20(t0) \n" +" sd x6, 0x28(t0) \n" +" sd x7, 0x30(t0) \n" +" sd x8, 0x38(t0) \n" +" sd x9, 0x40(t0) \n" +" sd x10, 0x48(t0) \n" +" sd x11, 0x50(t0) \n" +" sd x12, 0x58(t0) \n" +" sd x13, 0x60(t0) \n" +" sd x14, 0x68(t0) \n" +" sd x15, 0x70(t0) \n" +" sd x16, 0x78(t0) \n" +" sd x17, 0x80(t0) \n" +" sd x18, 0x88(t0) \n" +" sd x19, 0x90(t0) \n" +" sd x20, 0x98(t0) \n" +" sd x21, 0xa0(t0) \n" +" sd x22, 0xa8(t0) \n" +" sd x23, 0xb0(t0) \n" +" sd x24, 0xb8(t0) \n" +" sd x25, 0xc0(t0) \n" +" sd x26, 0xc8(t0) \n" +" sd x27, 0xd0(t0) \n" +" sd x28, 0xd8(t0) \n" +" sd x29, 0xe0(t0) \n" +" sd x30, 0xe8(t0) \n" +" sd x31, 0xf0(t0) \n" + /* Save final values from float registers */ +" mv t0, %[final_fvalues] \n" +" fsd f0, 0x0(t0) \n" +" fsd f1, 0x8(t0) \n" +" fsd f2, 0x10(t0) \n" +" fsd f3, 0x18(t0) \n" +" fsd f4, 0x20(t0) \n" +" fsd f5, 0x28(t0) \n" +" fsd f6, 0x30(t0) \n" +" fsd f7, 0x38(t0) \n" +" fsd f8, 0x40(t0) \n" +" fsd f9, 0x48(t0) \n" +" fsd f10, 0x50(t0) \n" +" fsd f11, 0x58(t0) \n" +" fsd f12, 0x60(t0) \n" +" fsd f13, 0x68(t0) \n" +" fsd f14, 0x70(t0) \n" +" fsd f15, 0x78(t0) \n" +" fsd f16, 0x80(t0) \n" +" fsd f17, 0x88(t0) \n" +" fsd f18, 0x90(t0) \n" +" fsd f19, 0x98(t0) \n" +" fsd f20, 0xa0(t0) \n" +" fsd f21, 0xa8(t0) \n" +" fsd f22, 0xb0(t0) \n" +" fsd f23, 0xb8(t0) \n" +" fsd f24, 0xc0(t0) \n" +" fsd f25, 0xc8(t0) \n" +" fsd f26, 0xd0(t0) \n" +" fsd f27, 0xd8(t0) \n" +" fsd f28, 0xe0(t0) \n" +" fsd f29, 0xe8(t0) \n" +" fsd f30, 0xf0(t0) \n" +" fsd f31, 0xf8(t0) \n" + : "=3Dm" (initial_gvalues), + "=3Dm" (final_gvalues), + "=3Dm" (final_fvalues) + : "m" (initial_fvalues), + [initial_gvalues] "r" (initial_gvalues), + [initial_fvalues] "r" (initial_fvalues), + [final_gvalues] "r" (final_gvalues), + [final_fvalues] "r" (final_fvalues) + : "t0", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"); + + assert(got_signal); + + /* + * x4 / t0 is used in the asm so it has to be handled specially + * and is not a simple equality. + */ + assert(initial_gvalues[4] =3D=3D (unsigned long)initial_gvalues); + assert(signal_gvalues[4] =3D=3D (unsigned long)initial_fvalues); + assert(final_gvalues[4] =3D=3D (unsigned long)final_gvalues); + initial_gvalues[4] =3D final_gvalues[4] =3D signal_gvalues[4] =3D 0; + + /* + * Ensure registers match before, inside, and after signal + * handler. + */ + assert(!memcmp(initial_gvalues, final_gvalues, 8 * 31)); + assert(!memcmp(initial_gvalues, signal_gvalues, 8 * 31)); + assert(!memcmp(initial_fvalues, final_fvalues, 8 * 32)); + assert(!memcmp(initial_fvalues, signal_fvalues, 8 * 32)); +} + +int main(void) +{ + struct sigaction act =3D { 0 }; + + act.sa_flags =3D SA_SIGINFO; + act.sa_sigaction =3D &ILL_handler; + if (sigaction(SIGILL, &act, NULL) =3D=3D -1) { + perror("sigaction"); + exit(EXIT_FAILURE); + } + + init_test(); + + run_test(); +} --=20 2.51.0 From nobody Sat Sep 6 14:44:48 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1756887422; cv=none; d=zohomail.com; s=zohoarc; b=eDgwLbq2hS2hns7l7Yrj6v3eMeh4nsIZWAJrNCE4Nh7TROL8rfhETN23xwC/pxe/MMq6OGfb34hn/fRayuosZiAesauE3/OsmUVOM59+Q4DS2drTa2ZcZyQrNPkFpcP24GrimLcKcE9irt2+3XHRBZ9akDvX0w/c9LOxgUnsoIQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756887422; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=C417OsYO0i831zsFFAbegUg0Ax4p35RqpiQra3XZSak=; b=Xobx7ZznFGs31EELsq38IlvHnl7vnnq/BnnuDK7zb+HmX7+7kBIudWsPbQVxqCZ5VpGU1RUBMnxHBmQIq5gZwv+YuWMHjXPxJUWh+CFDgnTW0TE2I9dfQxm+Vf1yoLhxcuZ8ECkNR8zRxNjAfnVrDvPo0+LOu6vdKuC42TkqeJU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 175688742287546.8641491606636; Wed, 3 Sep 2025 01:17:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utidl-0002nC-HV; Wed, 03 Sep 2025 04:14:49 -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 1utidi-0002lp-MZ; Wed, 03 Sep 2025 04:14:46 -0400 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1utidg-0001j9-PS; Wed, 03 Sep 2025 04:14:46 -0400 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-24a9ccbf10dso34895295ad.3; Wed, 03 Sep 2025 01:14:44 -0700 (PDT) Received: from lima-default (123.253.189.97.qld.leaptel.network. [123.253.189.97]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-24c9a46bcf1sm8806555ad.3.2025.09.03.01.14.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Sep 2025 01:14:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756887282; x=1757492082; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=C417OsYO0i831zsFFAbegUg0Ax4p35RqpiQra3XZSak=; b=lF8h/lTXbwtPJM4e0PZkl6kBA4j7WzKv5GJIQoxhWeD8IjuSNSevLEAVO/WErNWgAy ChA64LUAWwa7IpjU+FXoT8aZE6pSgKleIOq9hKQzVN84XuMOxD52cly4qIjkS7jxnQe5 pyF/07db+GeAlnoI7AHntjBOp3iHaYkEjl+1jIr+p5Xp+3LLJnUlF+kBzVGI6HOES5qj l7j33kAWO3tW5QkYYbLVc73sYKRori+jWcHognaiArnsDAasdsErYy0/GFSbykbMhWdn EDQQRHUUxzbJF3TMojuLdTM8PIrvGnP822qFU5c4wQeaNxqrvTh0mWeg1g5et1u8bOSW LrbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756887282; x=1757492082; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C417OsYO0i831zsFFAbegUg0Ax4p35RqpiQra3XZSak=; b=EVWpk4UzLm3XKOrH8hZVHCp8hKIS5ypiBV8crXaWAzvDeFDZ0aklcJbJ8hPk0oJzkk on6oQ8b6PW8BAiuO5zOHj2Vig9kCOzgXtBHw9qdiCIqeqa0x8SL6V0MfdMysMvw/IGN1 wta4kiP7SKqKfcY86dY/3mMSiZFMKPxOnINGdXzrXKybx5D76IzXBXNUs577ZvlURslz qHTXm+QxIr1SfXhehzSLs1oxY7S1FKkucdZXXB/m2S0BOdyHw2/WpXui7xhG5dcLjtcw EeKE2yLa7at2DY7xGfh8mqFUyzLaTjUnAe9iOWoVi41GafHTZiFdPE/0xeS6sDrSvP88 xooA== X-Forwarded-Encrypted: i=1; AJvYcCUh21UA+pdpASMGsFTtOpjeoQDmrj7BqQWKn5v/MTQFmm8n2eQZ+Jc8RSw6Nq1zUKfqGEzi5ooDrCnw@nongnu.org X-Gm-Message-State: AOJu0Yxyavk+x8wzhqBr+yIXJx2MQ6gnpIPKL9YoOg/k7nhcR7NknuLT 7S3081jPjQawHT0MwjxcehDEKkENtlvlPZuF0AG4BC5pWM0gmADW6i77A5v/7Q== X-Gm-Gg: ASbGncvW2kclcfQuOmhOmOsRTg3WaILIn9lddL75abEc86ouvtpAs3G5+LqBS9JCewT /SBvJSKNZ0XulPD40icHtW98l4DQobH42p4byUE25I9XAGUN2IJ8qEOAwHDIZUS8f8XWmkh+G9f RfDgKFkGVN0GEAzYugOrK8aFguNQZ6jVjrJbzAC0El7tV3TbjpDcVyCNoc4IoZLGSLqScU+7XYc zxD2btOty7ok51xKr2IHivekyXtsdgFMeJ/EzOkiUcVFwYTBqB1hpy6T3ZGoVOJvbVDeT12LEYz vwE/canx+u/oFotx6wsQNgMVvopFmOjrC6prl5iCyod5E8mt+uX7ElTd2gnoNgIXz9cGKQWhL9p 5ANuoaYL+pFlVgJ9uDaLdfMCV7YspMI+SRUc313SwUolWzeT9JniN2l1tftI3vzWcBop+YRypX1 s21CI= X-Google-Smtp-Source: AGHT+IHbUrsbNIvdSnK/A2EmhCVdvU4vKnLsOywoKrYfS8w8aPPtCvwJq9411siQucImAiDDCudzOA== X-Received: by 2002:a17:902:ec85:b0:248:d84a:91df with SMTP id d9443c01a7336-24944a5c73cmr201795565ad.26.1756887282077; Wed, 03 Sep 2025 01:14:42 -0700 (PDT) From: Nicholas Piggin To: qemu-riscv@nongnu.org Cc: Nicholas Piggin , Laurent Vivier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-devel@nongnu.org Subject: [PATCH v2 2/4] linux-user/riscv: Add extended state to sigcontext Date: Wed, 3 Sep 2025 18:14:15 +1000 Message-ID: <20250903081417.338515-3-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250903081417.338515-1-npiggin@gmail.com> References: <20250903081417.338515-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62a; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1756887425192116600 Content-Type: text/plain; charset="utf-8" Linux/riscv has extended the sigcontext with padding and an extended state structure that can save various optional features like vector in a flexible format. Update the linux-user signal handling to this new structure. Signed-off-by: Nicholas Piggin --- linux-user/riscv/signal.c | 71 ++++++++++++++++++++++++++----- linux-user/riscv/vdso-asmoffset.h | 4 +- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c index 358fa1d82d..4ef55d0848 100644 --- a/linux-user/riscv/signal.c +++ b/linux-user/riscv/signal.c @@ -31,14 +31,43 @@ =20 The code below is qemu re-implementation of arch/riscv/kernel/signal.c = */ =20 -struct target_sigcontext { +struct target_gp_state { abi_long pc; abi_long gpr[31]; /* x0 is not present, so all offsets must be -1 */ +}; + +struct target_fp_state { uint64_t fpr[32]; uint32_t fcsr; +}; + +/* The Magic number for signal context frame header. */ +#define END_MAGIC 0x0 + +/* The size of END signal context header. */ +#define END_HDR_SIZE 0x0 + +struct target_ctx_hdr { + uint32_t magic; + uint32_t size; +}; + +struct target_extra_ext_header { + uint32_t __padding[129] __attribute__((aligned(16))); + uint32_t reserved; + struct target_ctx_hdr hdr; +}; + +struct target_sigcontext { + struct target_gp_state sc_regs; + union { + struct target_fp_state sc_fpregs; + struct target_extra_ext_header sc_extdesc; + }; }; /* cf. riscv-linux:arch/riscv/include/uapi/asm/ptrace.h */ =20 -QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, fpr) !=3D offsetof_fr= eg0); +QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_fpregs.fpr) !=3D + offsetof_freg0); =20 struct target_ucontext { abi_ulong uc_flags; @@ -79,19 +108,25 @@ static abi_ulong get_sigframe(struct target_sigaction = *ka, =20 static void setup_sigcontext(struct target_sigcontext *sc, CPURISCVState *= env) { + struct target_ctx_hdr *hdr; int i; =20 - __put_user(env->pc, &sc->pc); + __put_user(env->pc, &sc->sc_regs.pc); =20 for (i =3D 1; i < 32; i++) { - __put_user(env->gpr[i], &sc->gpr[i - 1]); + __put_user(env->gpr[i], &sc->sc_regs.gpr[i - 1]); } for (i =3D 0; i < 32; i++) { - __put_user(env->fpr[i], &sc->fpr[i]); + __put_user(env->fpr[i], &sc->sc_fpregs.fpr[i]); } =20 uint32_t fcsr =3D riscv_csr_read(env, CSR_FCSR); - __put_user(fcsr, &sc->fcsr); + __put_user(fcsr, &sc->sc_fpregs.fcsr); + + __put_user(0, &sc->sc_extdesc.reserved); + hdr =3D &sc->sc_extdesc.hdr; + __put_user(END_MAGIC, &hdr->magic); + __put_user(END_HDR_SIZE, &hdr->size); } =20 static void setup_ucontext(struct target_ucontext *uc, @@ -146,20 +181,36 @@ badframe: =20 static void restore_sigcontext(CPURISCVState *env, struct target_sigcontex= t *sc) { + struct target_ctx_hdr *hdr; int i; =20 - __get_user(env->pc, &sc->pc); + __get_user(env->pc, &sc->sc_regs.pc); =20 for (i =3D 1; i < 32; ++i) { - __get_user(env->gpr[i], &sc->gpr[i - 1]); + __get_user(env->gpr[i], &sc->sc_regs.gpr[i - 1]); } for (i =3D 0; i < 32; ++i) { - __get_user(env->fpr[i], &sc->fpr[i]); + __get_user(env->fpr[i], &sc->sc_fpregs.fpr[i]); } =20 uint32_t fcsr; - __get_user(fcsr, &sc->fcsr); + __get_user(fcsr, &sc->sc_fpregs.fcsr); riscv_csr_write(env, CSR_FCSR, fcsr); + + hdr =3D &sc->sc_extdesc.hdr; + uint32_t rsv; + __get_user(rsv, &sc->sc_extdesc.reserved); + if (rsv !=3D 0) { + qemu_log_mask(LOG_GUEST_ERROR, "signal: sigcontext reserved field = is " + "non-zero. Attempting restore anywa= y."); + } + + uint32_t magic; + __get_user(magic, &hdr->magic); + if (magic !=3D END_MAGIC) { + qemu_log_mask(LOG_UNIMP, "signal: unknown extended context header:= " + "0x%08x, ignoring", magic); + } } =20 static void restore_ucontext(CPURISCVState *env, struct target_ucontext *u= c) diff --git a/linux-user/riscv/vdso-asmoffset.h b/linux-user/riscv/vdso-asmo= ffset.h index 123902ef61..92e8ac10ab 100644 --- a/linux-user/riscv/vdso-asmoffset.h +++ b/linux-user/riscv/vdso-asmoffset.h @@ -1,9 +1,9 @@ #ifdef TARGET_ABI32 -# define sizeof_rt_sigframe 0x2b0 +# define sizeof_rt_sigframe 0x3b0 # define offsetof_uc_mcontext 0x120 # define offsetof_freg0 0x80 #else -# define sizeof_rt_sigframe 0x340 +# define sizeof_rt_sigframe 0x440 # define offsetof_uc_mcontext 0x130 # define offsetof_freg0 0x100 #endif --=20 2.51.0 From nobody Sat Sep 6 14:44:48 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1756887323; cv=none; d=zohomail.com; s=zohoarc; b=RqgmU17MRKC+0A4RsGs1iE1YxlMQ9im7uqSGqmKHuniqt6BaAdg1VQlA3/YxYB0DkuQQZJjt7JYd2sk8dgzwx6nMTGqxbz++cu+VUYg6RY1Jn9Bs6NN7pucMVC+ivxPeXL7uNCpDiP0eczLn4znjtxXzBbAe7OomeKJLJaLMMXQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756887323; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=YvRVwijnneGWg1Edja7q4SQVpGJeMep01w/gAcM43ZQ=; b=IWHDm2mgBtUik+p5+3YzfK7kviKah+lefJCjnseiIVNaX6Qs2laVnaeGLY7r0DRsoFjfMNFMTSqyMBVnTb80Kq6qHGklXgw3OZGKld09/++4AAIgBkexDKCWSgPPEfuAlJS11b9y0n/2Y3ESmyrHK6mlDxGfiyLgS8puMBDKaSI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756887323385392.2707957970555; Wed, 3 Sep 2025 01:15:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utidp-0002oZ-Is; Wed, 03 Sep 2025 04:14:53 -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 1utidn-0002np-4h; Wed, 03 Sep 2025 04:14:51 -0400 Received: from mail-pl1-x62e.google.com ([2607:f8b0:4864:20::62e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1utidl-0001jk-5D; Wed, 03 Sep 2025 04:14:50 -0400 Received: by mail-pl1-x62e.google.com with SMTP id d9443c01a7336-248df8d82e2so52931235ad.3; Wed, 03 Sep 2025 01:14:47 -0700 (PDT) Received: from lima-default (123.253.189.97.qld.leaptel.network. [123.253.189.97]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-24c9a46bcf1sm8806555ad.3.2025.09.03.01.14.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Sep 2025 01:14:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756887286; x=1757492086; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YvRVwijnneGWg1Edja7q4SQVpGJeMep01w/gAcM43ZQ=; b=Fs4nHkHpZkJPISI0OlZSYBi6nLoKf/v+FvR0dPrU/756fCFHkJz+SnFLe0KDJ2xHtW MyZow/aFnrGK42jlQSUrwq0n/ZV9R1qy8l/rUvsVIUzkW3gd5EJInCX3uorEosPP0y7w B2Em3fdB01IrWNJ3Y8X5LOWrTIYEyKiVZQhY4ueCPgak9J30WnzBBH46PnREJ5U5ccet AjYE0MM8MqfveAhQsRaoNsOJ8Ae1Dc4veIfReufA/rjtWNDTsZdSNn3jmcbdwNx3RM9m Bdw0y/G/WgKuWWureKJo0Zm3phzRJFWTJESg+O/S//Dw/MKr9o+O2OB+F60B7CJcie1C eRLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756887286; x=1757492086; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YvRVwijnneGWg1Edja7q4SQVpGJeMep01w/gAcM43ZQ=; b=WF532K4yGrlnQHEPenCLLDokjc853xjFOj0rBLRhU/9hFFuftkJz9uDODRBn0NiC2K JQKMu/ha6WSLbyiTCp1md2ddySLB2R84qtw1ftfTzUoGg9I4HxAyq5aEpYTpLA4Qsaql secNiNSxQ8dnhnRn9R4p/V170WI5q0rKRSgIJi5aYD5ompm45tcHZ+AFO/MHJjy+VC8c VdxE27yp6y82h1GWD/aXzsVzKizRFw89VDOjuzHNAeT9id1bFq9J61gnG4tI7LDxpA8c pbL87oFVW6lsDPx9uzzbesUULPxpT8sntYkLuGwouL5TkGE0c4dH4jt0RJIhxzlzezVn uKIg== X-Forwarded-Encrypted: i=1; AJvYcCVF7E9XD7AbwSVz8lxNBNIHKLJelKKISlHGpx2T4CbH2YWRd6xT1taNfN6sHV/AYI3IRdjr4PP9Ckr4@nongnu.org X-Gm-Message-State: AOJu0YxgN5gzrrbM/rH3kgbM38VhwQnRIAfR4HlWiIZZ8A6eI/N67EAY kLSz8maTPpHctVXSkFwbyHHwmQkhOOewrdOSLD0nido/zakzn7K/EPwrWJ06RA== X-Gm-Gg: ASbGncsEpS9MuwmAbKMukBKwtRy2gEo3gCK99sb8cYrwU4djXUOYADkRLbD0iSIek1w /pRfLmVgeKkvZoVJ4xA9F1X4kKyuSQSYcmrLhTYqLJuho26dIQfxMMNq5HE0jgyheGq3Sgpasx7 8fTJS/1cPMbGAq94ffiiQdXVby2gq3pGdZ4L2oSpkbNxYHPeD9M5k25I5fS/hoFiJysEpa7uhin IIkxZYdJR7dLVxF0VfmhpsSwawfokp9M/o46g1LDfy8BYPGY78xjZYL8Pd8HJSNAX43l00qlFCr z8DeEZ72ZKFQ/FLOXdXsFMMXT0yiK9NeC3NYqFeDs9zY5G4/CWGO03fD2rqc/WzrMDpy+Sk1qc8 L4q4E5vcrs+FfSZ7zmBaYFAtNt7qP+zaNptk8F8cVZgeC7J8OBB465E2bnrp1NU7PW55z X-Google-Smtp-Source: AGHT+IHDKngE7z+ISk9X7AAVoYQatEhKUjexYINGxIGIStv4iu8Z5qCxZ9UMqzrd2WYMFM5W/7Gv3Q== X-Received: by 2002:a17:902:f652:b0:249:3eec:15b8 with SMTP id d9443c01a7336-24944908a47mr194442395ad.24.1756887286150; Wed, 03 Sep 2025 01:14:46 -0700 (PDT) From: Nicholas Piggin To: qemu-riscv@nongnu.org Cc: Nicholas Piggin , Laurent Vivier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-devel@nongnu.org Subject: [PATCH v2 3/4] linux-user/riscv: Add vector state to signal context Date: Wed, 3 Sep 2025 18:14:16 +1000 Message-ID: <20250903081417.338515-4-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250903081417.338515-1-npiggin@gmail.com> References: <20250903081417.338515-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::62e; envelope-from=npiggin@gmail.com; helo=mail-pl1-x62e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1756887324197116600 Content-Type: text/plain; charset="utf-8" This enables vector state to be saved and restored across signals. Signed-off-by: Nicholas Piggin --- linux-user/riscv/signal.c | 132 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 4 deletions(-) diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c index 4ef55d0848..6af7f6b0f3 100644 --- a/linux-user/riscv/signal.c +++ b/linux-user/riscv/signal.c @@ -41,7 +41,17 @@ struct target_fp_state { uint32_t fcsr; }; =20 +struct target_v_ext_state { + target_ulong vstart; + target_ulong vl; + target_ulong vtype; + target_ulong vcsr; + target_ulong vlenb; + target_ulong datap; +} __attribute__((aligned(16))); + /* The Magic number for signal context frame header. */ +#define RISCV_V_MAGIC 0x53465457 #define END_MAGIC 0x0 =20 /* The size of END signal context header. */ @@ -106,6 +116,90 @@ static abi_ulong get_sigframe(struct target_sigaction = *ka, return sp; } =20 +static unsigned int get_v_state_size(CPURISCVState *env) +{ + RISCVCPU *cpu =3D env_archcpu(env); + + return sizeof(struct target_ctx_hdr) + + sizeof(struct target_v_ext_state) + + cpu->cfg.vlenb * 32; +} + +static struct target_ctx_hdr *save_v_state(CPURISCVState *env, + struct target_ctx_hdr *hdr) +{ + RISCVCPU *cpu =3D env_archcpu(env); + target_ulong vlenb =3D cpu->cfg.vlenb; + uint32_t riscv_v_sc_size =3D get_v_state_size(env); + struct target_v_ext_state *vs; + target_ulong datap; + int i; + + __put_user(RISCV_V_MAGIC, &hdr->magic); + __put_user(riscv_v_sc_size, &hdr->size); + + vs =3D (struct target_v_ext_state *)(hdr + 1); + datap =3D (unsigned long)(vs + 1); + + __put_user(env->vstart, &vs->vstart); + __put_user(env->vl, &vs->vl); + __put_user(env->vtype, &vs->vtype); + target_ulong vcsr =3D riscv_csr_read(env, CSR_VCSR); + __put_user(vcsr, &vs->vcsr); + __put_user(vlenb, &vs->vlenb); + __put_user(datap, &vs->datap); + + for (i =3D 0; i < 32; i++) { + int j; + for (j =3D 0; j < vlenb; j +=3D 8) { + size_t idx =3D (i * vlenb + j); + __put_user(env->vreg[idx / 8], + (uint64_t *)(unsigned long)(datap + idx)); + } + } + + return (void *)hdr + riscv_v_sc_size; +} + +static void restore_v_state(CPURISCVState *env, + struct target_ctx_hdr *hdr) +{ + RISCVCPU *cpu =3D env_archcpu(env); + target_ulong vlenb =3D cpu->cfg.vlenb; + struct target_v_ext_state *vs; + target_ulong datap; + int i; + + uint32_t size; + __get_user(size, &hdr->size); + if (size !=3D get_v_state_size(env)) { + qemu_log_mask(LOG_GUEST_ERROR, "signal: restoring sigcontext vecto= r " + "state with wrong size header (%u)\= n", + size); + return; + } + + vs =3D (struct target_v_ext_state *)(hdr + 1); + + __get_user(env->vstart, &vs->vstart); + __get_user(env->vl, &vs->vl); + __get_user(env->vtype, &vs->vtype); + target_ulong vcsr; + __get_user(vcsr, &vs->vcsr); + riscv_csr_write(env, CSR_VCSR, vcsr); + __get_user(vlenb, &vs->vlenb); + __get_user(datap, &vs->datap); + + for (i =3D 0; i < 32; i++) { + int j; + for (j =3D 0; j < vlenb; j +=3D 8) { + size_t idx =3D (i * vlenb + j); + __get_user(env->vreg[idx / 8], + (uint64_t *)(unsigned long)(datap + idx)); + } + } +} + static void setup_sigcontext(struct target_sigcontext *sc, CPURISCVState *= env) { struct target_ctx_hdr *hdr; @@ -124,7 +218,11 @@ static void setup_sigcontext(struct target_sigcontext = *sc, CPURISCVState *env) __put_user(fcsr, &sc->sc_fpregs.fcsr); =20 __put_user(0, &sc->sc_extdesc.reserved); + hdr =3D &sc->sc_extdesc.hdr; + if (riscv_has_ext(env, RVV)) { + hdr =3D save_v_state(env, hdr); + } __put_user(END_MAGIC, &hdr->magic); __put_user(END_HDR_SIZE, &hdr->size); } @@ -151,8 +249,13 @@ void setup_rt_frame(int sig, struct target_sigaction *= ka, { abi_ulong frame_addr; struct target_rt_sigframe *frame; + size_t frame_size =3D sizeof(*frame); =20 - frame_addr =3D get_sigframe(ka, env, sizeof(*frame)); + if (riscv_has_ext(env, RVV)) { + frame_size +=3D get_v_state_size(env); + } + + frame_addr =3D get_sigframe(ka, env, frame_size); trace_user_setup_rt_frame(env, frame_addr); =20 if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { @@ -207,9 +310,30 @@ static void restore_sigcontext(CPURISCVState *env, str= uct target_sigcontext *sc) =20 uint32_t magic; __get_user(magic, &hdr->magic); - if (magic !=3D END_MAGIC) { - qemu_log_mask(LOG_UNIMP, "signal: unknown extended context header:= " - "0x%08x, ignoring", magic); + while (magic !=3D END_MAGIC) { + if (magic =3D=3D RISCV_V_MAGIC) { + if (riscv_has_ext(env, RVV)) { + restore_v_state(env, hdr); + } else { + qemu_log_mask(LOG_GUEST_ERROR, "signal: sigcontext has V s= tate " + "but CPU does not."); + } + } else { + qemu_log_mask(LOG_GUEST_ERROR, "signal: unknown extended state= in " + "sigcontext magic=3D0x%08x", ma= gic); + } + + if (hdr->size =3D=3D 0) { + qemu_log_mask(LOG_GUEST_ERROR, "signal: extended state in " + "sigcontext has size 0"); + } + hdr =3D (void *)hdr + hdr->size; + __get_user(magic, &hdr->magic); + } + + if (hdr->size !=3D END_HDR_SIZE) { + qemu_log_mask(LOG_GUEST_ERROR, "signal: extended state end header = has " + "size=3D%u (should be 0)", hdr->siz= e); } } =20 --=20 2.51.0 From nobody Sat Sep 6 14:44:48 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1756887372; cv=none; d=zohomail.com; s=zohoarc; b=Q17fJ3KVbWclEIx2Y9PBP5Tq36pZ2IPHVWieIvbsN8v6RQt8xm6PlUWPtybaTyQrLYXHEYLgeiNARzTv3AvmVhZynb003MuUubcZ8KPl6i7Oda4qHkFHpuQv9iKY4xGhOnRt38tKGSOZE7nNz1UcrirgQzZLjsElFyTfaMlhuLU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756887372; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=dNZ8GUQEcdncKpqq5+93aWhn2/yiYqrWH3RoFbYQvKo=; b=n0JaHEOofzn+ciFDyIgqPou/K/fggcdh4qZvf0zjyCTiljQPniue4FXlv2Wryg10UpWzwz4NMJ1JmZ6wbh1/+eAvx1/X9mrb6AY5f7fJ3n38M9h4puWDnTwdJuE0ZEzWvy0dCqcPWJZSnTtcQApG+ugQ7YYMgwZini5R6zDwXWQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1756887372524302.5762765803761; Wed, 3 Sep 2025 01:16:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1utidv-0002po-Rr; Wed, 03 Sep 2025 04:14:59 -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 1utidr-0002pJ-NW; Wed, 03 Sep 2025 04:14:55 -0400 Received: from mail-pg1-x52a.google.com ([2607:f8b0:4864:20::52a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1utidp-0001kB-Dk; Wed, 03 Sep 2025 04:14:55 -0400 Received: by mail-pg1-x52a.google.com with SMTP id 41be03b00d2f7-b4f8bf49aeaso2010106a12.1; Wed, 03 Sep 2025 01:14:52 -0700 (PDT) Received: from lima-default (123.253.189.97.qld.leaptel.network. [123.253.189.97]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-24c9a46bcf1sm8806555ad.3.2025.09.03.01.14.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Sep 2025 01:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1756887290; x=1757492090; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dNZ8GUQEcdncKpqq5+93aWhn2/yiYqrWH3RoFbYQvKo=; b=XSC5qM5CbS7ocM3fOfBgIE0ZFrBGaJ4VS1sPFK9N++0nVlD2orKWz1AJSKYNFiGtOB p2AIa5NFmduTgpJI6IdKFpYNmE9eXMEPyvH6SrpXuRxkgLx6PcorwzM9hScP68MjsS1k h+oE0bpZn1gUqupm9RPbuCuMRIOkIrLwYBDOa6U+aIZgqKwEylu/jFbbROcaspHRaJ5e CqPCt/v3UKm704VlRb3UACSsHj5Ugv+EGUazq+cHqkDyjJ0je8NRsnqwVyzSshhOaxz7 094sC9noKhXm0GmWEMMzHrLqCZuWlK/TxqO3rGsIaoG5XNKcjtj54QKEk8xtGrJ6KUyK Mggw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756887290; x=1757492090; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dNZ8GUQEcdncKpqq5+93aWhn2/yiYqrWH3RoFbYQvKo=; b=U6Cll6m+XjBPDuZAN4c3BKGzAe/ITeff8/Qm88LB1AfVLsrFSSNZJ0zOUxgx5UVZkA a6XKcVp4HX+UUSJDMZSuJXHohUkA4UC5j9tyen3lFS00SVsB79Vjrr0K58jWeiyR6Nub 80BStatz6orUbwiRfHrqm0rhLJQi6dtvxcCnrglO+HwdyHMqDjEX/V9QDke7IHt4TWl1 GyNxDogfZ3PwbO4GyHJ05h7GYKMO2BfQC1k3BESy+OYP6nEo+5zp7Ms72n0gIzBuzZWh N8C/kX74eDV0Mt4SwdUExeG4hv1lAuwJvAE4k4nLS/j8s+vs3kj0ajhOTVg51tJCnfQp z9Ug== X-Forwarded-Encrypted: i=1; AJvYcCXmgBHYBaaU40GlIRGhW0ZTX4bGB3kIptJVEMUeEOdQwyxyXeU7TYaA/l3zZW3TPfhi5WlO3BooPdrS@nongnu.org X-Gm-Message-State: AOJu0YxSpamA1ytXeB1XFl9dbSf4rwDfNz40HynLhyCbjfaa+7SVUyw9 5RUXXWFJMKQnDMr6ZYX9BAOi6kaP7PnCQQkzwiAdeEjIKUm7ToNIl1vQpFVxqA== X-Gm-Gg: ASbGncumgI+gGXwE6KYXbFca28DwKLBwqTK0m84H8760J02u7DPNXlpLE2XivGM6ZDX imFgr+IUBchRDwWqbK05G9U6L10Wzqh/rR70BRP7FerE1ZcODG3j5e3PUyCEGWlkKvg6fNous7g SRNhLhVQeZUIAMQC+xJo5CU2C6l8QR11n4bRb+HQL2jvjbfaeAVWaO0pNj3UDIbC1CpklwdhYMg pXMPSqIzoAr+rdyqDUpDWwgvvOxgX2/v2EHI3FOw7Shuf1ZrFM3jY3TCF9lDFepo2ZQTLIlB4A2 R4xFTLRhatF6Sa2B5XXsnYZNyZXmQ+V+HhWE4hjIYLUhP1inhHMVwIXWXoatvoSw4pXM0n9MPmz kaKm/1YpnxwRauCQ0iTdI8RQ3mWCqX/dvmmU4w6ajIq4T4x+SwELh5MfbitVrcQHXfza1Nji7HD bskac= X-Google-Smtp-Source: AGHT+IHkQvZD2OGeLPj5O3UAtBwEq9jvCPualHnPb2Le0sNVqyDzRYj08QCUkWEndw8V3yXK/sEN8g== X-Received: by 2002:a17:903:198c:b0:24c:8257:7e59 with SMTP id d9443c01a7336-24c82578687mr32592925ad.22.1756887290120; Wed, 03 Sep 2025 01:14:50 -0700 (PDT) From: Nicholas Piggin To: qemu-riscv@nongnu.org Cc: Nicholas Piggin , Laurent Vivier , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-devel@nongnu.org Subject: [PATCH v2 4/4] tests/tcg/riscv64: Add vector state to signal test Date: Wed, 3 Sep 2025 18:14:17 +1000 Message-ID: <20250903081417.338515-5-npiggin@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250903081417.338515-1-npiggin@gmail.com> References: <20250903081417.338515-1-npiggin@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=2607:f8b0:4864:20::52a; envelope-from=npiggin@gmail.com; helo=mail-pg1-x52a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1756887374551124100 Content-Type: text/plain; charset="utf-8" Signed-off-by: Nicholas Piggin --- tests/tcg/riscv64/test-signal-handling.c | 216 ++++++++++++++++++++++- 1 file changed, 210 insertions(+), 6 deletions(-) diff --git a/tests/tcg/riscv64/test-signal-handling.c b/tests/tcg/riscv64/t= est-signal-handling.c index e9c0170c74..6440cb83d5 100644 --- a/tests/tcg/riscv64/test-signal-handling.c +++ b/tests/tcg/riscv64/test-signal-handling.c @@ -19,9 +19,16 @@ #include #include #include +#include +#include #include #include #include +#include "riscv_vector.h" + +#ifndef COMPAT_HWCAP_ISA_V +#define COMPAT_HWCAP_ISA_V (1 << ('V' - 'A')) +#endif =20 /* * This horrible hack seems to be required when including @@ -41,6 +48,10 @@ static uint64_t *signal_gvalues; static double *initial_fvalues; static double *final_fvalues; static double *signal_fvalues; +static size_t vlenb; +static uint8_t *initial_vvalues; +static uint8_t *final_vvalues; +static uint8_t *signal_vvalues; =20 extern unsigned long unimp_addr[]; =20 @@ -64,6 +75,8 @@ static void ILL_handler(int signo, siginfo_t *info, void = *context) { ucontext_t *uc =3D context; struct sigcontext *sc =3D (struct sigcontext *)&uc->uc_mcontext; + struct __riscv_ctx_hdr *sc_ext =3D &sc->sc_extdesc.hdr; + bool found_v =3D false; =20 got_signal =3D true; =20 @@ -82,12 +95,48 @@ static void ILL_handler(int signo, siginfo_t *info, voi= d *context) } /* Test sc->sc_fpregs.d.fcsr ? */ =20 + assert(sc->sc_extdesc.reserved =3D=3D 0); + while (sc_ext->magic !=3D END_MAGIC) { + assert(sc_ext->size !=3D 0); + + if (sc_ext->magic =3D=3D RISCV_V_MAGIC) { + struct __sc_riscv_v_state *sc_v_state =3D + (struct __sc_riscv_v_state *)(sc_ext + 1); + struct __riscv_v_ext_state *v_state =3D &sc_v_state->v_state; + + found_v =3D true; + + assert(getauxval(AT_HWCAP) & COMPAT_HWCAP_ISA_V); + + assert(v_state->vlenb =3D=3D vlenb); + assert(v_state->vtype =3D=3D 0xc0); /* vma, vta */ + assert(v_state->vl =3D=3D vlenb); + assert(v_state->vstart =3D=3D 0); + assert(v_state->vcsr =3D=3D 0); + + uint64_t *vregs =3D v_state->datap; + for (int i =3D 0; i < 32; i++) { + for (int j =3D 0; j < vlenb; j +=3D 8) { + size_t idx =3D (i * vlenb + j) / 8; + ((uint64_t *)signal_vvalues)[idx] =3D vregs[idx]; + } + } + } + + sc_ext =3D (void *)sc_ext + sc_ext->size; + } + + assert(sc_ext->size =3D=3D 0); + if (getauxval(AT_HWCAP) & COMPAT_HWCAP_ISA_V) { + assert(found_v); + } + sc->sc_regs.pc +=3D 4; } =20 static void init_test(void) { - int i; + int i, j; =20 callchain_root =3D find_callchain_root(); =20 @@ -107,6 +156,19 @@ static void init_test(void) memset(final_fvalues, 0, 8 * 32); signal_fvalues =3D malloc(8 * 32); memset(signal_fvalues, 0, 8 * 32); + + vlenb =3D __riscv_vlenb(); + initial_vvalues =3D malloc(vlenb * 32); + memset(initial_vvalues, 0, vlenb * 32); + for (i =3D 0; i < 32 ; i++) { + for (j =3D 0; j < vlenb; j++) { + initial_vvalues[i * vlenb + j] =3D i * vlenb + j; + } + } + final_vvalues =3D malloc(vlenb * 32); + memset(final_vvalues, 0, vlenb * 32); + signal_vvalues =3D malloc(vlenb * 32); + memset(signal_vvalues, 0, vlenb * 32); } =20 static void run_test(void) @@ -179,6 +241,72 @@ static void run_test(void) " fld f29, 0xe8(t0) \n" " fld f30, 0xf0(t0) \n" " fld f31, 0xf8(t0) \n" + /* Load initial values into vector registers */ +" mv t0, %[initial_vvalues] \n" +" vsetvli x0,%[vlenb],e8,m1,ta,ma \n" +" vle8.v v0, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v1, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v2, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v3, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v4, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v5, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v6, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v7, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v8, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v9, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v10, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v11, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v12, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v13, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v14, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v15, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v16, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v17, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v18, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v19, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v20, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v21, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v22, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v23, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v24, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v25, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v26, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v27, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v28, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v29, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v30, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vle8.v v31, (t0) \n" /* Trigger the SIGILL */ ".global unimp_addr \n" "unimp_addr: \n" @@ -251,19 +379,93 @@ static void run_test(void) " fsd f29, 0xe8(t0) \n" " fsd f30, 0xf0(t0) \n" " fsd f31, 0xf8(t0) \n" + /* Save final values from vector registers */ +" mv t0, %[final_vvalues] \n" +" vse8.v v0, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v1, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v2, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v3, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v4, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v5, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v6, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v7, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v8, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v9, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v10, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v11, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v12, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v13, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v14, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v15, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v16, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v17, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v18, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v19, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v20, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v21, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v22, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v23, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v24, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v25, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v26, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v27, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v28, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v29, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v30, (t0) \n" +" add t0, t0, %[vlenb] \n" +" vse8.v v31, (t0) \n" : "=3Dm" (initial_gvalues), "=3Dm" (final_gvalues), - "=3Dm" (final_fvalues) - : "m" (initial_fvalues), + "=3Dm" (final_fvalues), + "=3Dm" (final_vvalues) + : [vlenb] "r" (vlenb), + "m" (initial_fvalues), + "m" (initial_vvalues), [initial_gvalues] "r" (initial_gvalues), [initial_fvalues] "r" (initial_fvalues), + [initial_vvalues] "r" (initial_vvalues), [final_gvalues] "r" (final_gvalues), - [final_fvalues] "r" (final_fvalues) + [final_fvalues] "r" (final_fvalues), + [final_vvalues] "r" (final_vvalues) : "t0", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"); + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"); =20 assert(got_signal); =20 @@ -272,7 +474,7 @@ static void run_test(void) * and is not a simple equality. */ assert(initial_gvalues[4] =3D=3D (unsigned long)initial_gvalues); - assert(signal_gvalues[4] =3D=3D (unsigned long)initial_fvalues); + assert(signal_gvalues[4] =3D=3D (unsigned long)initial_vvalues + 31 * = vlenb); assert(final_gvalues[4] =3D=3D (unsigned long)final_gvalues); initial_gvalues[4] =3D final_gvalues[4] =3D signal_gvalues[4] =3D 0; =20 @@ -284,6 +486,8 @@ static void run_test(void) assert(!memcmp(initial_gvalues, signal_gvalues, 8 * 31)); assert(!memcmp(initial_fvalues, final_fvalues, 8 * 32)); assert(!memcmp(initial_fvalues, signal_fvalues, 8 * 32)); + assert(!memcmp(initial_vvalues, signal_vvalues, vlenb * 32)); + assert(!memcmp(initial_vvalues, final_vvalues, vlenb * 32)); } =20 int main(void) --=20 2.51.0