From patchwork Fri Jun 20 17:27:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 898396 Delivered-To: patch@linaro.org Received: by 2002:a5d:5f54:0:b0:3a4:ee3f:8f15 with SMTP id cm20csp1562177wrb; Fri, 20 Jun 2025 15:25:56 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWNtggZDw8SLgxpbFvocquWySzndHAu555TNVuaAKzZKZR0rIDEAH/v7Ocq1tzEMgge6ZBPDQ==@linaro.org X-Google-Smtp-Source: AGHT+IFDbTsq2K2RGUMOed2k1cwpSd/hLf/YgE+Amlsscdb97Jr5saIqYQqxwk42loAgRaCZykxF X-Received: by 2002:ac8:5891:0:b0:4a4:3924:96b9 with SMTP id d75a77b69052e-4a77a25059emr79884521cf.52.1750458355793; Fri, 20 Jun 2025 15:25:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1750458355; cv=none; d=google.com; s=arc-20240605; b=aiPLjlDlsNIhuBGKVt4M0Ks3gfxzKvv+LvGms9jLZwUoRUn+vdvHkwA7YouO0jojZ+ ZP1+mrDmXt2l5fG/7fjLrl6BG/36i44EyloDVCWuvJWGcTEClEdYVo4gXEuMkn5Ijljg 9HSHoo+dF7aXYCu539kcAMcUpVQkCUPc6gtzxi7KSkyhWZKlQ/j9Ihkr3TPc9AYUEemL khuCZnzIyG2O5S+42sgPBCjdYldC+sUGSWetbrXE05/DfRMg6dhd5u9lLWkt/ShygrTG BFqGHe5tRkiPkqalPdNZ9YOUqyte8bdcdrALp7woAHYH9zQVf8oNr/Fth0DhqJ3rrSUe 5tog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; 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=WY9x0NPRZ8lLtMj2Ul1MxvXDA5qTO7mgp4F1gZCrJ00=; fh=AyzBWpdZKvTUKIe2KsNBcRb7uNXo8uS2i+VtImaSwe4=; b=NnxXLjvDd6zh3Wd9/NrCXIQRDkG1JTMFgoCMMRZGNV66AV2AV3UBtgIO8zeukAH7W5 5zF99ETU9S3B/BBlLfQXvGIuMF6eIMdJZvxL6FMgGFPa+5oiAd83fSZ982q4t2mpdS7S MMrhqe6fmqCeqvXkCOif02HkeIbpyF/EvewWsHxYsriV6U8mE9VMX3ORP+IGGJkdU3jP jWpoNpU/Sql173+iayZHvNmsgLwWSIJkKPipVXw62aktATd+Q+zgfDK6gz2QCyYJrr/B r8TlRXlVCa8KDPxMDvpkLRR+j2/V1czZqJMlIsjFL9nILaY2ar6oN76WbMJfQu6OQaCO 9Pog==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ZSkfG3VR; 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; dara=neutral header.i=@linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id d75a77b69052e-4a779d4752fsi27200331cf.78.2025.06.20.15.25.55 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 20 Jun 2025 15:25:55 -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=ZSkfG3VR; 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; dara=neutral header.i=@linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uSk6y-000684-JT; Fri, 20 Jun 2025 18:21:31 -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 1uSfX6-00074N-MV for qemu-devel@nongnu.org; Fri, 20 Jun 2025 13:28:08 -0400 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1uSfX4-0005so-NM for qemu-devel@nongnu.org; Fri, 20 Jun 2025 13:28:08 -0400 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-451ebd3d149so13485465e9.2 for ; Fri, 20 Jun 2025 10:28:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1750440484; x=1751045284; 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=WY9x0NPRZ8lLtMj2Ul1MxvXDA5qTO7mgp4F1gZCrJ00=; b=ZSkfG3VRV8xlWrxaK7LrILYqSSx1mH54z5nJa2Cft9G5JPMsAGqwXMIYGrAwUDw5Qq emO7rQeK8csi2Qi1oBRbRYXiX3qXKvOsY/ppidMMm7iggeXq36dqRGBRCu/XCHHd/saN B9tzKzfeO9xIGMtl1HAKE44CKhhplI63uNqkkPkACUNbdikXmlIBrBnVOkT/rfRLUTvu iQgFz39yTCkjvX9K2I2Uq/aLPE7Aw9AmB3UJoaEIirHZv4DuJb7nU6+TpnLJoN6eXDOU vOB5ZMs0XxrkZ7/WWu5iXyrFUw6AW5aoVZiomFXbfHJafeW6IAm0Dr2q1BoJqLPa80kJ ZqPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750440484; x=1751045284; 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=WY9x0NPRZ8lLtMj2Ul1MxvXDA5qTO7mgp4F1gZCrJ00=; b=f2T118EHBE/8jWg/ComcYKqT8OCC3Retvik8jCrztXX+jsELagh/ay2SRykHs6bb2f ocAm2QOt/xRTZp0oeIIA8smTbRE1LGClLK9ANje+w+sQoJiQXTz3uvEhx8Q+GCDvLIQy p1N9AQr5any7UBHpf6VZQX2iitB+K7nD5SHJZAgU61fbyuKvc3BWrIc9knlSVV15Trsf 6JDCunPSS3ToR8Fb5Sm72KZuFvrMbA9ZhAwRmk4w1W+Zt8Grdk3NZnSufSOaRbJdgF+U OH+XHxBtcZha/FXo10ArdOt9vwOpu/Atc9Mr/qqXaRvTf9ZmNEwXlk+RLRtYFTv2pqE7 X+iQ== X-Gm-Message-State: AOJu0YzOH6ALswoWfg45mJmcY6fRYWiqJY8MzRu0Q/pSQabPEeK16gyW qGfBc3a0Rcms6WKrotKdTF5UJj249Sc+jo7vpg2osLuST2uqgTVyAdDXtBQknubH6xQqfWzMGBw quSD0NC5cEQ== X-Gm-Gg: ASbGncu3IsVZvew0yG2+zbs/cRalEuVOISbLIn2HCd86fA61s8+Uvrax0t6B+LSnzaz MSJZ7tYq5DYB3av+Fa1jeEc7uKA0NkgLFiBS7mEKy3WO1YJ5BdJqBqCJinNjF/EJCHKZ4sN5knC ASomtavygc6og4LENlYJIkb/JRC0UarqVfFKyJiLyLpE2cYBoI/m0ng+O5UC2NHJfKAIwOn50D2 jQv5LPUPFgQxhkNU33ZiauzqjS6Ruww5MtrXVOyBCeP9swOhK91+AIXwLGbd0ZUScjHc2xqkBHa XgOc1dXuHoF1iTS2mNxDpS2ZJ/3PLyt1zjuhXjB2zcx9OmRpXNhjHyIOmI422+wF4fxJ7q1FUsq JtYGLF9aIh9GoIDT/ulZBjfVgxffyU0XfcMKklD7xp83mKEROnAh3gX63 X-Received: by 2002:a05:600c:83c7:b0:440:61eb:2ce5 with SMTP id 5b1f17b1804b1-453655c6169mr42573945e9.17.1750440484389; Fri, 20 Jun 2025 10:28:04 -0700 (PDT) Received: from localhost.localdomain (101.red-95-127-63.dynamicip.rima-tde.net. [95.127.63.101]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4535eac8e19sm65079415e9.21.2025.06.20.10.28.01 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 20 Jun 2025 10:28:03 -0700 (PDT) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Alexander Graf , =?utf-8?q?Alex_Benn=C3=A9e?= , Richard Henderson , Paolo Bonzini , Peter Maydell , Julian Armistead , Cameron Esfahani , Mark Burton , Thomas Huth , "Edgar E. Iglesias" , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-?= =?utf-8?q?Daud=C3=A9?= Subject: [RFC PATCH RESEND 01/42] accel/split: Minimal stubs for split accelerator Date: Fri, 20 Jun 2025 19:27:09 +0200 Message-ID: <20250620172751.94231-2-philmd@linaro.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250620172751.94231-1-philmd@linaro.org> References: <20250620172751.94231-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::334; envelope-from=philmd@linaro.org; helo=mail-wm1-x334.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: Julian Armistead Signed-off-by: Julian Armistead Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Richard Henderson --- accel/split/split-accel-ops.c | 161 ++++++++++++++++++++++++++++++++++ accel/split/split-all.c | 77 ++++++++++++++++ system/vl.c | 4 + accel/Kconfig | 6 ++ accel/meson.build | 1 + accel/split/meson.build | 9 ++ 6 files changed, 258 insertions(+) create mode 100644 accel/split/split-accel-ops.c create mode 100644 accel/split/split-all.c create mode 100644 accel/split/meson.build diff --git a/accel/split/split-accel-ops.c b/accel/split/split-accel-ops.c new file mode 100644 index 00000000000..e5c1d51d426 --- /dev/null +++ b/accel/split/split-accel-ops.c @@ -0,0 +1,161 @@ +/* + * QEMU "split" accelerator (HW + SW) ops + * + * Copyright (c) 2025 Linaro Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "system/accel-ops.h" + +static void *split_cpu_thread_routine(void *arg) +{ + g_assert_not_reached(); +} + +static void split_ops_init(AccelClass *ac) +{ + g_assert_not_reached(); +} + +static bool split_cpu_common_realize(CPUState *cpu, Error **errp) +{ + g_assert_not_reached(); +} + +static void split_cpu_common_unrealize(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_cpu_reset_hold(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_kick_vcpu_thread(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static bool split_cpu_thread_is_idle(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_synchronize_post_reset(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_synchronize_post_init(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_synchronize_state(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_synchronize_pre_loadvm(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_synchronize_pre_resume(bool step_pending) +{ + g_assert_not_reached(); +} + +static void split_handle_interrupt(CPUState *cpu, int mask) +{ + g_assert_not_reached(); +} + +static int64_t split_get_virtual_clock(void) +{ + g_assert_not_reached(); +} + +static void split_set_virtual_clock(int64_t time) +{ + g_assert_not_reached(); +} + +static int64_t split_get_elapsed_ticks(void) +{ + g_assert_not_reached(); +} + +static int split_update_guest_debug(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static int split_insert_breakpoint(CPUState *cpu, int type, + vaddr addr, vaddr len) +{ + g_assert_not_reached(); +} + +static int split_remove_breakpoint(CPUState *cpu, int type, + vaddr addr, vaddr len) +{ + g_assert_not_reached(); +} + +static void split_remove_all_breakpoints(CPUState *cpu) +{ + g_assert_not_reached(); +} + +static void split_get_vcpu_stats(CPUState *cpu, GString *buf) +{ + g_assert_not_reached(); +} + +static void split_accel_ops_class_init(ObjectClass *oc, const void *data) +{ + AccelOpsClass *ops = ACCEL_OPS_CLASS(oc); + + ops->ops_init = split_ops_init; + ops->cpu_common_realize = split_cpu_common_realize; + ops->cpu_common_unrealize = split_cpu_common_unrealize; + ops->cpu_reset_hold = split_cpu_reset_hold; + ops->cpu_thread_routine = split_cpu_thread_routine; + ops->kick_vcpu_thread = split_kick_vcpu_thread; + ops->cpu_thread_is_idle = split_cpu_thread_is_idle; + + ops->synchronize_post_reset = split_synchronize_post_reset; + ops->synchronize_post_init = split_synchronize_post_init; + ops->synchronize_state = split_synchronize_state; + ops->synchronize_pre_loadvm = split_synchronize_pre_loadvm; + ops->synchronize_pre_resume = split_synchronize_pre_resume; + + ops->handle_interrupt = split_handle_interrupt; + ops->get_vcpu_stats = split_get_vcpu_stats; + + ops->get_virtual_clock = split_get_virtual_clock; + ops->set_virtual_clock = split_set_virtual_clock; + ops->get_elapsed_ticks = split_get_elapsed_ticks; + + ops->update_guest_debug = split_update_guest_debug; + ops->insert_breakpoint = split_insert_breakpoint; + ops->remove_breakpoint = split_remove_breakpoint; + ops->remove_all_breakpoints = split_remove_all_breakpoints; +} + +static const TypeInfo split_accel_ops_type = { + .name = ACCEL_OPS_NAME("split"), + .parent = TYPE_ACCEL_OPS, + .class_init = split_accel_ops_class_init, + .abstract = true, +}; + +static void split_accel_ops_register_types(void) +{ + type_register_static(&split_accel_ops_type); +} +type_init(split_accel_ops_register_types); diff --git a/accel/split/split-all.c b/accel/split/split-all.c new file mode 100644 index 00000000000..7e308f3c1e7 --- /dev/null +++ b/accel/split/split-all.c @@ -0,0 +1,77 @@ +/* + * QEMU "split" accelerator (HW + SW emulator) + * + * Copyright (c) 2025 Linaro Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/accel.h" + +bool split_allowed; + +static int split_accel_init_machine(MachineState *ms, AccelState *as) +{ + g_assert_not_reached(); +} + +static void split_setup_post(MachineState *ms, AccelState *accel) +{ + g_assert_not_reached(); +} + +static bool split_has_memory(MachineState *ms, AddressSpace *as, + hwaddr start_addr, hwaddr size) +{ + g_assert_not_reached(); +} + +static bool split_cpus_are_resettable(AccelState *as) +{ + g_assert_not_reached(); +} + +static bool split_supports_guest_debug(AccelState *as) +{ + g_assert_not_reached(); +} + +static int split_gdbstub_supported_sstep_flags(AccelState *as) +{ + g_assert_not_reached(); +} + +static void split_get_stats(AccelState *as, GString *buf) +{ + g_assert_not_reached(); +} + +static void split_accel_class_init(ObjectClass *oc, const void *data) +{ + AccelClass *ac = ACCEL_CLASS(oc); + + ac->name = "split"; + ac->init_machine = split_accel_init_machine; + ac->setup_post = split_setup_post; + ac->has_memory = split_has_memory; + ac->cpus_are_resettable = split_cpus_are_resettable; + ac->supports_guest_debug = split_supports_guest_debug; + ac->gdbstub_supported_sstep_flags = split_gdbstub_supported_sstep_flags; + ac->get_stats = split_get_stats; + ac->allowed = &split_allowed; + ac->compat_props = NULL; +} + +static const TypeInfo split_accel_type = { + .name = ACCEL_CLASS_NAME("split"), + .parent = TYPE_ACCEL, + .class_init = split_accel_class_init, +}; + +static void register_accel_types(void) +{ + type_register_static(&split_accel_type); +} + +type_init(register_accel_types); diff --git a/system/vl.c b/system/vl.c index 3b7057e6c66..c7111d743ab 100644 --- a/system/vl.c +++ b/system/vl.c @@ -2433,6 +2433,7 @@ static void configure_accelerators(const char *progname) bool have_tcg = accel_find("tcg"); bool have_kvm = accel_find("kvm"); bool have_hvf = accel_find("hvf"); + bool have_split = accel_find("split"); if (have_tcg && have_kvm) { if (g_str_has_suffix(progname, "kvm")) { @@ -2447,6 +2448,9 @@ static void configure_accelerators(const char *progname) accelerators = "tcg"; } else if (have_hvf) { accelerators = "hvf"; + } else if (have_split) { + assert(have_tcg); + accelerators = "split"; } else { error_report("No accelerator selected and" " no default accelerator available"); diff --git a/accel/Kconfig b/accel/Kconfig index 4263cab7227..122ca9945ad 100644 --- a/accel/Kconfig +++ b/accel/Kconfig @@ -10,6 +10,12 @@ config HVF config TCG bool +config SPLIT + bool + default y + depends on TCG + depends on HVF + config KVM bool diff --git a/accel/meson.build b/accel/meson.build index 52909314bfa..b6d4740725f 100644 --- a/accel/meson.build +++ b/accel/meson.build @@ -9,6 +9,7 @@ if have_system subdir('qtest') subdir('kvm') subdir('xen') + subdir('split') subdir('stubs') endif diff --git a/accel/split/meson.build b/accel/split/meson.build new file mode 100644 index 00000000000..fbc68593180 --- /dev/null +++ b/accel/split/meson.build @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +split_ss = ss.source_set() +split_ss.add(files( + 'split-all.c', + 'split-accel-ops.c', +)) + +specific_ss.add_all(when: 'CONFIG_SPLIT', if_true: split_ss)