From patchwork Mon Jan 29 17:41:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brijesh Singh X-Patchwork-Id: 10190173 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1C1196020C for ; Mon, 29 Jan 2018 17:42:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 174BF2236A for ; Mon, 29 Jan 2018 17:42:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0B05C284BD; Mon, 29 Jan 2018 17:42:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3D8272236A for ; Mon, 29 Jan 2018 17:41:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751540AbeA2Rl6 (ORCPT ); Mon, 29 Jan 2018 12:41:58 -0500 Received: from mail-dm3nam03on0060.outbound.protection.outlook.com ([104.47.41.60]:15322 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751257AbeA2Rlw (ORCPT ); Mon, 29 Jan 2018 12:41:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=jB+y93PT/s1nye6+CSIMhZKnZUsVRejhx0+Di6WrNsQ=; b=HfoIrhjTJccuRrT97s436O70prlBtvRBoqg4HkSXFUrgnQZ7ixI1R0LkbtExFPDUUrGUWw1SZFSWXLSeHoUkxXzPiEMA66yqj1FCtz0OsBwwOuDupdnXfDKYtiEucgzjkmQEj2MxbJI0RWuGbLOI0tzTmDDH4D0Hyuyqi34iuzA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; Received: from wsp141597wss.amd.com (165.204.78.1) by DM2PR12MB0154.namprd12.prod.outlook.com (2a01:111:e400:50ce::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.444.14; Mon, 29 Jan 2018 17:41:47 +0000 From: Brijesh Singh To: qemu-devel@nongnu.org Cc: kvm@vger.kernel.org, Paolo Bonzini , Tom Lendacky , Peter Maydell , Richard Henderson , "Edgar E. Iglesias" , "Dr. David Alan Gilbert" , Eduardo Habkost , Stefan Hajnoczi , Eric Blake , "Michael S. Tsirkin" , "Daniel P . Berrange" , Brijesh Singh , Peter Crosthwaite , Richard Henderson Subject: [PATCH v6 02/23] exec: add ram_debug_ops support Date: Mon, 29 Jan 2018 11:41:11 -0600 Message-Id: <20180129174132.108925-3-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180129174132.108925-1-brijesh.singh@amd.com> References: <20180129174132.108925-1-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR17CA0018.namprd17.prod.outlook.com (2603:10b6:404:65::28) To DM2PR12MB0154.namprd12.prod.outlook.com (2a01:111:e400:50ce::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: eea74016-7046-46b9-7222-08d5673f933b X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:DM2PR12MB0154; X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0154; 3:Se6x29+cw0ZDpI4D9UNfdWIJcCW8xuMh6wCkPbM0VIHgYMvORKlsosM6DMLkI0G1R64IZ4GhOOMV0uhpRfXW5mrFAR3Db2gPDytOSLiPgoI+O873JJB0yDIimnhPcdgacWmkD6YpmT4ogv9mlpPQ9kydgAkZQvyBFCKaISGt95Sm7BtML5D0Zl7lQ8CVs/moP5BoygAQPJ0omVBjoLNf8ITU5lfvDxdCMifkd31tat6H5nnn/Y43aYMWbdgevaZp; 25:C0yxxZExxCtld35vzT9jwoGpB0UPN64p4nspS6pGDfIFZNdg+0x2/SsKdowXc2TryNim+Fmxl0gsgjoQv984XBWj9BgREC0ah3VoCa73lCSf/VKKsY/BRnl21clFhO+0zQHw5f2MtW1uA4d4L7umNx5S2ayFuu6tsr3XqqzhAJKNPZE863tdEUq+lwUuplnVArOI0NI97cNnXVmRvvyYWHEvpPl3VEtCD2kq4Yj8Kf5UlWflqyXQBumTqTvOMo4otkpIKDS8dGVkEgJYSp1Fr0LfZ+ISi9GomWtONa15talw9BjlAZ+6wwEUzZY2y8dh0UmCbS38Z4JTfAaa0zmtYw==; 31:1o5PBNjsORG1lFfk7hOtnqsK6rQ25geTdh3D/IdnkKlUhiOWcqVQKTanbjcqPJ8SJOvG1YpmdvFGS9NgI2VUDUcVQhJjc7zuUWg/8JZMAqwa4f4zQ3KzQ2ZrKA89+eeP9K6RS1wrwNVrj4h+efzFRPDYQzmb+R8QfAgFTUo2hO+QZP0wtRUWGRnNlNGMobqot+mh/A1UXeaC6gIbnaBSj2glZr/ptU9U3sh33WkIT5U= X-MS-TrafficTypeDiagnostic: DM2PR12MB0154: X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0154; 20:QVQ8KklkanJMi6Z4lwtMKuvm6gT8ZaRMPDZtDqRLgSJ5cMpgPdW76SIkuFl3GIOAKc4aFsJ/Akr81/qNhTaJ51b4RXeb3x9yhNAx+uskV60KGdNj9QKx1++bzPDeGtmJCy6WZFgEO5+ZETe0wHCk6GDEBbHFsl+PZVdqZC+kOnhShEGb2Pcev2ZBkR1jXLhSCDTGFmnaelx2e00z7GePsE5f6HLQ0K5x6l2gYV00+9rBNSy7OpPb5GcH6Sdyp2czWhXQx04nGfaSmifrjgwJLN+Rng7eUHKYsGUs8AgKJTLJQhhEPG26zhl3dpdw5gE8oSKDfTu86vB6vMR7fjO13W3lSadK6oBDyofdtr2DizDRw+Chil6OitKLabo/ikbJCA+C2PYGxoW82QPsOUEyOSM4JI2PQ48RnWwo6pBiN50Xv0d2HwkX3KdOWsqQfnNNa+//OwoKPW45KdocyU8V9A+0sjvR4+JYoxsktGpDrl3HF0bAVqu/FxA7aJ14sSxe; 4:3NdI+2oczwJfXuCVEKfR4t4aHwXGrEXUxtYWjrl6W9swoo6VA+cIRXYLXbtZSdtw2i1+StOEgmjOdk83mo+S+52AGHwAvRpT7HZYsIOsv1aPvQkYeaDavUu7DslPlkdDE468L7YqMzntRdMRy4TO9E5gDpbYqq8VqEFSmhAOZUbLoR3h4KqThUjwcb9HrPYd0/surXmL8Vx0vNGc/lU3hBLVd1gijDhLWmKvrDLSIwHuntYGPnuf0Gxv1WDPTIPzGTH6WPZPlSta+pkRXNhLa8TqTvfWj4BZ6y5KIWG3MrQWOpCMJjGGZIO83CBiQ6Jd2uSUUjjuDKxj0Syl2qMh8Q== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(85827821059158)(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(10201501046)(3231101)(944501161)(93006095)(93001095)(3002001)(6055026)(6041288)(20161123560045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123564045)(6072148)(201708071742011); SRVR:DM2PR12MB0154; BCL:0; PCL:0; RULEID:; SRVR:DM2PR12MB0154; X-Forefront-PRVS: 0567A15835 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39860400002)(376002)(39380400002)(396003)(366004)(346002)(199004)(189003)(48376002)(8656006)(39060400002)(4326008)(6486002)(68736007)(36756003)(478600001)(26005)(97736004)(16526019)(53936002)(386003)(50466002)(86362001)(25786009)(8666007)(16586007)(54906003)(186003)(47776003)(59450400001)(316002)(7416002)(305945005)(7696005)(105586002)(106356001)(76176011)(51416003)(2906002)(81156014)(66066001)(81166006)(8676002)(2361001)(53416004)(3846002)(50226002)(52116002)(6116002)(2351001)(1076002)(8936002)(7736002)(6666003)(6916009)(5660300001)(2950100002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR12MB0154; H:wsp141597wss.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR12MB0154; 23:JiS8ZehJqOUxaA+s+hsywQpAPRNSWMZ+tDHK3cHao?= =?us-ascii?Q?reMS7Mx6obrRiy3mQ3fmTlq8ayv79CzUJh+3hIBd3/G7Nu9DTz6c27DyaNab?= =?us-ascii?Q?XeDnVQ65wjr8Aa/qLQNhC/joURIEXvR+91u5oBK8GWEey99KNCEN/l7OazzF?= =?us-ascii?Q?UcxlpbTW4goJ4UXZDI25+TpjCUE1jvwwphJzbrX/F/khI7Ay41HdYKawuM5C?= =?us-ascii?Q?05hmO9qTdQloQ2treRZcm/IUoFeteqUqxuCX2el9U72hASc0Y82lkRIqXjGj?= =?us-ascii?Q?63BDRKybtjbx2S1Krns5fI8ePbNwiESQpWOQ1dlZEdsTJdCcEFTIcMbzoqjQ?= =?us-ascii?Q?AF84GnZyARgXXz331LQAoZUobAHua5/sklb/EF6I2ZHxqIWfzHDau0WT2e0G?= =?us-ascii?Q?vWYHDJR7j+IQzlrulg8Xy5IlxDTj9VXfUYiJg+8O6OcsgoQttIxaIRHYKVVQ?= =?us-ascii?Q?aGSneiVx3smJxLFNe+uYmN1Sn8EafWROJaYce9hEUwrRXjGTQbH0iu+aRRPf?= =?us-ascii?Q?Hcmz8tfq1NPTqP8BNQKE8IjM4v3Ex6ByqW3ETWbHEw6F7GoU7ex0x9kOF8tb?= =?us-ascii?Q?2Hlt0ApDjcGmNYIaiDi+BhMBmkNpD0Z1QPQTnXsXPubmS8ZCmjL1wPnCj/tf?= =?us-ascii?Q?zHKvJxteb94V/+AzHfA1CVWtiBKn8SuFBZiTTtY5bSB2NnPmtdillZbbVhF5?= =?us-ascii?Q?m77GY2VdFZPFokh158Vo+K6Tc8xsUG9HnsqWA3N2jet+NzGPvfWfO0qlb76h?= =?us-ascii?Q?rk6GSpqPSw0Kx81t70SdipJqmLwf1+eVmJemN62skBJeaP0QtiBrzx7qqSL6?= =?us-ascii?Q?XkOkUGIex3gL7DeBdvlHXBEG4D39U2/qHGey1VdRZjldxnECfykES7DEGlH/?= =?us-ascii?Q?1B9/1BWX8KTGH/WNq+q21JSi0i0k9WAuNwbCojogWvh4jw+nNLkNHxwal3FD?= =?us-ascii?Q?wRRsv4/EYVs0exVO1y9kNV2hDu+Md5uZiTrF14wT9gG/XfMqKZQ9KvgjBxXj?= =?us-ascii?Q?vttYvILKUe1qnBGkXhTxCDMAiCGVWts2caB22vGg6hkXnIEbPuxu0665DiMW?= =?us-ascii?Q?phFjLC0jpFTY7B38KZ5yElULuzuBRQyfoup+Ssq4Zy5b8EreYMxX+tuXKR1s?= =?us-ascii?Q?+uFsjVptkyzTGRzClzOjRrnQK8bpecx2fidsqNbvjqGiSROOrvEmyvEwAhy6?= =?us-ascii?Q?1VwFst912BWb6FOv4Jnuvp9Z0nKcaq+iGCft+ggyh5GwtGyebQkvZdlX0HhO?= =?us-ascii?Q?6YReZ0uAqz01OpZ4ZkdxXTbD0j1+7p7jkWw2OkyobrdaX+f9odOh4op9VLhf?= =?us-ascii?B?UT09?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0154; 6:Lxdpp1v4m77xkykgLxERA3moRQr0+tlziRRROsdja4VbW0AJNYrd/hDr0YtbShYw1YlNiI7fe++Oz06B+kH5pJVtciIqkYXRierBeGh5PKeRJQFkhxrmnvx+llXa02d4sAh5s1TkMHTReri6DEFysTRZhqAXwDlVZYzKCRPKe+ECVjuNFIzrZM9ZGBxkaPjyc684vUk5UZ9rP17i9IYSSFT6GTWhjSU4WK+Y0xCaEGSa4MRHmQGa669BOVP6pFMDf+wjixnkOpthZhz5cvgC7irJ0jcOG9bIGc8i/XX2wg36rKp/nucEk8GoUoK6Ir2s4vUuMrB/IsNDv1FbzpI6sm80/ZNYYwmAQimHm2CWa2Q=; 5:0JmZNNwZ4deMkMgnvQdz5xyqNohkAB1UGnAntARCxcexUsHc9ZzlCjwsC7O3UQbEqmzDWx5SxxI5xIMbZz/tOHLVPu4YNxEeVNWAJtAhqu7XSh/cVaWvbQfKcLQ0U3luSYoCT0nsLvuDBzg59ccvid3QRA2qEvf4JepgbtdqJ+0=; 24:EXB4MHTyodsl9UCJxZwI4nkeq0eXK4Z+8L4NbM86LVVDNDB8+8kju+N0fQsHLFbSnC5jAwkdj6RFXc0Z+eR7gQYAlttO80BVznSH/bBvxSw=; 7:0tF/0xSA9N7TPn/B4jfc0jz4WOOLjGPXED5MtXDxSl/u1kWHJMngb9Jr9cafRzHRX4/Sp6YOg+agUwKCNfIFk0GxiDvVguds5p+FVQmmfa95mcjEY/K2l2bNdDiyZ1mCqxXp1tgs8TplfyEP9VocrJza7VIUHJ9J6VkJPldz3D0MxEhj4H5BxwyFcPGVHPjYE2koSOKGrPuk2og9fL3cPSCLnY80by8GF8Xw8yw3/EnQxSjCkCMOCkChYE4eQy29 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR12MB0154; 20:e9tVEqSImoBMjPcHoxGs1gm4T4iRrZi8/ipXp2DZZKBgEUIIWOVemc9atVzw3t8Oeio70+s5HNPiGxnZR5ClpKTBMAhYeOVHtohPPIDs9DYT9Atx93fq/H5b7knkD7wmzvyZuqaGD/BHYa6AKcLDr1UEv5jhF48vTSLPpybasFIKV+UPFa4Gzbarqmmn6ks2bNBVa/NzLs78wGYE0oBUXbEZ0786qPvjr2GPRZ3uxMLlHuwQPxRpqU6wneEQ8AYt X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jan 2018 17:41:47.8540 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: eea74016-7046-46b9-7222-08d5673f933b X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR12MB0154 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently, the guest memory access for the debug purpose is performed using the memcpy(). Lets extend the 'struct MemoryRegion' to include ram_debug_ops callbacks. The ram_debug_ops can be used to override memcpy() with something else. The feature can be used by encrypted guest -- which can register callbacks to override memcpy() with memory encryption/decryption APIs. a typical usage: mem_read(uint8_t *dst, uint8_t *src, uint32_t len, MemTxAttrs *attrs); mem_write(uint8_t *dst, uint8_t *src, uint32_t len, MemTxAttrs *attrs); MemoryRegionRAMReadWriteOps ops; ops.read = mem_read; ops.write = mem_write; memory_region_init_ram(mem, NULL, "memory", size, NULL); memory_region_set_ram_debug_ops(mem, ops); Cc: Paolo Bonzini Cc: Peter Crosthwaite Cc: Richard Henderson Signed-off-by: Brijesh Singh --- exec.c | 66 ++++++++++++++++++++++++++++++++++++++------------- include/exec/memory.h | 27 +++++++++++++++++++++ 2 files changed, 77 insertions(+), 16 deletions(-) diff --git a/exec.c b/exec.c index 629a5083851d..1919052b7385 100644 --- a/exec.c +++ b/exec.c @@ -3050,7 +3050,11 @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr, } else { /* RAM case */ ptr = qemu_ram_ptr_length(mr->ram_block, addr1, &l, false); - memcpy(ptr, buf, l); + if (attrs.debug && mr->ram_debug_ops) { + mr->ram_debug_ops->write(ptr, buf, l, attrs); + } else { + memcpy(ptr, buf, l); + } invalidate_and_set_dirty(mr, addr1, l); } @@ -3148,7 +3152,11 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr, } else { /* RAM case */ ptr = qemu_ram_ptr_length(mr->ram_block, addr1, &l, false); - memcpy(buf, ptr, l); + if (attrs.debug && mr->ram_debug_ops) { + mr->ram_debug_ops->read(buf, ptr, l, attrs); + } else { + memcpy(buf, ptr, l); + } } if (release_lock) { @@ -3218,11 +3226,13 @@ void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf, enum write_rom_type { WRITE_DATA, + READ_DATA, FLUSH_CACHE, }; -static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as, - hwaddr addr, const uint8_t *buf, int len, enum write_rom_type type) +static inline void cpu_physical_memory_rw_internal(AddressSpace *as, + hwaddr addr, uint8_t *buf, int len, MemTxAttrs attrs, + enum write_rom_type type) { hwaddr l; uint8_t *ptr; @@ -3237,12 +3247,33 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as, if (!(memory_region_is_ram(mr) || memory_region_is_romd(mr))) { l = memory_access_size(mr, l, addr1); + /* Pass MMIO down to address address_space_rw */ + switch (type) { + case READ_DATA: + case WRITE_DATA: + address_space_rw(as, addr1, attrs, buf, l, + type == WRITE_DATA); + break; + case FLUSH_CACHE: + break; + } } else { /* ROM/RAM case */ ptr = qemu_map_ram_ptr(mr->ram_block, addr1); switch (type) { + case READ_DATA: + if (mr->ram_debug_ops) { + mr->ram_debug_ops->read(buf, ptr, l, attrs); + } else { + memcpy(buf, ptr, l); + } + break; case WRITE_DATA: - memcpy(ptr, buf, l); + if (mr->ram_debug_ops) { + mr->ram_debug_ops->write(ptr, buf, l, attrs); + } else { + memcpy(ptr, buf, l); + } invalidate_and_set_dirty(mr, addr1, l); break; case FLUSH_CACHE: @@ -3261,7 +3292,8 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as, void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr, const uint8_t *buf, int len) { - cpu_physical_memory_write_rom_internal(as, addr, buf, len, WRITE_DATA); + cpu_physical_memory_rw_internal(as, addr, (uint8_t *)buf, len, + MEMTXATTRS_UNSPECIFIED, WRITE_DATA); } void cpu_flush_icache_range(hwaddr start, int len) @@ -3276,8 +3308,10 @@ void cpu_flush_icache_range(hwaddr start, int len) return; } - cpu_physical_memory_write_rom_internal(&address_space_memory, - start, NULL, len, FLUSH_CACHE); + cpu_physical_memory_rw_internal(&address_space_memory, + start, NULL, len, + MEMTXATTRS_UNSPECIFIED, + FLUSH_CACHE); } typedef struct { @@ -3583,6 +3617,7 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, int l; hwaddr phys_addr; target_ulong page; + int type = is_write ? WRITE_DATA : READ_DATA; cpu_synchronize_state(cpu); while (len > 0) { @@ -3592,6 +3627,10 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, page = addr & TARGET_PAGE_MASK; phys_addr = cpu_get_phys_page_attrs_debug(cpu, page, &attrs); asidx = cpu_asidx_from_attrs(cpu, attrs); + + /* set debug attrs to indicate memory access is from the debugger */ + attrs.debug = 1; + /* if no physical page mapped, return an error */ if (phys_addr == -1) return -1; @@ -3599,14 +3638,9 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, if (l > len) l = len; phys_addr += (addr & ~TARGET_PAGE_MASK); - if (is_write) { - cpu_physical_memory_write_rom(cpu->cpu_ases[asidx].as, - phys_addr, buf, l); - } else { - address_space_rw(cpu->cpu_ases[asidx].as, phys_addr, - MEMTXATTRS_UNSPECIFIED, - buf, l, 0); - } + cpu_physical_memory_rw_internal(cpu->cpu_ases[asidx].as, + phys_addr, buf, l, attrs, + type); len -= l; buf += l; addr += l; diff --git a/include/exec/memory.h b/include/exec/memory.h index 07c5d6d59796..4d027fffeebf 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -215,6 +215,18 @@ typedef struct IOMMUMemoryRegionClass { typedef struct CoalescedMemoryRange CoalescedMemoryRange; typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd; +/* Memory Region RAM debug callback */ +typedef struct MemoryRegionRAMReadWriteOps MemoryRegionRAMReadWriteOps; + +struct MemoryRegionRAMReadWriteOps { + /* Write data into guest memory */ + int (*write) (uint8_t *dest, const uint8_t *src, + uint32_t len, MemTxAttrs attrs); + /* Read data from guest memory */ + int (*read) (uint8_t *dest, const uint8_t *src, + uint32_t len, MemTxAttrs attrs); +}; + struct MemoryRegion { Object parent_obj; @@ -254,6 +266,7 @@ struct MemoryRegion { const char *name; unsigned ioeventfd_nb; MemoryRegionIoeventfd *ioeventfds; + const MemoryRegionRAMReadWriteOps *ram_debug_ops; }; struct IOMMUMemoryRegion { @@ -624,6 +637,20 @@ void memory_region_init_rom_device_nomigrate(MemoryRegion *mr, Error **errp); /** + * memory_region_set_ram_debug_ops: Set debug access ops for a given memory region + * + * @mr: the #MemoryRegion to be initialized + * @ops: a function that will be used for when accessing @target region during + * debug + */ +static inline void +memory_region_set_ram_debug_ops(MemoryRegion *mr, + const MemoryRegionRAMReadWriteOps *ops) +{ + mr->ram_debug_ops = ops; +} + +/** * memory_region_init_reservation: Initialize a memory region that reserves * I/O space. *