From patchwork Thu May 16 22:20:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Pierrick Bouvier X-Patchwork-Id: 797270 Delivered-To: patch@linaro.org Received: by 2002:adf:e68e:0:b0:351:d90a:5487 with SMTP id r14csp501209wrm; Thu, 16 May 2024 15:22:46 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXITH8ibxX+HvLGGNHOfemcpAhFM9/ZUNFxxISPlVPe7lCbVRlVTWoxkF9TT1fzfhk87jKWWl9zW8QusTCAwdAX X-Google-Smtp-Source: AGHT+IGCxi6GfVmrIBQEobllgY2AuRxyOPAjsSqNquwZ24BQLlSRfUF3dVVul079LwLFtW3fZsWK X-Received: by 2002:a05:6358:9987:b0:183:f7cb:af75 with SMTP id e5c5f4694b2df-193bd00710cmr2030193155d.32.1715898165725; Thu, 16 May 2024 15:22:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1715898165; cv=none; d=google.com; s=arc-20160816; b=eoH5cy2l0MZWAT+PsvJwSRQHwHGFSbfxwgd/PtbFvtmdQvTH8aKoxNHrbZVzp5KL41 WejpPvt+tYy8EuKbic7NVcx9Cg08bKNK7KQ8PdzEWRo6j1Wrvajn3bQtJTvWratuW3e0 iAwC+HHkN1sXQkjV8/EkeZWHg06FSHGq/jG+kAcWJfWEyHPJapsr8rNf9q6r7tBAqPub yjM/aCOjNpwaI9S5b7p6yznQM5T3xSSjsQBsi1Hd0BMRZXIONNIEfvbFysq4NsDtsII/ 7xsk6ivYeq5b621VtlFLIKh9tA75z/ZwHSnWJJ/pV7Bvf7DEXd/TguU9pN0Uvl4GNkcH l3eg== 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=wCrQq/arpKfIJalWxUJZGuwFUrWxkEQgahovvZswQxw=; fh=dnKm9ic91IyE2znXvQafF3QZhC6YRQTIuif9qSthU6U=; b=uhRcV3F0lFxEJ978hYzQs5uEKfnvFsN6+yl8+Dnhzy10gARkhOE5F59wZb4LAJmCUV NYd4sfL96l9jYOckhko6AAm8LJqvigUXBv4U8Pnx/Qlli0tU4uHK40m40dYDkQXVMQnj p5303N/OnWzIVgsp25Q08Y8Y1XFahLdYggDQy+A7v05KyoyKqI3f6W1O5fH4BS7/xQ8V 7NjnaBhkW3A4WoHAhcPcrQfKfu8nMS3Qc3a7qptf1Jj1qwaH9qAmn1e1++PC8AM9EtAT Mnswea+CrI0H/JtFIz/m7snUSA/vEk2bG982ULDU4T5Us6n7PIJUIcz9xsxYOpCAXSbk Ko2A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=fKdBHwAt; 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-43df56d487asi153214561cf.678.2024.05.16.15.22.45 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 May 2024 15:22:45 -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=fKdBHwAt; 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 1s7jTV-0006m4-Bx; Thu, 16 May 2024 18:21:21 -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 1s7jTN-0006f1-GG for qemu-devel@nongnu.org; Thu, 16 May 2024 18:21:14 -0400 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1s7jTK-0003Bv-1R for qemu-devel@nongnu.org; Thu, 16 May 2024 18:21:12 -0400 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-6f447260f9dso693821b3a.0 for ; Thu, 16 May 2024 15:21:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1715898068; x=1716502868; 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=wCrQq/arpKfIJalWxUJZGuwFUrWxkEQgahovvZswQxw=; b=fKdBHwAtYslUzBxgFKDJlGt7y/j2X69XpYqipFOJ2oZC4SnPOOZ58rcb5TxTq7I5AK YiAtyNjNRKX/omkZgXpTzWvzg5xteOdkYQeu1SpqAOKUBOPprv3YGB9BXuCaeLgK5a0Q mupTrltfeUUvQFFGf7y0ZztVqR/nXizFgqpnCxP5b88GweuZSD0kkWE9bVvt/NJH284I QT9FVl60DfzVf1CwOpx3xcgilHlLqwpzdvU3uoddsF3zwIOivYYxkOE6DO208j1k5q1T KVPVOu22tWLY3aMNsvaFxZSdCk+xh/LErgZ0s7UnrXhFDXpAZuaNmz4jLYSXorsaBDgd eXLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715898068; x=1716502868; 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=wCrQq/arpKfIJalWxUJZGuwFUrWxkEQgahovvZswQxw=; b=xA0FuEvrKwVkn3QkK2dLAuLCsVlftrMVYJGpMdwnFpIVzABSW+2b0pfvCrzWi5JA8U RsCcYPKgfRGXH51xnybDqhnAWFzytwH9BgG/HrS3Rj9irDUXVHzgV+k/lYYwLs1Jlhqi mlG8fNydioROchQbfk0fx5decmUbv2jga89HgQd5MkYW66Yo5lJqotfXSEKuCZyoj3Xu 3nRqSixvg3S57fQ5PJp9/s+HqqikZD8rVciasxJO9+1sNjkJdhROeccFevDsGMefpnTV TyHdcVodWPpK1DrJV069Mbg2T5yWvp0zHe9rthJxeQ84iQWAZlMqCo8uKdYwjGarzFHa zcDw== X-Gm-Message-State: AOJu0Yz0Ym8terK7se9btU7zNYPUMV15oiGuzqxqyPG2APcEpYH0OmHz wP1PDmOnskEZUVXbHTN+olXRLTh7cBYx/e/IKgkKZQe7BB3nDM7SLlrZTAPuYq8psjFvNCcz5M8 TInM= X-Received: by 2002:a05:6a20:d70b:b0:1af:d9a3:f38d with SMTP id adf61e73a8af0-1afde202083mr19482104637.62.1715898067830; Thu, 16 May 2024 15:21:07 -0700 (PDT) Received: from linaro.vn.shawcable.net ([2604:3d08:9384:1d00::e697]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f4d2a66476sm13589219b3a.28.2024.05.16.15.21.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 May 2024 15:21:07 -0700 (PDT) From: Pierrick Bouvier To: qemu-devel@nongnu.org Cc: Thomas Huth , Laurent Vivier , Mahmoud Mandour , =?utf-8?q?Alex_Benn=C3=A9e?= , Alexandre Iooss , Richard Henderson , Pierrick Bouvier , Paolo Bonzini Subject: [PATCH 4/5] plugins: add time control API Date: Thu, 16 May 2024 15:20:46 -0700 Message-Id: <20240516222047.1853459-5-pierrick.bouvier@linaro.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240516222047.1853459-1-pierrick.bouvier@linaro.org> References: <20240516222047.1853459-1-pierrick.bouvier@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::42b; envelope-from=pierrick.bouvier@linaro.org; helo=mail-pf1-x42b.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 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 --- 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; };