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; };