From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754483AbdGXUL5 (ORCPT ); Mon, 24 Jul 2017 16:11:57 -0400 Received: from mail-by2nam01on0040.outbound.protection.outlook.com ([104.47.34.40]:32685 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753963AbdGXUHk (ORCPT ); Mon, 24 Jul 2017 16:07:40 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: Thomas Gleixner , Borislav Petkov , Joerg Roedel , "Michael S . Tsirkin" , Paolo Bonzini , =?UTF-8?q?=5C=22Radim=20Kr=C4=8Dm=C3=A1=C5=99=5C=22?= , Tom Lendacky , Brijesh Singh Subject: [RFC Part2 PATCH v3 20/26] KVM: SVM: Add support for SEV DEBUG_DECRYPT command Date: Mon, 24 Jul 2017 15:02:57 -0500 Message-Id: <20170724200303.12197-21-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170724200303.12197-1-brijesh.singh@amd.com> References: <20170724200303.12197-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: DM3PR12CA0049.namprd12.prod.outlook.com (10.161.151.17) To BY2PR12MB0145.namprd12.prod.outlook.com (10.162.82.18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f06b72ae-e185-4063-e626-08d4d2cf17c9 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(48565401081)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:BY2PR12MB0145; X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;3:bRGSyJLDAfEESqJzTlUhW9Rhi5e1EWH9QQSgdjkb4oNj8exX4NQWokP/WsrRqS/aCkyh1zKkRHtPBY0YffhrEyb+0K3cACrfS+Zz+Dm1Skbcb66yaG3zJZ4Iii9lYciQxsuBgQvE0hYvJbMSz0GPLqCLf7YrwrYoPe4acjcyRbs/rGu7NgVKv3IwkvPBk0T/kdGRZqAumqz2PUxZHOXungausQrP0Gnk1gMK0tf4CurYeZmVst6RW7xkzLcxbIxS/pmzBo5Ot/zFxGCgGxj9RehWNtl5hIeq61ZRkA+TLvdMGZdxLj4r1U6UG7nK8aOsaGmFC6AzcqxhqWaaxjdj0pI5/O2AlNI5nXGQp9JGUetUraPWbBvz0PgIbDrlR5W7b1GjY1x3N/QyP/DEtGzQ5Qu3/UMSCKvE+zQXAFyuy1dsuRAjWeDUxq14/tmaousPyH/iSJw9SuXWy+hB50GVccmYeynAhQGXXgL14UZYO6yirErwyRd0Ja2No0Z+mIHT+lNDD6ZeWosLZon2YxtfjcT2Zw+EKAJMdcZhXHfaXiJGbrWIX93EPm4nKiPJtu9eXAa3dscOuk809uaj6zWCda0P84XY+1OeHN2sgwJMA7zoVR44Iuw/4Pq7lCXZBFaOE1vqCPPHWSIUFgofmR8fbOGyD7vE4PzqxCyEQ03Q/s7xqKihN1UVwAcdEIetud0Lyz34X5JptyDDpfxxI1FoBZ6NWbqITQWAYtUx9jZAuuYlqu2uh0euEierIHp9ODzeOSF5zx2mWEOMZRVbxV1xtA== X-MS-TrafficTypeDiagnostic: BY2PR12MB0145: X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;25:ua0D6yWuNt4VLkko0sJV7ntQpXo+D2IBGTyqkv8GSYHY+2a3pOGen8RQq+avjNVH4Y5IR0/lrdHUx/CZce3oLSDSq/Xqr6yOA7FRmLiiLG3OCNQD+h6Ja3Ons9DdwJK9FB/a/aBLNxg4O7rxAPZj9RpPKRYDL9ahgboGqhLH+lu6T7jvVyw3SPvemN9pJUb68lt+nBdpaJ/yJQdZr3JF6FxcKQMOryPirwyPaPvDoVPc3PAtt7RrGfR4v/rT6PkCdfLOIbxhMN8OOi4zW0ES+py8Mm1KEgNovZO4+WqhPgkqoZzQpTK3enCFee+lKajzSWUvvcaOgfkFp6hKWFliXlg6e3pHRs2pA/GkU+Z/IslqE2Lmk/WyX3O0CIgmRDu5Fbxrf3flOoVHLSa88ZDl1caCoRU0Kkm3asvUPTjuZlahsb51a4E18AO5td8d04DEHf0myObvdbX322eju4AmGHXGD7Sz8NLSk28FeAlTChS40BxIYdp6vYzkqkWmw+3As7RVcclXS4wOMcSq2EM5PGu+j4+vCBBpHjpz9JBHrE9EKgTx9dMs8pDQF4yxOvyKPkUDzghYN2RpfL8sf87kEihttyO3sdKFWGoyVTG+hpPCb/r9p3YWyws9rQ3Rv5GEhdryu4jn/rKuxyK20eLbvkAW2/ofES5zgaRQgA6U9c+P6aW3drKKNCCHA3u2bxT0qArf1wV8KeI4szL5k5N/Tn6IgNEJ5d2j7uYRNb8xvInFqZ2XddFJ1lhk19p6UQAeoRGJiwfE7ad2KKdoHsu3OTV0rp83xPFcStb7ep465ktfas5ojIRCeaJ4FPP7Mc0sVIPXZzrTfsxLoudmg0gFXWYQ7nXJPBIQes3Mrl/EOLhFjbNY2IkbcY4kIxTS+CxwXmFKTRt798hbXKnxuiOcN/GjHG/DJghiGe1v/qz/Uxw= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;31:tLzK43OYZ+eqgR6IK8e73pGd2CYbnwgKW+xVrPOHP3sBnjQeGHK6AGODYFxlbonQR6RXytSjuTYofUdszBe0DthwmaHYdhtE8BsL0EzFw3jhUIdYBPzub9JknQuMgJFpbrJjru4GvY1az1jRFmhstZYD3zX5M4lPYPM3w4898/rnM1ifyDDPc89QWzjN0DFDyrubtnNhEeAw5+WAflYM1N8SM7sZHnfnxkPY7V4cnAgzFawqOXB28LsO3wb1eVMeFjwcy0uo21vu8MGT2uyw8byXBBPFYswheqmb9Wcff1Y6mDPz/6I8UQwiwTDbXaUJsCn267VjwAf571X0I3LJiega3j8o6uuy4CliU2bRVu6sxy7B9KxZrBkfug6VzYCTejdTVRppht7IuKa22vfg4QvPbMDrsTrpTUppzXl8pdsr/+fkyx1EIfmmGiFFDPZ9oNaD+hVTFWKrni3rMQtKcZhsNpZ/+jmQ/XGv1H5zL3c0YEbfKAoRF7o3d8izBFClfklxnjBkahvbmIy/nRsc950/iNQP/rbTDNnzmBc1W1tJXlFTcqB9so+Hhowz1nnY2+xUGL52QjmCUMqlsqOWnrMUD9Ev7L8/qB+Dq6yzxL6eF9us1WE5g3nhLeXiw3z8q81274QWICO9WX4kr2b09hmXRhuPZF/gMSFxCW+85WI= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;20:QAptzDOjvJFFJK4Vdsiwi23MussP8bUOnmzEmeIDQtkbbi0We04mdPFsf48RMEZpGAU0j/g5wZou3PIzp/4BNk2D8Reyln+Hhek0CpCjGk0AwNxMGfOfR/wovoNQRd/nvnrBWOmx5lMNJCn/U4dt9kPFIZBXSUp/I0rY4rpQ5t3cXtbUCRZrr2WR0VOLTJDXJsOvo6e4MaKGIPsnYCPav9d/I1+l5RYPjGAcJhoN1nfGyBvtEesofyxfFWy2hObu3IhDISKSealLOt/ztERiczSJtZe9XMmuU/CT2k6AjFqO0jDokIM5/YzBGZHpvZR5GJgTbFsivi5+AD2p+NT8Mh643cUg/9fE9KNmgXNjGVk5/Ax7cLCo8gJd8xjvBrrveiUqdZdNH/SePgJmTbbt278zECgwimjXRvVwBEfngOAu4gS9LmV/7mvOX8IOlyLa6RX2BTiBIitqSnt5g3Rc5ZtJ3tlRSRGehsmDTCKfsQy/k6KIsr2EN4Z3pGekSLqE X-Exchange-Antispam-Report-Test: UriScan:(767451399110); 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)(3002001)(93006095)(93001095)(100000703101)(100105400095)(10201501046)(6055026)(6041248)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123564025)(20161123555025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:BY2PR12MB0145;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:BY2PR12MB0145; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR12MB0145;4:WWjD5GDxeuElGrDP5ii56ZrGs+0AiEXhb+ufL0wx8k?= =?us-ascii?Q?pjGArPQHvaHmTK0K08TsCx42zcMTw3n8y4/PoWhmScIZnPv1ROuPdqaxCBgu?= =?us-ascii?Q?Oyszq5yy2WT60g/AZ95gqu/HjPZstGXEY3if7FDNzRjxVzIB8vyPcpZ71TQH?= =?us-ascii?Q?q+7j3VAYZR8nv6xqNx6nBJ8iiJmhjGFuyY66afWOlAhQzVZXZt0pC/4mQRJU?= =?us-ascii?Q?JBVYEWJgXTXirrf0c8FKMAzm+3+okS0wralOm7lGR4TWVs73dw3dM/6Lciae?= =?us-ascii?Q?rVnLvRdRpRftE68RWiQA/9Lhroi9h3u5AdxZyCPv38QXrHQBKoK67lYF3mXS?= =?us-ascii?Q?eQ8dOggkvw9tt9NWA5TKeZNqalQz+2zFDEh68JmNxF2bHJIt36TaNQWPaGD2?= =?us-ascii?Q?kxxnkoJECrvEBZpi6f1lWziQh02ec4qtg3XIoFla5h10hH4Ou2hN+ig6GZbQ?= =?us-ascii?Q?n4BAabLv8lr21+UZ5V44QCN1AOzOfPcZFvUIARAb04nOIZObZ6Iojwp6bzTr?= =?us-ascii?Q?T+fPp2psCUYIqFGKU5P4tC4dk4GWahku7sCFN4E2kdxRQohIQcKoxV5qxGN3?= =?us-ascii?Q?ZVcFywTBHmoh3r99RrOa5HzyRUNey4mTfrbzjZQf35GSqWFDaYhUVPkhhDPB?= =?us-ascii?Q?/kAfvjzxg87RXbHyAtq69wiJA0sORUkQhd7vCPodhXlC/lc5L4zUFYtrPXuF?= =?us-ascii?Q?GlLTpvtzUT1qQ8pW8kQ6s+8sXGxgikEm3yxBkicUlkEt/bFpMYaQOxV4A3YL?= =?us-ascii?Q?wAZDQKaJsazoxUvhaPDZQpgj102Vs1Zo04obPzBgA40CQcjk2MW8o1i4aBCJ?= =?us-ascii?Q?Jf9EiZ8vdSAgLlEI3iG7nOFpWmz4IJWVqT600FAIfp93LF6LsmvYDU45KKMw?= =?us-ascii?Q?zmAX6Sf1iSpAQn62qvM5hTE+DmXP9xwqe/imSyIAF5sWmvOQX04VFbAijVKE?= =?us-ascii?Q?GrdfVi58KbkQy1N6CC9/Y6FuEBvM7Ian2s31FoFFzG4aX4Ws9bRc6lrd3Ft5?= =?us-ascii?Q?gXw+zaWHipfltfrJgoWBB8UJX8i8s0v9SLHMi300ruCO9mUxWstVt+wxXXUG?= =?us-ascii?Q?P16erg6v3IAvid0xuwFCsUjNZfnxQSPg0kSuQWDxmq264dursDNiIj9VhXZp?= =?us-ascii?Q?YMvfczPj7td9NshDZUuQc1acHZaPeP05En8pi4cRrnUKY2NAWarFestaImng?= =?us-ascii?Q?2GA1mDIq0QPX366n64FW+pMtDTVBF9tuIz?= X-Forefront-PRVS: 0378F1E47A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(7370300001)(6009001)(39450400003)(39410400002)(39400400002)(39850400002)(39860400002)(39840400002)(189002)(199003)(7350300001)(68736007)(53416004)(105586002)(54906002)(97736004)(50466002)(6486002)(48376002)(2906002)(106356001)(33646002)(6116002)(1076002)(53936002)(3846002)(189998001)(101416001)(6666003)(2950100002)(478600001)(50986999)(76176999)(81156014)(50226002)(38730400002)(47776003)(5003940100001)(86362001)(25786009)(4326008)(36756003)(42186005)(8676002)(81166006)(110136004)(5660300001)(66066001)(7736002)(305945005);DIR:OUT;SFP:1101;SCL:1;SRVR:BY2PR12MB0145;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR12MB0145;23:KfKAkzlFgoKpuUrb1m3Qqxfvbm3/18Grm1SdlPJZn?= =?us-ascii?Q?8A6XKIIu9OYX2fXeGXATyufEMcqdY1LkNP6l39S/wdPrOiRql5OgJ+2WTdgz?= =?us-ascii?Q?Ou+NkRbJFP0+PPC5lZA6RzjL0BFVGepm6kYybph5yntaiUdg0T8Wuq+0nEA+?= =?us-ascii?Q?rFb92uUaEV30ksdpqdz8MeFqBMCa3n7MGfZtqcgKdcJY5qpyuNaG1DFLdW1Y?= =?us-ascii?Q?Hdz6srWLw3eSBYEzE9yw9QLBa/kLPUwPlvRI0NHE55LqmSvmEyXl2gVKZjmv?= =?us-ascii?Q?e293CUgDa8L06kAh78l8MZM68WzH6RHvS8UF4QZwBapJBP45p03Aa2Qos6MQ?= =?us-ascii?Q?kM4SM8pEyOOz9eyCeDnuwhuKZvMoBakkqZAJbUYNJPiPyR8eVp6vJAyBXMzQ?= =?us-ascii?Q?+lwwe0x25PQI5fgC3PKTHWQ2lJmQd31CHLtoSDvyLh8+4B3hhDP5WfIiQozi?= =?us-ascii?Q?0m9nueqQK7+RhMHFQZ58HY/SuU4XyBQVV6GOUiVDK1AvKx50noUrgGaL3JrT?= =?us-ascii?Q?fiEJHcMY4HmrQ2rFxIIu+3cc6VbI8DNGb+Y7kbWlgdf7Ayvl2IWTgqnqFWoa?= =?us-ascii?Q?KreH1DPoq7SCf/Pyd2Fl6itWvJVssNYkl2I5RWWbAMr1/jZFn93yvQloOO6X?= =?us-ascii?Q?th42XQr7z5HfPyBopgqPBPWlTMVI6c72wsWMq9JPwAID3c0SauUtUTaFsvpQ?= =?us-ascii?Q?qPzM2Nj7bGXRZmwlv8NZeAjSnrpmtvLLadBKX+ZMYRUdt80Us6kjVAUEdojn?= =?us-ascii?Q?zYsw1XZiTpxYeGX3Yzq9N3cd4dQ6Vuhg8LBcP9UKqZXyZMZh6OFzJJWjH2av?= =?us-ascii?Q?NuE7aYA5F5klN/LWAZ+dHIdrmUg1aKP5mw4IGtuMoM3GZZOxsB4I7hhomGJT?= =?us-ascii?Q?2vOysDApwCWIt0tYzULN0Tfv7Jm4o7FH8Ps8H7bVa6DEJk5Riq9ZSoDlzU8b?= =?us-ascii?Q?4js5rl/uBQbJLWBIOmjwSU0DxJtFg34d8AGgSr7fh13kbnTwtQijtUw3I6hB?= =?us-ascii?Q?lIM7N6F2yEakU/oj2pX1O7dGPld7P8/aQZWBP4GstkEr86eDyTSdMDHNMWdk?= =?us-ascii?Q?l2vf+YktDYb68/CcJHCcHjTVX1hitepqOG0xRyardBE2yFRu/eB3NjSpRQ6N?= =?us-ascii?Q?KKkg2ToJb3mi9LipbW+4xsoVBGVP7gxjrrdQ/Ac6SlNnEyjp+dAoFeacXNvG?= =?us-ascii?Q?Yqn1ON7eZYy8wCD2DF6258UrMv6pMnk1sHo0q6glPtuSSo/ANRzEazqIotwE?= =?us-ascii?Q?KIeyigiHmKc2qGGOCBl8M+9BoFd/bLRu0NMGudU?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR12MB0145;6:b3o0I8RNEOosoDXQpFrzhnSHLwyOblBYQZFwVrXnjL?= =?us-ascii?Q?Ps1TdeBmcYa4bHjJBQn2UkU5VAqmeE83qOgr7ZUAXn7yW8x+pzWSC9lbToXT?= =?us-ascii?Q?aT/yDWgZ/6+RtsN60p4MwVyWG4e79NjLKmLDwkngm485xBLFMMu91XgkEebl?= =?us-ascii?Q?Q22HdgewHr+G0vCGePVMTrETBX2g08yBCwSE2wGUaKDTb9bLtFWi4oIjW0FA?= =?us-ascii?Q?VsytUG0r1uQHIXOYWaM/RSyhBO4jzv37JLfeajq8clK3t6LXuG2EkXGN3UQQ?= =?us-ascii?Q?cK0WCB3poQ3Z46fHidUyC2LGUn9YHX6J9TLzwjkdDWvvfYof20jEK8KG9Wlk?= =?us-ascii?Q?+UGT8Kf5BzmoNvNiSo2C++Yc/6fy47OAcgL9Y/pUBebEfZ7g2osPHtCG8P6d?= =?us-ascii?Q?/1vu4Vhddh8YxhcxCw40B428Ray/DsPRZk2yn/xy9d32fbOpXgbjYnQZauQX?= =?us-ascii?Q?TX0P2X6ZrkTYPQiLO7VECV2wE2qKrHY3MOFO43zyE0a2zN5mENKVLkq1SMQx?= =?us-ascii?Q?QDFmWnhC4rC3REtxXkRDQyTf2dq7O/iO9WGdzFFY5xjTWaLUoPPe81JIlGX+?= =?us-ascii?Q?om//eClEBfpuMjMmwSRb9QsR+1LrFj+5jmhvWL2aU2OJsfEm+8dTAM+Cly3a?= =?us-ascii?Q?l4Aeq3j+9t3MgXKcyrUB9UXDWvQWtCKK7MzfVeqjFGje/FWuUurrkdwtf9OQ?= =?us-ascii?Q?EEfJxaVj7aYSojtTes3hZrWSN9uhrcozx2pNbrlUOn9vsXGaxT+HSn0irXN/?= =?us-ascii?Q?M52q7F6TtddM20+U/mq8w102F0voFPtFsRaNnUctY2RXJFIi5JShm5JM1lfr?= =?us-ascii?Q?LYomjZwv5G3iYsvZQI7ZRFieHUtPRyesAPbKBWCDc69yajVgADWXDtW3lcxy?= =?us-ascii?Q?SsxTkSxZm7xSApDA2dJsEebMsInjUg1sHCHJsGslWjBjbqTQdWpEqKzwTyt9?= =?us-ascii?Q?SJdxXaLZERfdGdRqoUSI7KCP1dx6JTUmJvGMXsTdEnsckHVD/mMHgFRm7jNE?= =?us-ascii?Q?7sS7T04h1fuHglnJ4QXKsT?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;5:ypypU3yAX21iqPv2ljLWTOKnJYJSH+y4Ii13T3OylQ5JOranVrA0e4/QU+ETqGzs+oLCkjptOgHprPdfmV+tRVEyZLLj/fEWexEz1Fd6fgzqakmF6T3wMxv0HmZ2Wzhzb9kNtyExeRpSZRtis1sznxF1YzIQursd8PXz2NcsKmk/YNUkCwXuz6q3C74C3UCwRlnkFZRIr3UsWc+CZDsXbCtv9QzCld8vfS7rtYyIbzr2o907R2zDXOh0ehJ/GXZHM3KC/N4Yq42uhVHGKpHFR2LdwxZ7yk8njyR8C3Bw+8y5FjOzJR5ifvO99pApB1CEnIa9BWc184OgpJhAA3e89rd9FltwEKDCF2/Bgn2Gli+/dkOfYOnK6IYjVFlQLYhy6DlMqXAmJyvYnLP+aomSMTeBA4BmxSGuj7UupJYe+D94qzyA3z8ZX4aLNIMBHrz3OhaTy453imHIZwxsiaDIe94PMqOONU7h22rIkKjgGi4iLQNwIN+/lolUB9JVnNub;24:aafRDYXfP3S9ODTNhZpvbqKdYFtjGjxzHlgN/vFl+YdIrQemMBxBaEHddqUMZE8UoxH3nPjvHZvMpclYTRpIbwWinsJS7oh/SwuFwCkpgpI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;7:NVfiA0iVoPPpjKVYeUBk8AFP20iudb3P1ZA5G4sZE10EPtSsFkZDgvNjmkdRwQXSYOeTY0joNZVbkJRLCLQHtALQgeb5MlIMcRLKCmRP3/xyUj/lFcuB1xj1bAdxpCdK0EMRjeiPxBZvjjrv1pdKKGuuZ2QKecxU6VsCnmfuQxkAFpeX9CrlB91Ph4a+7ql/YpRujejSCfkKly+Ze002MPd1pZVN//epW5GMX1Av6sNs5vVSMhsffkucq2j3JsF2VZYhKezh+fUZGssTkdbRDXib7cYfvz2oWlmGAlScuH4RnmOZZ7umimtITc6hWhDHlyfwlUsF/pDNKgR/HiGtMhzHPPRg6qz0Lrjb/vBa5JWXJfpfIkK56d86LjNincTKuv77GIXyGBNURpvPGhvdrSegFrha3EHcceB4dg0GcOO3A7O4ByS9L0Vt/PV3/R5vSdIZV3RX20wvo6FlNw+uf8N5Ii5722rl99sUagKyFOsc63b6k6XWzWeR4vAAJKykp1e4kbMw4tlRFWOgddaZfYT+6QWMOWIePWeh0dv/L9smXCr8jI/WsOjrq4OZAJoqPFDzSdzMtMMRo8I/UW9J0Id6DIvvlaj53zgpepehhJHf8yczE1ZZuPHAt1OOHZpytX1d62KLpjrI2oYm/FcUcUgFx8JSprIuYqk05dUAomjiYyH6eW9Knx+mfUX7+TX2VDuHsH+SOIz/VzoyY+Sihly3w8BNj7713dkIBRJHV2TD9XAEQv4iSW/bZIg24RA5InuRmLw81BmEsIvGZ2javU6hBeCf3vDdfp4Xb4kgju8= X-Microsoft-Exchange-Diagnostics: 1;BY2PR12MB0145;20:UrzQScqvuqtCb5118tf3k+IHThBaoFgdHhyrbQBIw4u3GjfBjohQQAsvJUikeA1yl4BJeO3ohwalMOLxcDLSEtDrCZfmbjDD7iFUrU7nOmYEdrlXZkfuP3zFYx/EWLWJNDmSiUh3AsO5+UJnz00U5WlKjYPUtRDInYrLO0UMc2vVzUNzHotczv+eoKJIOvtcWs8C8ukH/V7lx7smQrXLKIfuJuJ2lv2Z/yKG+dGpNcC07nxUK1UY/nJ2BlaY1IZJ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jul 2017 20:03:45.5722 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR12MB0145 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The command is used for decrypting a guest memory region for debug purposes. Signed-off-by: Brijesh Singh --- arch/x86/kvm/svm.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 21f85e1..933384a 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -6058,6 +6058,162 @@ static int sev_guest_status(struct kvm *kvm, struct kvm_sev_cmd *argp) return ret; } +static int __sev_dbg_enc_dec(struct kvm *kvm, unsigned long src, + unsigned long dst, int size, int *error, bool enc) +{ + struct sev_data_dbg *data; + int ret; + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->handle = sev_get_handle(kvm); + data->dst_addr = dst; + data->src_addr = src; + data->length = size; + + ret = sev_issue_cmd(kvm, + enc ? SEV_CMD_DBG_ENCRYPT : SEV_CMD_DBG_DECRYPT, + data, error); + kfree(data); + return ret; +} + +/* + * Decrypt source memory into userspace or kernel buffer. If destination buffer + * or len is not aligned to 16-byte boundary then it uses intermediate buffer. + */ +static int __sev_dbg_dec(struct kvm *kvm, unsigned long paddr, + unsigned long __user dst_uaddr, + unsigned long dst_kaddr, unsigned long dst_paddr, + int size, int *error) +{ + int ret, offset, len = size; + struct page *tpage = NULL; + + /* + * Debug command works with 16-byte aligned inputs, check if all inputs + * (src, dst and len) are 16-byte aligned. If one of the input is not + * aligned then we decrypt more than requested into a temporary buffer + * and copy the porition of data into destination buffer. + */ + if (!IS_ALIGNED(paddr, 16) || !IS_ALIGNED(dst_paddr, 16) || + !IS_ALIGNED(size, 16)) { + tpage = (void *)alloc_page(GFP_KERNEL); + if (!tpage) + return -ENOMEM; + + dst_paddr = __sme_page_pa(tpage); + + /* + * if source buffer is not aligned then offset will be used + * when copying the data from the temporary buffer into + * destination buffer. + */ + offset = paddr & 15; + + /* its safe to read more than requested size. */ + len = round_up(size + offset, 16); + + paddr = round_down(paddr, 16); + } + + ret = __sev_dbg_enc_dec(kvm, paddr, dst_paddr, len, error, false); + /* + * If temporary buffer is used then copy the data from temporary buffer + * into destination buffer. + */ + if (tpage) { + + /* + * If destination buffer is a userspace buffer then use + * copy_to_user otherwise memcpy. + */ + if (dst_uaddr) { + if (copy_to_user((uint8_t *)dst_uaddr, + page_address(tpage) + offset, size)) + ret = -EFAULT; + } else { + memcpy((void *)dst_kaddr, + page_address(tpage) + offset, size); + } + + __free_page(tpage); + } + + return ret; +} + +static int sev_dbg_decrypt(struct kvm *kvm, struct kvm_sev_cmd *argp) +{ + unsigned long vaddr, vaddr_end, next_vaddr; + unsigned long dst_vaddr, dst_vaddr_end; + struct page **srcpage, **dstpage; + struct kvm_sev_dbg debug; + unsigned long n; + int ret, size; + + if (!sev_guest(kvm)) + return -ENOTTY; + + if (copy_from_user(&debug, (void *)argp->data, + sizeof(struct kvm_sev_dbg))) + return -EFAULT; + + vaddr = debug.src_addr; + size = debug.length; + vaddr_end = vaddr + size; + dst_vaddr = debug.dst_addr; + dst_vaddr_end = dst_vaddr + size; + + for (; vaddr < vaddr_end; vaddr = next_vaddr) { + int len, s_off, d_off; + + /* lock userspace source and destination page */ + srcpage = sev_pin_memory(vaddr & PAGE_MASK, PAGE_SIZE, &n, 0); + if (!srcpage) + return -EFAULT; + + dstpage = sev_pin_memory(dst_vaddr & PAGE_MASK, PAGE_SIZE, + &n, 1); + if (!dstpage) { + sev_unpin_memory(srcpage, n); + return -EFAULT; + } + + /* flush the caches to ensure that DRAM has recent contents */ + sev_clflush_pages(srcpage, 1); + sev_clflush_pages(dstpage, 1); + + /* + * since user buffer may not be page aligned, calculate the + * offset within the page. + */ + s_off = vaddr & ~PAGE_MASK; + d_off = dst_vaddr & ~PAGE_MASK; + len = min_t(size_t, (PAGE_SIZE - s_off), size); + + ret = __sev_dbg_dec(kvm, + __sme_page_pa(srcpage[0]) + s_off, + dst_vaddr, 0, + __sme_page_pa(dstpage[0]) + d_off, + len, &argp->error); + + sev_unpin_memory(srcpage, 1); + sev_unpin_memory(dstpage, 1); + + if (ret) + goto err; + + next_vaddr = vaddr + len; + dst_vaddr = dst_vaddr + len; + size -= len; + } +err: + return ret; +} + static int svm_memory_encryption_op(struct kvm *kvm, void __user *argp) { struct kvm_sev_cmd sev_cmd; @@ -6093,6 +6249,10 @@ static int svm_memory_encryption_op(struct kvm *kvm, void __user *argp) r = sev_guest_status(kvm, &sev_cmd); break; } + case KVM_SEV_DBG_DECRYPT: { + r = sev_dbg_decrypt(kvm, &sev_cmd); + break; + } default: break; } -- 2.9.4