From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752097AbdJTCpU (ORCPT ); Thu, 19 Oct 2017 22:45:20 -0400 Received: from mail-bl2nam02on0081.outbound.protection.outlook.com ([104.47.38.81]:36505 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751757AbdJTCex (ORCPT ); Thu, 19 Oct 2017 22:34:53 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: kvm@vger.kernel.org Cc: bp@alien8.de, Brijesh Singh , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Joerg Roedel , Borislav Petkov , Tom Lendacky , x86@kernel.org, linux-kernel@vger.kernel.org Subject: [Part2 PATCH v6 08/38] KVM: Introduce KVM_MEMORY_ENCRYPT_{UN,}REG_REGION ioctl Date: Thu, 19 Oct 2017 21:33:43 -0500 Message-Id: <20171020023413.122280-9-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171020023413.122280-1-brijesh.singh@amd.com> References: <20171020023413.122280-1-brijesh.singh@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: MWHPR1701CA0020.namprd17.prod.outlook.com (10.172.58.30) To SN1PR12MB0157.namprd12.prod.outlook.com (10.162.3.144) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 97cbf661-ba75-4ff3-3d2b-08d51763229a X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(48565401081)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603199);SRVR:SN1PR12MB0157; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;3:74i9iW9B4X3dbQ7KlrbcRkKDQ46q7xIESvK4Amb2QWFxVU80PeMBDaGN7nQ6ZTjHUVsYgXVXaL1jotm8J327dW1Sa/AYnv7EvWUZIBF08oPs7S2lMf9dcsf1qWGhLfIQ9CMW0b6GKHcRT9QpL6rQTGzmKZOcVrR3PntoIfxJbnvZlX/nmyw6M6De11TCuHThZdYa6T9UIK4wQaRBe7f56noSuqEzPUwpoU5S7yA8Br+mY57l7j2P7MI0wE2sz7yb;25:ydLHTodmrZzaetWcmZL55i9cnbSBWAQV1R/gwNhpdJAbQdVmDwnjKoz4gEup0mnq+RJNxZ46z/g8B4uubjihtIdN3HIxMTIs1Oar5wdn0V+wtX6QAfiVrCMAiNPiM6/cxEQdpXO/IqP1aNLmHLNM9DHymRE1tbxSmb1PSUd7Jcq69AnxVhY+0x90IEgAfjYtODCgq5cd07a9bsEO7KsjpbrhBd1dwu6lLSqXUVEEbP44EobcMsBf7b8K8jeGxyQZIN/M93mXNrK35FVW7XkwRl4ASOD8Yb8bkII9jKo8LM984drTlA/jZFprl4mIAjyFqJZSiBVQqqi9voYFk/XabQ==;31:8uA3an81zs+vwFYg1c7NrMpWMI1uby10whJevw+b+EEsjRzPlBlmQcx8WOFW4WhuafSA8pHp9MzaY/0okLuuGV/zeAiX2i5aSUDHwnNxfnUA6NikJSpgTWLEKcZpsaBrB6XIaI8/nvUxXR2dO8/jnvAOQH7R8SWEYyk8MQNLbmYolCfio6trn0Ner8oTVTc2dcSJJKZQyvlek4gzleu/5jYPKTtatebnnsmQAFF1hNc= X-MS-TrafficTypeDiagnostic: SN1PR12MB0157: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;20:XVyf/mzzfl9Szyjf48ZOaOF7jxJYM586ZgbticVhS4mSBtbb0rTIuZW+NiKcqoIDkS3IQI0cDW1xqRHHUBHlnETuXINZRvFaukeK8Ax668GecgOOFA/bgqBKr78ex+99NRgCMioAEEOHUTGWzYtjh+LPfnC++kKq6o76zCiMULLEX8G9EJeucaA5agvwiTXg+9IOtl8K0p8zUZppKXpiACBcxd3n4zmerGOqiDZYel3UKjq6gjSRBwCEVJFMNdmTP/mOxoP9AJLbxVE/0ILr/fbJZI9tsBx0ivxdY8oWQmZ0GcwVO3hjhD6uojPOqPHcqO8i4Tv2BE3znC8lQjg/RiqJF0z4apqV6LQWQeQ7zSQOAce1MzaFxxnD5evA5pa2gkzSrthma8UtnTUyT23zZgffZ1RfHIhB+sTMksSNuupB+rCS3IsN8JebTi4wscM2DB5HKaak8xzKA8ztBjKduufv7Niy/5gVOviXcvY9NfY/w0rY9i/AaLAroBsQmji3;4:SEf02prVTQXEIWD4WbLhKEcqgVSNKREl/yL+iEMUzmTCe0o6GqkMMf3rKUpqa1TREaWkKsEgta0OfZulV0jvcR8Q1eRcGoamMS/qP+W1KKXJzA1Yh0ZY1ZvPdrLVLkChK2L+NByHo2EG+NvB9UqD7je/3ChRb1VR6KBSqC5TGUAd2IQ96VljBDgQRxpWNzMtiax8kuX+JNCO03rSpOGfBNnct922Xm9j810rXRrFOxm7hN8uNH+0vK5a5c+XKk9MHA5zkkYkX9sF6mUOWj0nAxxobtxgqh2uR8ExbLYKY7N8L9oNXHE1ZaMu/zXwAKS1tS5dXMwemnSYcsoSCrWnBQ== X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(3231020)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041248)(20161123555025)(20161123564025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0157;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0157; X-Forefront-PRVS: 0466CA5A45 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(36756003)(7736002)(68736007)(50466002)(1076002)(478600001)(4326008)(16526018)(316002)(53936002)(6486002)(86362001)(305945005)(53416004)(54906003)(50226002)(2351001)(106356001)(101416001)(81166006)(105586002)(8676002)(2361001)(76176999)(2870700001)(2906002)(50986999)(6916009)(23676002)(66066001)(47776003)(6666003)(97736004)(6116002)(2950100002)(189998001)(8936002)(3846002)(33646002)(81156014)(7416002)(5660300001)(25786009);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0157;H:ubuntu-010236106000.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTU3OzIzOkRyUU0xNkNXS09XN3owN24wS3BZTVRrQW9r?= =?utf-8?B?dFM5VEtkbXdDd3hsRmdBTzRLWWk3bnM3WldyL3g3ZXR5V05nVk9VMkJlTTl0?= =?utf-8?B?Q3pLd2xZUmhOclhVQWxlc3hWSVlHSHVXRjVYVDVTMXRyejlTdUcxd3VVZlJI?= =?utf-8?B?ckRESWcrejZUb2YxeTRpcER1TDhBcEhUQzJsV0s4RmxFU29NL2NLd0k1MjVo?= =?utf-8?B?MDduU1FTSTJkU0FRSmlFeXhUL0RzOHhjMk5NWFlvUWtaMlF4OFhOdUVtS0cz?= =?utf-8?B?NmE5UEdVRms1UVR3U25KbisvcUJ3ZFRFMzN0VlcxVUlRR1pzbGJuUjhrSE9P?= =?utf-8?B?WUxoTkU5THJXVVhsZ0N3U2U0dWhaaE1MMUF3U2dZcVRadkJQK25Ka0daYnRa?= =?utf-8?B?eVdyZlh5eTZtU1c1Y2tmMUZVOEFnU3hrbzRodlJnWm9GeEZlVzJlWENQZmh1?= =?utf-8?B?cVVQeW1ydFUvWWxuUzJZVEJUdHNCejZaREhBdjViQ0hjNFh2Y00zbjB1WGph?= =?utf-8?B?MTNOTy9BUUx1bjVsTHE0K2Fnc0ptczhNMGN4clIwMWE0SndwRWpzZTFobGla?= =?utf-8?B?ajdmVXl5TllVSUdOeHNYM2h1aDIwWTNXcGdTMW40TGs5UWxIUWJkZGlnTkJY?= =?utf-8?B?eUwrUHNXa2oydmtrc3FRaitleXFNbTRvTkdCMEZITW5hTXc4cDEveVJzQ2E2?= =?utf-8?B?djBtQmp5WldtTGZLTmI5Z3l3c2FCdnEvbHQreGZ4Z3Z0ZEZ6MFdQc2NLdWF1?= =?utf-8?B?K2ZUTmJHYm0raDJtdG1BMmVRWTFvRXN0SGpQdk5WdmJaTUw4RVFvcnZadjBk?= =?utf-8?B?bEI1aHA4ekNaY3o2NFZxMVVyOHkyYjNtVkJ5RzZMUWFJTmFUeXpZWHZtY0NW?= =?utf-8?B?c2UwT1pSTUt4VnI3OVZxV2c3Tys2SmN1ajZhektQVkdOT3lqWW12YTNwRkZx?= =?utf-8?B?Kzd2azEwZGFrM3kvYlJNYldWWkdpNlBBT040aGtHTUZMTlpYY0NsTVg0THNt?= =?utf-8?B?eXhYeS9YdDg5cU9lWHNjZU0wWEIwK3lDb3Vsc3paNDFZRHdWRzZpeVVjQVFs?= =?utf-8?B?c0ZDWUV3SVhkRUxxbkx4L1RsamlsVzZTa2FPWEE0RDUvSS9oQXZaNG9wVXNW?= =?utf-8?B?Ky93Y0x3YTBqNkIzZjZBeVdBZUtjS1JLOGwzOFIzSmMwdVhRYzFveDdZNVVn?= =?utf-8?B?ekh6YmFsbWlPZDUzU1d5MFF3Z3hUWEZaY3pndy85Mlc2YXVRNGlIWWZ2UWM0?= =?utf-8?B?K2k2c0hMTmpLVzFaNXMxQ00yQ2c5YldkYXFQWTBUMmdXbEJ0YlJBZjNEalpT?= =?utf-8?B?L2Y1bjZWV1VvOWplY0M0T2l6c0pwdWoxY3hIUGdBOE9iOHBJRFh6RThqWnVL?= =?utf-8?B?V2t3ZkZzSHMwU1VoNWtZSUg2RDgxSG1jTkdTZUFWTmJFdHlhdHRPTFRhOUF4?= =?utf-8?B?aWJYUit1ZitpOU5XUWZtay9aMzlFU0xnZ1JSamNaTytJYnZIRXIzKzdFYUxi?= =?utf-8?Q?yokT/wp0wiHjLLYMQCbCb5ldXeeY5Ku3GKCtXGKvJhLgq8?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;6:KrICoN4iTSMp4O9r6jjG5rJ3wPj6bRzTqWfqUzimAGjObZWoWhIGU8xykPcHMTaomNQHGTr9pQU9v4uuhF4Q2DGDtgBY+zXhPhwTHuiX5wVPgYv/rmp3cnqzrwU2/XMOCG1R/WwqS9jz5K+tKnrfL/pHRS3/6SGX8OJthO8tm4v7jJ88ZdmLnpUffy+5e6aWHQzoo/l8z+HCqGb/Iv4wFN3ywIVIlL7Rf6AGB2yDstoQPThEfFYdirJTYVILA9pIXy0/p2ulXHJEyzT9vAS3/3uiN8F1GBzUY7CtafINbfVgryV1vtOBtWnL9tvU6oXa7QBsIbxE6iGcUGU55H63UA==;5:k4QAiutqNpKcFtOcsZ+Pa4ttHLkKWa1JdMj1gkzTyWrECGeNSURa5QhAPj9t03jmWVY7U4moX7aQO5ddvmOdWN8yqV7OM+0ocnjt5AfghwlYl0ZOPMpjqTZRcerIytV/ajXsbw1ZUsvyEsqaUlENrQ==;24:D61aiVdOV3AH1vP0/pEwxK2u1r6I6RBEjUQWxmngzE5bcu4+qa+1hFK3M+sB4nFrEWS6fAjgDtTAhHqeCb3rzWfXZWHkVQl/Qf2zPoG0KI8=;7:HrX7QWEJWEoGmc0IbsafrZ8XFyFINnC6ngtoZjV23cVR8Ilghq6k7yPw73YX/HxIXCt0mksMsHl0rvqQ9JY9TgOlUdqJdrMxFkOEhoOQszDN7zIFLC8RInz6MFxaTtW5pJZPZJ7tw39RpynDHFp6GA1a8fTotYRkLgHbrV6zRZEgvOfrgAaK5tYuV+shDgLftoYw9JOqIiLC9yuZyBfdlVHK8aUUMjD3vOWw+v516Yc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0157;20:HDiuAVRbgH81TTzG2acJoRPXsyUAeFzuNgs5e26Klj/feQ3QEPJU7EOYpXlbG4JTT3/MuQ+eSw3m/O0vnV+/EAaIhka9BsbIWBaVf3PYWj3DDGadd+z3VNioJP4XQB8A47+4DScorr2slvX2yP1iJEHMAYjs3WLwrtyI9od69buS6eINFBybDHKSOIpTheFmhygCzXQhZeGbCXR6LaqhHIBBQRks1V2XgNP0xdBMugB6JkOdcsuuSYWivnO4Xlo2 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2017 02:34:47.5340 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 97cbf661-ba75-4ff3-3d2b-08d51763229a X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0157 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If hardware supports memory encryption then KVM_MEMORY_ENCRYPT_REG_REGION and KVM_MEMORY_ENCRYPT_UNREG_REGION ioctl's can be used by userspace to register/unregister the guest memory regions which may contain the encrypted data (e.g guest RAM, PCI BAR, SMRAM etc). Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Paolo Bonzini Cc: "Radim Krčmář" Cc: Joerg Roedel Cc: Borislav Petkov Cc: Tom Lendacky Cc: x86@kernel.org Cc: kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Brijesh Singh --- Documentation/virtual/kvm/api.txt | 34 ++++++++++++++++++++++++++++++++++ arch/x86/include/asm/kvm_host.h | 2 ++ arch/x86/kvm/x86.c | 24 ++++++++++++++++++++++++ include/uapi/linux/kvm.h | 8 ++++++++ 4 files changed, 68 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index fcafdae1739e..365b6e2c8be5 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3406,6 +3406,40 @@ Currently, this ioctl is used for issuing Secure Encrypted Virtualization (SEV) commands on AMD Processors. The SEV commands are defined in Documentation/virtual/kvm/amd-memory-encryption.txt. +4.110 KVM_MEMORY_ENCRYPT_REG_REGION + +Capability: basic +Architectures: x86 +Type: system +Parameters: struct kvm_enc_region (in) +Returns: 0 on success; -1 on error + +This ioctl can be used to register a guest memory region which may +contain encrypted data (e.g. guest RAM, SMRAM etc). + +It is used in the SEV-enabled guest. When encryption is enabled, a guest +memory region may contain encrypted data. The SEV memory encryption +engine uses a tweak such that two identical plaintext pages, each at +different locations will have differing ciphertexts. So swapping or +moving ciphertext of those pages will not result in plaintext being +swapped. So relocating (or migrating) physical backing pages for the SEV +guest will require some additional steps. + +Note: The current SEV key management spec does not provide commands to +swap or migrate (move) ciphertext pages. Hence, for now we pin the guest +memory region registered with the ioctl. + +4.111 KVM_MEMORY_ENCRYPT_UNREG_REGION + +Capability: basic +Architectures: x86 +Type: system +Parameters: struct kvm_enc_region (in) +Returns: 0 on success; -1 on error + +This ioctl can be used to unregister the guest memory region registered +with KVM_MEMORY_ENCRYPT_REG_REGION ioctl above. + 5. The kvm_run structure ------------------------ diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 48001ca48c14..3af074452b2b 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1063,6 +1063,8 @@ struct kvm_x86_ops { void (*setup_mce)(struct kvm_vcpu *vcpu); int (*mem_enc_op)(struct kvm *kvm, void __user *argp); + int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp); + int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp); }; struct kvm_arch_async_pf { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4c365eb23080..d4e2c61cb6b7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4276,6 +4276,30 @@ long kvm_arch_vm_ioctl(struct file *filp, r = kvm_x86_ops->mem_enc_op(kvm, argp); break; } + case KVM_MEMORY_ENCRYPT_REG_REGION: { + struct kvm_enc_region region; + + r = -EFAULT; + if (copy_from_user(®ion, argp, sizeof(region))) + goto out; + + r = -ENOTTY; + if (kvm_x86_ops->mem_enc_reg_region) + r = kvm_x86_ops->mem_enc_reg_region(kvm, ®ion); + break; + } + case KVM_MEMORY_ENCRYPT_UNREG_REGION: { + struct kvm_enc_region region; + + r = -EFAULT; + if (copy_from_user(®ion, argp, sizeof(region))) + goto out; + + r = -ENOTTY; + if (kvm_x86_ops->mem_enc_unreg_region) + r = kvm_x86_ops->mem_enc_unreg_region(kvm, ®ion); + break; + } default: r = -ENOTTY; } diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 4a39d99c5f99..1f9f26a8e111 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -1359,6 +1359,14 @@ struct kvm_s390_ucas_mapping { /* Memory Encryption Commands */ #define KVM_MEMORY_ENCRYPT_OP _IOWR(KVMIO, 0xba, unsigned long) +struct kvm_enc_region { + __u64 addr; + __u64 size; +}; + +#define KVM_MEMORY_ENCRYPT_REG_REGION _IOR(KVMIO, 0xbb, struct kvm_enc_region) +#define KVM_MEMORY_ENCRYPT_UNREG_REGION _IOR(KVMIO, 0xbc, struct kvm_enc_region) + #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) #define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1) #define KVM_DEV_ASSIGN_MASK_INTX (1 << 2) -- 2.9.5