From nobody Sat Apr 11 19:55:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1775167316; cv=none; d=zohomail.com; s=zohoarc; b=IaGss1B0IYpt9fmxIj1qqhD2W5nZvWc5CgOcWVlLTAoK2pNk0XBcEI/hVGjX38rCXkiX9kwBj7XtFWGBX8WztPHRLKz/iCP1XjyUtPlx+Sdo+LQF3KGiUL9TE8+s+YGMKKnmFR6SGPojo8LbnfSbPjrnPlFqae15SYI2VN58Gwc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775167316; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=x8ZREsUktJ+jWPapDw6PB5NQmm74pQN/VTasE9D0cnk=; b=oCcs8yplJwjoTLIM+ocCJcPAwAlMHFf/ZAX5i7PM+asgDu590HT6w5OqfDflOzJDU1AFUoWwUDRkKT3JAtvlBjLuA+ZIq7oOa7qRQuNSn066VvPUC1yrx6uoUExSX89GoEfLmat63MomHaBnwcswBAy+BVoWb5ReYofUK+2+kn8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1775167316227741.9213524976394; Thu, 2 Apr 2026 15:01:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w8Q3C-0001Iu-3p; Thu, 02 Apr 2026 17:58:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w8Q2d-0000BE-GM for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:57:32 -0400 Received: from mail-ej1-x631.google.com ([2a00:1450:4864:20::631]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w8Q2a-0007Eq-0U for qemu-devel@nongnu.org; Thu, 02 Apr 2026 17:57:30 -0400 Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-b9c1da7ac63so234958366b.0 for ; Thu, 02 Apr 2026 14:57:27 -0700 (PDT) Received: from thinkpad-t470s.. (93-143-182-244.adsl.net.t-com.hr. [93.143.182.244]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-b9c3cac0e1asm134009166b.27.2026.04.02.14.57.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 14:57:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775167046; x=1775771846; 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=x8ZREsUktJ+jWPapDw6PB5NQmm74pQN/VTasE9D0cnk=; b=Dc0icwgpvpqvvpW3+72803p5YmOe0ooA2lLuA7tRXQDlx2Kj+wotv5Yw6G5+go54bW xThElLEWvWsDwukoJxmafyeDW3tIqTA1g+KxrlwmSJiIzC0l57XTwZDg8zXncVp5hW6s i1ZRRoCmqyBO3aOXj62hjTnQttftiEKeDIq+90DvjwedHnORBii1+m28P0i3mIJC1MT1 1Qz5h09OkllU/iV1zcC+n3E7IBqyE0lUxThLbdslRR/mS0dO9WS4f/FCGA09eO7KrLBW b3hHITOv+G3eypDn+fskzkv8Qp6N/pAyNSM5aXulfN//1tJf0Eom4sO8MNI3+tnK2Jyn TGRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775167046; x=1775771846; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=x8ZREsUktJ+jWPapDw6PB5NQmm74pQN/VTasE9D0cnk=; b=jbmYuMzXeN/FJ5fdK0E0ZZ2DxyI59JaAHVxBpf2De99Aq2AgsHacSbwcIf3bqVF3yR TMh7iUtrnFNiWgFlt9cqKE8HItGa2vXvkj2MTlYienKoYkob1UszfzIKMsFFMI00nl9g dbqFdlXL5WSCeqrCfFa7GBj7ra1caLyzRSKkg6WskzKH9FljJBQ2WWxYXxifbJeIrCZd VlCV1DlaU2oV38MgmApYN6qtImb/5pVC/GXLcDwQoMi8qwGAkCEp88IVsD+Oo9YTOgwl 9vqRC9/ff0UAMazSmkGa48GAaWzeLsDznGUbttK9KNqjq03D700skc/XZpmzS4ZDFVsI 7bPQ== X-Gm-Message-State: AOJu0YwTSG/DF73KBclLdWKU06ZtzmuLU+eBw+wli3g102xKRTdYhvud rVbptcw3IIQcLQHW3Iv5118bmJ4cvMMKj1FWR92WYize3LXH/RUn0KhQnP1Fk9BS X-Gm-Gg: ATEYQzxSfg8xFZjV0FRmVRIeNCYNsRBetOGfhg9pPrdvc5J0C+UbYJ/5E/pqavDiCN6 QWaM9FwA7F9HmuoJ15HUynnyIDkqqtoPweDbbiTZ8Xfl9Hmc7/0mYuMWDEAug3fA4e+71Igyp8i IpFYU5lit2QlInpIruHYNQcVcbrWfkgnonutCEMO1SfB3YtfTfTlI8BEPcW/ENc4L1XRwVwg1OW bTBT2KaYSVopq20BrD4h43OCOc9V5IE5eRpqH+T0LcG5NKntCv/txoWng1OVRpLgxoQROWYWQj2 CnDnt8L+BOJGPPkbKB4X/94cmwj55XFUA7KGxJjHBVxFsr8dRAV45oncxScH5dFrifhPe2vYGOj jAd648q4R1qOudZEbLzv+kwSTTf2IY9m5Lrp2Uo8h/EoL3e59uwLCc9/kOwhEshiYUJbtpsCb+G aFGYIZ0S/aKu7UItZd7Pr4GsvFpprxs0/DQjzCQoAGisFg7FnVR8HCV8pE1AcIBKvdUw58QMCeP 83GiPZQ X-Received: by 2002:a17:907:6093:b0:b94:858:5807 with SMTP id a640c23a62f3a-b9c679adc2fmr25890166b.25.1775167046059; Thu, 02 Apr 2026 14:57:26 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, alex.bennee@linaro.org, peter.maydell@linaro.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" , Ruslan_Ruslichenko@epam.com, balaton@eik.bme.hu, Paolo Bonzini , Peter Xu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v3 25/33] system/memory: add setters for MemoryRegion properties Date: Thu, 2 Apr 2026 23:56:10 +0200 Message-ID: <20260402215629.745866-26-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260402215629.745866-1-ruslichenko.r@gmail.com> References: <20260402215629.745866-1-ruslichenko.r@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::631; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej1-x631.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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1775167316706158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Currently, MemoryRegion properties such as addr, size, priority and container are read-only and don't have setters. This patch implements the missing setters function, so that properties can be modified dynamically. The changes allow MemoryRegions objects to be fully configured via properties, which enables them be created from a device tree description. Signed-off-by: Ruslan Ruslichenko --- system/memory.c | 221 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 216 insertions(+), 5 deletions(-) diff --git a/system/memory.c b/system/memory.c index 56f3225b21..cd463a3dde 100644 --- a/system/memory.c +++ b/system/memory.c @@ -55,6 +55,9 @@ static GHashTable *flat_views; =20 typedef struct AddrRange AddrRange; =20 +static void memory_region_update_container_subregions(MemoryRegion *subreg= ion); +static void memory_region_readd_subregion(MemoryRegion *mr); + /* * Note that signed integers are needed for negative offsetting in aliases * (large MemoryRegion::alias_offset). @@ -1251,6 +1254,73 @@ void memory_region_init(MemoryRegion *mr, memory_region_do_init(mr, owner, name, size); } =20 +static void memory_region_get_addr(Object *obj, Visitor *v, const char *na= me, + void *opaque, Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + uint64_t value =3D mr->addr; + + visit_type_uint64(v, name, &value, errp); +} + +static void memory_region_set_addr(Object *obj, Visitor *v, const char *na= me, + void *opaque, Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + Error *local_err =3D NULL; + uint64_t value; + + visit_type_uint64(v, name, &value, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + memory_region_set_address(mr, value); +} + +static void memory_region_set_container(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + Error *local_err =3D NULL; + MemoryRegion *old_container =3D mr->container; + MemoryRegion *new_container =3D NULL; + char *path =3D NULL; + + visit_type_str(v, name, &path, &local_err); + + if (!local_err && strcmp(path, "") !=3D 0) { + new_container =3D MEMORY_REGION(object_resolve_link(obj, name, pat= h, + &local_err)); + while (new_container->alias) { + new_container =3D new_container->alias; + } + } + + if (local_err) { + error_propagate(errp, local_err); + return; + } + + object_ref(OBJECT(new_container)); + + memory_region_transaction_begin(); + memory_region_ref(mr); + if (old_container) { + memory_region_del_subregion(old_container, mr); + } + mr->container =3D new_container; + if (new_container) { + memory_region_update_container_subregions(mr); + } + memory_region_unref(mr); + memory_region_transaction_commit(); + + object_unref(OBJECT(old_container)); +} + static void memory_region_get_container(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -1275,6 +1345,53 @@ static Object *memory_region_resolve_container(Objec= t *obj, void *opaque, return OBJECT(mr->container); } =20 +static void memory_region_set_alias(const Object *obj, const char *name, + Object *val, Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + MemoryRegion *subregion, *next; + + /* + * Be conservative and only allow one shotting for the mo + * FIXME: Use a softer error than assert + */ + assert(!mr->alias); + + /* + * FIXME: check we don't already have subregions and + * anything else that might be mutex with aliasing + */ + + memory_region_transaction_begin(); + QTAILQ_FOREACH_SAFE(subregion, &mr->subregions, subregions_link, next)= { + object_property_set_link(OBJECT(subregion), "container", + OBJECT(val), errp); + } + memory_region_ref(mr); + mr->alias =3D MEMORY_REGION(val); + mr->alias->mapped_via_alias++; + memory_region_unref(mr); + memory_region_transaction_commit(); + /* FIXME: add cleanup destructors etc etc */ +} + +static void memory_region_set_alias_offset_prop(Object *obj, Visitor *v, + const char *name, + void *opaque, Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + Error *local_err =3D NULL; + uint64_t value; + + visit_type_uint64(v, name, &value, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + memory_region_set_alias_offset(mr, value); +} + static void memory_region_get_priority(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -1285,6 +1402,70 @@ static void memory_region_get_priority(Object *obj, = Visitor *v, visit_type_int32(v, name, &value, errp); } =20 +static void memory_region_set_priority(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + Error *local_err =3D NULL; + int32_t value; + + visit_type_uint32(v, name, (uint32_t *)&value, &error_abort); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + if (mr->priority !=3D value) { + mr->priority =3D value; + memory_region_readd_subregion(mr); + } +} + +static void memory_region_do_set_ram(MemoryRegion *mr) +{ + if (mr->addr) { + qemu_ram_free(mr->ram_block); + } + if (int128_eq(mr->size, int128_make64(0))) { + return; + } + if (mr->ram) { + mr->ram_block =3D qemu_ram_alloc(int128_get64(mr->size), + RAM_SHARED, mr, &error_abort); + } +} + +static void memory_region_set_ram(Object *obj, Visitor *v, const char *nam= e, + void *opaque, Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + Error *local_err =3D NULL; + uint8_t value; + + visit_type_uint8(v, name, &value, &error_abort); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + mr->dirty_log_mask |=3D tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0; + /* FIXME: Sanitize error handling */ + /* FIXME: Probably need all that transactions stuff */ + if (mr->ram =3D=3D value) { + return; + } + + mr->ram =3D value; + mr->terminates =3D !!value; /*FIXME: Wrong */ + + if (int128_eq(int128_2_64(), mr->size)) { + return; + } + + memory_region_do_set_ram(mr); +} + static void memory_region_get_size(Object *obj, Visitor *v, const char *na= me, void *opaque, Error **errp) { @@ -1294,6 +1475,19 @@ static void memory_region_get_size(Object *obj, Visi= tor *v, const char *name, visit_type_uint64(v, name, &value, errp); } =20 +static void memory_region_set_object_size(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + MemoryRegion *mr =3D MEMORY_REGION(obj); + Error *local_err =3D NULL; + uint64_t size; + + visit_type_uint64(v, name, &size, &local_err); + + memory_region_set_size(mr, size); +} + static void memory_region_initfn(Object *obj) { MemoryRegion *mr =3D MEMORY_REGION(obj); @@ -1309,19 +1503,33 @@ static void memory_region_initfn(Object *obj) op =3D object_property_add(OBJECT(mr), "container", "link<" TYPE_MEMORY_REGION ">", memory_region_get_container, - NULL, /* memory_region_set_container */ + memory_region_set_container, NULL, NULL); op->resolve =3D memory_region_resolve_container; =20 - object_property_add_uint64_ptr(OBJECT(mr), "addr", - &mr->addr, OBJ_PROP_FLAG_READ); + object_property_add_link(OBJECT(mr), "alias", TYPE_MEMORY_REGION, + (Object **)&mr->alias, + memory_region_set_alias, + 0); + object_property_add(OBJECT(mr), "alias-offset", "uint64", + NULL, /* FIXME: Add getter */ + memory_region_set_alias_offset_prop, + NULL, NULL); + object_property_add(OBJECT(mr), "addr", "uint64", + memory_region_get_addr, + memory_region_set_addr, + NULL, NULL); object_property_add(OBJECT(mr), "priority", "uint32", memory_region_get_priority, - NULL, /* memory_region_set_priority */ + memory_region_set_priority, + NULL, NULL); + object_property_add(OBJECT(mr), "ram", "uint8", + NULL, /* FIXME: Add getter */ + memory_region_set_ram, NULL, NULL); object_property_add(OBJECT(mr), "size", "uint64", memory_region_get_size, - NULL, /* memory_region_set_size, */ + memory_region_set_object_size, NULL, NULL); } =20 @@ -2666,6 +2874,9 @@ void memory_region_set_size(MemoryRegion *mr, uint64_= t size) } memory_region_transaction_begin(); mr->size =3D s; + if (mr->ram) { + memory_region_do_set_ram(mr); + } memory_region_update_pending =3D true; memory_region_transaction_commit(); } --=20 2.43.0