From patchwork Tue Sep 20 14:54:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 672321 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sdmt83mnDz9svs for ; Wed, 21 Sep 2016 01:30:40 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b=s6qM+UIf; dkim-atps=neutral Received: from localhost ([::1]:36110 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmN0I-0000Ax-2o for incoming@patchwork.ozlabs.org; Tue, 20 Sep 2016 11:30:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41819) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmMxV-0006Ej-1U for qemu-devel@nongnu.org; Tue, 20 Sep 2016 11:27:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bmMxP-00082A-KS for qemu-devel@nongnu.org; Tue, 20 Sep 2016 11:27:43 -0400 Received: from mail-bn3nam01on0069.outbound.protection.outlook.com ([104.47.33.69]:13988 helo=NAM01-BN3-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bmMxP-00081z-Eh for qemu-devel@nongnu.org; Tue, 20 Sep 2016 11:27:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Rx4oWuYX1K7H1Fi+XONNTOA+qYHjX9Tyi7i4gLO41ls=; b=s6qM+UIfvheQWcdUr8VJohEYqHoudQ+LFS4HZRPxUlHZlQ8evddC4LjdqteWE+BnITZDkP9dGm8XNO30+l/WgM8i6JqsdJLAdSJAoQ6cJKTHQqF0AGCa/8B39R9+Wl/eNos8R0P8Q1wXCTPzhOnHZAUsxsLLnnDzknYko2hJYc8= Received: from BLUPR0201CA0038.namprd02.prod.outlook.com (10.163.116.48) by DM5PR02MB2892.namprd02.prod.outlook.com (10.175.86.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.619.10; Tue, 20 Sep 2016 14:55:30 +0000 Received: from BL2NAM02FT050.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e46::208) by BLUPR0201CA0038.outlook.office365.com (2a01:111:e400:52e7::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.629.8 via Frontend Transport; Tue, 20 Sep 2016 14:55:29 +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 BL2NAM02FT050.mail.protection.outlook.com (10.152.77.101) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.629.5 via Frontend Transport; Tue, 20 Sep 2016 14:55:27 +0000 Received: from 172-16-1-203.xilinx.com ([172.16.1.203]:50716 helo=xsj-tvapsmtp02.xilinx.com) by xsj-tvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1bmMSE-0008Gx-4S; Tue, 20 Sep 2016 07:55:26 -0700 Received: from [127.0.0.1] (port=47543 helo=tsj-smtp-dlp1.xlnx.xilinx.com) by xsj-tvapsmtp02.xilinx.com with esmtp (Exim 4.63) (envelope-from ) id 1bmMSE-00074p-2v; Tue, 20 Sep 2016 07:55:26 -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 u8KEmJhc008985; Tue, 20 Sep 2016 07:48:19 -0700 Received: from [172.19.74.182] (port=57014 helo=xsjalistai50.xilinx.com) by xsj-tvapsmtp02 with esmtp (Exim 4.63) (envelope-from ) id 1bmMSD-00074l-AZ; Tue, 20 Sep 2016 07:55:25 -0700 From: Alistair Francis To: , Date: Tue, 20 Sep 2016 07:54:24 -0700 Message-ID: <9964c959eb53e73a2d4bf71fec390c4185533d1e.1474331683.git.alistair.francis@xilinx.com> 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-22588.005 X-TM-AS-Result: No--14.716-7.0-31-10 X-imss-scan-details: No--14.716-7.0-31-10 X-TMASE-MatchedRID: +7/i6KNT1khYXTxImR5ZvCZm6wdY+F8KM3PBQtDBME+voBtU8+SlKSFt AzREqaecZMmd/uF7O5uOmWv5qdGucQMWCgdCzp+aMB2m5K0KuIlyETzgIO4satJgDNnoqapaj+J vxx0kMPlK0wQxS6/iekhGhVq1hSzQDwsoidZSmzxbuDP8ZuCmXhokPBiBBj9/erbS/Z8GD7Ky1m 1yYQlZ+YZ5Z4b2tHeiMypbxa6TALEfLCnwVCuCFaOuVibdZNTvh+w9Wz/xXDqneP2LcHykgdNLQ qq8Knhmt+ki9vYAWeZ+dfwnt/TnE/E4wkX7qm7s8YGKGucXIE/DHSNFHFxB801KG1YrOQW/gFhq c0Jeu8fsJbnEUDpZMnybR4oj90UAlh+IkeJQ88aZroPNdqiG8520dShmm+V5QtAmhdC/04uiQ0Q xVRsW5ueJ5evGGEmfAvAS+4MtyNG0A65es43yNt35+5/2RxqmNq2wzbsxt8udYFRaUAqcEwC+sR w3LkeY+nPXVKp0JE0PyyDeklejcKs6SlQGyqnfvHKClHGjjr1tITm2wSHw4KWoJLlGMFzdTW6Co H367w2ywLMX24RfhFrqoMZix94CU8TwY4QpdzvhG1IOMb7PsKTYf9v9flolmyiLZetSf8mfop0y tGwvXiq2rl3dzGQ1GT2xztX86zSt9NgNArtacSx4AcE7EreSiXsuw6qPtXIDQGvtXlZwGA== 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)(1109001)(1110001)(339900001)(189002)(199003)(305945005)(8676002)(106466001)(86362001)(81156014)(81166006)(586003)(8936002)(105606002)(87936001)(2906002)(626004)(85426001)(7846002)(5660300001)(19580395003)(19580405001)(33646002)(11100500001)(229853001)(4326007)(356003)(9786002)(50466002)(36756003)(77096005)(92566002)(5003940100001)(76176999)(50986999)(71366001)(64026002)(50226002)(2950100001)(118296001)(48376002)(47776003)(5001770100001)(189998001)(41533002)(107986001)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR02MB2892; H:xsj-tvapsmtpgw01; FPR:; SPF:Fail; PTR:unknown-60-96.xilinx.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2NAM02FT050; 1:L6m2Ge8psX2vrML8peKJnfa7PW/ogO8Sjafs3Ke5f5Af3biLPoZ1i/D1cSVIa1QjJ2+z5KezlDJqE904mizLbD5bicrzZLnRLncEorLB7bvxFJxhHreDpcmv0vqLfrGng2M32z0By/zzAy0dqlnIgRWfrZFRmcpPVvfpHNrmWijwo8NDCyVBXPtxDpsjMw6VuZBEZVjJgC8nlXK+XmLB+g5Cywy0OV2dPfqHxMHhQ3I79WxB+5D9tChTCspnOjvdyWEXXghxYWFH6wFvJVVtuHhyUcoVhMNjw9RXY4NoY0Wk8YxgtxPKrvTEr24uQFL/1FmdCMUJvAq0ZJDFPeP9TpN5kzDFpYnwse2tkDBq9dR9BbFM8Z62pj0yLHTHuljnZ5sd5s9D4LdS2ts48XLS7QlqP3zP7QSv8tkof4DZyMFuujUW88LudIrkoFkUomQkxlI2j0+CeyfBgrEs5A+VVIpHDdQChZICHCWBXYm7i1LeCyGJQTuVzqwoHWM0FqAugLdNuPMVyc8eD1h2xdIO441Pt6Hxb+LgpcShLptHGQB1EoQF2j1e7O95xgCHOWCCcMuqqZUU/SphIYpI8J4RsiuIkRAbu0dDg66O98CzQI0= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: aa4fb34d-9cd7-4d72-2bfe-08d3e16629e7 X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB2892; 2:81VAxj8H6L4LG3UVYMlgZ1P+3vbfw4uq/40E3NMO4vKL9vuL1PAzJyhgrq59fihM6PlVDBmw6l7SFYIsbip7UJhBPUudh4N97SZd/BhLHzKpI4BTNOjyNP+uVLxL3ssqDmxCtJixwgcqKb6SZbkeHFmNhdFXHpHVhFD26Nj77ZmZeOa8XBFhoHsj1ntves9x; 3:yN8v1qPp8g2wk5OPwIzffV2o+oDkYTuV2/e3Dg4P+j2+0ICXfqLkHSEgZdex4IXdvrcmA1vF4Rkax4CQ9JrCaOYQOJnNyyGS2xzKsUboS8xMrn4wQXB2ux1BWOAiX9RT6krkJerxO+sS572zTcqUvDCeG0aG4/CspFJ024WGiYAtjK/4J+GhEzMMd2I15JQ1oeui5f3CjdmCwZ3QsYdjy3FVXSu2f9Z/JfVMcbvgmcE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM5PR02MB2892; X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB2892; 25:vHZFRxi/Yo9ljLBwL7fT7+qip8hEoSTduiRoKl0CgSkPsWX0cxgCYorU7cHmToaYIXQYzSNIVhd9T34pCFx13DHfJl7bj/nnunQyehuXfbZrx642ouQTPB/ZAFzTh2DQ23T4//a1ZnEv1ZGyExzRjZpCc2mOpqanfz5GPY7Fyxb+Cnsv1wds6S4Os9KQ8cde9GRgiExBiFVulFUgUr80nPYJud8732YBitiPrR79bJmSBiKYTpjnZ0xQMHLWqZhNqy2AKPtn66cVe8zbD4vb3iL4wTSGFvAq1fAKKr+uabrFidtPKdMP9dapA20a/w9JTsdvY7bF75AIFKp6H1mX0uLfcwNmJnNzCnmZkFl3PLfdoAYoUlW5rozyIpF9yZ34snfeQ6mVjOLox9zJ5SrkKcawe04IiORIY6Q/p4rKpiBfbWjkUeqvfqdQPeVpEpSoTI/JhueUwi0z3C3WtKtm7NnDgqgH8A578M7y9TlSb1+I6n0BYCXkRn3uFAm6zHdDbS1owU1chqKGgNaBDytZY4uJFVjkz4MU61uKeA1yBrj1k8TDIU7dnWVYCXm46nPWJMbtl3e0G6bhqD3vj/FcZm0q30SNr6M1VVts2hkdy7hFau9Cl1iMZaj/PIAFlVD4EosN4Y3BFQWWmHroTVmMBzyJ+DC8uMtrBbP3W5VKgTS3lMTto79IYkVpq9/jmTdbQfeEbQmZIeZpJ1VC/5s4GY8na+EAYKrAOr/EBBUu+UOJ1XBG61yWESBhKodOtaevSYVA5uLSaKnX5+xA1ao2FDwYdcEaYidlnh5CDDETOg0= X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB2892; 31:wk1rG7Im/rhQzeAnFDaQlY0fyBYh2wHTRD46kkQ5Kh+ua02+toOG0KlojJPMu7dXSuDN2pNBXGlDGXRXoRzB6w768YepxkUbBSnvR+vW8ykC5B0voLdWilTVi21EB5+dBNORMPjiJ0pwN2PWRuESb7eDArpVvVIW7PIgs/TaeISqf5QhcgFxHFQdFgRO6uSU8s6ypZoG2iarp6EyMUzQIUHV9J2PSHbv1/qf9OSLMJs=; 20:xd4oe3WrWuBGfdkmbSnCCTn1h0M9JXbvjJlxgnoJaBCV7gVaNte77SfO8OEaBEWPViKk21nIhuGpHOe95m/0MUcmAyJotNX+0quik4RHrsAdlzl6cwrTbwdaFB+ni6NPUAEalW3AwprAB40gu1mvV9LuyA/aQJ2s4ce78qog8JXPloiZ9n2Cj3q2VWtxK0bxWCWCdlL8k64ukW2qaQT2S5vOkMJXqI7x/4MrI6PnAI6pZ3omEThJ0GWLRjPLvQ2KbtP5zeHQFGdE6xjj1tMZWQajRYtS16fJoLcHQHWhGHF4UQAWqunJUqFHzDan8lYyONW6Xxg2SFzqx4jCjx/yqKErdQlMn5Ks5b6X0HHGIT1JAZHWeEVyTex3ZZdDuEMRnZPIzoqkYfCIsWOh4+eQH0aKghCZz+WIA21xHQtPTBYV+7zAh9VtlXIW081dvAcQRcp1NKZArpLhpJHTOBSuM1WtkbnwvT/fYWawhIVAG1n0soQx3o1u89ZkVfDC9D1H X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592)(170618885588394); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(13015025)(13017025)(13023025)(13024025)(13018025)(5005006)(8121501046)(10201501046)(3002001)(6055026); SRVR:DM5PR02MB2892; BCL:0; PCL:0; RULEID:; SRVR:DM5PR02MB2892; X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB2892; 4:qlbPN/Wdlv9k2TUosOuTNzJOn4cxpC3LMkaQiKBuItQjbdzA5A1haMmhnuYpigAA4fXkzX31murd92Ay41sEceTKxdY9t6scneJOE6W/FOlZc30zO8GWIR4gP89yXbFKHDsrfZszjsf7U48qbqBtS6zt5kXhwVXgqjOY/eZde54CTHUGTpOFzieCCq5TCLhIfZJPLT7arh4ITdrLiJa+ECduQjN2Jay9m4i9Va6SVYkDXtk5HiMcxV9cNsJ4X1wOVdUcHeA29pHCtpKkkdhqzMUgiqDd7w6p4nqvGcF6X16l61m1NRf+WlDu4C1qzH9qOb+LxVEAU8QOe/fVi8dHN/WH7dovNbC966Yj3GlCaO1Cb0tAwfI5SXZXB0Pq93Ex+A2vGH6E1YMveu37i5qR/cka3CMky31hZoTwHJFUtTQ6WaSqrHquEr28x92luAMGrvQNXfwqAFyHS18Sc3NwuDbloXgezx3UDCE1NU/yf226xNVkKAhDvRXrfI/ligYgON6bElhodycoBR/oK/x2R64Y8eWGqUGg//IdA2WuW0tSDlR0a+I1COltQ06kMNS6C0WVjBE+kDcGh1yhqVAp3A== X-Forefront-PRVS: 0071BFA85B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR02MB2892; 23:EOamJaMRhrcsmn44Rz2V6+DyZCYJBHcCDcX3pmtRH?= =?us-ascii?Q?Jp+OX1IHi4tryX5GERnlhnnRX3z6aLCBwSdp/RmCC5i3CPRBqIVT1vcPHqYe?= =?us-ascii?Q?k/FpYj/EeVn0QI7hsLGlFie4MdbaHHvAUCfuJ5hwAq15aQdn7xvvHz4aXHVy?= =?us-ascii?Q?fxcv7SQMrZb7V3IwATQPfSu7faEM536NRCtIMDtFwvABWROuCFm7eR0UzsHe?= =?us-ascii?Q?kEb54u/UMnI1Dg1CWux7dwEyP58wkzkWoOpRGh7cYXKnh5wA8+gxAFgPbdA4?= =?us-ascii?Q?BYhR9SlxZR7BiiZrufyn/cxzc8fBz4SJEiWCFo1lCUFxUy+/t4nnYVDZrkAN?= =?us-ascii?Q?r+y3cKrnQtO+JTCYm2AIeW1Hy94xx6sO1G6ymO2Bcjw5jopyhTsBOUh9lwPS?= =?us-ascii?Q?AQEsPTh/ThI/KxC0ERjj+DdNH+Ek55xJydQNXDn0GblWEf5282Zp90VCJelI?= =?us-ascii?Q?S1sCnI5fZ05QOB2lufMnmGsrqD42+pPwr9S7W8w309lZDLN+MyE1ZAB+CC78?= =?us-ascii?Q?2j5Ff0XFxxJkwVMCRJyTeqcuslwhkKbUBh16FypwJ7gWMbb3h/4PqO3MRb63?= =?us-ascii?Q?4xbdBZpe6vdZ/tFf3SRY8aksXsB/+5ZBJyN4FqRxhUG19HrAMYxJ0MpvTlUW?= =?us-ascii?Q?XiNgzan9tGM6owOQ5qMK+aacJgeWHs2vMjJtKFxqwGsbYOodAtqsk7ZpmhJz?= =?us-ascii?Q?7s7RNSnhZ5yVjCav5OyXTqg+lCAa38Sf0pWdQAj6e+z3XSrXCrdIp++zLadr?= =?us-ascii?Q?1chEU81S8mUEgHKj46t+h+eDTBDeq2YTTVoCjmQjFv3DmesYuE83C7NP2vRt?= =?us-ascii?Q?ShuHmDptZDab0VjNKwE79CR20s1kQh6cyG/KE7fJvqL6O66xI/jQU/69pL7f?= =?us-ascii?Q?aPJCbSYFI7oxlIECoI4dAUhPAjrSQkwqMx82k1DRtIDh5TuhnAPPpisx6F8N?= =?us-ascii?Q?55fsTgAZaNtDiLdc976zGRhpOBBy5dv9F/QorR4rVe4A/m/GOuLrrmyBlbuX?= =?us-ascii?Q?5zwCmjAvqs6DM27z7PMGE4euQ6ClpuI+HTjylZR5Zh+mCXYsQ9QHb2/NztDE?= =?us-ascii?Q?Z0PpET5PJZf4bCuYNBfTmpV9CoSd4g09S4HzXzSgWC6FjxtPesBrDm8JoETo?= =?us-ascii?Q?rxJGXGq+xnA9XbUu5LaPgMTUScoLOp47jkllPN58Ns5aGQYi4rwdMGNjzJF7?= =?us-ascii?Q?K0cat5hM/fzi46qSWa3CpnD3qhRZ0f1gKNa?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB2892; 6:t8ku21lRMZQ/fRbhFwIfB+u1y5H4s6ruFg3O/lEOwpBzjDpfOSSaU+WDQvr81emjD0XPP/5uCrc6q4YnnPcJ7vHmlf4T7dym8xok6J3GjS4tA1PhJnz9aa/mGVvUEesXq3YfZfkVPUusvfVHbLd5Olr57Vxu0GX4i8depnkh1f344dpFmbl2m1b5PtXa1scIYZVWFYYrt4TMB/1DHnDV3ztM9ZQ6EIxzsj19JWmId9ATJ+oCnk7MI4WhNjj7NQJpzsheV9dlrybDf3Rdlngb2bzyqSfTGrI7SRdNTw00b4JrFOEilVAe9FGUB9YRBh4rbWtnBPwpfHXVxwXsrxundQ==; 5:0fqBp5ayO6ecfKbqOVbPrdK7mbfhM3a9hI51ECKXolzHm3HqwdkXm56tlxIma8SxcCz9OJSAedx6xbariKieRT3BWE2fsfQrd0qe/nzmD6xntQta1d+4XZBuIWtVFic2Z8bXdDSLQlS5gP/iX+FZ8g==; 24:zLiLaWO0SYPY3SF78ozVMacUCUuWZN00Bb7vtsVdctB67IbRRvlgAhDBcuzMq4w8mZfo9aeqlfljaLks5XdVNawBoEOTI3SBE1Tm1gwHE7I=; 7:DPf2CSi1Y/qIaehCG6Eh+aEmiAjyAO2nhVg5I/pNQojmrFAh9vI+xARRvoE2isqpnAbIr49xIXdbBn8nnFPkjP/8n24/wxsJYv2t3QetwqKfxtykjpcHI0YB21rAMCkYes3nKRrDu5G8XgFx8GNmNZJ0Cs1WcsV3QgeAc44jyvEftuehnYljPl31uRUcyNWh6Kg5Jx9rUITc1G7jaC6X04a1MtTd2qnENP7O2otzY0tAatLP/zHIyZ+LBycii0ONTl27GWdvXQb6qvyVYX6D7LX4E1Pnmz1nWfLsTZrsMZG0ix4EfP+wLgCwR3HNYUwB SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Sep 2016 14:55:27.0769 (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: DM5PR02MB2892 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.33.69 Subject: [Qemu-devel] [PATCH v11 7/8] generic-loader: Add a generic loader 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" Add a generic loader to QEMU which can be used to load images or set memory values. Signed-off-by: Alistair Francis Reviewed-by: Peter Maydell --- V11: - Small corrections - Don't check for !data as writing a value of 0 is valid. V10: - Split out the PC setting and data loading V9: - Fix error messages - Updated some incorrect logic - Add address space loading support for all image types - Explain why the reset is manually registered V8: - Code corrections - Rebase V7: - Rebase V6: - Add error checking V5: - Rebase V4: - Allow the loader to work with every architecture - Move the file to hw/core - Increase the maximum number of CPUs - Make the CPU operations conditional - Convert the cpu option to cpu-num - Require the user to specify endianess V3: - Pass the ram_size to load_image_targphys() V2: - Add maintainers entry - Perform bounds checking - Register and unregister the reset in the realise/unrealise Changes since RFC: - Add BE support MAINTAINERS | 6 ++ hw/core/Makefile.objs | 2 + hw/core/generic-loader.c | 197 +++++++++++++++++++++++++++++++++++++++ include/hw/core/generic-loader.h | 46 +++++++++ 4 files changed, 251 insertions(+) create mode 100644 hw/core/generic-loader.c create mode 100644 include/hw/core/generic-loader.h diff --git a/MAINTAINERS b/MAINTAINERS index 3e106c8..808956a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -998,6 +998,12 @@ M: Dmitry Fleytman S: Maintained F: hw/net/e1000e* +Generic Loader +M: Alistair Francis +S: Maintained +F: hw/core/generic-loader.c +F: include/hw/core/generic-loader.h + Subsystems ---------- Audio diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs index cfd4840..939c94e 100644 --- a/hw/core/Makefile.objs +++ b/hw/core/Makefile.objs @@ -17,3 +17,5 @@ common-obj-$(CONFIG_SOFTMMU) += loader.o common-obj-$(CONFIG_SOFTMMU) += qdev-properties-system.o common-obj-$(CONFIG_SOFTMMU) += register.o common-obj-$(CONFIG_PLATFORM_BUS) += platform-bus.o + +obj-$(CONFIG_SOFTMMU) += generic-loader.o diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c new file mode 100644 index 0000000..fc2fea7 --- /dev/null +++ b/hw/core/generic-loader.c @@ -0,0 +1,197 @@ +/* + * Generic Loader + * + * Copyright (C) 2014 Li Guang + * Copyright (C) 2016 Xilinx Inc. + * Written by Li Guang + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include "qemu/osdep.h" +#include "qom/cpu.h" +#include "hw/sysbus.h" +#include "sysemu/dma.h" +#include "hw/loader.h" +#include "qapi/error.h" +#include "hw/core/generic-loader.h" + +#define CPU_NONE 0xFFFFFFFF + +static void generic_loader_reset(void *opaque) +{ + GenericLoaderState *s = GENERIC_LOADER(opaque); + + if (s->set_pc) { + CPUClass *cc = CPU_GET_CLASS(s->cpu); + cpu_reset(s->cpu); + if (cc) { + cc->set_pc(s->cpu, s->addr); + } + } + + if (s->data_len) { + assert(s->data_len < sizeof(s->data)); + dma_memory_write(s->cpu->as, s->addr, &s->data, s->data_len); + } +} + +static void generic_loader_realize(DeviceState *dev, Error **errp) +{ + GenericLoaderState *s = GENERIC_LOADER(dev); + hwaddr entry; + int big_endian; + int size = 0; + + s->set_pc = false; + + /* Perform some error checking on the user's options */ + if (s->data || s->data_len || s->data_be) { + /* User is loading memory values */ + if (s->file) { + error_setg(errp, "Specifying a file is not supported when loading " + "memory values"); + return; + } else if (s->force_raw) { + error_setg(errp, "Specifying force-raw is not supported when " + "loading memory values"); + return; + } else if (!s->data_len) { + /* We cant' check for !data here as a value of 0 is still valid. */ + error_setg(errp, "Both data and data-len must be specified"); + return; + } else if (s->data_len > 8) { + error_setg(errp, "data-len cannot be greater then 8 bytes"); + return; + } + } else if (s->file || s->force_raw) { + /* User is loading an image */ + if (s->data || s->data_len || s->data_be) { + error_setg(errp, "data can not be specified when loading an " + "image"); + return; + } + s->set_pc = true; + } else if (s->addr) { + /* User is setting the PC */ + if (s->data || s->data_len || s->data_be) { + error_setg(errp, "data can not be specified when setting a " + "program counter"); + return; + } else if (!s->cpu_num) { + error_setg(errp, "cpu_num must be specified when setting a " + "program counter"); + return; + } + s->set_pc = true; + } else { + /* Did the user specify anything? */ + error_setg(errp, "please include valid arguments"); + return; + } + + qemu_register_reset(generic_loader_reset, dev); + + if (s->cpu_num != CPU_NONE) { + s->cpu = qemu_get_cpu(s->cpu_num); + if (!s->cpu) { + error_setg(errp, "Specified boot CPU#%d is nonexistent", + s->cpu_num); + return; + } + } else { + s->cpu = first_cpu; + } + +#ifdef TARGET_WORDS_BIGENDIAN + big_endian = 1; +#else + big_endian = 0; +#endif + + if (s->file) { + if (!s->force_raw) { + size = load_elf_as(s->file, NULL, NULL, &entry, NULL, NULL, + big_endian, 0, 0, 0, s->cpu->as); + + if (size < 0) { + size = load_uimage_as(s->file, &entry, NULL, NULL, NULL, NULL, + s->cpu->as); + } + } + + if (size < 0 || s->force_raw) { + /* Default to the maximum size being the machine's ram size */ + size = load_image_targphys_as(s->file, s->addr, ram_size, + s->cpu->as); + } else { + s->addr = entry; + } + + if (size < 0) { + error_setg(errp, "Cannot load specified image %s", s->file); + return; + } + } + + /* Convert the data endiannes */ + if (s->data_be) { + s->data = cpu_to_be64(s->data); + } else { + s->data = cpu_to_le64(s->data); + } +} + +static void generic_loader_unrealize(DeviceState *dev, Error **errp) +{ + qemu_unregister_reset(generic_loader_reset, dev); +} + +static Property generic_loader_props[] = { + DEFINE_PROP_UINT64("addr", GenericLoaderState, addr, 0), + DEFINE_PROP_UINT64("data", GenericLoaderState, data, 0), + DEFINE_PROP_UINT8("data-len", GenericLoaderState, data_len, 0), + DEFINE_PROP_BOOL("data-be", GenericLoaderState, data_be, false), + DEFINE_PROP_UINT32("cpu-num", GenericLoaderState, cpu_num, CPU_NONE), + DEFINE_PROP_BOOL("force-raw", GenericLoaderState, force_raw, false), + DEFINE_PROP_STRING("file", GenericLoaderState, file), + DEFINE_PROP_END_OF_LIST(), +}; + +static void generic_loader_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + /* The reset function is not registered here and is instead registered in + * the realize function to allow this device to be added via the device_add + * command in the QEMU monitor. + * TODO: Improve the device_add functionality to allow resets to be + * connected + */ + dc->realize = generic_loader_realize; + dc->unrealize = generic_loader_unrealize; + dc->props = generic_loader_props; + dc->desc = "Generic Loader"; +} + +static TypeInfo generic_loader_info = { + .name = TYPE_GENERIC_LOADER, + .parent = TYPE_DEVICE, + .instance_size = sizeof(GenericLoaderState), + .class_init = generic_loader_class_init, +}; + +static void generic_loader_register_type(void) +{ + type_register_static(&generic_loader_info); +} + +type_init(generic_loader_register_type) diff --git a/include/hw/core/generic-loader.h b/include/hw/core/generic-loader.h new file mode 100644 index 0000000..dd27c42 --- /dev/null +++ b/include/hw/core/generic-loader.h @@ -0,0 +1,46 @@ +/* + * Generic Loader + * + * Copyright (C) 2014 Li Guang + * Written by Li Guang + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#ifndef GENERIC_LOADER_H +#define GENERIC_LOADER_H + +#include "elf.h" + +typedef struct GenericLoaderState { + /* */ + DeviceState parent_obj; + + /* */ + CPUState *cpu; + + uint64_t addr; + uint64_t data; + uint8_t data_len; + uint32_t cpu_num; + + char *file; + + bool force_raw; + bool data_be; + bool set_pc; +} GenericLoaderState; + +#define TYPE_GENERIC_LOADER "loader" +#define GENERIC_LOADER(obj) OBJECT_CHECK(GenericLoaderState, (obj), \ + TYPE_GENERIC_LOADER) + +#endif