From nobody Sat Feb 7 07:11:38 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=1769449593; cv=none; d=zohomail.com; s=zohoarc; b=RvfAC1NWnGpVVwC9NldtIj+bUmi2EVwF3pEDsOghsZCaLa2nfReGGP0REB7oS6/8cmydwA9mWdAAVwoMdP3evtGqAXCfuh5ei0lTx7gf8vroIpKlJTnPg9fTiyn+cpgE8yHO+an16HvobxIW5MM1YRWGfP35Lt3PjCPILYjbFVo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769449593; 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=Rs6OZbCjNekEZyKGP1riYjsv7cAl0YSLCjdr3zwLJfM=; b=bD5Ln5dy7jmGTNVmdwyZ54qakQUgCb3eNfsap0wKXAKzRsF3T8rj0ZHgJ9HHJIP5K+GPa3neui38YInmoI0evPpxb2Q5DZwr8ufsiK3HyUeGZvNakQn8uyfXiqV9U/anFhovT9sxV+JCWrAYSykeGdT6e4jDXu3bdquN0Zt9TSY= 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 1769449593882177.75908662899394; Mon, 26 Jan 2026 09:46:33 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vkQd9-0001f9-ND; Mon, 26 Jan 2026 12:44:03 -0500 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 1vkQcy-0001UC-Bd for qemu-devel@nongnu.org; Mon, 26 Jan 2026 12:43:52 -0500 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vkQcw-0000EN-A7 for qemu-devel@nongnu.org; Mon, 26 Jan 2026 12:43:52 -0500 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-435903c4040so2927399f8f.3 for ; Mon, 26 Jan 2026 09:43:49 -0800 (PST) Received: from thinkpad-t470s.. (93-143-71-105.adsl.net.t-com.hr. [93.143.71.105]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-435b1e71730sm34199603f8f.26.2026.01.26.09.43.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jan 2026 09:43:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769449429; x=1770054229; 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=Rs6OZbCjNekEZyKGP1riYjsv7cAl0YSLCjdr3zwLJfM=; b=SRZBOSfRUfHOwUjz2gGRdbjYqcCWwRXkk9gCzRbRUgrNIZ4waiX6WebLS4hlxeWAH9 /gfFluvLwX3k6bO2emN8Q9CyCHIfuFNNh+o/QTDh1GG1DRGS5TbSrmGAHTh7tGYqZFUv nwNvZIAaDOcPt/WJFCVkPWyUzzsN4PjH3xg7gab/n3NgMzKzPj1HvY0ixxmI2P5GmYp7 Fhfb+zbtMtk0HqWT/bTTGaH4ngiiVelMQ8iM8luVThwCnxdq8K2vMpENI5HbnltugvUs hQn60birWlh9BIrYHnznwfcWV6m5CU1aGRQdLt6HhnzlS//VexDkcrTYXYy1gjO+P+jY 2lcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769449429; x=1770054229; 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=Rs6OZbCjNekEZyKGP1riYjsv7cAl0YSLCjdr3zwLJfM=; b=AANaTUTM479Z7pSL799G6Dz1J8gRn7Vn+8F/Gxgq7Mrod44SdXhWqrMP/aBYNkEvz5 Vx/LCx+TFG9b3C8nDSWv0ScXsp4Imrp7B9cY+CJ0y4eG5EWR7paDdVBvQ9JnvN6ik3pU 4WVcp7eJzOrqXiGcHiSuYFmSJGVDIKLJhjcyM9YialIA2uY1cEJJwahvQGb399B0y6Zi tpkrb4QxSP5ew0DrqVbVZMeKfYDE8rotXNU6Yi9xZM1lQ+K1lHNzMiEqK4tDfqkpetEK 4mNPIj4C1DCXpJ2EW2K9vimMywKUJwaETavb5zJOuhzSOayaJMLga4RPy6aoO4t2rPJ6 8F6Q== X-Gm-Message-State: AOJu0YxoSxGo4K7SmghQ7xlV738QmvB2Knj7aW6TrodIy2B2UN4EwYEA IP0yfaURJrDI1ekwj0XDX78AMHjqHpo2dDtsmld0g8WQP8xKppdiCIKcraokoFyb X-Gm-Gg: AZuq6aLi+GwZ+vlxD2ozEqF2MGgZU7uaUpJ+JDL9YUu7YAG5a5L/VrorOIeLkoFUNPm 2My8pY0CdZ9wzqpN9aYJsY5PhIeL/RMZTUfcK39qAnsQXhHKlpIotEkp0xD44oED17kyXtUMgPj FEfJkptCUhOFHdSaC2hE4au834O27KvZu3FEaAFRzp3UmQjdMi5wMpLOhBdsIW2JvSZM+/RP1fh y3cmFoKN9YE1i7Ntfh9aunVuYx7R/uIok+1+geDQeZHVng0Tc9cFHarpjGzPB5mc8Fd8wuq2FJk llc/g5QCJcIb+Sylwd3cIToGcqYzt63r9aBOr6nD/KkREIucIPhoCHphKLHOiKFcyguBXpW0nSd JFhsgdElKQ81l0dX1wL6RRYuC7ONiAhkILU216Y74sn4pQFxKulcKsbYW2bahWDeP0tkeymWBuk jQOcgeu9P4LXOkumqpw0tlgBhuxig0xqI9GVCf8FVMcfyp9aHi2E+hpQ== X-Received: by 2002:a05:6000:22c4:b0:430:f463:b6ae with SMTP id ffacd0b85a97d-435ca1ae140mr9940306f8f.53.1769449428436; Mon, 26 Jan 2026 09:43:48 -0800 (PST) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.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, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH 24/27] system/memory: add setters for MemoryRegion properties Date: Mon, 26 Jan 2026 18:43:10 +0100 Message-ID: <20260126174313.1418150-25-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260126174313.1418150-1-ruslichenko.r@gmail.com> References: <20260126174313.1418150-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::433; envelope-from=ruslichenko.r@gmail.com; helo=mail-wr1-x433.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=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: 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: 1769449594501158500 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 | 166 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 161 insertions(+), 5 deletions(-) diff --git a/system/memory.c b/system/memory.c index 4bf00d82bc..a683af525a 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) @@ -1285,6 +1355,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 +1428,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 +1456,25 @@ 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(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 @@ -2751,6 +2904,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