From nobody Sun Sep 28 16:37:07 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=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1757422779; cv=none; d=zohomail.com; s=zohoarc; b=DDtprLZNuCKobkFc/gkPrnp5o1+i97+AFd+TNUnH6sEvr2btIlWz8YY2/5CHrSySI58RZxr2uhqMVo4agnM1/OQ8A8v2Y44pp4YBh7hGzpVGhUkIdUi6pi/hsemZx58Hco2W+dShxGsxqrbngRLJT8PZ3Empd3dZa1aBbbPeKRM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1757422779; h=Content-Type: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=me43SX3a+xSKAwLcaPxPl4VjPmwlSD7FvoID7UbjIow=; b=L9mSTuv9zRLxKSERIb2p1RapoakeHN6MR40Lad38x1Iz9j3STh31f50Nt+eIVjAeyIyge/CC8TxccXSLEnza4qGFXDlpXW1KMCGTeXvV7qwy9xznfOopu6yjf8O7UOnDRrJqBaI8UEgYBGyE8fDWfiUCh8etRQBiFIrXCi9FNls= 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 1757422779276485.3053321569083; Tue, 9 Sep 2025 05:59:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uvxvt-0006B7-MC; Tue, 09 Sep 2025 08:58: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 1uvv1d-00009M-Db; Tue, 09 Sep 2025 05:52:34 -0400 Received: from [115.124.30.99] (helo=out30-99.freemail.mail.aliyun.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uvv1W-00033w-8D; Tue, 09 Sep 2025 05:52:33 -0400 Received: from ea134-sw06.eng.xrvm.cn(mailfrom:lyndra@linux.alibaba.com fp:SMTPD_---0WndQHtc_1757411217 cluster:ay36) by smtp.aliyun-inc.com; Tue, 09 Sep 2025 17:46:57 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1757411534; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To; bh=me43SX3a+xSKAwLcaPxPl4VjPmwlSD7FvoID7UbjIow=; b=XExdR4BeWeIUErQXQu+ZktTakTA484bDzFieoOUaAI3PQNR+JQsOY7rPeWYWcv7Xu0ipCF5oAYEaDe9FCdgV68Zcae9w6B3dAFETXO4GFYI/iI7f+L+EwvwN9t/MXzigJblJDgrXyLdsMpQY+LOEnZFjlRzlqW1B+NxGK81i8F0= From: TANG Tiancheng Date: Tue, 09 Sep 2025 17:46:44 +0800 Subject: [PATCH 1/3] hw/intc: Save time_delta in RISC-V mtimer VMState MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250909-timers-v1-1-7ee18a9d8f4b@linux.alibaba.com> References: <20250909-timers-v1-0-7ee18a9d8f4b@linux.alibaba.com> In-Reply-To: <20250909-timers-v1-0-7ee18a9d8f4b@linux.alibaba.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-riscv@nongnu.org, Peter Xu , Fabiano Rosas , TANG Tiancheng X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1757411216; l=2808; i=lyndra@linux.alibaba.com; s=20250909; h=from:subject:message-id; bh=DmQziyHEcWKJHsqd4a4sunfZg4o2rYAH01a4d5lY18k=; b=gnhIjZ8bh/CrlhqOt8KiWBrBn3dlwYc0/3qXtIHZOINvoTFMYGlEk7144LeCsSluoJxvt7fQQ 6g8+1JOFnfdC/f6angu42oaHYCfHkmVH5eH2f4QpoISBVAPR2jOiAdg X-Developer-Key: i=lyndra@linux.alibaba.com; a=ed25519; pk=GQh4uOSLVucXGkaZfEuQ956CrYS14cn1TA3N8AiIjBw= X-Host-Lookup-Failed: Reverse DNS lookup failed for 115.124.30.99 (deferred) 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=115.124.30.99; envelope-from=lyndra@linux.alibaba.com; helo=out30-99.freemail.mail.aliyun.com X-Spam_score_int: -166 X-Spam_score: -16.7 X-Spam_bar: ---------------- X-Spam_report: (-16.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, RDNS_NONE=0.793, SPF_PASS=-0.001, T_SPF_HELO_TEMPERROR=0.01, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Tue, 09 Sep 2025 08:58:43 -0400 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1757422781323116600 In QEMU's RISC-V ACLINT timer model, 'mtime' is not stored directly as a state variable. It is computed on demand as: mtime =3D rtc_r + time_delta where: - 'rtc_r' is the current VM virtual time (in ticks) obtained via cpu_riscv_read_rtc_raw() from QEMU_CLOCK_VIRTUAL. - 'time_delta' is an offset applied when the guest writes a new 'mtime' value via riscv_aclint_mtimer_write(): time_delta =3D value - rtc_r Under this design, 'rtc_r' is assumed to be monotonically increasing during VM execution. Even if the guest writes an 'mtime' value smaller than the current one (making 'time_delta' negative in signed arithmetic, or underflow in unsigned arithmetic), the computed 'mtime' remains correct because 'rtc_r_new > rtc_r_old': mtime_new =3D rtc_r_new + (value - rtc_r_old) However, this monotonicity assumption breaks on snapshot load. Before restoring a snapshot, QEMU resets the guest, which calls riscv_aclint_mtimer_reset_enter() to set 'mtime' to 0 and recompute 'time_delta' as: time_delta =3D 0 - rtc_r_reset Here, the time_delta differs from the value that was present when the snapshot was saved. As a result, subsequent reads produce a fixed offset from the true mtime. This can be observed with the 'date' command inside the guest: after loading a snapshot, the reported time appears "frozen" at the save point, and only resumes correctly after the guest has run long enough to compensate for the erroneous offset. The fix is to treat 'time_delta' as part of the device's migratable state and save/restore it via vmstate. This preserves the correct relation between 'rtc_r' and 'mtime' across snapshot save/load, ensuring 'mtime' continues incrementing from the precise saved value after restore. Reviewed-by: LIU Zhiwei Signed-off-by: TANG Tiancheng Reviewed-by: Daniel Henrique Barboza --- hw/intc/riscv_aclint.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c index 4623cfa029365c6cbdead4bd4a9f0d8b9e88b939..318a9c8248432a8cd4c3f3fa990= 739917ecf7ca1 100644 --- a/hw/intc/riscv_aclint.c +++ b/hw/intc/riscv_aclint.c @@ -323,9 +323,10 @@ static void riscv_aclint_mtimer_reset_enter(Object *ob= j, ResetType type) =20 static const VMStateDescription vmstate_riscv_mtimer =3D { .name =3D "riscv_mtimer", - .version_id =3D 1, - .minimum_version_id =3D 1, + .version_id =3D 2, + .minimum_version_id =3D 2, .fields =3D (const VMStateField[]) { + VMSTATE_UINT64(time_delta, RISCVAclintMTimerState), VMSTATE_VARRAY_UINT32(timecmp, RISCVAclintMTimerState, num_harts, 0, vmstate_info_uint64, uint64_t), --=20 2.43.0 From nobody Sun Sep 28 16:37:07 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=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1757422867; cv=none; d=zohomail.com; s=zohoarc; b=hOIQzolTWAughhvzqCqEqReHs2PN4g0xA+wkMr0Wc4rj/ibTLSgylb8FKhkcBvEY9SJs8zJZnXcwlX7LcgjKtF/kkXnqIRnnPiOmgnWROXMXL7Pv5uFwcV8MdmCUW8lKVd3SbobOzvAxmgfCwZcHxndVJ1arjXNd9iPU3F1VzDY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1757422867; h=Content-Type: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=gdxCOjTq347NYfqTOrM1YGY3YxJeDGJ5zmIf4NPc2rs=; b=Rke1N5oeRVD4qjSt/j2wqmhSZlFp03iWBmFCmB57wtCSs2hTgSkq6U/m9c0JG2OagzN4SDPxpAqWEtr8tMIJZNNFoaFl5y8JfrFhNrp85v0PbyVqFQqQTwKiDJocn2Xwo/VEKQHPRD+hAiOhXEyzzRA6tr1ghGcIdYud4d0EfUY= 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 1757422867584249.85928546431808; Tue, 9 Sep 2025 06:01:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uvxwA-0006KK-Py; Tue, 09 Sep 2025 08:59:06 -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 1uvv1f-00009X-Oj; Tue, 09 Sep 2025 05:52:35 -0400 Received: from [115.124.30.97] (helo=out30-97.freemail.mail.aliyun.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uvv1W-00033s-8L; Tue, 09 Sep 2025 05:52:34 -0400 Received: from ea134-sw06.eng.xrvm.cn(mailfrom:lyndra@linux.alibaba.com fp:SMTPD_---0WndQHtm_1757411217 cluster:ay36) by smtp.aliyun-inc.com; Tue, 09 Sep 2025 17:46:57 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1757411533; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To; bh=gdxCOjTq347NYfqTOrM1YGY3YxJeDGJ5zmIf4NPc2rs=; b=bUve2suO6Cy8qnaVC+NpZ4FLIuI9+Nr70tWRLdfTIrrJM7z6muXA9q0ZQPt9LRxqS8O+IwLIzFw4JqHoaw5yTYGfHjc3se6zMGpFoDVYDTp4w5e4bGofxt3f1U7KzrnRTEo0iEvL1Fbz9mICNJw/hkKqq6bU4LOSPda7wpH6/hs= From: TANG Tiancheng Date: Tue, 09 Sep 2025 17:46:45 +0800 Subject: [PATCH 2/3] hw/intc: Save timers array in RISC-V mtimer VMState MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250909-timers-v1-2-7ee18a9d8f4b@linux.alibaba.com> References: <20250909-timers-v1-0-7ee18a9d8f4b@linux.alibaba.com> In-Reply-To: <20250909-timers-v1-0-7ee18a9d8f4b@linux.alibaba.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-riscv@nongnu.org, Peter Xu , Fabiano Rosas , TANG Tiancheng X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1757411216; l=4232; i=lyndra@linux.alibaba.com; s=20250909; h=from:subject:message-id; bh=stR2NZygkLJHgnxSDo9w+i+TRSVf5TH1xDTP10RPuHA=; b=JFc73tNYBTpBjyajsP0cWALr7sOF8RviNQUao6vIXxzbwdAFnggzniHePgPI6jxapLa2pxNqu 8yp48RCuERNDN4igWjPF5amTq0vSnVdSFPDXj/edLIIEkzAgCgEgnqT X-Developer-Key: i=lyndra@linux.alibaba.com; a=ed25519; pk=GQh4uOSLVucXGkaZfEuQ956CrYS14cn1TA3N8AiIjBw= X-Host-Lookup-Failed: Reverse DNS lookup failed for 115.124.30.97 (deferred) 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=115.124.30.97; envelope-from=lyndra@linux.alibaba.com; helo=out30-97.freemail.mail.aliyun.com X-Spam_score_int: -166 X-Spam_score: -16.7 X-Spam_bar: ---------------- X-Spam_report: (-16.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Tue, 09 Sep 2025 08:58:43 -0400 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1757422870752124100 The current 'timecmp' field in vmstate_riscv_mtimer is insufficient to keep timers functional after migration. If an mtimer's entry in 'mtimer->timers' is active at the time the snapshot is taken, it means riscv_aclint_mtimer_write_timecmp() has written to 'mtimecmp' and scheduled a timer into QEMU's main loop 'timer_list'. During snapshot save, these active timers must also be migrated; otherwise, after snapshot load there is no mechanism to restore 'mtimer->timers' back into the 'timer_list', and any pending timer events would be lost. QEMU's migration framework commonly uses VMSTATE_TIMER_xxx macros to save and restore 'QEMUTimer' variables. However, 'timers' is a pointer array with variable length, and vmstate.h did not previously provide a helper macro for such type. This commit adds a new macro, 'VMSTATE_TIMER_PTR_VARRAY', to handle saving and restoring a variable-length array of 'QEMUTimer *'. We then use this macro to migrate the 'mtimer->timers' array, ensuring that timer events remain scheduled correctly after snapshot load. Reviewed-by: LIU Zhiwei Signed-off-by: TANG Tiancheng --- hw/intc/riscv_aclint.c | 6 ++++-- include/migration/vmstate.h | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c index 318a9c8248432a8cd4c3f3fa990739917ecf7ca1..9f4c36e965e2aa379d75c0a9f65= 6177f0dd82a45 100644 --- a/hw/intc/riscv_aclint.c +++ b/hw/intc/riscv_aclint.c @@ -323,13 +323,15 @@ static void riscv_aclint_mtimer_reset_enter(Object *o= bj, ResetType type) =20 static const VMStateDescription vmstate_riscv_mtimer =3D { .name =3D "riscv_mtimer", - .version_id =3D 2, - .minimum_version_id =3D 2, + .version_id =3D 3, + .minimum_version_id =3D 3, .fields =3D (const VMStateField[]) { VMSTATE_UINT64(time_delta, RISCVAclintMTimerState), VMSTATE_VARRAY_UINT32(timecmp, RISCVAclintMTimerState, num_harts, 0, vmstate_info_uint64, uint64_t), + VMSTATE_TIMER_PTR_VARRAY(timers, RISCVAclintMTimerState, + num_harts), VMSTATE_END_OF_LIST() } }; diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 1ff7bd9ac425ba67cd5ca7ad97bcf570f9e19abe..255e403e5a103188712425d95a7= 19d181e1a7202 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -522,6 +522,16 @@ extern const VMStateInfo vmstate_info_qlist; .offset =3D vmstate_offset_array(_s, _f, _type*, _n), \ } =20 +#define VMSTATE_VARRAY_OF_POINTER_UINT32(_field, _state, _field_num, _vers= ion, _info, _type) { \ + .name =3D (stringify(_field)), = \ + .version_id =3D (_version), = \ + .num_offset =3D vmstate_offset_value(_state, _field_num, uint32_t), = \ + .info =3D &(_info), = \ + .size =3D sizeof(_type), = \ + .flags =3D VMS_VARRAY_UINT32 | VMS_ARRAY_OF_POINTER | VMS_POINTER= , \ + .offset =3D vmstate_offset_pointer(_state, _field, _type), = \ +} + #define VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, _num, _version, _= vmsd, _type) { \ .name =3D (stringify(_field)), = \ .version_id =3D (_version), = \ @@ -1035,6 +1045,10 @@ extern const VMStateInfo vmstate_info_qlist; #define VMSTATE_TIMER_PTR_ARRAY(_f, _s, _n) \ VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer = *) =20 +#define VMSTATE_TIMER_PTR_VARRAY(_f, _s, _f_n) \ +VMSTATE_VARRAY_OF_POINTER_UINT32(_f, _s, _f_n, 0, vmstate_info_timer, \ + QEMUTimer *) + #define VMSTATE_TIMER_TEST(_f, _s, _test) \ VMSTATE_SINGLE_TEST(_f, _s, _test, 0, vmstate_info_timer, QEMUTimer) =20 --=20 2.43.0 From nobody Sun Sep 28 16:37:07 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=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1757422778; cv=none; d=zohomail.com; s=zohoarc; b=JR8Vnh2wGUAefoAEbPT977hISCPrQIVy9al4CqCQdzvk2SweU+Bksom3OZXxXW4PHJMey81oDRUaa8/OVmLriJx/YG6kIQG4NZVDNUmspmTjyjOGw/orkCDF/ZPKgDGD9+vFSUV8CzWkWuMRXfzCBpm7h/6bwt3thGsdf2RWXT8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1757422778; h=Content-Type: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=GdB12XnmnCPByghSWEJzOH3fFvS3WD8TU/HoT26Wkxg=; b=W9SIlnAl6rnauDh2cEPaPw7Aq8AyUBP1ZYvz8Ep8FWgL2L3w6z0g7UJr2n1R1NOrgsd2OetU9q+M+/EkIZdKTEI9wPt76RpVwUO4Q7ms+NNNfXkkpIys3ZPrPUKmEnSjwiYmWDnUzs85nGUPjgj9qF9shWxTkbvw058gEr/9GUs= 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 1757422778828169.50751376021117; Tue, 9 Sep 2025 05:59:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uvxwC-0006Kw-UE; Tue, 09 Sep 2025 08:59:08 -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 1uvv1f-00009W-P5; Tue, 09 Sep 2025 05:52:35 -0400 Received: from [115.124.30.118] (helo=out30-118.freemail.mail.aliyun.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uvv1W-00033t-8Y; Tue, 09 Sep 2025 05:52:35 -0400 Received: from ea134-sw06.eng.xrvm.cn(mailfrom:lyndra@linux.alibaba.com fp:SMTPD_---0WndQHtx_1757411218 cluster:ay36) by smtp.aliyun-inc.com; Tue, 09 Sep 2025 17:46:58 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1757411533; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To; bh=GdB12XnmnCPByghSWEJzOH3fFvS3WD8TU/HoT26Wkxg=; b=Eqt0755iuH1d/ri+JIBjZgRUXRvTKiCrjy37ixEyFmtXmOADwvY4KqG+bBNaYhDXYzDNj1woYIE/mddehOxoYIStRiExIfE5OyVNBnDWG2LLBZ0tszLdwkzSaXDwLPOg7pFbP4UKSZ2uXOfIISBL3tCImmnZr1p8CFnjMU6f+yc= From: TANG Tiancheng Date: Tue, 09 Sep 2025 17:46:46 +0800 Subject: [PATCH 3/3] target/riscv: Save stimer and vstimer in CPU vmstate MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250909-timers-v1-3-7ee18a9d8f4b@linux.alibaba.com> References: <20250909-timers-v1-0-7ee18a9d8f4b@linux.alibaba.com> In-Reply-To: <20250909-timers-v1-0-7ee18a9d8f4b@linux.alibaba.com> To: qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , qemu-riscv@nongnu.org, Peter Xu , Fabiano Rosas , TANG Tiancheng X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1757411216; l=1665; i=lyndra@linux.alibaba.com; s=20250909; h=from:subject:message-id; bh=XX9ZRtuMvdom7IopJZ+Ph+oZPSGbE5hvIJZg9s5HNAA=; b=MfZGX7XB9HPkeE5eYfcd7ugvVCEZ6k4yqZFE3omFFonQLGY8z4T2TK8pAe6Nrv4Vzz2ZpvdvO Edvq62yDdJFBYkxLpof2aBmJZ6Qt854CJC1uzzBWyqhaxvoRjkzKrfZ X-Developer-Key: i=lyndra@linux.alibaba.com; a=ed25519; pk=GQh4uOSLVucXGkaZfEuQ956CrYS14cn1TA3N8AiIjBw= X-Host-Lookup-Failed: Reverse DNS lookup failed for 115.124.30.118 (deferred) 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=115.124.30.118; envelope-from=lyndra@linux.alibaba.com; helo=out30-118.freemail.mail.aliyun.com X-Spam_score_int: -166 X-Spam_score: -16.7 X-Spam_bar: ---------------- X-Spam_report: (-16.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Tue, 09 Sep 2025 08:58:43 -0400 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1757422781219124100 vmstate_riscv_cpu was missing env.stimer and env.vstimer. Without migrating these QEMUTimer fields, active S/VS-mode timer events are lost after snapshot or migration. Add VMSTATE_TIMER_PTR() entries to save and restore them. Reviewed-by: LIU Zhiwei Signed-off-by: TANG Tiancheng Reviewed-by: Daniel Henrique Barboza --- target/riscv/machine.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/target/riscv/machine.c b/target/riscv/machine.c index 1600ec44f0b755fdd49fc0df47c2288c9940afe0..51e0567ed30cbab5e791ea90416= 5bc1854709192 100644 --- a/target/riscv/machine.c +++ b/target/riscv/machine.c @@ -400,6 +400,30 @@ static const VMStateDescription vmstate_ssp =3D { } }; =20 +static bool sstc_timer_needed(void *opaque) +{ + RISCVCPU *cpu =3D opaque; + CPURISCVState *env =3D &cpu->env; + + if (!cpu->cfg.ext_sstc) { + return false; + } + + return env->stimer !=3D NULL || env->vstimer !=3D NULL; +} + +static const VMStateDescription vmstate_sstc =3D { + .name =3D "cpu/timer", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D sstc_timer_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_TIMER_PTR(env.stimer, RISCVCPU), + VMSTATE_TIMER_PTR(env.vstimer, RISCVCPU), + VMSTATE_END_OF_LIST() + } +}; + const VMStateDescription vmstate_riscv_cpu =3D { .name =3D "cpu", .version_id =3D 10, @@ -476,6 +500,7 @@ const VMStateDescription vmstate_riscv_cpu =3D { &vmstate_elp, &vmstate_ssp, &vmstate_ctr, + &vmstate_sstc, NULL } }; --=20 2.43.0