From patchwork Thu May 30 17:49:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 800202 Delivered-To: patch@linaro.org Received: by 2002:a5d:65c4:0:b0:35b:5a80:51b4 with SMTP id e4csp358981wrw; Thu, 30 May 2024 10:51:44 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW6sWLEodUgszMjCDKpmx8msOdBzqYIqSbFA/dw0JGxjPy2/SzqjL4vCOB/H2VDEkNTIgIJZREm4YnqIDUpmMxT X-Google-Smtp-Source: AGHT+IEqCMz4jPXYNl1PCGO3XCRepjTPcZf/XLpnRW+boPYFgM2qLZPW/AkwKf70ypjoylSWEBIp X-Received: by 2002:a05:622a:83:b0:43a:d063:c8d7 with SMTP id d75a77b69052e-43fe92abc1emr32757631cf.1.1717091504097; Thu, 30 May 2024 10:51:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717091504; cv=none; d=google.com; s=arc-20160816; b=uXvdkAi7z+bh5riR+aUZUcLaJHWYG+/UjmHw3X1T5og4hLk91rOj/Abl7Wrn6usFT3 RHZnrIuJHTa77SFsWC/OFE+1edXHAzcy5B3kwIdV3hRL9W4HAxUjT/NgXGCuqJbYy7cV GfBTKOmk0VbuKvXgfbOZNXfBpk0tYIBnJvyQxsG2WEO/gmtodfTGhIJF0dA2ajpDH3Ed ujp/XMB+M2wrxBh8gKzndRq7xlBbs1Hr/sUgM4hrALNsvKeCzhEHs8DmwXCxbQMAeWal 4hEod2MUbuFWjfwToE7+MG8Ma5oBkZ3svY1K4lFFV74I+A7XycNoU25cEhCta7aWHt/j f0wA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5fTc09zeskly2ZP9LGBon66poI8aZTqjlUXNgpOk+s4=; fh=LKktwX56bxJWWOzcPT9ux4esRHG9xF8JYIpPYIK87W4=; b=JKqkBxjNZceAlL7WtA02MW3esoD8oXu8hVDZvsuMu0I3QrAQcEROVGQ3YizZkmLsGR iem1dMqbWJUJwPgE9dfzwkdk6cWUjtzMNXEQCYAWRNHDM7na/q4Id9oL3zXb72mFAz98 EAizJPpGPM62F91N0jozHxoNsX/N9lEhm+PzruPsuhGuWribfQRZ+OJxt/wrWJCO4ptB N2B1V79Q4d1KOI/5DH3TH7JFo8QMjAn9Ow7l25bSu7PsSwwEWdFWatjnesm657oXgiJb 4cykYkXOeb3odEaJ9gxjhG7wN9BjjDCi3rOG60ck5Ej6+JKj8iJh2evbo3QtK7Vrnmzb knuQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RbDEzbgv; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d75a77b69052e-43ff259d200si583001cf.562.2024.05.30.10.51.43 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 May 2024 10:51:44 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RbDEzbgv; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCjuW-0003r3-8J; Thu, 30 May 2024 13:49:56 -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 1sCjuU-0003qi-2a for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:54 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCjuR-0002S5-L3 for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:53 -0400 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1f4a52b9413so9981955ad.2 for ; Thu, 30 May 2024 10:49:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717091390; x=1717696190; 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=5fTc09zeskly2ZP9LGBon66poI8aZTqjlUXNgpOk+s4=; b=RbDEzbgvE61wO2seG9hmbVbWr0KU02cr9ObQp4S8PW1llg4iWS2t8Zymkr0EG9RvhK tQSLK7//s6lEv8IlpK94eZlz2Mn5jKcKVYaKika3H2ZulevfXbbDFxG72UrKDH3JAbxs iEknsYDVaqu0pE9pha2lHzDjkt0nXQXNqsxzWEo551TwdqwUvbJCG5PGeZcy9mGRqtwV LY3A9VVK/rAepz/xii2zRFlha7wNTBw+L5VlpER3SLEUaFSqXtfD/7wB/VlmDCaUgDKv 0VEFzBKrmPP15im0sr38HRFvnf2pR8+/jmrgFBCF83BUqkYBpgbpuq/L+ik6J8RbSYxT la7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717091390; x=1717696190; 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=5fTc09zeskly2ZP9LGBon66poI8aZTqjlUXNgpOk+s4=; b=D+Uw0MjeuUB8LlsKPNq6/DYZ8t5BtBhcRUNeQzdFbGxy5+JrzUwDIAVg5M5Mruj7yQ nKfIZwqVXRcylclaFxhQC7ys93qxJjLH7UNmvXVsOtnSD8iHWNWIXXtO3w/0v1+1fAhi R624yTGja84UseY5vDicfHTZIaUmN4FJXKazGADEkcEYAt/B0+mbkdBD2D/6nOF6K302 wB7qGiNiaInOWjonfHUFdeADRzLjltxH5wHfELOV2czgjQywhNKbrNZS0M8+7Neh+5WQ +evd94xOy1LVrdlbATADFvV7UXF+ixb9rxhdZ330aZY2z7XEpP41nxQvLnEsUu8vJ8US ta4w== X-Gm-Message-State: AOJu0YwV2hpsXD/fdQkc69mPUhav62uwLx+LhSsIKGfbDGyg298gQnMX E149+0CqAAKFIwFf1nJLvQzCfzce0QzOlvUzQo/jFehi8l9tU2C2s2kAOnQAcgsFsToTSWmTYo+ ktcA= X-Received: by 2002:a17:902:d4cc:b0:1f4:5f66:895 with SMTP id d9443c01a7336-1f61a2e44a4mr30894645ad.68.1717091389832; Thu, 30 May 2024 10:49:49 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6323deb38sm590405ad.124.2024.05.30.10.49.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 10:49:49 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Richard Henderson , Laurent Vivier , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Paolo Bonzini , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-?= =?utf-8?q?Daud=C3=A9?= Subject: [PATCH v2 1/6] sysemu: add set_virtual_time to accel ops Date: Thu, 30 May 2024 10:49:34 -0700 Message-Id: <20240530174939.749163-2-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240530174939.749163-1-pierrick.bouvier@linaro.org> References: <20240530174939.749163-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::630; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pl1-x630.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, RCVD_IN_DNSWL_NONE=-0.0001, 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org From: Alex Bennée We are about to remove direct calls to individual accelerators for this information and will need a central point for plugins to hook into time changes. From: Alex Bennée Signed-off-by: Alex Bennée Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Pierrick Bouvier --- include/sysemu/accel-ops.h | 18 +++++++++++++++++- include/sysemu/cpu-timers.h | 3 ++- ...et-virtual-clock.c => cpus-virtual-clock.c} | 5 +++++ system/cpus.c | 11 +++++++++++ stubs/meson.build | 2 +- 5 files changed, 36 insertions(+), 3 deletions(-) rename stubs/{cpus-get-virtual-clock.c => cpus-virtual-clock.c} (68%) diff --git a/include/sysemu/accel-ops.h b/include/sysemu/accel-ops.h index ef91fc28bbd..a0886722305 100644 --- a/include/sysemu/accel-ops.h +++ b/include/sysemu/accel-ops.h @@ -20,7 +20,12 @@ typedef struct AccelOpsClass AccelOpsClass; DECLARE_CLASS_CHECKERS(AccelOpsClass, ACCEL_OPS, TYPE_ACCEL_OPS) -/* cpus.c operations interface */ +/** + * struct AccelOpsClass - accelerator interfaces + * + * This structure is used to abstract accelerator differences from the + * core CPU code. Not all have to be implemented. + */ struct AccelOpsClass { /*< private >*/ ObjectClass parent_class; @@ -44,7 +49,18 @@ struct AccelOpsClass { void (*handle_interrupt)(CPUState *cpu, int mask); + /** + * @get_virtual_clock: fetch virtual clock + * @set_virtual_clock: set virtual clock + * + * These allow the timer subsystem to defer to the accelerator to + * fetch time. The set function is needed if the accelerator wants + * to track the changes to time as the timer is warped through + * various timer events. + */ int64_t (*get_virtual_clock)(void); + void (*set_virtual_clock)(int64_t time); + int64_t (*get_elapsed_ticks)(void); /* gdbstub hooks */ diff --git a/include/sysemu/cpu-timers.h b/include/sysemu/cpu-timers.h index d86738a378d..7bfa960fbd6 100644 --- a/include/sysemu/cpu-timers.h +++ b/include/sysemu/cpu-timers.h @@ -96,8 +96,9 @@ int64_t cpu_get_clock(void); void qemu_timer_notify_cb(void *opaque, QEMUClockType type); -/* get the VIRTUAL clock and VM elapsed ticks via the cpus accel interface */ +/* get/set VIRTUAL clock and VM elapsed ticks via the cpus accel interface */ int64_t cpus_get_virtual_clock(void); +void cpus_set_virtual_clock(int64_t new_time); int64_t cpus_get_elapsed_ticks(void); #endif /* SYSEMU_CPU_TIMERS_H */ diff --git a/stubs/cpus-get-virtual-clock.c b/stubs/cpus-virtual-clock.c similarity index 68% rename from stubs/cpus-get-virtual-clock.c rename to stubs/cpus-virtual-clock.c index fd447d53f3c..af7c1a1d403 100644 --- a/stubs/cpus-get-virtual-clock.c +++ b/stubs/cpus-virtual-clock.c @@ -6,3 +6,8 @@ int64_t cpus_get_virtual_clock(void) { return cpu_get_clock(); } + +void cpus_set_virtual_clock(int64_t new_time) +{ + /* do nothing */ +} diff --git a/system/cpus.c b/system/cpus.c index f8fa78f33d4..d3640c95030 100644 --- a/system/cpus.c +++ b/system/cpus.c @@ -229,6 +229,17 @@ int64_t cpus_get_virtual_clock(void) return cpu_get_clock(); } +/* + * Signal the new virtual time to the accelerator. This is only needed + * by accelerators that need to track the changes as we warp time. + */ +void cpus_set_virtual_clock(int64_t new_time) +{ + if (cpus_accel && cpus_accel->set_virtual_clock) { + cpus_accel->set_virtual_clock(new_time); + } +} + /* * return the time elapsed in VM between vm_start and vm_stop. Unless * icount is active, cpus_get_elapsed_ticks() uses units of the host CPU cycle diff --git a/stubs/meson.build b/stubs/meson.build index 3b9d42023cb..a1deafde08c 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -28,7 +28,7 @@ endif if have_block or have_ga stub_ss.add(files('replay-tools.c')) # stubs for hooks in util/main-loop.c, util/async.c etc. - stub_ss.add(files('cpus-get-virtual-clock.c')) + stub_ss.add(files('cpus-virtual-clock.c')) stub_ss.add(files('icount.c')) stub_ss.add(files('graph-lock.c')) if linux_io_uring.found() From patchwork Thu May 30 17:49:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 800201 Delivered-To: patch@linaro.org Received: by 2002:a5d:65c4:0:b0:35b:5a80:51b4 with SMTP id e4csp358941wrw; Thu, 30 May 2024 10:51:36 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX5PGOW5ayScEJVsP66xqynR4q1pgVx1Lf29zUfPIfh4sb2PZfMcyL0WoxszkNPQJprgYfk7tg3Xhnq+l/I0isM X-Google-Smtp-Source: AGHT+IEiwK2inKXq604nfcIUaa3eQsKh9A0KGuc4Nx0eBr31/oEBCTr0saVK8iN6Qb6YaxQJPhFu X-Received: by 2002:a05:6808:1704:b0:3c8:6543:584b with SMTP id 5614622812f47-3d1dcd20f7fmr3208238b6e.54.1717091496700; Thu, 30 May 2024 10:51:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717091496; cv=none; d=google.com; s=arc-20160816; b=Ss+hAqIJsyKP/FnOvqLZqPD9kZ/Qbat9lR1qhQdNEfbjchKzBftGqrpa0PdVsu5JPE hvcCbl+5Dkbimmwknd7sIeEcvqxwKxFrV8XoKTvBiydEWz/rRFQbIQBtgG2I1/1HS/RK +3CnKrBZtPNMCKVg9Hn8h4FH6A4g7bcdna/jf9Icrz9H/nKfeDaluXeuLJWmN56p3cf2 mp+XjX8RDpCCFpjTd3A+dgIedMOdfqUUIi9hKdVCU+Kgk9FQPUjmVp6+QxtAQaUOww/A NdBk+OyL1kP/iFtzBszhQhsVNjco40vLicduteoI/acqOIIuW769lfrX5wW2MEt/Yvoe PbiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=N8fpp15niTkZ3IPMy6ehe10O59rmldsghTOZNCkMcuE=; fh=cf3Q/5dJyAanhqpbGSZv6kxpEC/hZ4CRqZ3z5yvqhQw=; b=TYSMHDpTmDZGR9SuCK4dAm6mk52VZ8SgBy6w0mejjs4TEkK5xS01IGepCNY22QJRA/ +GCeWMJNDT0YwB905+4jm8C0NVjzoFM8ZpDkoYeK3owlAiE1ocPdXZHMnT5uIvuh0mnt k7tJ47RTiCxy+wT6S/UcJDHsGy+nPegm2kp7DzPsk1ALQIlgfn/z/wdz2hT43oHM+t0A Pi0FEBgfvEJBQPBZLeVTzpONx2n1/s3fVgojW8M6F5fOjJTbM9pjyAGYUhzcPyp9LaN2 SF1jb1Xw9kuSFnbhvXTO+KAVjoN9X28r2gL6ugWW59tdagw9Otk1VNPb6/EJ0diXOhnW pq7A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=W3reaMr1; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 6a1803df08f44-6ae4b42cd13si1258946d6.529.2024.05.30.10.51.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 May 2024 10:51:36 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=W3reaMr1; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCjuX-0003rW-Hc; Thu, 30 May 2024 13:49:57 -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 1sCjuV-0003qu-Gq for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:55 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCjuT-0002SG-8h for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:55 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-1f44b45d6abso8042455ad.0 for ; Thu, 30 May 2024 10:49:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717091391; x=1717696191; 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=N8fpp15niTkZ3IPMy6ehe10O59rmldsghTOZNCkMcuE=; b=W3reaMr1N9cVY5tN/SJOoavOaYYDvJnVaHFC2zVzsrcmYgJNb/i9psC2CgYYYVgnhj OXCjSDBmjEpEGrBV4DTbFClZJUAmOYWvkL2Gdhxorpv21t6+SVdVgqnsPa+Xg5uPvOuK 5XdFUUj3PH30vQvg7ZJitiW30/SLk4tJEVG7zT0Jc/92PIotwf9WSuCASq1mgttX9BBY KGOu/xYdQ6Es32Tseq3YtSnGP0Ll8k2MGOYbvn6aCbciX92TPAHXCgjOq52NeZolQyeh kjaG64oPyYYVhgkgA6uXX7a2qD9xaDODdFPkn47aitG8KyhNwOIFjUzdRBk43ZEniTj8 rAsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717091391; x=1717696191; 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=N8fpp15niTkZ3IPMy6ehe10O59rmldsghTOZNCkMcuE=; b=QiUM71OLQ4xjrKS2daEve7ijrvLMnx7jiNHYBDsPUdR7u9V4nSTYM+vZGNqLUqDJXK w343Su0ly7hDZizbcOWg+jiw9HSVmBhmPe/sLx0stRl7KHUYd7zGGC4jiNpNaIoik6YL lMnNqXXd2RBS8nKg2ChK138a8SZVsPOINBEHkgGBeTw0a8aRfFOs+HKf1OlB0TN4G57Q BOyNSXw9BtR2KSwyl8t4zM2ywPwuSyxyLTtLaAyqbmYRtPRanLv8idka2RdmlN84DltX Dp/WaHYgDKWILYFZVd7hpJiAe7F3Yh/7xv2wXYoYh+NqCeoDd9/TP7YNZ2AUW+juJZAp fVFA== X-Gm-Message-State: AOJu0YzUj58oYegDgvKKD0D3x7Nvwdjc3my3S6D+RjHdlbxmMtVTZL5G lDL/65xFY+t4YYeEfQjQGaqUu7tIBXlCA5TDCzngbeX528hyHyz0Juzeb1qe8ubCQ4sp1oA2hsI jhsA= X-Received: by 2002:a17:902:c94b:b0:1f4:89e2:b47b with SMTP id d9443c01a7336-1f61992ee59mr33274415ad.50.1717091390928; Thu, 30 May 2024 10:49:50 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6323deb38sm590405ad.124.2024.05.30.10.49.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 10:49:50 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Richard Henderson , Laurent Vivier , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Paolo Bonzini , Pierrick Bouvier Subject: [PATCH v2 2/6] qtest: use cpu interface in qtest_clock_warp Date: Thu, 30 May 2024 10:49:35 -0700 Message-Id: <20240530174939.749163-3-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240530174939.749163-1-pierrick.bouvier@linaro.org> References: <20240530174939.749163-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62b; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pl1-x62b.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, RCVD_IN_DNSWL_NONE=-0.0001, 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org From: Alex Bennée This generalises the qtest_clock_warp code to use the AccelOps handlers for updating its own sense of time. This will make the next patch which moves the warp code closer to pure code motion. From: Alex Bennée Signed-off-by: Alex Bennée Acked-by: Thomas Huth Signed-off-by: Pierrick Bouvier --- include/sysemu/qtest.h | 1 + accel/qtest/qtest.c | 1 + system/qtest.c | 6 +++--- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/sysemu/qtest.h b/include/sysemu/qtest.h index b5d5fd34637..45f3b7e1df5 100644 --- a/include/sysemu/qtest.h +++ b/include/sysemu/qtest.h @@ -36,6 +36,7 @@ void qtest_server_set_send_handler(void (*send)(void *, const char *), void qtest_server_inproc_recv(void *opaque, const char *buf); int64_t qtest_get_virtual_clock(void); +void qtest_set_virtual_clock(int64_t count); #endif #endif diff --git a/accel/qtest/qtest.c b/accel/qtest/qtest.c index f6056ac8361..53182e6c2ae 100644 --- a/accel/qtest/qtest.c +++ b/accel/qtest/qtest.c @@ -52,6 +52,7 @@ static void qtest_accel_ops_class_init(ObjectClass *oc, void *data) ops->create_vcpu_thread = dummy_start_vcpu_thread; ops->get_virtual_clock = qtest_get_virtual_clock; + ops->set_virtual_clock = qtest_set_virtual_clock; }; static const TypeInfo qtest_accel_ops_type = { diff --git a/system/qtest.c b/system/qtest.c index 6da58b3874e..ee8b139e982 100644 --- a/system/qtest.c +++ b/system/qtest.c @@ -332,14 +332,14 @@ int64_t qtest_get_virtual_clock(void) return qatomic_read_i64(&qtest_clock_counter); } -static void qtest_set_virtual_clock(int64_t count) +void qtest_set_virtual_clock(int64_t count) { qatomic_set_i64(&qtest_clock_counter, count); } static void qtest_clock_warp(int64_t dest) { - int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + int64_t clock = cpus_get_virtual_clock(); AioContext *aio_context; assert(qtest_enabled()); aio_context = qemu_get_aio_context(); @@ -348,7 +348,7 @@ static void qtest_clock_warp(int64_t dest) QEMU_TIMER_ATTR_ALL); int64_t warp = qemu_soonest_timeout(dest - clock, deadline); - qtest_set_virtual_clock(qtest_get_virtual_clock() + warp); + cpus_set_virtual_clock(cpus_get_virtual_clock() + warp); qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL); timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]); From patchwork Thu May 30 17:49:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 800198 Delivered-To: patch@linaro.org Received: by 2002:a5d:65c4:0:b0:35b:5a80:51b4 with SMTP id e4csp358936wrw; Thu, 30 May 2024 10:51:36 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX6zK6zn0UHrY3sZE5nc6xF7xKJrkayCdmShb1nFIqsljRPsS+CJ3qub1BPgVx+bz45+iAidbLNiiyFCde8lJpb X-Google-Smtp-Source: AGHT+IGdATYh4XkD+uYKqMZjsQJgPxkTgWMK6rcRdomuqZw/V56vyhKWBoDbNrvsk80B2qfStkce X-Received: by 2002:a05:6214:53c7:b0:6a0:b4ec:cda0 with SMTP id 6a1803df08f44-6ae0cb2cef2mr34116076d6.26.1717091496334; Thu, 30 May 2024 10:51:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717091496; cv=none; d=google.com; s=arc-20160816; b=XalIkEJZluDOhGchBCmflNCGAoIt4RtE9eTH9hOzpO9tOJNukPm9g8jISUI6gry9y7 k5v3J8lDQkaMUeYiqqYl1fFrAOzeQ2tLR/dDf+3WDoi81oZm+pU1Ns1OV82ifpskQmSv JD3o1ooLGlJWBx8btzOYlOvpz+UwkzdoIjGF9rQGuIUDKQPkMcmiRNUa3VxYbQ0Db8ZG IYihY86sT1tEiZYQsfPfLch5s74qOoJ8CyZZLn2wb7OXy3Bhwi3XOVXgKA+1BNDdpG6n COVT160Kt92yJc071fC4Rgs3Ot81qK5D+jSYqVptVNAHbqNexoHD0GFrGgPMcJnM1UUB O0LQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=6IWWhHyfIReAoyuKPFTir6WLrARTyk7MyySJZx8v8IY=; fh=cf3Q/5dJyAanhqpbGSZv6kxpEC/hZ4CRqZ3z5yvqhQw=; b=HjqIprNNos/zFXJbsZE2yOax2lHQ+OKjKl4MsuROefIQv/yNE5clKa7SeCbI1v5MqQ 8rPyT6J6cN4OaMmzV08IiDp1pxB//YOZrP6hYFMJ0Ca4AgAqNz+pT7TWScl6Dn5LJCPo goWRAXlLCW9xyuK8vIyBOaUFIYsxI8FYDtD4sJekGhDE0VbpN2F6Y28ba4YmARGJDWxj FggLZA0DJk/QqdlR6qv9D2MB/zvL+PRjxUtnZG24YhPbtPBPz/U4goLB9oc8SgrcolBe kOrtICpuMw8JYW48SN50PqVu1nON5YQl1xcK7/x30th4it1kZQi4v+KLxLzscJdZ+C8o NO+Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=LbENw2dr; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 6a1803df08f44-6ae4a732b44si1487546d6.62.2024.05.30.10.51.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 May 2024 10:51:36 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=LbENw2dr; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCjuY-0003s3-6C; Thu, 30 May 2024 13:49:58 -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 1sCjuX-0003rU-9u for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:57 -0400 Received: from mail-pl1-x632.google.com ([2607:f8b0:4864:20::632]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCjuV-0002SM-D5 for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:57 -0400 Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1f61f775738so6692565ad.2 for ; Thu, 30 May 2024 10:49:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717091392; x=1717696192; 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=6IWWhHyfIReAoyuKPFTir6WLrARTyk7MyySJZx8v8IY=; b=LbENw2dr/TNmqoHOzpqHovhp2mLDPE4yjqa9r5fE9JPF555xHbHGPNNOqfTlj+xg6R K0UUBd7FkpBkoWbJmlO+yuJSc2OhQnwFASG1v9dO7CytVvbIHvPvMQn2d3AryznPuMMS wHJ+3+k3XEyrB7sdD8dw2GOkidKob2b1+giX1puasnpUaoRtvT6cIF6Z3r+rYf4bMe2E CqS8/Cw6Kg2L8Eu9pHwU4tBp8AGYRHJDII41+20uwhJQo3UM8p0UzBjXOnPZg3mPyEF4 NuJ5EkfYdt+VP7z986JQJoJNNNwX9RGNJUWxO2YMXpunauaABj4Z9Huc9D+T1jTd+Qpw JjwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717091392; x=1717696192; 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=6IWWhHyfIReAoyuKPFTir6WLrARTyk7MyySJZx8v8IY=; b=lJfZn+UDx3j+yLT8kfU+4jg/emfWcSezuN2/mfnKnpPQBjcNFWkiwhJ/Guh/Z3rt6e wKqSh0Uw3GUnMfzaJVdqfi9VZ9rsLReKwXpUb5d7sSozURt41kn/2SQU7t2DGkCcJXl1 RgtxZFmRJ3SxeX+bvgKMDOPTkJWAkW7hWSLZJ5tjGStIkHfqMkAc2aGGrZdgkTVrNZ3O 94fLA7sPUuB8E1ShNmmtK4bUdyM8WBSXrnKb8mYBvfPN+L+Ty6yHl2ACmiuuhOoKR8sp K+OtvSqPxzetfeOYWSjpKkBPhQ5dyrgywyt8ACJa9HdpiaK+hAi+LwzcqVCqFKtoqOZx RCfA== X-Gm-Message-State: AOJu0YyR7xJvQFrbsZxUYjSBzjEYDeT4fqCQ8+qLwRWVkzfKH7o2FcVU LEjI3XSUBhzx0+MHZHrb6qT27uGZMFO9Unj55UINBLioTRA4QK0zavA9M4xx0JChy5h00Me1W97 ghD8= X-Received: by 2002:a17:903:2385:b0:1f6:1144:a112 with SMTP id d9443c01a7336-1f6196087d6mr31883245ad.25.1717091392121; Thu, 30 May 2024 10:49:52 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6323deb38sm590405ad.124.2024.05.30.10.49.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 10:49:51 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Richard Henderson , Laurent Vivier , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Paolo Bonzini , Pierrick Bouvier Subject: [PATCH v2 3/6] sysemu: generalise qtest_warp_clock as qemu_clock_advance_virtual_time Date: Thu, 30 May 2024 10:49:36 -0700 Message-Id: <20240530174939.749163-4-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240530174939.749163-1-pierrick.bouvier@linaro.org> References: <20240530174939.749163-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::632; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pl1-x632.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, RCVD_IN_DNSWL_NONE=-0.0001, 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org From: Alex Bennée Move the key functionality of moving time forward into the clock sub-system itself. This will allow us to plumb in time control into plugins. From: Alex Bennée Signed-off-by: Alex Bennée Signed-off-by: Pierrick Bouvier --- include/qemu/timer.h | 15 +++++++++++++++ system/qtest.c | 25 +++---------------------- util/qemu-timer.c | 26 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/include/qemu/timer.h b/include/qemu/timer.h index 9a366e551fb..910587d8293 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -245,6 +245,21 @@ bool qemu_clock_run_timers(QEMUClockType type); */ bool qemu_clock_run_all_timers(void); +/** + * qemu_clock_advance_virtual_time(): advance the virtual time tick + * @target: target time in nanoseconds + * + * This function is used where the control of the flow of time has + * been delegated to outside the clock subsystem (be it qtest, icount + * or some other external source). You can ask the clock system to + * return @early at the first expired timer. + * + * Time can only move forward, attempts to reverse time would lead to + * an error. + * + * Returns: new virtual time. + */ +int64_t qemu_clock_advance_virtual_time(int64_t dest); /* * QEMUTimerList diff --git a/system/qtest.c b/system/qtest.c index ee8b139e982..e6f6b4e62d5 100644 --- a/system/qtest.c +++ b/system/qtest.c @@ -337,26 +337,6 @@ void qtest_set_virtual_clock(int64_t count) qatomic_set_i64(&qtest_clock_counter, count); } -static void qtest_clock_warp(int64_t dest) -{ - int64_t clock = cpus_get_virtual_clock(); - AioContext *aio_context; - assert(qtest_enabled()); - aio_context = qemu_get_aio_context(); - while (clock < dest) { - int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL, - QEMU_TIMER_ATTR_ALL); - int64_t warp = qemu_soonest_timeout(dest - clock, deadline); - - cpus_set_virtual_clock(cpus_get_virtual_clock() + warp); - - qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL); - timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]); - clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - } - qemu_clock_notify(QEMU_CLOCK_VIRTUAL); -} - static bool (*process_command_cb)(CharBackend *chr, gchar **words); void qtest_set_command_cb(bool (*pc_cb)(CharBackend *chr, gchar **words)) @@ -755,7 +735,8 @@ static void qtest_process_command(CharBackend *chr, gchar **words) ns = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL, QEMU_TIMER_ATTR_ALL); } - qtest_clock_warp(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns); + qemu_clock_advance_virtual_time( + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns); qtest_send_prefix(chr); qtest_sendf(chr, "OK %"PRIi64"\n", (int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); @@ -781,7 +762,7 @@ static void qtest_process_command(CharBackend *chr, gchar **words) g_assert(words[1]); ret = qemu_strtoi64(words[1], NULL, 0, &ns); g_assert(ret == 0); - qtest_clock_warp(ns); + qemu_clock_advance_virtual_time(ns); qtest_send_prefix(chr); qtest_sendf(chr, "OK %"PRIi64"\n", (int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)); diff --git a/util/qemu-timer.c b/util/qemu-timer.c index 6a0de33dd2b..213114be68c 100644 --- a/util/qemu-timer.c +++ b/util/qemu-timer.c @@ -645,6 +645,11 @@ int64_t qemu_clock_get_ns(QEMUClockType type) } } +static void qemu_virtual_clock_set_ns(int64_t time) +{ + return cpus_set_virtual_clock(time); +} + void init_clocks(QEMUTimerListNotifyCB *notify_cb) { QEMUClockType type; @@ -675,3 +680,24 @@ bool qemu_clock_run_all_timers(void) return progress; } + +int64_t qemu_clock_advance_virtual_time(int64_t dest) +{ + int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + AioContext *aio_context; + aio_context = qemu_get_aio_context(); + while (clock < dest) { + int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL, + QEMU_TIMER_ATTR_ALL); + int64_t warp = qemu_soonest_timeout(dest - clock, deadline); + + qemu_virtual_clock_set_ns(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + warp); + + qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL); + timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]); + clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + } + qemu_clock_notify(QEMU_CLOCK_VIRTUAL); + + return clock; +} From patchwork Thu May 30 17:49:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 800200 Delivered-To: patch@linaro.org Received: by 2002:a5d:65c4:0:b0:35b:5a80:51b4 with SMTP id e4csp358940wrw; Thu, 30 May 2024 10:51:36 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXOdHD8Z3KXaZDUloTqsmaNmbuu5o2UlU63ND0G7jaLcI4nnekR0nhzyaDe9vRWZnjoG26PSPX5oHCKScZGlAza X-Google-Smtp-Source: AGHT+IH3m+qcdm5ptP8xdpoWr5B82hq5v13Y4xURAH1Drr1GoElDQDIwlyW9RNQ1fEui0QByCFKN X-Received: by 2002:a9d:6aca:0:b0:6f0:e6c4:7cb with SMTP id 46e09a7af769-6f90ad5e546mr3081644a34.0.1717091496541; Thu, 30 May 2024 10:51:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717091496; cv=none; d=google.com; s=arc-20160816; b=h82Sd/KWlzrGpdVZUaB8WASK6PBYHP+YNjdTy015btR2pK2fjeVoNxYM9ISYpHvS6E Oji2M/XAd21PiJj4BawTEf49WSYlJ9zBQOMVBQ/I/uaYXoQfVpd7Evp5Vel2WUHUExbQ bQ0pmPSgzs3kv3aHuYGK8G7jlSyEI96RImsbl7ktTGjO2nDpsB4UMKep2qJ0kEAn0QNk O/PCKjikTRukfxcjwCB3+k/8nXiJc0FJ3h9okbHcPuZjJfo4HE+0ScKqd0lPfH51lmLp Pbxk7EFf2qrlVZwAZuPEmFSiRHCZuFmBUBKBGY5u9jwl7cZForvFRiW3eb0vmiS4RXMN pHqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ChXWvUNOD02yoYequIGCuEzpK9HfTXZtOpXCWQ0j1Uw=; fh=cf3Q/5dJyAanhqpbGSZv6kxpEC/hZ4CRqZ3z5yvqhQw=; b=vzIyCS+HudxrfFSQOktmzRUBe2uAgNmiYzFv2uv5H36Nx0t7rtkiUVlle5MiaHzkd7 6Q/maP9AHLMPRVGfPFe18qSWPL6lijxQVPeSZDhU8jFSUIatCOAKPjwMT9ECt922aB0A GYNuAfCm/hv7R7C8ZeaSInXbwAaDWj58037H9O5y2vSsmsqr83tAeLgcGJUOJB4bjvOo B+1W3fJFHh7zyI4ZfyBFSCnnbcTHVXBwhXqLRGOixFUsacMQnJd4hHEo0wYSTZ96eatC AQkPrd2m1SlXfd4q+Y7WOyMk+nozUkasxaLDqJEcJr7sCGs55fBQtixWtTWiJRCSTIXU /NZw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b="dGG/j/ku"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d75a77b69052e-43ff23dd15fsi881391cf.172.2024.05.30.10.51.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 May 2024 10:51:36 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b="dGG/j/ku"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCjuY-0003sG-UB; Thu, 30 May 2024 13:49:58 -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 1sCjuX-0003rp-N2 for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:57 -0400 Received: from mail-pl1-x62c.google.com ([2607:f8b0:4864:20::62c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCjuV-0002SW-Tr for qemu-devel@nongnu.org; Thu, 30 May 2024 13:49:57 -0400 Received: by mail-pl1-x62c.google.com with SMTP id d9443c01a7336-1f630e35a01so1388035ad.1 for ; Thu, 30 May 2024 10:49:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717091393; x=1717696193; 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=ChXWvUNOD02yoYequIGCuEzpK9HfTXZtOpXCWQ0j1Uw=; b=dGG/j/kusF2OC8h8X2M1KRmzvUNk2LUH3LaPIPUWkPcIxzcZ736gaQqYhoEd82Cbz2 9JHDDiPs3xnOK2bukJ33HbAuWQ6wb/QM7CFAej/BehNbnBFxQInDMCQuaWihnXf/l6Mx NB7riwuhfk+C7i5XUo6TqQbYNjQuGLjAgKKEk6f1GGGaWeIV0gXIQ9SX9eOVWT/LCiXs 2PAv2+Tu6KfZQ33ZZfHv3IAN+94cxcxZUVIsGLDHfN1Cg6pp4yWPGbURm+0Lh4mQX094 6VzNFDa6U4yzi8nfghzpQrmq4Kppwi6oemvoVK0nb4A5uzVTU0rdwUUNNtLHp/qSxbx9 lezw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717091393; x=1717696193; 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=ChXWvUNOD02yoYequIGCuEzpK9HfTXZtOpXCWQ0j1Uw=; b=fqF7HfIjrMJh4PtmphHwpWJxPCgcH4eSfl5zHxxuroC1rFdzIvf6SGVkUly+FFjNyp x78RzwkJ5Qxf2Hl5dvgzSJiICt9WlNyRyR01XSwO7KQHBYMwlo7LVjOQcyuZnxUX/F2b JPBNyuDrgePfz5PE/oU5AQbsJtDc2IVW1WjVWum+/cT0qAb7PDBQl/MCsWRN2ZmhqEkJ 1WhaG52ItzJDN3W6bN0YayK/yjWnD9kSNdNRbz7hvmDdteorDFSIPv/Nb8W5uqBeIzjj J/F+FHC3YmCiamKn1Sbtx33ThosILeSPJy/AeR/ih5GDgwwBUgSlai7BI/Wjczem6PeC Tp2A== X-Gm-Message-State: AOJu0YzCu4W2PScJfsWdUhTt/pZxCEslc4LWfPtFK0Hmoxa4yyHEsfJ0 PWyXlNpbwzjW5muP5gWOLwlcqYXYEn3RXkj0xrFYsT57k2/y9Tgh4ysp6sx8MuowJG2LAkbTlaK ro0U= X-Received: by 2002:a17:902:e890:b0:1f6:225e:6769 with SMTP id d9443c01a7336-1f6225e697fmr22279025ad.21.1717091393620; Thu, 30 May 2024 10:49:53 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6323deb38sm590405ad.124.2024.05.30.10.49.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 10:49:52 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Richard Henderson , Laurent Vivier , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Paolo Bonzini , Pierrick Bouvier Subject: [PATCH v2 4/6] qtest: move qtest_{get, set}_virtual_clock to accel/qtest/qtest.c Date: Thu, 30 May 2024 10:49:37 -0700 Message-Id: <20240530174939.749163-5-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240530174939.749163-1-pierrick.bouvier@linaro.org> References: <20240530174939.749163-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62c; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pl1-x62c.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, RCVD_IN_DNSWL_NONE=-0.0001, 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org Signed-off-by: Pierrick Bouvier --- include/sysemu/qtest.h | 3 --- accel/qtest/qtest.c | 12 ++++++++++++ system/qtest.c | 12 ------------ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/include/sysemu/qtest.h b/include/sysemu/qtest.h index 45f3b7e1df5..c161d751650 100644 --- a/include/sysemu/qtest.h +++ b/include/sysemu/qtest.h @@ -34,9 +34,6 @@ void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error ** void qtest_server_set_send_handler(void (*send)(void *, const char *), void *opaque); void qtest_server_inproc_recv(void *opaque, const char *buf); - -int64_t qtest_get_virtual_clock(void); -void qtest_set_virtual_clock(int64_t count); #endif #endif diff --git a/accel/qtest/qtest.c b/accel/qtest/qtest.c index 53182e6c2ae..bf14032d294 100644 --- a/accel/qtest/qtest.c +++ b/accel/qtest/qtest.c @@ -24,6 +24,18 @@ #include "qemu/main-loop.h" #include "hw/core/cpu.h" +static int64_t qtest_clock_counter; + +static int64_t qtest_get_virtual_clock(void) +{ + return qatomic_read_i64(&qtest_clock_counter); +} + +static void qtest_set_virtual_clock(int64_t count) +{ + qatomic_set_i64(&qtest_clock_counter, count); +} + static int qtest_init_accel(MachineState *ms) { return 0; diff --git a/system/qtest.c b/system/qtest.c index e6f6b4e62d5..ba210780ec0 100644 --- a/system/qtest.c +++ b/system/qtest.c @@ -325,18 +325,6 @@ static void qtest_irq_handler(void *opaque, int n, int level) } } -static int64_t qtest_clock_counter; - -int64_t qtest_get_virtual_clock(void) -{ - return qatomic_read_i64(&qtest_clock_counter); -} - -void qtest_set_virtual_clock(int64_t count) -{ - qatomic_set_i64(&qtest_clock_counter, count); -} - static bool (*process_command_cb)(CharBackend *chr, gchar **words); void qtest_set_command_cb(bool (*pc_cb)(CharBackend *chr, gchar **words)) From patchwork Thu May 30 17:49:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 800204 Delivered-To: patch@linaro.org Received: by 2002:a5d:65c4:0:b0:35b:5a80:51b4 with SMTP id e4csp359019wrw; Thu, 30 May 2024 10:51:49 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXkqpB6wI2WzJwHRZy6SlopuHPA2tb8zb5BcafR++Dv6G0uUKfYVA7x04AaIR6fTSfP3B6/HnOPpElIczpVN/o7 X-Google-Smtp-Source: AGHT+IHSYxqvDdESX0M5HMaI8VTpe0suwUJ1n9AjWyvpxvxOW/kUdxZL/ConOfi41AJJPFJQO8Yd X-Received: by 2002:ac8:5e4a:0:b0:434:7045:129 with SMTP id d75a77b69052e-43fe92cd81dmr32650741cf.40.1717091509158; Thu, 30 May 2024 10:51:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717091509; cv=none; d=google.com; s=arc-20160816; b=EelrK9REpcluzTwD6HUwvTbKk0+1eVnblZjBbXkO3SLBjv9yRJkfEB7QSRWp+uwOPp UEMeBh3+jP9SrMTGNIBLhDwLQVOnWfG6fTu+mhSqF63CZxkb9rNvVxIdJhMc2teA7rQu zaXyeWzJztf43RcVaPsHBB9CWGec755f2r6sMvsNMh0j2uvDK15t4zYna3V1RFT6RqUp TbSC6VaTRt/FSnDB45HxASaEH1nm8lTRJ+2wQfv0kWkUKtAcqXMwcDjmxwtX9ENaYuzz kPmq5AKIiMGAHlrNJLIT9EwFX6lyn/vn3qzvNd+mplvQXoUKQFZF60ufycH1qwRrPn7g MTIw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=4pgM/UwM460cpw8hnXWYswA57iFvGhgQxtIaLtYjo7Y=; fh=cf3Q/5dJyAanhqpbGSZv6kxpEC/hZ4CRqZ3z5yvqhQw=; b=CwWu7FD/u3/ZVRj95VnRpoTzSfKQU6uEBhVYIiODUHkYllxSSY35IAx90JaCQJjIaG KV5+m41mDI6UzDRMTHFfpxy4u9/kkGuPSTSfcvEEoTAJlupMwdj28gkKMS36NqXCU1S2 FU1DzykJ8Kvmo3cBnWQEv1niUwjEgEE4QCffa7i9lrdX8H/8j9FWlgnJrSEyPderG66L g5PBHNbM7V9WzDTWwtwa3/5p+6MLpC9BbNgkNgWza4u1p27cv7+ODRE4quKzhzEYn01j NiJUAWxflUpbLBsVFg4BAXplO9Ayp/rr/BhAQ3LViTP5my/tkyVFqnzUv7YYXgLewCif HgvQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ebuKLsaL; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d75a77b69052e-43ff257eb83si741501cf.444.2024.05.30.10.51.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 May 2024 10:51:49 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ebuKLsaL; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCjud-0003ty-PE; Thu, 30 May 2024 13:50:03 -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 1sCjua-0003t6-TM for qemu-devel@nongnu.org; Thu, 30 May 2024 13:50:00 -0400 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCjuX-0002Sq-56 for qemu-devel@nongnu.org; Thu, 30 May 2024 13:50:00 -0400 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-1f47728fa4cso7956885ad.3 for ; Thu, 30 May 2024 10:49:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717091395; x=1717696195; 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=4pgM/UwM460cpw8hnXWYswA57iFvGhgQxtIaLtYjo7Y=; b=ebuKLsaLQCTDc+mZwN4t2jFkCK5V9wv6c/nB9zto8xCrx1gCtHtx/rsVoOIFz6qj9N 8axs9mLIOfa9tMXGCh/uEEVY7rPlfc+4BaUzk+Icqo3m5TMjUo0EFtRSPbUmiNPSrws4 NyAEGQyCFVkRO7MuaSNOooa6zyf0cjjhCHby1wGYjyHVJmxq569/+6nDpZLlUySC73gT 7SkO8zfAgDfOByPk4NuSJJ3NRmVWT6gSA2VlRwGtyDqHKBv1M5dfR8TQeCgQFt7+d5Ya isfuxuUeuvTv0T0k7YSYK2acqi0rUv1+2pNq7A0WoEMSKcSTVlLSglUPGKeHn5A0mhL+ toLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717091395; x=1717696195; 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=4pgM/UwM460cpw8hnXWYswA57iFvGhgQxtIaLtYjo7Y=; b=CJq8bSZS5LjZA63SAoUFUy6GiHEn9MGAm+zPY43tW0AP8GQoBOS7n/3bGoekCt53nM EAYFvoBfZQoWvxSt9J2g1iAqyZ890Rx6DoLgAXdoMNb3hGBXDawoXOgSPaMdqb1L9N1K syYUM79MFxjIYbRAR7l3BScGxMYYvAHq2rzzANcio6aMGNDVf4RqiqCh2EnKhVmoz72O wwZCFCjueRvrHPRtLA3jdSIw/Vd9gTGA0xztSu961Y7qx16k+FFqrGT49sV3IEiPsA14 OWEc4xjq3d5+tcduU+cdVJ3yLNR/kE72YOLIpjHXA+IQ7eqefg6BBwobYDSSuFIHfIC6 f6Pw== X-Gm-Message-State: AOJu0YzOS4NcwwhoMRB+0Dllj1uortwDVKzWL41vsonM23dRkvmxbGuO gfjpY3+3iq0vsNIExdkGxx4lgIpdhiNuRBXC35cDn4LCFnPo8n4IsQTUjoIg60S/naBMjJZtsO2 ND5Y= X-Received: by 2002:a17:902:ca0c:b0:1f4:867c:dc34 with SMTP id d9443c01a7336-1f6193f8762mr24070025ad.13.1717091395187; Thu, 30 May 2024 10:49:55 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6323deb38sm590405ad.124.2024.05.30.10.49.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 10:49:54 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Richard Henderson , Laurent Vivier , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Paolo Bonzini , Pierrick Bouvier Subject: [PATCH v2 5/6] plugins: add time control API Date: Thu, 30 May 2024 10:49:38 -0700 Message-Id: <20240530174939.749163-6-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240530174939.749163-1-pierrick.bouvier@linaro.org> References: <20240530174939.749163-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::635; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pl1-x635.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, RCVD_IN_DNSWL_NONE=-0.0001, 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org From: Alex Bennée Expose the ability to control time through the plugin API. Only one plugin can control time so it has to request control when loaded. There are probably more corner cases to catch here. From: Alex Bennée Signed-off-by: Alex Bennée Signed-off-by: Pierrick Bouvier --- include/qemu/qemu-plugin.h | 23 +++++++++++++++++++++++ plugins/api.c | 31 +++++++++++++++++++++++++++++++ plugins/qemu-plugins.symbols | 2 ++ 3 files changed, 56 insertions(+) diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index 95703d8fec1..80b1637cede 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -661,6 +661,29 @@ void qemu_plugin_register_vcpu_mem_inline_per_vcpu( qemu_plugin_u64 entry, uint64_t imm); +/** + * qemu_plugin_request_time_control() - request the ability to control time + * + * This grants the plugin the ability to control system time. Only one + * plugin can control time so if multiple plugins request the ability + * all but the first will fail. + * + * Returns an opaque handle or NULL if fails + */ +const void *qemu_plugin_request_time_control(void); + +/** + * qemu_plugin_update_ns() - update system emulation time + * @handle: opaque handle returned by qemu_plugin_request_time_control() + * @time: time in nanoseconds + * + * This allows an appropriately authorised plugin (i.e. holding the + * time control handle) to move system time forward to @time. + * + * Start time is 0. + */ +void qemu_plugin_update_ns(const void *handle, int64_t time); + typedef void (*qemu_plugin_vcpu_syscall_cb_t)(qemu_plugin_id_t id, unsigned int vcpu_index, int64_t num, uint64_t a1, uint64_t a2, diff --git a/plugins/api.c b/plugins/api.c index 5a0a7f8c712..26822b69ea2 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -39,6 +39,7 @@ #include "qemu/main-loop.h" #include "qemu/plugin.h" #include "qemu/log.h" +#include "qemu/timer.h" #include "tcg/tcg.h" #include "exec/exec-all.h" #include "exec/gdbstub.h" @@ -583,3 +584,33 @@ uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry) } return total; } + +/* + * Time control + */ +static bool has_control; + +const void *qemu_plugin_request_time_control(void) +{ + if (!has_control) { + has_control = true; + return &has_control; + } + return NULL; +} + +static void advance_virtual_time__async(CPUState *cpu, run_on_cpu_data data) +{ + int64_t new_time = data.host_ulong; + qemu_clock_advance_virtual_time(new_time); +} + +void qemu_plugin_update_ns(const void *handle, int64_t new_time) +{ + if (handle == &has_control) { + /* Need to execute out of cpu_exec, so bql can be locked. */ + async_run_on_cpu(current_cpu, + advance_virtual_time__async, + RUN_ON_CPU_HOST_ULONG(new_time)); + } +} diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols index aa0a77a319f..ca773d8d9fe 100644 --- a/plugins/qemu-plugins.symbols +++ b/plugins/qemu-plugins.symbols @@ -38,6 +38,7 @@ qemu_plugin_register_vcpu_tb_exec_cond_cb; qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu; qemu_plugin_register_vcpu_tb_trans_cb; + qemu_plugin_request_time_control; qemu_plugin_reset; qemu_plugin_scoreboard_free; qemu_plugin_scoreboard_find; @@ -51,5 +52,6 @@ qemu_plugin_u64_set; qemu_plugin_u64_sum; qemu_plugin_uninstall; + qemu_plugin_update_ns; qemu_plugin_vcpu_for_each; }; From patchwork Thu May 30 17:49:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 800203 Delivered-To: patch@linaro.org Received: by 2002:a5d:65c4:0:b0:35b:5a80:51b4 with SMTP id e4csp359014wrw; Thu, 30 May 2024 10:51:49 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXOgN1sMh+If/5cbFiJLTUk6lnGtFp9CGYvJtH0+E47azJImE8vF3k/ov0GCWt8hR/GiDYu0ePQIX0LwlvVr/11 X-Google-Smtp-Source: AGHT+IG4Yz++COi/qxgioEMuB03sSP56p7n4MQemxLtkg9M2oKi15nELnlMXIZgR3qVOq4Hdws4f X-Received: by 2002:a05:6808:434e:b0:3c9:64b5:c458 with SMTP id 5614622812f47-3d1dcc9d941mr3082855b6e.3.1717091508874; Thu, 30 May 2024 10:51:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1717091508; cv=none; d=google.com; s=arc-20160816; b=m9/EQiiRWJlFEeIrii1Zq//45UxsrsSzslthvd7euL6awvDmfhtyN6B0saASSesPdb 8reahrhS318XirbWSlVHHJNTwQs7nhRQ+mCxbEN9Ak2rs8iqnvt+udOysc/48stbOL/D Ty8zzfEYKzxBWi/eLQBqwqdAePP47+HHGRm0sqGXeqqiQ4ni8K4uuQFfOLLP6Q4iY5PA x/E8G1/BNPSPZuE5wlOxtQ84MrH/y5tbzoMZoG8IJ3ViaEMK0x1EO9q5j/DtJf9qK5Wh 2L7aQ5lid3khodfiss95Dj3Ca91JlCAUh1SgaqR7HjTde6m4NiPNiNeJL4HXoBPmh68G P3Yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=a9mfgVW6aKcKwSz1phkXMBstK1m6Ri0Rr6frZF0Wh5I=; fh=cf3Q/5dJyAanhqpbGSZv6kxpEC/hZ4CRqZ3z5yvqhQw=; b=em1ZWRRZkS1gC8U0IUCowLIOfFX3NyDrVjL1yVnJUqLjJhGR0afRd/eJa9lWbIwHLj Esq5MMLOktjbYClW/AjUUoXXLH9DRtOff80R03yQpGjR6YMpHC0wW8oRxLp4xISpkLVW E6ss9lOOj+XZff75JF077gx09YVb+0/NJmqBjwXmwhQ3mNlSYZ8/d5xrfB+6M5/CRX25 g5XMxYUHSgkjASeOl+DdFlnLn2Rd6tbgUvodTNFjKRc9I0d3IDd/auEkPONjK9W9s981 Q5TtGpRpyGR8pZyaM4jeGdfYbq6leP1Fz+SVX28S6a7qjPkJoXd3G9wMLbHj4nO9+65B QhvA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=voN+CQJq; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d75a77b69052e-43ff259f574si711651cf.648.2024.05.30.10.51.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 May 2024 10:51:48 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=voN+CQJq; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCjud-0003tS-6b; Thu, 30 May 2024 13:50:03 -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 1sCjua-0003sw-9J for qemu-devel@nongnu.org; Thu, 30 May 2024 13:50:00 -0400 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCjuY-0002T7-8h for qemu-devel@nongnu.org; Thu, 30 May 2024 13:50:00 -0400 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1f62fae8c1aso2114755ad.3 for ; Thu, 30 May 2024 10:49:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717091396; x=1717696196; 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=a9mfgVW6aKcKwSz1phkXMBstK1m6Ri0Rr6frZF0Wh5I=; b=voN+CQJqije/81pB0luWr/2dAU8KrBIB1eEk5qrDk3LkClzbTh/q8iaKAAfiagoT2M EYcAhTcGG8ssaQJsXFtnQne79/GmGjIFwirkfSKl4urykeUcDJ6Whkt9Zr/cisBgooQK uCxS3lJsvTl3YFVsDpFTSBVFVGnJGRXSQVXeMQJ86oF58UwuuzJx5VwUbXz4mpNDbjBf xYaZYAohelHvyuA+NGkyTjke6/tcY5KW47Yt3UYIMEb++QdadDC3ggAdqx/q6/nSWbz+ p/bfud2JbI/pTTleHqzALRqOJttjQeXiomDpLfrtvWt35/977mUlrbP5Hzc0aCrCT9zc V6Jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717091396; x=1717696196; 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=a9mfgVW6aKcKwSz1phkXMBstK1m6Ri0Rr6frZF0Wh5I=; b=Daifze0QdHxCmOUIbwOBnYXOA8SnN58uGnWJ7MH79mDyWZOqRSH1UwZA2jK+k622Ky VJanc8otdpfz6i/YEVLpdGUp1+Lc13qZII/+SD0Rkz/JUH0x01JjpTXWrcUgcPzCAZnL wWITbo8j/k7ZoRSOiHiMk4Y/ZWLmYQbm5xEF7TdVm+Dwyi+x69jw3iNKA+syOfi915f5 9JEqZyXFDR+r/N9VVr2u9En1fwsUVd4sZU7bA72Z6kGTl0oykzc5B/y3Kkq0OyfIvmA4 5i6WG61BXQq8xA2XxZT38R1SpSoLeey8tTVbrtl+8OgK6n1NDORPfE5+41IL8XvSRY8F NjoQ== X-Gm-Message-State: AOJu0YwoI9tr97FyL45Pi4wC78DrqKD5POYWLcYjcpzWFKvWor6/n+u6 ryX3I9/GoE4BKbRVT8eKhelPfHjYx6NNfv23KCoKj73gkAwW+jG7RI3p7oaVQeqj7yTMdj70DPK RH/U= X-Received: by 2002:a17:902:e549:b0:1f4:5fe5:74c9 with SMTP id d9443c01a7336-1f61a4e4e8emr38818015ad.69.1717091396339; Thu, 30 May 2024 10:49:56 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6323deb38sm590405ad.124.2024.05.30.10.49.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 10:49:55 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Richard Henderson , Laurent Vivier , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , Alexandre Iooss , Mahmoud Mandour , Paolo Bonzini , Pierrick Bouvier Subject: [PATCH v2 6/6] contrib/plugins: add ips plugin example for cost modeling Date: Thu, 30 May 2024 10:49:39 -0700 Message-Id: <20240530174939.749163-7-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240530174939.749163-1-pierrick.bouvier@linaro.org> References: <20240530174939.749163-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::62d; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pl1-x62d.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, RCVD_IN_DNSWL_NONE=-0.0001, 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org This plugin uses the new time control interface to make decisions about the state of time during the emulation. The algorithm is currently very simple. The user specifies an ips rate which applies per core. If the core runs ahead of its allocated execution time the plugin sleeps for a bit to let real time catch up. Either way time is updated for the emulation as a function of total executed instructions with some adjustments for cores that idle. Examples -------- Slow down execution of /bin/true: $ num_insn=$(./build/qemu-x86_64 -plugin ./build/tests/plugin/libinsn.so -d plugin /bin/true |& grep total | sed -e 's/.*: //') $ time ./build/qemu-x86_64 -plugin ./build/contrib/plugins/libips.so,ips=$(($num_insn/4)) /bin/true real 4.000s Boot a Linux kernel simulating a 250MHz cpu: $ /build/qemu-system-x86_64 -kernel /boot/vmlinuz-6.1.0-21-amd64 -append "console=ttyS0" -plugin ./build/contrib/plugins/libips.so,ips=$((250*1000*1000)) -smp 1 -m 512 check time until kernel panic on serial0 Signed-off-by: Pierrick Bouvier --- contrib/plugins/ips.c | 239 +++++++++++++++++++++++++++++++++++++++ contrib/plugins/Makefile | 1 + 2 files changed, 240 insertions(+) create mode 100644 contrib/plugins/ips.c diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c new file mode 100644 index 00000000000..cf3159df391 --- /dev/null +++ b/contrib/plugins/ips.c @@ -0,0 +1,239 @@ +/* + * ips rate limiting plugin. + * + * This plugin can be used to restrict the execution of a system to a + * particular number of Instructions Per Second (ips). This controls + * time as seen by the guest so while wall-clock time may be longer + * from the guests point of view time will pass at the normal rate. + * + * This uses the new plugin API which allows the plugin to control + * system time. + * + * Copyright (c) 2023 Linaro Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include + +QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION; + +/* how many times do we update time per sec */ +#define NUM_TIME_UPDATE_PER_SEC 10 +#define NSEC_IN_ONE_SEC (1000 * 1000 * 1000) + +static GMutex global_state_lock; + +static uint64_t insn_per_second = 1000 * 1000; /* ips per core, per second */ +static uint64_t insn_quantum; /* trap every N instructions */ +static bool precise_execution; /* count every instruction */ +static int64_t start_time_ns; /* time (ns since epoch) first vCPU started */ +static int64_t virtual_time_ns; /* last set virtual time */ + +static const void *time_handle; + +typedef enum { + UNKNOWN = 0, + EXECUTING, + IDLE, + FINISHED +} vCPUState; + +typedef struct { + uint64_t counter; + uint64_t track_insn; + vCPUState state; + /* timestamp when vCPU entered state */ + int64_t last_state_time; +} vCPUTime; + +struct qemu_plugin_scoreboard *vcpus; + +/* return epoch time in ns */ +static int64_t now_ns(void) +{ + return g_get_real_time() * 1000; +} + +static uint64_t num_insn_during(int64_t elapsed_ns) +{ + double num_secs = elapsed_ns / (double) NSEC_IN_ONE_SEC; + return num_secs * (double) insn_per_second; +} + +static int64_t time_for_insn(uint64_t num_insn) +{ + double num_secs = (double) num_insn / (double) insn_per_second; + return num_secs * (double) NSEC_IN_ONE_SEC; +} + +static int64_t uptime_ns(void) +{ + int64_t now = now_ns(); + g_assert(now >= start_time_ns); + return now - start_time_ns; +} + +static void vcpu_set_state(vCPUTime *vcpu, vCPUState new_state) +{ + vcpu->last_state_time = now_ns(); + vcpu->state = new_state; +} + +static void update_system_time(vCPUTime *vcpu) +{ + /* flush remaining instructions */ + vcpu->counter += vcpu->track_insn; + vcpu->track_insn = 0; + + int64_t uptime = uptime_ns(); + uint64_t expected_insn = num_insn_during(uptime); + + if (vcpu->counter >= expected_insn) { + /* this vcpu ran faster than expected, so it has to sleep */ + uint64_t insn_advance = vcpu->counter - expected_insn; + uint64_t time_advance_ns = time_for_insn(insn_advance); + int64_t sleep_us = time_advance_ns / 1000; + g_usleep(sleep_us); + } + + /* based on number of instructions, what should be the new time? */ + int64_t new_virtual_time = time_for_insn(vcpu->counter); + + g_mutex_lock(&global_state_lock); + + /* Time only moves forward. Another vcpu might have updated it already. */ + if (new_virtual_time > virtual_time_ns) { + qemu_plugin_update_ns(time_handle, new_virtual_time); + virtual_time_ns = new_virtual_time; + } + + g_mutex_unlock(&global_state_lock); +} + +static void set_start_time() +{ + g_mutex_lock(&global_state_lock); + if (!start_time_ns) { + start_time_ns = now_ns(); + } + g_mutex_unlock(&global_state_lock); +} + +static void vcpu_init(qemu_plugin_id_t id, unsigned int cpu_index) +{ + vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index); + /* ensure start time is set first */ + set_start_time(); + /* start counter from absolute time reference */ + vcpu->counter = num_insn_during(uptime_ns()); + vcpu_set_state(vcpu, EXECUTING); +} + +static void vcpu_idle(qemu_plugin_id_t id, unsigned int cpu_index) +{ + vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index); + vcpu_set_state(vcpu, IDLE); +} + +static void vcpu_resume(qemu_plugin_id_t id, unsigned int cpu_index) +{ + vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index); + g_assert(vcpu->state == IDLE); + int64_t idle_time = now_ns() - vcpu->last_state_time; + /* accumulate expected number of instructions */ + vcpu->counter += num_insn_during(idle_time); + vcpu_set_state(vcpu, EXECUTING); +} + +static void vcpu_exit(qemu_plugin_id_t id, unsigned int cpu_index) +{ + vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index); + vcpu_set_state(vcpu, FINISHED); + update_system_time(vcpu); + vcpu->counter = 0; +} + +static void every_insn_quantum(unsigned int cpu_index, void *udata) +{ + vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index); + g_assert(vcpu->track_insn >= insn_quantum); + update_system_time(vcpu); +} + +static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) +{ + size_t n_insns = qemu_plugin_tb_n_insns(tb); + qemu_plugin_u64 track_insn = + qemu_plugin_scoreboard_u64_in_struct(vcpus, vCPUTime, track_insn); + if (precise_execution) { + /* count (and eventually trap) on every instruction */ + for (int idx = 0; idx < qemu_plugin_tb_n_insns(tb); ++idx) { + struct qemu_plugin_insn *insn = qemu_plugin_tb_get_insn(tb, idx); + qemu_plugin_register_vcpu_insn_exec_inline_per_vcpu( + insn, QEMU_PLUGIN_INLINE_ADD_U64, track_insn, 1); + qemu_plugin_register_vcpu_insn_exec_cond_cb( + insn, every_insn_quantum, + QEMU_PLUGIN_CB_NO_REGS, QEMU_PLUGIN_COND_GE, + track_insn, insn_quantum, NULL); + } + } else { + /* count (and eventually trap) once per tb */ + qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu( + tb, QEMU_PLUGIN_INLINE_ADD_U64, track_insn, n_insns); + qemu_plugin_register_vcpu_tb_exec_cond_cb( + tb, every_insn_quantum, + QEMU_PLUGIN_CB_NO_REGS, QEMU_PLUGIN_COND_GE, + track_insn, insn_quantum, NULL); + } +} + +static void plugin_exit(qemu_plugin_id_t id, void *udata) +{ + qemu_plugin_scoreboard_free(vcpus); +} + +QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, + const qemu_info_t *info, int argc, + char **argv) +{ + for (int i = 0; i < argc; i++) { + char *opt = argv[i]; + g_auto(GStrv) tokens = g_strsplit(opt, "=", 2); + if (g_strcmp0(tokens[0], "ips") == 0) { + insn_per_second = g_ascii_strtoull(tokens[1], NULL, 10); + if (!insn_per_second && errno) { + fprintf(stderr, "%s: couldn't parse %s (%s)\n", + __func__, tokens[1], g_strerror(errno)); + return -1; + } + + } else if (g_strcmp0(tokens[0], "precise") == 0) { + if (!qemu_plugin_bool_parse(tokens[0], tokens[1], + &precise_execution)) { + fprintf(stderr, "boolean argument parsing failed: %s\n", opt); + return -1; + } + } else { + fprintf(stderr, "option parsing failed: %s\n", opt); + return -1; + } + } + + vcpus = qemu_plugin_scoreboard_new(sizeof(vCPUTime)); + insn_quantum = insn_per_second / NUM_TIME_UPDATE_PER_SEC; + + time_handle = qemu_plugin_request_time_control(); + g_assert(time_handle); + + qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans); + qemu_plugin_register_vcpu_init_cb(id, vcpu_init); + qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle); + qemu_plugin_register_vcpu_resume_cb(id, vcpu_resume); + qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit); + qemu_plugin_register_atexit_cb(id, plugin_exit, NULL); + + return 0; +} diff --git a/contrib/plugins/Makefile b/contrib/plugins/Makefile index 0b64d2c1e3a..449ead11305 100644 --- a/contrib/plugins/Makefile +++ b/contrib/plugins/Makefile @@ -27,6 +27,7 @@ endif NAMES += hwprofile NAMES += cache NAMES += drcov +NAMES += ips ifeq ($(CONFIG_WIN32),y) SO_SUFFIX := .dll