From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0050.outbound.protection.outlook.com [104.47.42.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E54D521D19956 for ; Mon, 31 Jul 2017 12:29:20 -0700 (PDT) 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=FLI0F5GDYC6O/5se1Hnaw0/N4OK1IqUvyhJDAnutzI8=; b=ptv7MRr5wmTmYLdyFqcUcP2W9SlmxAkGnTxkZzLXALZRNH59U+z3rCdnLDRSB72mUuuUBPnstkQi+QjKS3tAL5SsREAvVHAFmHuO4xQ8r4CbkgfC+lsFA/1yfS1/7zXmOMqNxoCMnxIg/9rX4scLEuEjYtSTQfI00Uay2A7MA6U= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; Received: from brijesh-build-machine.amd.com (165.204.77.1) by SN1PR12MB0158.namprd12.prod.outlook.com (10.162.3.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1304.22; Mon, 31 Jul 2017 19:31:27 +0000 From: Brijesh Singh To: edk2-devel@lists.01.org Cc: Tom Lendacky , Ard Biesheuvel , Brijesh Singh , Jordan Justen , Laszlo Ersek Date: Mon, 31 Jul 2017 15:31:14 -0400 Message-Id: <1501529474-20550-5-git-send-email-brijesh.singh@amd.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1501529474-20550-1-git-send-email-brijesh.singh@amd.com> References: <1501529474-20550-1-git-send-email-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM5PR19CA0017.namprd19.prod.outlook.com (10.175.226.155) To SN1PR12MB0158.namprd12.prod.outlook.com (10.162.3.145) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2a5eac12-5101-4363-32c4-08d4d84abcf1 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:SN1PR12MB0158; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 3:AClGgccU3lTFVR/SiDp8hVJNN0sK3ajdVTkzq8LPG2bh40HMcWdkdPUCgRdrII07se85v5fBt+0w9F/lrn7N5GHC5++YfHJEq6OoTxeGldoaGO+d0wmMD/0UzycBUFRHyzp3ud74wDmJhmW9sv8f+8rJqLOm/H3P8U4WVqVQLAPNcz55j8TQDg+8fMHSxy3kIhoqZtSQpn01DkliV7ooTAIkiuJn7zPwT+8DI2feIU+QMi4VVzI8bwNZmHfhu5n1IAMY+88k3xY1Ha+u3qBc1gpDCjs03acTxQ2ShGqabs1LJ0oyiWoEAftxLsNNe37NT9FYPTl8gKuTCcX2VTWNS2PlsV8LZAU8pHB0ZVIwYFq3KclHlC0zdeMNwHN1EVMh+SqOnqcElWGMamn6mL1/CL4isLL5ESjmtUfBSIeIWzEvdEgYNdJ7JbycINPD9tJnaQgCN8PmryWHmINfP43NjGPVUGgTHyw1wOWo63ERo8wh4p9pt94AQXpDc36x3qMv+J1rZ3B2GwG+SdXS9rCnOWNrV7QVwxJLBTYkBSoFi+7yqy2btRg9blfi9rnTUdXkebxbFq+bc5T2pEJ0o86n8/AbSHOi9sOrX5M/WzdtKjNQpfCK8g43LeU3j2ZteSFP1JCiIqwpVY+FO1dprPO/qoi7bnG8klrLtoTdK+Wj0iy7j5QCLvuztdhIfp0Oo1nNduGiTYDsLvntYr1/oo1Tho9w8bBmi/SAJeGLnpLnYKZ5UnwZHD9v9sZhRmXCXgQS6ftSQsOYwfBXbjnfxl9NWlLuChsXls0bT+09mv5CR61OrwVsTLbCH+LI+25dYLBRibngcmxd/tOQ2Ha3fIXqjA== X-MS-TrafficTypeDiagnostic: SN1PR12MB0158: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 25:IrneUY+mWX6sfaB8tu+A9HIFQFULbNCuQg8T9XWRPAQ9ui8pge6ULosoVH5iCGFNPYRXAajroUCeDa3vMPI+fzpM5gknCR8/ejMhjkRqE/sfO0z0yJy1hK++kKMmmCJnmL189FKY+Ofp1I/y691Sy+g3CUaQsy0UX75+q2Ldr8qTyLSbQlfpdYjU5b/QWrb/MIK8K4effHKFfjz9som43ffN1B8vTfcn6ROSrTPZKhVdp5Ud9RppnEFhGvPr7rqic8T4VkU3ZrOiHrc2f3uVLti0CKTfLK0V1YoEaXwBgA9+tnTxpm4b3LrCW73lzpLRrBwKcPtMv8P35Tyr5EPCBD40Sn+gPUKlpYafW9PLe/WCc6uNtPiaJdiVHMI0Rey65p5nuhkpWWlGcZPLMrWH3yID5QRxXNJ45TUWPRzavzOmK1zoo1GFeCivPBN43KDzWBcJb8slnTjLCl2unaV3IIuZhwwB/y82GG1U9ERFr02kAUS/4Hahvc0XNbNl8G2aZaM1cHiBz7N9llwfNuk8t7/L+sorgJFxHFYAIDTkzw77+IO1IDYp3DAc8aflXuqG6iA8moZ8DA6QRGoMCvhgxqK6I/m2IqLUV5evF6ULL0NCT0g4gX3hHiBNvLBFFq+POwhH260BBNWjlVoK4ji+48dmFBBZfBaxD22QKK6hBtJOCdYVSs/r8ao9619x18eCpAJRdNDKKYK0QaKXlwgMbmG0pGrLUZNnKlNU0gPM9n9X+eyy7y4mqSeE9H/Saw3cljEvJGpKC/Fc0mx7SzyPoj/uA4shNaAxrwgc4oTG5TZBeDmrKp1gSYM3tyv+K2e7hgNpw2iRsmOicrmXD0zusvdwUO5SKGCX8PWkVKfMd9SGFHzDHCe8BQU8gdNHzh3Q1JSbqrOXCdvvXkvUmMxNCkhghHNGHqgd4PAWc1oVE24= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 31:+pVX5Rr9mKNySdZTw2LrWnpY/dwmMqB82X/8wY3erwc6psdyN4XOuUjXB84cTubqQJQKC66HP1c9rZsTptsVIugoq/DOujsOHk8y5LbVV7i8m7X4BLYVuTv13afxEDb2hXjrTZbuh/xbZeSieXuegAo2RzaIrI/0MDr9LfoXi6PFk3qt64vKU/5gD/SzyeNxK/pB3cw/JUjbpgdOkGQ7v82nP4zqRm5H5gjc+57ewXLgMRci15KxrgjqBFgifoATiO6MSidR/rJRhlFRJte3SU6i01gnR1j1pCvmzXn2nANw+0cxLh7OHHfs1Lnie0FLnd7rz2zGKATYPyBi5MKzRejHaulZs7/TAl5XLTiSCyDDGcSMTBHHEsZ6ub40IfPykxRjr+pMua8SvtqEPkdegorb9pWO/duG12RhRjbXnplzDbf1TOTKL312ZQENVMEVqTFMcc2EN/soUBdj8VZ9/1QNLGwf9rGE/IJDJGlr2VYEolI4cDFz0Zqmdzi8sYpLV3kJ1jeohzMeqYJVEEv/ztjs+St77zhSuwI2RvXVkVFDG7ssNEmc2yxZS5/9tidSh/u5suf/g8AY5IlgiG0/GUZzqTL6nznSlBI2nYThpNRqiydoUascDInP0lNfbf+tiKJA0u5n5kx0uWpuLwydbzhyDkG5TqFW4LsZH2WjRi8= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 20:DGKV9elBFxRD46idpfg9bPZrV/l7vDuJlaQEwrZdUPXhlHkxGE+Mos8QATVEav1/BKNR8KOQVOfIpTlJ43B2xDbhwE6Ab7CoJdYKr1MI2zL1ACYUqoyLmulWkr/1bPoKauO86MomBYFsJuytgBuPswDBt1xkE6Bva+Jkxrj6VgW7TBDw+2OdxjT+Evhue42ySuXH3M8KIY0sN2POZM0USoH/88YRBwzBTW0Kj163SylphyeMvdODbNZ7MwiEbTWD1mc4z8co9BWXkV0xGyagiy6ztRLqk+a1aao7zj/13F4/aN7ydUc5ZIh+DPvtA/jLth6iyZFCDzRsrjmNVYbynPiuXdCxMPPd547dLMt9BAWgsUf9MNSuyIrWLvghFANQb1Lw/ammq87h38+k5yq7ce2ZscjS3dQdId4T+uwm4y7BIpZELUGjkp9byCOZUSMsNnW16FQoTieFMHu/pdOLTZbm3ixmz5YspZ/b6ZarWfTdqtDb6xpGC9OI5nDDPkh0 X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(162533806227266)(228905959029699); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(10201501046)(100000703101)(100105400095)(6055026)(6041248)(20161123555025)(20161123558100)(20161123560025)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:SN1PR12MB0158; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:SN1PR12MB0158; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR12MB0158; 4:K2nWo6kkSCXAi7P6iS4ZxMYmPAvpSfh0BoNdahZlXk?= =?us-ascii?Q?lQ41uRLH5AG/oFwBMHhzmHb7d0hxfmCF+SCFfkBo3QgAIjAbP775Nmz7WXq6?= =?us-ascii?Q?oxjlhBGUgabJiqy9lLCxyDdK6BsciEpBEDALawH9JXbZmjCc5BGd8P1/djfZ?= =?us-ascii?Q?MizSOzT2BtR9HzAT4K8dom9QoMy9cwxQyMnGK0Pxl/JbMF7wqaP8G556z07m?= =?us-ascii?Q?7+EO1ECMMYawukFvQXljBogQo2nyWrVyQScEqckwEtccTgum9Ootn0NBjCvs?= =?us-ascii?Q?dw/GSi0XiEDONQzVJuw+zXI9DtuuM6DBb6mBMNNSwjOHwlw+9mPBXHocxVCb?= =?us-ascii?Q?aDMRBof6WXttk3XRkfufJBLANBYBOxPbXA41rTlb2NcUX5RVOiQupzC1A/ir?= =?us-ascii?Q?J+wbIx6XblhGFajixXhPZvkFH7EkU6U+Rlu71qxXGbOvLNptVRM9IIJA6rYR?= =?us-ascii?Q?EOgftUjult87J2GrH/gOzu9xNubOHEQA7+8goFeeiAcmm/dcuByltkYX9UjO?= =?us-ascii?Q?y/fdVc3Q58JjaRrUZG55DPonXBEWT3ojvCartYNZ/TcxRQ9XR079uRQWRXIk?= =?us-ascii?Q?pqtWhGx+11zvqu1HzzuaEA8pRX26CPYsRw5NmXsJSxlYhaYuuXBKwKTMh14q?= =?us-ascii?Q?js4F40jupo6XKA9T071j4BNh18olpA0dVKNyYs8N862DloA0nPqUVh+8ax/S?= =?us-ascii?Q?sgU2S4hhMM6Ut75yJHK8gLpzCXhzkNsBD8qfm3YBd8gcWwwBgA+5LkQn3qnp?= =?us-ascii?Q?TaS3KwkGKETsevyPFMCUEGdpOfekuJIRLvYb7hctnSs01PKnyGx7tQyMI+wE?= =?us-ascii?Q?2gwj/Ujl0cZIB8L5EPGOH0c3HXNWUuajK362GwKGOaCcIDSpwDJ4fP758VSY?= =?us-ascii?Q?TrgAeloYNNsLCcAGotFb9lCkHxRdm8XlTA49fldmfl9kPh+n5MaPlEK554RM?= =?us-ascii?Q?apYzpXrC3hLN+5p1TYl/jqBhWaOl1CTn0vmFsDi5i91gM+RFicnCFLIkpdOU?= =?us-ascii?Q?QdYWoubmE4v/qf3cMhgIJG5nh+0q3YTMrfn+Djrxu0N7N56bPm0HSKzHsk+h?= =?us-ascii?Q?Qgg/miGc0K3hq3IkikCZzTtF6TKK/yl+dzMyfJmaEg6UDuoablkKFrpVe10u?= =?us-ascii?Q?/I14Sav8hMr6mzgmD7DnVqF5fiBRHIDS1VzdfUVKy0VMcG3uM1WkJM5vsybg?= =?us-ascii?Q?OaW3zAdPR6YEAa4NntbD2earH5mbFguyWt2Anxoi/FU5kQU9x4wNUYs3z3P4?= =?us-ascii?Q?+BXkTsggn1gG3wt/tT5zY26RI7sw1cGkzRNkwv?= X-Forefront-PRVS: 03853D523D X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(7370300001)(6029001)(6009001)(39840400002)(39860400002)(39450400003)(39850400002)(39410400002)(39400400002)(189002)(199003)(47776003)(4326008)(7350300001)(101416001)(50986999)(33646002)(478600001)(966005)(66066001)(2361001)(25786009)(76176999)(6306002)(189998001)(54906002)(6116002)(3846002)(5003940100001)(86362001)(38730400002)(110136004)(53936002)(2351001)(97736004)(6486002)(106356001)(48376002)(7736002)(50466002)(36756003)(50226002)(42186005)(81156014)(305945005)(68736007)(81166006)(6916009)(2906002)(2950100002)(53416004)(6666003)(8676002)(105586002)(5660300001)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0158; H:brijesh-build-machine.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A: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; SN1PR12MB0158; 23:NBPuhLOyfT9PKSTkQlG9tE0CzP0w6BBF70GChsFMF?= =?us-ascii?Q?tGUQxkylaHkFDs7m6FuMaAXUi5zvy85n5Ba3c0+V1IgG3tLQ/oGcWwm34HVT?= =?us-ascii?Q?t6PJaJk4aZaMfN9JrRpMkIo5CKiGURRiajgsA0CqAMy5wqaeAuTuKZtRA3a1?= =?us-ascii?Q?Zy9LdJlSoUmuTQUiR4y/zya/APKgWxZKH78q8bIlN0m9Pp0qTVi0Y1Q0S2/V?= =?us-ascii?Q?m4bHESrDj2jG35IDnSrvw9puyrgC7GuO5eJJ1S0z7Ne1RjvDWP+SelwJTKiY?= =?us-ascii?Q?++x2y4Zfir33XwcK7nGuNeN5exaeffTEtw8CEjLDNYmiBFVJA0C7/kVhNePQ?= =?us-ascii?Q?JJU0am+D1qxea4PfKUchHWuwyKuvwhtNZGnoWx4my0o/N3W28LQITpO+DIXt?= =?us-ascii?Q?hElUDlPfBvX7AF1PDXfZi9nO0r+CbXuOeec4v+0pLB382Mpa08Y9jKAKqpc2?= =?us-ascii?Q?9VFi/jwgF0J1T9bCA00VC+td7hq/QRgnilLr7KN6YPpOlBdNyy1UwCP94Nu8?= =?us-ascii?Q?GoTh5rgNkKh1yDofxuCXPI1roxBTRne0XoY3ghqYzUkjf54Vcsuwj73Q3LMz?= =?us-ascii?Q?zMDKI4Nhu0s1P9jaScxiqr6q6i0N2PKcQhXQDpgYoiLAheBdGG/sZRe18t9X?= =?us-ascii?Q?XPaDiWUN5zv0xQZl4vaqd7g4GhsqXRQs4OZBi2UbRBy9mtX4pLUt4RZAYjCx?= =?us-ascii?Q?NT4UKL538fjZ7HKfv/vxDr/bkSOp3AyTb02i2nTXR0H9/+w6SF+QUb9XPRNP?= =?us-ascii?Q?uslwiJYoFNpzeq25khBTV2PPrKvapGYJ2h09CJGxcd4KcriaegevdkHW7cdT?= =?us-ascii?Q?nJE+R6w8zlRno03q34Bg5OAKlPMRMCgFcwtobCM3wU4RvdkaUv1BL4kQDr5K?= =?us-ascii?Q?l9/LoAzeKwRI4v2hKIquZy7FGxB4Ynf7Y4gBqwzmKgIhyi+Y3muVQ3k205oN?= =?us-ascii?Q?bAwQ/pTMG56BumtsfE25eS8fefRF/kOGxgnJMeg9L5XufOwunY3Oy5Ul496C?= =?us-ascii?Q?P15LzkTy26nWl2NFM4SrJrBW+CvUSVQALlHdrLz/jo7n6bHGX208JkULPEuA?= =?us-ascii?Q?LVRoVOqSmGfOfiaVBDbjQXpJBLBG7WumJXb+4BtelczQVZFllvy+E6C1AKDH?= =?us-ascii?Q?RaOeMqZ3PWjYpYm2fhufGGXwQYOrvy62HgOHpBnPKHVtylQx1sER3Qqwe8ud?= =?us-ascii?Q?cBS8nkeBblJUFfg+ZIuPP1lmk/6MZfpd7GtWrgEzk2IJ38CcB8dCd3puS3+7?= =?us-ascii?Q?28Fzh3wpn/UJ2iuQdPxcRbP9+i/fgPN6Ffl6zs1omGtp85ffs84IJrClsFua?= =?us-ascii?Q?RxXNPAEWEaegjjejh9kQF1jzaFxHeGQEwaOR4Ko02OldNjw/hXGlbq/1Fkxj?= =?us-ascii?Q?SnNXwgk8mkarRHhQ471/KUTwpA/nSzFZUdegGLyg26otEHE?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN1PR12MB0158; 6:GkRBBxWRHM0lEOvN8zutigRDH3ds6IpSxRSX0u+XA7?= =?us-ascii?Q?AnZj9dy1gLyJdD6SM8ivrnjaz8QmhuCIPmtGzCweHJ+JiJtDtNc7TuxruF/H?= =?us-ascii?Q?CroMSVVtAQ6QTNzB/9fJQhh07OMzyTApaWzi2HLDVz3mwn49he2Q/WLRckzy?= =?us-ascii?Q?LWywVTogdZXb3hBdU13vZ/zMFFSg4DlhxX/RihdK2o5J6W+lBSBMgJz/Tjpv?= =?us-ascii?Q?N/9E6SvE9ArZTr6RhDRSVxUhRZ3Ljv2Tx8mLUgn0o3ps+M4RM1BoSsybKl5c?= =?us-ascii?Q?1ocle/kuf1JjC0Zrw9sz0MIKJ6JSTE+LC2pA2eA+HGBTV4JaHbQ399qQEaDT?= =?us-ascii?Q?VfhywdBZ08qV33zwCwImDI5eySiXKxtuNcXevxkDD0Iorj2wAWzK02vPJiUJ?= =?us-ascii?Q?K4XKSnuVfaYN2VRg4wgBhKciItbzyBGsbhVyjDHGBL9Nm9l7aijxGuKRa+dY?= =?us-ascii?Q?9W0EKKV62Zr6D+j3mqKIypsCjAtpg0p/2rVPGi2aehdRFzC1aRbarw7SFDlh?= =?us-ascii?Q?RvTiQLKsqCUCi3W55rLu/9VVeHFCqaSkfd5HnLNX6jM67zb/kB19YqKXlTqI?= =?us-ascii?Q?Gq0vuZ/g/UXccCzYr8HL644ywijji39dZY57ZlpIWT65L8xwG53SBfJ2fySn?= =?us-ascii?Q?MHDCSSKTFJ+/Ib7+YMdpePNtWAXguQyBYKe/2fRBPxrwswz4BVwalueJ8IWp?= =?us-ascii?Q?HRJNSEfVOvOk50gZdqolCq4fMKntLGL3pWQZLwjSaZkSowB1xryiCCfr53nP?= =?us-ascii?Q?ZG/E5hdvr4Xfpec7zy9LOz4jZ044xVi+jiXWxi/JgUELcOe2wSaEgPYRdLdi?= =?us-ascii?Q?hRAzydjI7x3KgSbI/omvFIMF97zNaS0JcLvUwdctfIqls1NTq06cP0yE57pS?= =?us-ascii?Q?Uk34OBIiMcu1dnrnyoVYPqcfk0vno3A7ZQUHtZ5RtA4gRMiVOgWtB1FpZ/mM?= =?us-ascii?Q?/YI/OchfhldiVKQ+/QkV2tdkhzEsxj5xt3yUt7z53nvlcy37br/pXtzNFVEk?= =?us-ascii?Q?/UmESoFrXCsWvNLSK4Z+fq?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 5:hJK50PzHCddX4qMxBrNSqnvrLnBuXUe1Po+or6QjFMuy2812DQ0laXhkJaOtSzQpHGV2zNnNG56W2t+7eihOmDQGdywrXOQ7gOFrkiKHEFQBhVIarQs5xn3vgyBD+C0DudjCvwKCt+aWYAtZGhGBVJ8IIi9MKZNa14L8InhUczgx0z7OFlHYudIY+/wdyCL+nUj9F0bAS2fh4HE64WCbeHlGbxMctiT8zz/qzJyLihP4g5iCcIkz+SCjEHc49mNqQoc+RHw9aM4JRX9oSgBplCpUjvwvhJt2820HDKdWOEpMBbe0IDJ4Ptx+XRaNYHHvMl48aGd05R5Eh2hCUSWmD6/myNUUhOXNCT+5Xo0SXAlo/s4CfUShj1iBz3RK3dZrUiZEGv6emshYGrW+P+W+0hZv16ZQfGIJVuwFw3vrn8dDhS6JxtlRJ31ksWiMYJA2zbPnn5Z8n0zrAtwQSaAKB/ebf5vqVChFrRZTiso87dQ0BHBBAOAY5FrZL/1P2Jqq; 24:olvOoyMclstJ8rSNJn3TtFTQv+k/ydkJK7mZVX+657jm7K83BmAvZqO+ul8FaXTSkgXDKQrZ//cHHUsIIKsRptvYIO6wub3Px8JjtTdZ8No= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 7:Pg22lkceHUun+ZCeSl+CB0Ugog4iF6V/iSzAsk8wJb0u9a7D2V7oKoETG8vfOc/WlSGN4dWEtPy2CaQD5WjHwYRHKmRIbu7bJsvY2aJ1Uv7AWnIdctazLIrkJ5GODhlqj69nS45TQSDhvxyDsVRqoNGNVbiD3CR6SygfAIXRFg9wQTOkHfCiEIfx6HJ9s/EpD3yu216QQIntFYFdw+/tcXAnRY38dU6h09OPzXD3Ea9ysZUMBseZkdJe5MmhiaoFC8WQ1y3H3XwBM2F8PA6KOjaz0wc61PPzxu2321xYcma1A6WktKNx6YBAQ0J6XF4v82ToEoLjGC4sSK0Y01qcBhzQUYYsEBdYTZ4DFNFioqDmM0K4U2G7ahp+AgN//za9KSOXpUp7NS8csPh1MZGf3meeyM1yyLxv2PttAHwI78rJWv/S7ErxW5Oc75MtAMsCUtKNUID0YhPa/q6mmZRm/lQGZRuxTYEWP7Y9SRg8hIhIxMPGv6ueIxI8NMh1l++mcHbmdhmH5V7/GWVpWCZBG5g+YJSL3iu9Y7FQAQagLCXEiPTDd892b28ALUMQBuPsqq5w1wmLHCbWFUZyCPrum1+pi1/MjriWopAKWdN6bFChmQN71+x2lSmbf0XGB8rvNm8OAtOwNi8UA5jrxHqmrhFNAc7lSp5L+6c5147Ubr7G1tvMeCsupx5vpdr1KsjUYHqK/uA5PMx7XtxyV7ApGBXb3CuH7xCVAwyrPXFjHMnNw0yjekPywcCcAzd8YlT7l7abDG0IZ96b7pd/5vz2EIfb/t5jMZB2/y1JczTrL4Q= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0158; 20:D8SOhTrYjxX50o1pDcASgim9fFv/EenbK/wrgzOmr0mCjz1C9ENSMA+ZdeCd60Daenu7ZGQplv836ZHa13BRyhOTuqNJx4crEHWVb+OIxaGPTWX7UIbIvTjJVBhTkrHkqcPZ99egnasUuKuD6Bh9UZRyX/MLGKNLf2YpGbO5EcvuSWEj9BcDcuNI6faKHBY1X7mL5A6eehuqADPvQ4R4ZpcXKbpI0ICHyjzhudXvAszp7EUxDixoAVRxYtesrKCU X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Jul 2017 19:31:27.1279 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0158 Subject: [PATCH v1 4/4] OvmfPkg : QemuFwCfgLib: Map DMA buffer with CommonBuffer when SEV is enable X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 31 Jul 2017 19:29:21 -0000 Content-Type: text/plain Commit 09719a01b11b (OvmfPkg/QemuFwCfgLib: Implement SEV internal function for Dxe phase) uses IOMMU protocol to allocate and free DMA buffer used by QemuFwCfgDxe when SEV is enabled. During the initial commit we made assumption that IOMMU.AllocateBuffer() will provide a buffer with C-bit cleared. But inorder to comply with EFI PCI protocol, recent changes in IoMmuDxe driver does not provide a buffer with C-bit cleared. If the DMA buffer need to be bi-directional (i.e processor and the DMA bus master can access the buffer equally) then buffer must be Map() with BusMasterCommonBuffer operation. The patch refactors the code and add the support to Map() the FW_CFG_DMA_ACCESS buffer using BusMasterCommonBuffer operation. The complete discussion about this and recommendation from Laszlo can be found here [1] [1] https://lists.01.org/pipermail/edk2-devel/2017-July/012652.html Suggested-by: Laszlo Ersek Contributed-under: TianoCore Contribution Agreement 1.0 Cc: Jordan Justen Cc: Laszlo Ersek Signed-off-by: Brijesh Singh --- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibInternal.h | 42 ++-- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c | 247 ++++++++++++++++---- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c | 131 ----------- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c | 101 +++++--- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSec.c | 56 ++--- 5 files changed, 292 insertions(+), 285 deletions(-) diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibInternal.h index 8cfa7913ffae..327f1d37e17d 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibInternal.h +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibInternal.h @@ -45,39 +45,25 @@ InternalQemuFwCfgDmaIsAvailable ( ); /** - Returns a boolean indicating whether SEV support is enabled + Transfer an array of bytes, or skip a number of bytes, using the DMA + interface. - @retval TRUE SEV is enabled - @retval FALSE SEV is disabled -**/ -BOOLEAN -InternalQemuFwCfgSevIsEnabled ( - VOID - ); + @param[in] Size Size in bytes to transfer or skip. -/** - Allocate a bounce buffer for SEV DMA. - - @param[out] Buffer Allocated DMA Buffer pointer - @param[in] NumPage Number of pages. + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, + and may be NULL, if Size is zero, or Control is + FW_CFG_DMA_CTL_SKIP. + @param[in] Control One of the following: + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. **/ VOID -InternalQemuFwCfgSevDmaAllocateBuffer ( - OUT VOID **Buffer, - IN UINT32 NumPages +InternalQemuFwCfgDmaBytes ( + IN UINT32 Size, + IN OUT VOID *Buffer OPTIONAL, + IN UINT32 Control ); -/** - Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer - - @param[in] NumPage Number of pages. - @param[in] Buffer DMA Buffer pointer - -**/ -VOID -InternalQemuFwCfgSevDmaFreeBuffer ( - IN VOID *Buffer, - IN UINT32 NumPages - ); #endif diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c index f8eb03bc3a9a..e03647bae3bd 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxe.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -157,74 +158,228 @@ InternalQemuFwCfgDmaIsAvailable ( } /** - Allocate a bounce buffer for SEV DMA. - - @param[in] NumPage Number of pages. - @param[out] Buffer Allocated DMA Buffer pointer + Function is used for allocating a bi-directional FW_CFG_DMA_ACCESS used + between Host and device to exchange the information. The buffer must be free'd + using FreeFwCfgDmaAccessBuffer (). **/ -VOID -InternalQemuFwCfgSevDmaAllocateBuffer ( - OUT VOID **Buffer, - IN UINT32 NumPages +STATIC +EFI_STATUS +AllocFwCfgDmaAccessBuffer ( + OUT VOID **Access, + OUT VOID **Mapping ) { - EFI_STATUS Status; + UINTN Size; + UINTN NumPages; + EFI_STATUS Status; + VOID *HostAddress; + EFI_PHYSICAL_ADDRESS DmaAddress; - ASSERT (mIoMmuProtocol != NULL); + Size = sizeof (FW_CFG_DMA_ACCESS); + NumPages = EFI_SIZE_TO_PAGES (Size); + // + // As per UEFI spec, in order to map a host address with BusMasterCommomBuffer64, + // the buffer must be allocated using the IOMMU AllocateBuffer() + // Status = mIoMmuProtocol->AllocateBuffer ( - mIoMmuProtocol, - 0, - EfiBootServicesData, - NumPages, - Buffer, - EDKII_IOMMU_ATTRIBUTE_MEMORY_CACHED + mIoMmuProtocol, + AllocateAnyPages, + EfiBootServicesData, + NumPages, + &HostAddress, + EDKII_IOMMU_ATTRIBUTE_MEMORY_CACHED ); + + // + // Map the host buffer with BusMasterCommonBuffer64 + // + Status = mIoMmuProtocol->Map ( + mIoMmuProtocol, + EdkiiIoMmuOperationBusMasterCommonBuffer64, + HostAddress, + &Size, + &DmaAddress, + Mapping + ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, - "%a:%a failed to allocate %u pages\n", gEfiCallerBaseName, __FUNCTION__, - NumPages)); - ASSERT (FALSE); - CpuDeadLoop (); + mIoMmuProtocol->FreeBuffer (mIoMmuProtocol, NumPages, HostAddress); } - DEBUG ((DEBUG_VERBOSE, - "%a:%a buffer 0x%Lx Pages %u\n", gEfiCallerBaseName, __FUNCTION__, - (UINT64)(UINTN)Buffer, NumPages)); + *Access = HostAddress; + return Status; +} + +/** + Function is to used for freeing the Access buffer allocated using + AllocFwCfgDmaAccessBuffer() + +**/ +STATIC +VOID +FreeFwCfgDmaAccessBuffer ( + IN VOID *Access, + IN VOID *Mapping + ) +{ + UINTN NumPages; + + NumPages = EFI_SIZE_TO_PAGES (sizeof (FW_CFG_DMA_ACCESS)); + + mIoMmuProtocol->Unmap (mIoMmuProtocol, Mapping); + + mIoMmuProtocol->FreeBuffer (mIoMmuProtocol, NumPages, Access); +} + +/** + Function is used for mapping host address to device address. The buffer must + be unmapped with UnmapDmaDataBuffer (). + +**/ +STATIC +EFI_STATUS +MapFwCfgDmaDataBuffer ( + IN BOOLEAN IsWrite, + IN VOID *HostAddress, + IN UINT32 Size, + OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, + OUT VOID **Mapping + ) +{ + EFI_STATUS Status; + UINTN NumberOfBytes; + + NumberOfBytes = Size; + Status = mIoMmuProtocol->Map ( + mIoMmuProtocol, + IsWrite ? EdkiiIoMmuOperationBusMasterRead64 : EdkiiIoMmuOperationBusMasterWrite64, + HostAddress, + &NumberOfBytes, + DeviceAddress, + Mapping + ); + return Status; +} + +EFI_STATUS +UnmapFwCfgDmaDataBuffer ( + IN VOID *Mapping + ) +{ + return mIoMmuProtocol->Unmap (mIoMmuProtocol, Mapping); } /** - Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer + Transfer an array of bytes, or skip a number of bytes, using the DMA + interface. - @param[in] NumPage Number of pages. - @param[in] Buffer DMA Buffer pointer + @param[in] Size Size in bytes to transfer or skip. + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, + and may be NULL, if Size is zero, or Control is + FW_CFG_DMA_CTL_SKIP. + + @param[in] Control One of the following: + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. **/ VOID -InternalQemuFwCfgSevDmaFreeBuffer ( - IN VOID *Buffer, - IN UINT32 NumPages +InternalQemuFwCfgDmaBytes ( + IN UINT32 Size, + IN OUT VOID *Buffer OPTIONAL, + IN UINT32 Control ) { - EFI_STATUS Status; + volatile FW_CFG_DMA_ACCESS LocalAccess; + volatile FW_CFG_DMA_ACCESS *Access; + UINT32 AccessHigh, AccessLow; + UINT32 Status; + VOID *AccessMapping, *DataMapping; - ASSERT (mIoMmuProtocol != NULL); + ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ || + Control == FW_CFG_DMA_CTL_SKIP); - Status = mIoMmuProtocol->FreeBuffer ( - mIoMmuProtocol, - NumPages, - Buffer - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, - "%a:%a failed to free buffer 0x%Lx pages %u\n", gEfiCallerBaseName, - __FUNCTION__, (UINT64)(UINTN)Buffer, NumPages)); - ASSERT (FALSE); - CpuDeadLoop (); + if (Size == 0) { + return; } - DEBUG ((DEBUG_VERBOSE, - "%a:%a buffer 0x%Lx Pages %u\n", gEfiCallerBaseName,__FUNCTION__, - (UINT64)(UINTN)Buffer, NumPages)); + // + // When SEV is enabled, map Buffer to DMA address before issuing the DMA request + // + if (MemEncryptSevIsEnabled ()) { + VOID *AccessBuffer; + EFI_PHYSICAL_ADDRESS DataBuffer; + + // + // Allocate DMA Access buffer + // + Status = AllocFwCfgDmaAccessBuffer (&AccessBuffer, &AccessMapping); + ASSERT_EFI_ERROR (Status); + + Access = AccessBuffer; + + // + // Map actual data buffer + // + if (Buffer) { + Status = MapFwCfgDmaDataBuffer (Control == FW_CFG_DMA_CTL_WRITE ? 1 : 0, + Buffer, Size, &DataBuffer, &DataMapping); + ASSERT_EFI_ERROR (Status); + + Buffer = (VOID *) (UINTN) DataBuffer; + } + } else { + Access = &LocalAccess; + AccessMapping = NULL; + DataMapping = NULL; + } + + Access->Control = SwapBytes32 (Control); + Access->Length = SwapBytes32 (Size); + Access->Address = SwapBytes64 ((UINTN)Buffer); + + // + // Delimit the transfer from (a) modifications to Access, (b) in case of a + // write, from writes to Buffer by the caller. + // + MemoryFence (); + + // + // Start the transfer. + // + AccessHigh = (UINT32)RShiftU64 ((UINTN)Access, 32); + AccessLow = (UINT32)(UINTN)Access; + IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh)); + IoWrite32 (FW_CFG_IO_DMA_ADDRESS + 4, SwapBytes32 (AccessLow)); + + // + // Don't look at Access.Control before starting the transfer. + // + MemoryFence (); + + // + // Wait for the transfer to complete. + // + do { + Status = SwapBytes32 (Access->Control); + ASSERT ((Status & FW_CFG_DMA_CTL_ERROR) == 0); + } while (Status != 0); + + // + // After a read, the caller will want to use Buffer. + // + MemoryFence (); + + // + // If Access buffer was dynamically allocated then free it. + // + if (AccessMapping) { + FreeFwCfgDmaAccessBuffer ((VOID *)Access, AccessMapping); + } + + if (DataMapping) { + UnmapFwCfgDmaDataBuffer (DataMapping); + } } diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c index d4e09c434e6a..7f42f38d1c05 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c @@ -45,137 +45,6 @@ QemuFwCfgSelectItem ( IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)(UINTN) QemuFwCfgItem); } - -/** - Transfer an array of bytes, or skip a number of bytes, using the DMA - interface. - - @param[in] Size Size in bytes to transfer or skip. - - @param[in,out] Buffer Buffer to read data into or write data from. Ignored, - and may be NULL, if Size is zero, or Control is - FW_CFG_DMA_CTL_SKIP. - - @param[in] Control One of the following: - FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. - FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. - FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. -**/ -VOID -InternalQemuFwCfgDmaBytes ( - IN UINT32 Size, - IN OUT VOID *Buffer OPTIONAL, - IN UINT32 Control - ) -{ - volatile FW_CFG_DMA_ACCESS LocalAccess; - volatile FW_CFG_DMA_ACCESS *Access; - UINT32 AccessHigh, AccessLow; - UINT32 Status; - UINT32 NumPages; - VOID *DmaBuffer, *BounceBuffer; - - ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ || - Control == FW_CFG_DMA_CTL_SKIP); - - if (Size == 0) { - return; - } - - // - // set NumPages to suppress incorrect compiler/analyzer warnigns - // set NumPages to suppress incorrect compiler/analyzer warnings - // - NumPages = 0; - - // - // When SEV is enabled then allocate DMA bounce buffer - // - if (InternalQemuFwCfgSevIsEnabled ()) { - UINTN TotalSize; - - TotalSize = sizeof (*Access); - // - // Skip operation does not need buffer - // - if (Control != FW_CFG_DMA_CTL_SKIP) { - TotalSize += Size; - } - - // - // Allocate SEV DMA buffer - // - NumPages = (UINT32)EFI_SIZE_TO_PAGES (TotalSize); - InternalQemuFwCfgSevDmaAllocateBuffer (&BounceBuffer, NumPages); - - Access = BounceBuffer; - DmaBuffer = (UINT8*)BounceBuffer + sizeof (*Access); - - // - // Decrypt data from encrypted guest buffer into DMA buffer - // - if (Control == FW_CFG_DMA_CTL_WRITE) { - CopyMem (DmaBuffer, Buffer, Size); - } - } else { - Access = &LocalAccess; - DmaBuffer = Buffer; - BounceBuffer = NULL; - } - - Access->Control = SwapBytes32 (Control); - Access->Length = SwapBytes32 (Size); - Access->Address = SwapBytes64 ((UINTN)DmaBuffer); - - // - // Delimit the transfer from (a) modifications to Access, (b) in case of a - // write, from writes to Buffer by the caller. - // - MemoryFence (); - - // - // Start the transfer. - // - AccessHigh = (UINT32)RShiftU64 ((UINTN)Access, 32); - AccessLow = (UINT32)(UINTN)Access; - IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh)); - IoWrite32 (FW_CFG_IO_DMA_ADDRESS + 4, SwapBytes32 (AccessLow)); - - // - // Don't look at Access.Control before starting the transfer. - // - MemoryFence (); - - // - // Wait for the transfer to complete. - // - do { - Status = SwapBytes32 (Access->Control); - ASSERT ((Status & FW_CFG_DMA_CTL_ERROR) == 0); - } while (Status != 0); - - // - // After a read, the caller will want to use Buffer. - // - MemoryFence (); - - // - // If Bounce buffer was allocated then copy the data into guest buffer and - // free the bounce buffer - // - if (BounceBuffer != NULL) { - // - // Encrypt the data from DMA buffer into guest buffer - // - if (Control == FW_CFG_DMA_CTL_READ) { - CopyMem (Buffer, DmaBuffer, Size); - } - - InternalQemuFwCfgSevDmaFreeBuffer (BounceBuffer, NumPages); - } -} - - /** Reads firmware configuration bytes into a buffer diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c index 40f89c3b53e2..bc649b40aec3 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c @@ -16,6 +16,7 @@ **/ #include +#include #include #include #include @@ -85,7 +86,7 @@ QemuFwCfgInitialize ( // (which need to allocate dynamic memory and allocating a PAGE size'd // buffer can be challenge in PEI phase) // - if (InternalQemuFwCfgSevIsEnabled ()) { + if (MemEncryptSevIsEnabled ()) { DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port interface.\n")); } else { mQemuFwCfgDmaSupported = TRUE; @@ -129,56 +130,80 @@ InternalQemuFwCfgDmaIsAvailable ( } /** + Transfer an array of bytes, or skip a number of bytes, using the DMA + interface. - Returns a boolean indicating whether SEV is enabled + @param[in] Size Size in bytes to transfer or skip. - @retval TRUE SEV is enabled - @retval FALSE SEV is disabled + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, + and may be NULL, if Size is zero, or Control is + FW_CFG_DMA_CTL_SKIP. + + @param[in] Control One of the following: + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. **/ -BOOLEAN -InternalQemuFwCfgSevIsEnabled ( - VOID +VOID +InternalQemuFwCfgDmaBytes ( + IN UINT32 Size, + IN OUT VOID *Buffer OPTIONAL, + IN UINT32 Control ) { - return MemEncryptSevIsEnabled (); -} + volatile FW_CFG_DMA_ACCESS Access; + UINT32 AccessHigh, AccessLow; + UINT32 Status; -/** - Allocate a bounce buffer for SEV DMA. + ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ || + Control == FW_CFG_DMA_CTL_SKIP); - @param[in] NumPage Number of pages. - @param[out] Buffer Allocated DMA Buffer pointer + if (Size == 0) { + return; + } + + if (MemEncryptSevIsEnabled ()) { + // + // SEV does not support DMA operations in PEI stage, we should + // not have reached here. + // + ASSERT (FALSE); + } + + Access.Control = SwapBytes32 (Control); + Access.Length = SwapBytes32 (Size); + Access.Address = SwapBytes64 ((UINTN)Buffer); -**/ -VOID -InternalQemuFwCfgSevDmaAllocateBuffer ( - OUT VOID **Buffer, - IN UINT32 NumPages - ) -{ // - // We should never reach here + // Delimit the transfer from (a) modifications to Access, (b) in case of a + // write, from writes to Buffer by the caller. // - ASSERT (FALSE); - CpuDeadLoop (); -} + MemoryFence (); + + // + // Start the transfer. + // + AccessHigh = (UINT32)RShiftU64 ((UINTN)&Access, 32); + AccessLow = (UINT32)(UINTN)&Access; + IoWrite32 (FW_CFG_IO_DMA_ADDRESS, SwapBytes32 (AccessHigh)); + IoWrite32 (FW_CFG_IO_DMA_ADDRESS + 4, SwapBytes32 (AccessLow)); -/** - Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer + // + // Don't look at Access.Control before starting the transfer. + // + MemoryFence (); - @param[in] NumPage Number of pages. - @param[in] Buffer DMA Buffer pointer + // + // Wait for the transfer to complete. + // + do { + Status = SwapBytes32 (Access.Control); + ASSERT ((Status & FW_CFG_DMA_CTL_ERROR) == 0); + } while (Status != 0); -**/ -VOID -InternalQemuFwCfgSevDmaFreeBuffer ( - IN VOID *Buffer, - IN UINT32 NumPages - ) -{ // - // We should never reach here + // After a read, the caller will want to use Buffer. // - ASSERT (FALSE); - CpuDeadLoop (); + MemoryFence (); } + diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSec.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSec.c index 071b8d9b91d4..62ddb69d3b4d 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSec.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSec.c @@ -97,53 +97,25 @@ InternalQemuFwCfgDmaIsAvailable ( } /** + Transfer an array of bytes, or skip a number of bytes, using the DMA + interface. - Returns a boolean indicating whether SEV is enabled + @param[in] Size Size in bytes to transfer or skip. - @retval TRUE SEV is enabled - @retval FALSE SEV is disabled -**/ -BOOLEAN -InternalQemuFwCfgSevIsEnabled ( - VOID - ) -{ - // - // DMA is not supported in SEC phase hence SEV support is irrelevant - // - return FALSE; -} - -/** - Allocate a bounce buffer for SEV DMA. - - @param[in] NumPage Number of pages. - @param[out] Buffer Allocated DMA Buffer pointer - -**/ -VOID -InternalQemuFwCfgSevDmaAllocateBuffer ( - OUT VOID **Buffer, - IN UINT32 NumPages - ) -{ - // - // We should never reach here - // - ASSERT (FALSE); -} - -/** - Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer - - @param[in] NumPage Number of pages. - @param[in] Buffer DMA Buffer pointer + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, + and may be NULL, if Size is zero, or Control is + FW_CFG_DMA_CTL_SKIP. + @param[in] Control One of the following: + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. **/ VOID -InternalQemuFwCfgSevDmaFreeBuffer ( - IN VOID *Buffer, - IN UINT32 NumPages +InternalQemuFwCfgDmaBytes ( + IN UINT32 Size, + IN OUT VOID *Buffer OPTIONAL, + IN UINT32 Control ) { // -- 2.7.4