From patchwork Wed Aug 3 20:06:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 655593 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3s4PQ82Dpvz9sxR for ; Thu, 4 Aug 2016 06:13:04 +1000 (AEST) Received: from localhost ([::1]:36484 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bV2XG-0006bj-9S for incoming@patchwork.ozlabs.org; Wed, 03 Aug 2016 16:13:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32838) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bV2Ru-0000fj-7n for qemu-devel@nongnu.org; Wed, 03 Aug 2016 16:07:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bV2Rq-0001az-V9 for qemu-devel@nongnu.org; Wed, 03 Aug 2016 16:07:30 -0400 Received: from mail-sn1nam02on0088.outbound.protection.outlook.com ([104.47.36.88]:14704 helo=NAM02-SN1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bV2Rq-0001ag-Ip for qemu-devel@nongnu.org; Wed, 03 Aug 2016 16:07:26 -0400 Received: from SN1NAM02FT030.eop-nam02.prod.protection.outlook.com (10.152.72.60) by SN1NAM02HT012.eop-nam02.prod.protection.outlook.com (10.152.72.254) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.557.8; Wed, 3 Aug 2016 20:07:23 +0000 Authentication-Results: spf=fail (sender IP is 149.199.60.96) smtp.mailfrom=xilinx.com; redhat.com; dkim=none (message not signed) header.d=none; redhat.com; dmarc=none action=none header.from=xilinx.com; Received-SPF: Fail (protection.outlook.com: domain of xilinx.com does not designate 149.199.60.96 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.96; helo=xsj-tvapsmtpgw01; Received: from xsj-tvapsmtpgw01 (149.199.60.96) by SN1NAM02FT030.mail.protection.outlook.com (10.152.72.114) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.567.7 via Frontend Transport; Wed, 3 Aug 2016 20:07:23 +0000 Received: from 172-16-1-203.xilinx.com ([172.16.1.203]:38983 helo=xsj-tvapsmtp02.xilinx.com) by xsj-tvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1bV2Rm-00026H-M2; Wed, 03 Aug 2016 13:07:22 -0700 Received: from [127.0.0.1] (port=35811 helo=tsj-smtp-dlp1.xlnx.xilinx.com) by xsj-tvapsmtp02.xilinx.com with esmtp (Exim 4.63) (envelope-from ) id 1bV2Rm-0000l8-JC; Wed, 03 Aug 2016 13:07:22 -0700 Received: from xsj-tvapsmtp02 (xsj-tvapsmtp02.xilinx.com [172.16.1.203]) by tsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id u73K0YDc006699; Wed, 3 Aug 2016 13:00:34 -0700 Received: from [172.19.74.182] (port=45294 helo=xsjalistai50.xilinx.com) by xsj-tvapsmtp02 with esmtp (Exim 4.63) (envelope-from ) id 1bV2Rl-0000l5-R3; Wed, 03 Aug 2016 13:07:21 -0700 From: Alistair Francis To: , Date: Wed, 3 Aug 2016 13:06:40 -0700 Message-ID: X-Mailer: git-send-email 2.7.4 In-Reply-To: References: X-RCIS-Action: ALLOW X-TM-AS-MML: disable X-TM-AS-Product-Ver: IMSS-7.1.0.1679-8.0.0.1202-22490.005 X-TM-AS-Result: No--12.689-7.0-31-10 X-imss-scan-details: No--12.689-7.0-31-10 X-TMASE-MatchedRID: bYH4cnTg5Bgal4bwVwO8G46MisxJraxHUAjrAJWsTe9NShtWKzkFv8or 7vG6xhrpM0UNcuhE9gC+daZEFcM/u5Coy9iDotiwV6iWWmDPLEDRVZ5j2m7RUtqqof+gfD6RHye T8VIiNb6XdcY6ZGiH+1E3oBDOx6GowwTYGyiIokyd4hCa7xSZoQdj8dD1pxq7owtRP8whCK+F5X H01BIFRl+vHXbjj67Mri3X8T1vMpGKxR05jBYW9935+5/2RxqmD/zRrejaXNLfc2Xd6VJ+yl/G5 Oa6fhZ1cCmbxEHafS2bbexJXGYzE7/eELA70ejckmtbTcNpxYT+rFFXesuqjWsXlULOq+TgU5L3 mFZXktPG3TRnfVX2PIAy6p60ZV62fJ5/bZ6npdg7AFczfjr/7OnRlmBPmq0J9S3uAQmwxtMb2ru VcveBeqJ39usUhXu+9ptoKkl4UgY= X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.96; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(2950100001)(19580395003)(81166006)(586003)(106466001)(7846002)(85426001)(71366001)(50986999)(11100500001)(87936001)(77096005)(36756003)(19580405001)(86362001)(105606002)(47776003)(76176999)(8936002)(64026002)(81156014)(33646002)(48376002)(189998001)(5003940100001)(118296001)(2906002)(9786002)(50466002)(4326007)(8676002)(305945005)(50226002)(92566002)(229853001)(356003)(7696003)(5001770100001)(49343001)(107986001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1NAM02HT012; H:xsj-tvapsmtpgw01; FPR:; SPF:Fail; PTR:unknown-60-96.xilinx.com; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02FT030; 1:fevwkaNawqo9SXWexh78+NoHKnM0L7vr8RK+e0WDR+bGEDIyVm7c0XcXf5qMW9L3FyAQZYO7HnN+PvpWHV8rTWklVAZwYuhhByP9gywgfSZ6Lp99eesksmgi2kDVFJ/F9SuZeQ1XqxL3b4ztr4HWfVFMc856y+Xg1Umlj1EuwNAsr8IqMF17U+09le+k/Q1yLVbZU/aex7EutjAG2HJw9tEVIzH2yb7WRUXswI9G3qH4J6RBC6Bp2RMq4RBfSjTK3WeiZ2u+RIBh2tj1v8QJLp9hio8etElhUyJqFcjMmMES2hZiaCDehL98+NArU4hR+57U64mEB01Tv15wa4xWvQ1AhychsbIBy5Ucwf/L9FepwW7RML2lYXnZLEuy3htY15K7SMSrdryVrrBbLFdWlpT9/9D6wU9l6cPgvFn481i+EUuN/Io4qZIIC8nkxJ6a0GReAjkvJA3cFWx2BdepoZbp7oksSlL/py/9N/sbO3IJqvUqawqtHWW5DkTd3tvR+wmpz57k1Zi1R28UhTn/mhrS1MqVWGtzt21sVdJoaIrEidybPIbSEvit+wnfFV6etbEMbiyciZ5Gux7tziqUq2UYeM4nnacEqWyn2Kx/1f4= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 8128bd93-2c80-4c2b-4275-08d3bbd9c883 X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02HT012; 2:IIdz9mQEUEYhprnY6PIH0ROLzj9loRZLOz8J1N98x/JMA+wqHf4cabQ1ogeJ0q5IpAhEA4UGxJoCcwgGHrov97/KqKiZD/CLcyiKp6K7YMhdNqrvFkPzH9dUHHCU+bAPGH9tyGRiQmzC0TNwANjE0ITX2HaI+RTnwUQQ2c4PxSwNig+UvuBilfVbYSaOFwdd; 3:rI7NnwBOfT1o65I0/bi9el38C2et+7oG+eyy8iEkdwEKV7lKR5Wh+HFB8JJGxiAO5KTNkvS69/iMVRpplPwElmZ5VF1RzapiT4QIDBA+Ik61wkRF8kbb3Bv3OtLKRFGzT9HiYzS58Fu7rcFrDibsVWH3ulOQOqNQMGAZCDGpucFl287kcxOhHlOpM48odZTDKlmA2xBP9jIIG4dyjpHP6pOyyVeG2tCFkeTBBzbOsMM=; 25:1nSkviN/R1o+a5HJXGAM0nBSt9G5BqmNuW5CyM7iTj4n6muuwwMTYYc5Fzm6z6zVkPz5J0UuJHe1LPrBWkOxY5ddyyhPFsKH4PBRrkw91lnSZxWu3QYhSalR5jtOhMasUCCBOf0tD+47kX7se0RwyhcJi6tN5OXyPijaLb+WONqUaSlJiuokR6LVN8mJ19H2+jQb43MMJDVsFt2swfZyg+qRhZ92kiCmE+8/ZzNO15onsEmGW9Jn46dezHJRr4wv1QZhEUmOL4H2Tbg9xeFqPGtt+Fb6YYLbFZlOrSUubugd8uX41NWbmvyg/fCBkkdPmb2EjyYC5Vxq0foppgZOERbKIPacC9CoM7yjy3dsny9X/KXe3pGgRWe2cz+VFmPLQOC1s6Pd10DFJ+wd5F6G2NwanwlFcQsvqOwN0PfCSYE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1NAM02HT012; X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02HT012; 31:G2Dx4y+FZMpgo0elAJGTqFi67lLCE8W5eOSVa0Ft0ngbLZlKZpzcvsqxXQX9K7Zi/cVw4+YH6EVmL/jFKbWMhUe//0/caBH7eLAZrGM7FB9cjYPbTqDMZewmCuiJ1QnUdeVKW9KNoJUiFWrzJ8H7Wl2CRBrovEAlRjOpBZ3lQzlElbFkepifVOPI8tNaXYrx9daRCGvWkEG80YZKixXqiEcZbO2OhU0G3OyNQbvIpeg=; 20:HJl7neAmvcNpcHCp48G5bTnFoSHd8PSCYAmmsIZakD5Z+/+TmEBBOZGyUiPc2P5gOvZPxfZk4/r8mFCcjfYcH+OYm9ApgNRBHJMbKtT9kO90DVJD20TDyGwK+2VOUWA0cxtu1F5PK+TEAhv3jH/uvEGP30qBVil1BosvUnVeG0oGlWHR/SQvu3Tkb3ISxkfBOfTg3PccGGNyEsf1XJ8sHc/xD0QOCfQ0rmsk3jho6sAMnVomt3UzESkxTDgnJwFGLXWgkghwyBcUJV+12VqdY6j+sTnZra22FdDvijyth+1JhbxH4vxdYJajA91kTo88syjs+Z4Pk7JqqyO9LSCvtgEDG4+d79pTgrwxtmLQaLrsNY7WJy1UMZqlpUWmDDMqKAQrA5yz/1R2rbY756kVeY1MY1X86M0zndK0YqEemlc9ZA6SJkRpiUvVdAxumFkgJUjXgA6EpOxFsZjD5eRUqDo9evtbt6WYcE6ZBB0E1IIx1ko5847KR3aavppodtyO X-Microsoft-Antispam-PRVS: <60d8f7e71a914b428e5e7d2e27496620@SN1NAM02HT012.eop-nam02.prod.protection.outlook.com> X-Exchange-Antispam-Report-Test: UriScan:(60795455431006)(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040151)(601004)(2401047)(13017025)(13015025)(8121501046)(5005006)(13023025)(13018025)(13024025)(3002001)(10201501046)(6055026); SRVR:SN1NAM02HT012; BCL:0; PCL:0; RULEID:; SRVR:SN1NAM02HT012; X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02HT012; 4:YSPcDwm4zhNjoYLhxtHHLGrGaRsBII2kw9Bz6agZ4O1gnSfdWDRCWuhWfjm7kKuA+4StUsw9ui/QzmiMuRTYkMkGmnAR8bFYXqDfIqwPjRVbG4UsSM+PS/UKqip/+Im++7XV0T6C7cOXeO2KQAPFJUhuqQwP9sxBQOJHNHS2tMh9H2lMIZUz2heD7wFd0Pk9XzfkXPs1SWLD+RdSOi1YdxpiHqmhOelj02V9MK5B8LTsPJi0wf0H0Tpp0QW5YP/DZt4zqGyCxiNRRHgSW1JLEJKpuHhzKKzfLOPnfIZzngi2A45pXbkcnKvctEhnVFTHlwGyHa/YqFC2pnWtRzsz51PEeR2a8ffmCTBtNQWHwqWhvfg6Jl9bdPn+Oh0cd1AQD0GMO9mXNVgRlh5KJTp8SBf4HAfYXZp/Z0vwPbUaKaNk/OIx0E1Ql7M0w/k3S6T6pw76vS+rph54Q9IzyzdarJ/2H8mlhJ6jwvRl52FQWymqGVNUtwpyNjraeoDN4wakweKm/zc03bgI8Tm0kiIDS64UB5kIYC5uA6ng1FyIh2JKu74MSoelMpbADYpreaHhSWyFWLEnmVnn9qHp/f9yhQ== X-Forefront-PRVS: 00235A1EEF X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1NAM02HT012; 23:zM0hWOIu//8//YpzhlhQWvsMfPAlSGnpOso/dJv4v?= =?us-ascii?Q?4ftpDIR+bNbSGSjfTLukCG5oP7MIPOT6H8yvjwBYk3CbKZCkaBLhI5ZCuhON?= =?us-ascii?Q?MZt2DJJzDCt2ofGqofjpMo1xUa0fwCsCayVNzJwEGkrtjMAAUc+Z2TdYoKXC?= =?us-ascii?Q?cYMCSiq86DuP6k8mH1upaTZE++oHLxp2l7RjYojdGGpa3T+YeCT0VtIMoYeV?= =?us-ascii?Q?42n6rDu5W+Svb+XF2uDiGObNLudzM0RrUle164bmX3Twp8wQHENVU1hYU2H+?= =?us-ascii?Q?V2UhzPJ33lcg6VpM5iPKajCuYJ6wkDwP5ThJ9/UQ2efir7tE5B/xlkM3FB0F?= =?us-ascii?Q?FjS/h1H6K8ZW8KkG8Z0ozt5n62MICi9rcA0iNmU4Xtzk8HjOaYwwyDf5u3LT?= =?us-ascii?Q?Vp/U2++jKgPxrOHCPlyoOWdGywcno8AEb54E5qx3B3skh0rMumP7iXzC26JT?= =?us-ascii?Q?n8T9sOUz2DcvvJEVcQfTELuLJDvS1I/8X/NboQAvEbW7k+bXlIHqtugEAudZ?= =?us-ascii?Q?3xycH++v6NQPHicFveCG7nXRLW5OprMUu/t/iZWcsyzPeZokkqOP53GKTSo0?= =?us-ascii?Q?5xydi+XZoLhDtLoxegOeRpVqwjSRLiw8YUANO39OyRtSodaxYH2CPXvMOXpS?= =?us-ascii?Q?J0XYteBvzgLnL2QwGrLQdlLBP7iP5PBlIX++eJJigRR0MowGnNmou9UmvZax?= =?us-ascii?Q?Y66iU3cz7JJMMwDIA322kxmeAyGmRdE3L/dtbm+fnRXNmCssjKQzWW9yy+tO?= =?us-ascii?Q?WDrZbt7rNT+BVipBUNzp5onXjPxSrzH5jRmtE1Z5LKCeYi97yPCmS3o30Jai?= =?us-ascii?Q?tHQP2gceI9/JSg1VUocBYuft+MgtlpxmU5lJvSoI80c6Qv0tl5ePqMMqM23z?= =?us-ascii?Q?MFpTnmQCaYrgWPK89R68QNo9uEvbbKJiKsQCo1FykOkwGinuHwZ3WQYx73OL?= =?us-ascii?Q?9QWIZVhBDK54YxLN81Riw9TtCTjvLg2d6sImyiASoXGjkWpJZJm5nCgbuF23?= =?us-ascii?Q?5vJSR3fzUqEQfNv0ZpYCEypdD0s5xL9ay6it8yEBnWM5ncgPnWr1ufNHfmQR?= =?us-ascii?Q?rF57uqOezJpEvneBASMtRCDPJubzU3mJZrFOk7lBlYiobaNpuzbJn/RZqrRy?= =?us-ascii?Q?pDeaS1tR2SzzF71R6cjkpFmceeUzJepIWo1FFUzcntx9HsXwJP7stDzS2deD?= =?us-ascii?Q?7XqepzT6GqIz+byNTFm1YMg6/0f0ODNIpfm?= X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02HT012; 6:el9LLr05TdYoOwVFj2MHN8VbXBJqwtI1gZQnneWKgvATq00IgkgVGZy/q+nfJV3Z2AtHFNgYzWoH5PT1TIVuZsJ0wN7sdZYQp5BgpvI9xgXfOVv11V4FfMr1j5y4K7f1lWE35ZeYZx94MwniR94aJW7exZlwNCVd9zs4Yucz7fMLyFwhECn7X9T5GPKLbEtLBbgOubjqrA4+Xh0+8jpvdEyRymVBLt5WFgQSg9DikHX6PdvgiHEFmffsX7D9MKnUVOgPTIS1kU4FtnusNQjOEsIYKFq0vXfJH4I57m31vTGL378qoLhhRNuehVoWsccxggR3W6noadgqlaDcQ7dXqg==; 5:uqRfHNfB1F29DwlRz6ccrv3TqleQTgXC/4zP9hvhf5cS/dzVvAuefT58bmDeyfl5NS91reBKe01NPLXvnO2nEhrMPgnKbPCYG6+Nf74jTIs9ZTdjN042rBfo5U3hMBfoBQwgLbZ0pKcjMPZdlZft0g==; 24:RxC+eieutUbVNgJygs7laIvHCOgKxjSKzLyT0SKxd/ANDd1zdqF4DaexB1VSj+bzH9qTGOKTVRV/f2BkUVSCb1fl8n1g+0O8Fad6+/Y+TAk=; 7:CfsF5E+J09AKVUF4dYWKthS2xTLSG2gthTtI81edsCi/eDqu2lnmVpyTWCbfmWTlhMiwTOawxoKZjO1gyfzH/cTb/fuC9brpIqfnFGMdjFMNjCzQ8CXg8FeQxf4uBMOlcthihNGRNJOxGjty110GEpSxYkbJArtyE4sItCOx6T2B3rtdyejTiuBpozO1cDHP7JcK4qk54LwPOn3CnUjapgYQHd1uVbbQ7ttdENnoDBsnJSd946AWfONsYaPfcU2r SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2016 20:07:23.1964 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.96]; Helo=[xsj-tvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1NAM02HT012 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.36.88 Subject: [Qemu-devel] [PATCH v10 3/8] loader: Allow a custom AddressSpace when loading ROMs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: cov@codeaurora.org, crosthwaitepeter@gmail.com, pbonzini@redhat.com, armbru@redhat.com, alistair.francis@xilinx.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" When loading ROMs allow the caller to specify an AddressSpace to use for the load. Signed-off-by: Alistair Francis --- V10: - Set the rom address space instead of leaving it NULL - Cleanup ordering logic V9: - Fixup the ROM ordering - Don't allow address space and memory region to be specified V8: - Introduce an RFC version of AddressSpace loading support hw/core/loader.c | 52 ++++++++++++++++++++++++++++++++++++++++------------ include/hw/elf_ops.h | 2 +- include/hw/loader.h | 10 ++++++---- 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/hw/core/loader.c b/hw/core/loader.c index 6b61f29..aef7bc9 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -777,6 +777,7 @@ struct Rom { uint8_t *data; MemoryRegion *mr; + AddressSpace *as; int isrom; char *fw_dir; char *fw_file; @@ -788,6 +789,11 @@ struct Rom { static FWCfgState *fw_cfg; static QTAILQ_HEAD(, Rom) roms = QTAILQ_HEAD_INITIALIZER(roms); +static inline bool rom_order_compare(Rom *rom, Rom *item) +{ + return rom->addr >= item->addr; +} + static void rom_insert(Rom *rom) { Rom *item; @@ -796,12 +802,22 @@ static void rom_insert(Rom *rom) hw_error ("ROM images must be loaded at startup\n"); } - /* list is ordered by load address */ + /* The user didn't specify an address space, this is the default */ + if (!rom->as) { + rom->as = &address_space_memory; + } + + /* List is ordered by load address in the same address space */ QTAILQ_FOREACH(item, &roms, next) { - if (rom->addr >= item->addr) - continue; - QTAILQ_INSERT_BEFORE(item, rom, next); - return; + if (rom->as == item->as) { + if (rom_order_compare(rom, item)) { + QTAILQ_INSERT_AFTER(&roms, item, rom, next); + return; + } else { + QTAILQ_INSERT_BEFORE(item, rom, next); + return; + } + } } QTAILQ_INSERT_TAIL(&roms, rom, next); } @@ -833,16 +849,25 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name) int rom_add_file(const char *file, const char *fw_dir, hwaddr addr, int32_t bootindex, - bool option_rom, MemoryRegion *mr) + bool option_rom, MemoryRegion *mr, + AddressSpace *as) { MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); Rom *rom; int rc, fd = -1; char devpath[100]; + if (as && mr) { + fprintf(stderr, "Specifying an Address Space and Memory Region is " \ + "not valid when loading a rom\n"); + /* We haven't allocated anything so we don't need any cleanup */ + return -1; + } + rom = g_malloc0(sizeof(*rom)); rom->name = g_strdup(file); rom->path = qemu_find_file(QEMU_FILE_TYPE_BIOS, rom->name); + rom->as = as; if (rom->path == NULL) { rom->path = g_strdup(file); } @@ -969,7 +994,7 @@ MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len, * memory ownership of "data", so we don't have to allocate and copy the buffer. */ int rom_add_elf_program(const char *name, void *data, size_t datasize, - size_t romsize, hwaddr addr) + size_t romsize, hwaddr addr, AddressSpace *as) { Rom *rom; @@ -979,18 +1004,19 @@ int rom_add_elf_program(const char *name, void *data, size_t datasize, rom->datasize = datasize; rom->romsize = romsize; rom->data = data; + rom->as = as; rom_insert(rom); return 0; } int rom_add_vga(const char *file) { - return rom_add_file(file, "vgaroms", 0, -1, true, NULL); + return rom_add_file(file, "vgaroms", 0, -1, true, NULL, NULL); } int rom_add_option(const char *file, int32_t bootindex) { - return rom_add_file(file, "genroms", 0, bootindex, true, NULL); + return rom_add_file(file, "genroms", 0, bootindex, true, NULL, NULL); } static void rom_reset(void *unused) @@ -1008,8 +1034,8 @@ static void rom_reset(void *unused) void *host = memory_region_get_ram_ptr(rom->mr); memcpy(host, rom->data, rom->datasize); } else { - cpu_physical_memory_write_rom(&address_space_memory, - rom->addr, rom->data, rom->datasize); + cpu_physical_memory_write_rom(rom->as, rom->addr, rom->data, + rom->datasize); } if (rom->isrom) { /* rom needs to be written only once */ @@ -1031,12 +1057,13 @@ int rom_check_and_register_reset(void) hwaddr addr = 0; MemoryRegionSection section; Rom *rom; + AddressSpace *as = NULL; QTAILQ_FOREACH(rom, &roms, next) { if (rom->fw_file) { continue; } - if (addr > rom->addr) { + if ((addr > rom->addr) && (as == rom->as)) { fprintf(stderr, "rom: requested regions overlap " "(rom %s. free=0x" TARGET_FMT_plx ", addr=0x" TARGET_FMT_plx ")\n", @@ -1049,6 +1076,7 @@ int rom_check_and_register_reset(void) rom->addr, 1); rom->isrom = int128_nz(section.size) && memory_region_is_rom(section.mr); memory_region_unref(section.mr); + as = rom->as; } qemu_register_reset(rom_reset, NULL); roms_loaded = 1; diff --git a/include/hw/elf_ops.h b/include/hw/elf_ops.h index 5038c7f..4744d11 100644 --- a/include/hw/elf_ops.h +++ b/include/hw/elf_ops.h @@ -405,7 +405,7 @@ static int glue(load_elf, SZ)(const char *name, int fd, snprintf(label, sizeof(label), "phdr #%d: %s", i, name); /* rom_add_elf_program() seize the ownership of 'data' */ - rom_add_elf_program(label, data, file_size, mem_size, addr); + rom_add_elf_program(label, data, file_size, mem_size, addr, NULL); total_size += mem_size; if (addr < low) diff --git a/include/hw/loader.h b/include/hw/loader.h index c59673d..815a8d6 100644 --- a/include/hw/loader.h +++ b/include/hw/loader.h @@ -120,14 +120,14 @@ extern bool rom_file_has_mr; int rom_add_file(const char *file, const char *fw_dir, hwaddr addr, int32_t bootindex, - bool option_rom, MemoryRegion *mr); + bool option_rom, MemoryRegion *mr, AddressSpace *as); MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len, size_t max_len, hwaddr addr, const char *fw_file_name, FWCfgReadCallback fw_callback, void *callback_opaque); int rom_add_elf_program(const char *name, void *data, size_t datasize, - size_t romsize, hwaddr addr); + size_t romsize, hwaddr addr, AddressSpace *as); int rom_check_and_register_reset(void); void rom_set_fw(FWCfgState *f); void rom_set_order_override(int order); @@ -137,11 +137,13 @@ void *rom_ptr(hwaddr addr); void hmp_info_roms(Monitor *mon, const QDict *qdict); #define rom_add_file_fixed(_f, _a, _i) \ - rom_add_file(_f, NULL, _a, _i, false, NULL) + rom_add_file(_f, NULL, _a, _i, false, NULL, NULL) #define rom_add_blob_fixed(_f, _b, _l, _a) \ rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL) #define rom_add_file_mr(_f, _mr, _i) \ - rom_add_file(_f, NULL, 0, _i, false, _mr) + rom_add_file(_f, NULL, 0, _i, false, _mr, NULL) +#define rom_add_file_as(_f, _as, _i) \ + rom_add_file(_f, NULL, 0, _i, false, NULL, _as) #define PC_ROM_MIN_VGA 0xc0000 #define PC_ROM_MIN_OPTION 0xc8000