get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.0/patches/2198219/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2198219,
    "url": "http://patchwork.ozlabs.org/api/1.0/patches/2198219/?format=api",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.0/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260219144901.3317747-7-ruslichenko.r@gmail.com>",
    "date": "2026-02-19T14:48:53",
    "name": "[v2,25/33] system/memory: add setters for MemoryRegion properties",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "31154ffa3438b0d1a0d4150c2785fa80ec0abe14",
    "submitter": {
        "id": 92275,
        "url": "http://patchwork.ozlabs.org/api/1.0/people/92275/?format=api",
        "name": "Ruslan Ruslichenko",
        "email": "ruslichenko.r@gmail.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260219144901.3317747-7-ruslichenko.r@gmail.com/mbox/",
    "series": [
        {
            "id": 492690,
            "url": "http://patchwork.ozlabs.org/api/1.0/series/492690/?format=api",
            "date": "2026-02-19T14:33:04",
            "name": "hw/arm: Introduce generic FDT-driven machine",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/492690/mbox/"
        }
    ],
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2198219/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=IR3FBchG;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fGxDW2Z7kz1xpl\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 20 Feb 2026 01:52:11 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vt5ML-00041t-60; Thu, 19 Feb 2026 09:50:29 -0500",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <ruslichenko.r@gmail.com>)\n id 1vt5M4-0003mG-Ra\n for qemu-devel@nongnu.org; Thu, 19 Feb 2026 09:50:19 -0500",
            "from mail-wr1-x42e.google.com ([2a00:1450:4864:20::42e])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <ruslichenko.r@gmail.com>)\n id 1vt5Lw-00084P-8d\n for qemu-devel@nongnu.org; Thu, 19 Feb 2026 09:50:07 -0500",
            "by mail-wr1-x42e.google.com with SMTP id\n ffacd0b85a97d-4362507f0bcso807109f8f.0\n for <qemu-devel@nongnu.org>; Thu, 19 Feb 2026 06:49:50 -0800 (PST)",
            "from thinkpad-t470s.. (93-143-129-182.adsl.net.t-com.hr.\n [93.143.129.182]) by smtp.googlemail.com with ESMTPSA id\n ffacd0b85a97d-43796ac8d82sm50163087f8f.31.2026.02.19.06.49.47\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 19 Feb 2026 06:49:48 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20230601; t=1771512589; x=1772117389; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=CGdJDqeEFRiYE7+mNqWDgSi4YGcdtyU590w+gpZTD7A=;\n b=IR3FBchGob9JzTbm/FzfTsPpNKicxynB1HrWuiMWuPYzbzZdolNdN/+x9qHnj0xV2T\n 1XE3pVQvXG2X2xNefXjBFkWqm8lpIvesEufiAkOfzwJvAmWGi43V+5Lghy7G5bGLeQK+\n 8Dtd548xd7IuScTXbdV+PBuGvV6GWUGMx4ItOHmShwNAAssRoJcTpUWZVe/5GteUDBwL\n ZZHJomdjxz/SIq8k+hdmC/18YlxWGTxdnLUcMrlcooyaJRMNMwSe0pXD2gwGbA5dB+kY\n 2ixPgIjzZLzVZU39ZbFv1AK/815Ao7VfWBJyDxRbL4kdVBaR+1qgH9/7Q81uy3RhN3mS\n gkdw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1771512589; x=1772117389;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=CGdJDqeEFRiYE7+mNqWDgSi4YGcdtyU590w+gpZTD7A=;\n b=D43ikmiWFN5sVTAbEVqcOV7xZw62SsPYRSv5VXQWIREEpOjdwrvF7Ovvx2zS5F6Ja/\n NChY7eTeuX5jMfpmJkewS5yXroWlP3/BmGV9Gs/usMKeZr98UoA3yDLApffmt4dfvl5S\n /kmSGGjS+hm2Lg+GkB0fHrRITotuX+HA3GVPc8WY43Ft52qEeQJNVrjA7Tjazc2bFH15\n Ty/F/TEaV+9uLAUZZbHeT6iFu/o4Y1IhQqYdwPo6pIvCGyZN+3l5Uy2rLMll1TVK4o1T\n wKTAz3xnC2s/Inh+cTyz+cLSM+haUxvtTDMWCxTCgeo1OcD/IPDLRAyPScQ5ZxNO/1/A\n zqog==",
        "X-Gm-Message-State": "AOJu0YxsDhnKK9v/wVCHsMph6uqJMA6eMYGMFzXFmieEedvrEh/UCFif\n +Jd1UopkMQU1jwHrNqz1++CBWomdB4DnRq5ZWEzD3MvF3vv+EhCHtjaKwwBPZJyx",
        "X-Gm-Gg": "AZuq6aIM0QBwczzp72w3OgS0byhmkjqJggmAuLrM16uhdMtOVFBlpLwPNg+irUI2Lyo\n 34vWAxYcUfhpP603r9fVPx/AZMiIxfcYF8onDuuvCQrwWtgSTy++Od2JtICPliD2GyCWGNlPpx+\n XLlqognlG+w4CwSCMwtwnrRraRJjbbpL6CKDBPQ4NNLP7F/Cse5uMBXYwFkQ/KY/pFHbmxnZ1sO\n VK0v/HPr6go4CVFFmZ28tobUzvjVFOupUiN00H+/CzhKrL4Oul9RMDjhqffYX5hGRRuF5v7JazO\n NJns7DnmkD47rcfaT9Anm8cOocgpS/8Ru7e35p+kC4ojW6SbyMoOARB4kV8c0YAvGcQNvpJqvjf\n YVnwGMwg/UdCwcgV1zcnx8JiQpC0tzJA0yRmcdihBQwkvWbVH90YQ/N50DvHPagyOlDWrT9veU2\n A2ZlSiUQGhi5B+FDGiI7fb2JFjrwPWjJn+qqpb91xkowy96cs1Dc7qSO+0SJmp9k1ITkye",
        "X-Received": "by 2002:a05:6000:430a:b0:436:549:e15d with SMTP id\n ffacd0b85a97d-439626e3608mr4046912f8f.18.1771512588665;\n Thu, 19 Feb 2026 06:49:48 -0800 (PST)",
        "From": "Ruslan Ruslichenko <ruslichenko.r@gmail.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "qemu-arm@nongnu.org, alex.bennee@linaro.org, peter.maydell@linaro.org,\n artem_mygaiev@epam.com, volodymyr_babchuk@epam.com,\n takahiro.nakata.wr@renesas.com,\n \"Edgar E . Iglesias\" <edgar.iglesias@gmail.com>, Ruslan_Ruslichenko@epam.com,\n balaton@eik.bme.hu,\n =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>",
        "Subject": "[PATCH v2 25/33] system/memory: add setters for MemoryRegion\n properties",
        "Date": "Thu, 19 Feb 2026 15:48:53 +0100",
        "Message-ID": "<20260219144901.3317747-7-ruslichenko.r@gmail.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20260219144901.3317747-1-ruslichenko.r@gmail.com>",
        "References": "<20260219143332.3316679-1-ruslichenko.r@gmail.com>\n <20260219144901.3317747-1-ruslichenko.r@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Received-SPF": "pass client-ip=2a00:1450:4864:20::42e;\n envelope-from=ruslichenko.r@gmail.com; helo=mail-wr1-x42e.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,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n 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 <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "From: Ruslan Ruslichenko <Ruslan_Ruslichenko@epam.com>\n\nCurrently, MemoryRegion properties such as addr, size,\npriority and container are read-only and don't have setters.\n\nThis patch implements the missing setters function, so that\nproperties can be modified dynamically.\n\nThe changes allow MemoryRegions objects to be fully configured\nvia properties, which enables them be created from a device\ntree description.\n\nSigned-off-by: Ruslan Ruslichenko <Ruslan_Ruslichenko@epam.com>\n---\n system/memory.c | 221 ++++++++++++++++++++++++++++++++++++++++++++++--\n 1 file changed, 216 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/system/memory.c b/system/memory.c\nindex c51d0798a8..fc1f6cff0c 100644\n--- a/system/memory.c\n+++ b/system/memory.c\n@@ -55,6 +55,9 @@ static GHashTable *flat_views;\n \n typedef struct AddrRange AddrRange;\n \n+static void memory_region_update_container_subregions(MemoryRegion *subregion);\n+static void memory_region_readd_subregion(MemoryRegion *mr);\n+\n /*\n  * Note that signed integers are needed for negative offsetting in aliases\n  * (large MemoryRegion::alias_offset).\n@@ -1251,6 +1254,73 @@ void memory_region_init(MemoryRegion *mr,\n     memory_region_do_init(mr, owner, name, size);\n }\n \n+static void memory_region_get_addr(Object *obj, Visitor *v, const char *name,\n+                                   void *opaque, Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    uint64_t value = mr->addr;\n+\n+    visit_type_uint64(v, name, &value, errp);\n+}\n+\n+static void memory_region_set_addr(Object *obj, Visitor *v, const char *name,\n+                                   void *opaque, Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    Error *local_err = NULL;\n+    uint64_t value;\n+\n+    visit_type_uint64(v, name, &value, &local_err);\n+    if (local_err) {\n+        error_propagate(errp, local_err);\n+        return;\n+    }\n+\n+    memory_region_set_address(mr, value);\n+}\n+\n+static void memory_region_set_container(Object *obj, Visitor *v,\n+                                        const char *name, void *opaque,\n+                                        Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    Error *local_err = NULL;\n+    MemoryRegion *old_container = mr->container;\n+    MemoryRegion *new_container = NULL;\n+    char *path = NULL;\n+\n+    visit_type_str(v, name, &path, &local_err);\n+\n+    if (!local_err && strcmp(path, \"\") != 0) {\n+        new_container = MEMORY_REGION(object_resolve_link(obj, name, path,\n+                                      &local_err));\n+        while (new_container->alias) {\n+            new_container = new_container->alias;\n+        }\n+    }\n+\n+    if (local_err) {\n+        error_propagate(errp, local_err);\n+        return;\n+    }\n+\n+    object_ref(OBJECT(new_container));\n+\n+    memory_region_transaction_begin();\n+    memory_region_ref(mr);\n+    if (old_container) {\n+        memory_region_del_subregion(old_container, mr);\n+    }\n+    mr->container = new_container;\n+    if (new_container) {\n+        memory_region_update_container_subregions(mr);\n+    }\n+    memory_region_unref(mr);\n+    memory_region_transaction_commit();\n+\n+    object_unref(OBJECT(old_container));\n+}\n+\n static void memory_region_get_container(Object *obj, Visitor *v,\n                                         const char *name, void *opaque,\n                                         Error **errp)\n@@ -1275,6 +1345,53 @@ static Object *memory_region_resolve_container(Object *obj, void *opaque,\n     return OBJECT(mr->container);\n }\n \n+static void memory_region_set_alias(const Object *obj, const char *name,\n+                                    Object *val, Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    MemoryRegion *subregion, *next;\n+\n+    /*\n+     * Be conservative and only allow one shotting for the mo\n+     * FIXME: Use a softer error than assert\n+     */\n+    assert(!mr->alias);\n+\n+    /*\n+     * FIXME: check we don't already have subregions and\n+     * anything else that might be mutex with aliasing\n+     */\n+\n+    memory_region_transaction_begin();\n+    QTAILQ_FOREACH_SAFE(subregion, &mr->subregions, subregions_link, next) {\n+        object_property_set_link(OBJECT(subregion), \"container\",\n+                                 OBJECT(val), errp);\n+    }\n+    memory_region_ref(mr);\n+    mr->alias = MEMORY_REGION(val);\n+    mr->alias->mapped_via_alias++;\n+    memory_region_unref(mr);\n+    memory_region_transaction_commit();\n+    /* FIXME: add cleanup destructors etc etc */\n+}\n+\n+static void memory_region_set_alias_offset_prop(Object *obj, Visitor *v,\n+                                                const char *name,\n+                                                void *opaque, Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    Error *local_err = NULL;\n+    uint64_t value;\n+\n+    visit_type_uint64(v, name, &value, &local_err);\n+    if (local_err) {\n+        error_propagate(errp, local_err);\n+        return;\n+    }\n+\n+    memory_region_set_alias_offset(mr, value);\n+}\n+\n static void memory_region_get_priority(Object *obj, Visitor *v,\n                                        const char *name, void *opaque,\n                                        Error **errp)\n@@ -1285,6 +1402,70 @@ static void memory_region_get_priority(Object *obj, Visitor *v,\n     visit_type_int32(v, name, &value, errp);\n }\n \n+static void memory_region_set_priority(Object *obj, Visitor *v,\n+                                       const char *name, void *opaque,\n+                                       Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    Error *local_err = NULL;\n+    int32_t value;\n+\n+    visit_type_uint32(v, name, (uint32_t *)&value, &error_abort);\n+    if (local_err) {\n+        error_propagate(errp, local_err);\n+        return;\n+    }\n+\n+    if (mr->priority != value) {\n+        mr->priority = value;\n+        memory_region_readd_subregion(mr);\n+    }\n+}\n+\n+static void memory_region_do_set_ram(MemoryRegion *mr)\n+{\n+    if (mr->addr) {\n+        qemu_ram_free(mr->ram_block);\n+    }\n+    if (int128_eq(mr->size, int128_make64(0))) {\n+        return;\n+    }\n+    if (mr->ram) {\n+        mr->ram_block = qemu_ram_alloc(int128_get64(mr->size),\n+                                       RAM_SHARED, mr, &error_abort);\n+    }\n+}\n+\n+static void memory_region_set_ram(Object *obj, Visitor *v, const char *name,\n+                                  void *opaque, Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    Error *local_err = NULL;\n+    uint8_t value;\n+\n+    visit_type_uint8(v, name, &value, &error_abort);\n+    if (local_err) {\n+        error_propagate(errp, local_err);\n+        return;\n+    }\n+\n+    mr->dirty_log_mask |= tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0;\n+    /* FIXME: Sanitize error handling */\n+    /* FIXME: Probably need all that transactions stuff */\n+    if (mr->ram == value) {\n+        return;\n+    }\n+\n+    mr->ram = value;\n+    mr->terminates = !!value; /*FIXME: Wrong */\n+\n+    if (int128_eq(int128_2_64(), mr->size)) {\n+        return;\n+    }\n+\n+    memory_region_do_set_ram(mr);\n+}\n+\n static void memory_region_get_size(Object *obj, Visitor *v, const char *name,\n                                    void *opaque, Error **errp)\n {\n@@ -1294,6 +1475,19 @@ static void memory_region_get_size(Object *obj, Visitor *v, const char *name,\n     visit_type_uint64(v, name, &value, errp);\n }\n \n+static void memory_region_set_object_size(Object *obj, Visitor *v,\n+                                          const char *name, void *opaque,\n+                                          Error **errp)\n+{\n+    MemoryRegion *mr = MEMORY_REGION(obj);\n+    Error *local_err = NULL;\n+    uint64_t size;\n+\n+    visit_type_uint64(v, name, &size, &local_err);\n+\n+    memory_region_set_size(mr, size);\n+}\n+\n static void memory_region_initfn(Object *obj)\n {\n     MemoryRegion *mr = MEMORY_REGION(obj);\n@@ -1309,19 +1503,33 @@ static void memory_region_initfn(Object *obj)\n     op = object_property_add(OBJECT(mr), \"container\",\n                              \"link<\" TYPE_MEMORY_REGION \">\",\n                              memory_region_get_container,\n-                             NULL, /* memory_region_set_container */\n+                             memory_region_set_container,\n                              NULL, NULL);\n     op->resolve = memory_region_resolve_container;\n \n-    object_property_add_uint64_ptr(OBJECT(mr), \"addr\",\n-                                   &mr->addr, OBJ_PROP_FLAG_READ);\n+    object_property_add_link(OBJECT(mr), \"alias\", TYPE_MEMORY_REGION,\n+                             (Object **)&mr->alias,\n+                             memory_region_set_alias,\n+                             0);\n+    object_property_add(OBJECT(mr), \"alias-offset\", \"uint64\",\n+                        NULL,  /* FIXME: Add getter */\n+                        memory_region_set_alias_offset_prop,\n+                        NULL, NULL);\n+    object_property_add(OBJECT(mr), \"addr\", \"uint64\",\n+                        memory_region_get_addr,\n+                        memory_region_set_addr,\n+                        NULL, NULL);\n     object_property_add(OBJECT(mr), \"priority\", \"uint32\",\n                         memory_region_get_priority,\n-                        NULL, /* memory_region_set_priority */\n+                        memory_region_set_priority,\n+                        NULL, NULL);\n+    object_property_add(OBJECT(mr), \"ram\", \"uint8\",\n+                        NULL, /* FIXME: Add getter */\n+                        memory_region_set_ram,\n                         NULL, NULL);\n     object_property_add(OBJECT(mr), \"size\", \"uint64\",\n                         memory_region_get_size,\n-                        NULL, /* memory_region_set_size, */\n+                        memory_region_set_object_size,\n                         NULL, NULL);\n }\n \n@@ -2730,6 +2938,9 @@ void memory_region_set_size(MemoryRegion *mr, uint64_t size)\n     }\n     memory_region_transaction_begin();\n     mr->size = s;\n+    if (mr->ram) {\n+        memory_region_do_set_ram(mr);\n+    }\n     memory_region_update_pending = true;\n     memory_region_transaction_commit();\n }\n",
    "prefixes": [
        "v2",
        "25/33"
    ]
}