From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932661AbdKFSMX (ORCPT ); Mon, 6 Nov 2017 13:12:23 -0500 Received: from mail-dm3nam03on0078.outbound.protection.outlook.com ([104.47.41.78]:9872 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932421AbdKFSMP (ORCPT ); Mon, 6 Nov 2017 13:12:15 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: kvm@vger.kernel.org, linux-kernel@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 Subject: [Part2 PATCH v8 08/38] KVM: Introduce KVM_MEMORY_ENCRYPT_{UN,}REG_REGION ioctl Date: Mon, 6 Nov 2017 12:11:00 -0600 Message-Id: <20171106181130.68491-9-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171106181130.68491-1-brijesh.singh@amd.com> References: <20171106181130.68491-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: BN6PR10CA0031.namprd10.prod.outlook.com (10.175.102.145) To SN1PR12MB0159.namprd12.prod.outlook.com (10.162.3.146) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0552d4a1-0f82-459f-b6e4-08d52541e37f X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603199);SRVR:SN1PR12MB0159; X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;3:WC/GekkHQFk/1fQTA2p709v2CwHxzPnjdBPFIudP630EoNK8/mWSg55ycn7sz8bKDkfuqiUp3I2/p15kYT7i5fVc5EvxIAsAnyRtUEML9iapT+j2vnVD97nPIbwsQqBX6DVE4Tzz5Qs6c0kA+6LoCgBp8GK85E1dr0BbgQOQ56vyvGDkUd8cSZ2vObT+cowM8xu9PyVo4li0QOST10W9eSHOUJ5LqV/OFHjOsfP3ReomQCkhqGPpyxnRPjJoMT5o;25:Z+uU8ry/SBvKGjdD+IhaBo9pp3adeIw4LbJJL+XurpViN52sz4RA37GORyvY3uhElviagrGRTo2Y49H4D6iCK57i8fH9RyGZAoWOohpEOK2FvrQ3DsiCxDq0gX0Wk4W6c6Lo83HFdySQAgQ9ISL6DkEaoMVUkCw9oegAlie2iEbPdG97BVplmDB8zNbAhTaGd8WjU8/yefay7UP25tMNCC1l3yPgxLmUBllCZYnD3OcFq/iE1wPs0R4DUpm+IR6adSY6MKwOhJj1MHHICLMAFEiDpiJWA0NSJU64awBiMjDWuayxJiVUw3ROQYkaUdR6iOtZnAIFsDbJ3XWLAij82w==;31:dCJwopFohEJuIOyuxlPE33a1vCvrOnu+xmkdv7Pm673tS8sLKlkHGCS8KZ4IIIlaDqF1PxPs5xKHml3MVS08nAHbqgy/iPTvcWAo2s1ZEKDYz7tAfCJcFZhfhbYgD+V4dWR6Ow+9lEuBACRdmaFfw2UXcDlRirxfinLQR/LNC4K1Af/VXPZb6UZywxozGR+hW8RgXZim41oohxQkQ7Ry/YQfJCsH1HsP7xOXgYVPIC0= X-MS-TrafficTypeDiagnostic: SN1PR12MB0159: X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;20:LKFLer5p3ERoZ1xltVf94zsSTVPaFDi8q8qNAkkm0zmko0l2tAUcZgnF03zL4wEhnybNeU4ojMieg27sMFXij+RkyBiqg6xLWuklm+FuICrwEjVhHgkEUoXDS46zWtPkjD/r4MLODGQF5Y1KIU9z4sb3k8XKW/j7hKlxFJqGWI6pbZpHdJX5r/FpQed6E80EGbdUyvuSBIGTNha/0ERsksKO1QHPnG6K9HqW+1iKHrhv9/0FzTK3Wf/68kvaVnG9jRKd01InFZTucEBaVxrfwaVf/zQ+OJ0h6r1+6W4k/mlrGR9Qb7r/KVtNSPIQsRXWU62UivmxGz80K8jbbClMgKgH8I8bF+sMz/Xhu4XaMwcMF4WKO+DHf+8LgeJbtBfZSJHbovjQcSoSqaof2mAOJ4jD3HmTD2D9nNPCyeT2xuVJrqjykyGCeNT/PlETmpSqBkCBWV18nOzodp5CWuvRPmgDHgV4yw6pn5rd3Ysjo1e47TtQsbFRZ2h8lcXF2m2N;4:LQdM3XVxtUap0UkeAGs/6MbJZw9Bfh59YHcIr1rgALHLwor3TBts6Ei65wksDjtGWRTt/HK8sP8wAS1Neg8zou8HcljlYJOfn3gjSIBsPBmXMKlQoVEmsfCwqptE6bmpZncAldzA6xRjDGhLOCGbb1gKOMuY4Ona3kKPBAA3ifbnQp336k6iinvTwgMjW7mreDZ4yixwbFk90s/Aplel/EmKagfHmFgyzztkGcyTeEoPqkVFVj4QzrUT8ed2I+/gLXPlRO8g2fwSitHbGHytvpbSgiNtSmeKmb7Z0BFd7EB5feHoY/oo87tzmnVHWKmh9yMo07cxZA5fRCsjHwbDKg== 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)(3231021)(100000703101)(100105400095)(3002001)(93006095)(93001095)(10201501046)(6055026)(6041248)(20161123564025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:SN1PR12MB0159;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:SN1PR12MB0159; X-Forefront-PRVS: 048396AFA0 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(39860400002)(189002)(199003)(68736007)(97736004)(4326008)(316002)(16526018)(54906003)(7736002)(8936002)(2906002)(81166006)(81156014)(25786009)(53936002)(8676002)(2870700001)(1076002)(6116002)(575784001)(23676003)(50226002)(189998001)(305945005)(86362001)(3846002)(50466002)(33646002)(66066001)(36756003)(53416004)(47776003)(5660300001)(7416002)(76176999)(478600001)(6486002)(105586002)(50986999)(2950100002)(101416001)(106356001)(6666003);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1PR12MB0159;H:wsp141597wss.amd.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTU5OzIzOkhlR0hkZkw4WTlkZ1Y1NG16VzhYOVRvYzF0?= =?utf-8?B?U1NjL1RJZG9TSGlSd2o0NlpZSDRFWnFGWDg4VGFqaFZKSlBCbngzVEh5UHJl?= =?utf-8?B?WHUyQ2VRbmR5VVArNXpuMFhNd0lMcVZHbWQwR1dxZEREanhwRUd4SlNTLzZt?= =?utf-8?B?RVY1MGdHWWluNjlnUXU4SmlKVVpRUGRtdUF4bnR4eXFoOXByNjZQTlp1cHRD?= =?utf-8?B?TFJNVEx4cndSdkdjWk9zUHJKVk1FUno2RWNvOEFrUGlkMVh0YkFldU8rTm91?= =?utf-8?B?Q2doQ3c4bktoMWFKck1IWkdGTDN5Q0NkOUg2UU1rVUNPaHRCQkNNcWRDL2Rz?= =?utf-8?B?Rk1lR2srTExuVTFKbU92bi9aaGpGTS9pYURGdkhObjJlU01lL0Vza1o5MGRt?= =?utf-8?B?TGdpK0RKNTNlaEdNalNRbHRJMEU5c05JV3JrYVBaTlBVUzY5YVlkM0VWbUMy?= =?utf-8?B?T25EUE5xTzRCQys3cksxNTg4bWdKUVRSYTNDV1JBdmN4RmdaRU5NS1FZYW9I?= =?utf-8?B?b3BxYVNMMzlnc2lHUmdPRnJwcE9sM0hLbmZJREFLMi9hbHRFaytEQmxmelFI?= =?utf-8?B?TVJoRG1sRzMra3N3dkRaT0RvNSs0cjJmbU1ETUwyQ2RyNGRqZGJzUExRU2Zl?= =?utf-8?B?WS9qN2t1cERRYlhncDhCM1JHUVJJR01weVFqNFl4OGkyVzlIMEpkYTRVcXk4?= =?utf-8?B?TmRIeVVGU0h2cUthcEFPNWkwcDIvWDVUbWlYWmJROHpWMUl6a0hNSEpFMzk1?= =?utf-8?B?MVpTbEFwVzlFdDNvVUdaWmNhQ241WjJBdGNWUFMyNnZ2ZjlNQk5VWGF0MkxG?= =?utf-8?B?UVhHdldQeFR5UHpJWmdoejR3MzRMQUJyNEVPZjdyR0JCT3NsVy91NlY3OFQ4?= =?utf-8?B?bmJnUEovcFBnNzdZNEFkZ1VvbFZMQlYzY0I2SUczYkhBZ0FlaTRCa3IwOUlv?= =?utf-8?B?L05hd2VsR0tENWlad0c5aXpqK0Y0VWdVT1h2eTVmMUxLYnNTaGNaV0FObFpE?= =?utf-8?B?b2JzOTBpc1lQVjBrdWIxOVBrbDVIWmplWGNwcHhtZENjVmVoYkhiOThFNzJB?= =?utf-8?B?UkZFY1ZHdjdkNG4vQm8rWDIyVXlETTFuemUzaGIwZ0l4emdrMldpM1YweDhN?= =?utf-8?B?b2UwaWw2SmV0WUUrNWRIZFVEYVZoWGFJTGhQM3g4SVp1YXVlVEhTbUh5SC9u?= =?utf-8?B?RU1JeWJZeTFid1FTbUl0S0VMYWNsMWt3TFBXQXJYM3JHd0txVWdWUkMrcXR2?= =?utf-8?B?ZE50dlpURnJhcVF0SkMzUE1hMmhQUmFuZkQ1MkVvV0pkVWlvVVBwMzBmMTNX?= =?utf-8?B?RzVHek5td0RSL3NTaWFiWXlIZEwrdkl5QW5sQkd4Mnlzb2V1K2FBUUJLaEJE?= =?utf-8?B?NllaQ2lBa2YyZVQyT3ZSMTEzYkxoU29JdGhBdmUrMXlDaFA1MVBUSkNSNWRS?= =?utf-8?B?Tjl4QjZGcDc2RFE4MU5TcmdmbndKNU9NMTB0Q09wYWV6ZkJwZms4MzBlMThv?= =?utf-8?Q?3/EW+dvQ6UhuUN6gQptPQ4j9M=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;6:gCQTdwTiIS6tc3d2gSuMjNN3wDR6AQKuAnCpgBeY4VeZaUYVuNRodPV3bFPdFq1hakm9ovhViAcPp2iS2j8XnVh09ZD78l5Ry1lgc+qj3fNB7pajA6GYK4wKFqT2Mgw4Z03fYynqERI1bH8PCGnkw2YC7frj6NuWyonOVw+FTQ5eXw6haa8UfPIOE8H/2XCf1UA2+bJAXQCIsq4qbfCcf34FLCXyi4hCGuO2nBxLpTGofjoCig1uQ2txkX1cek70d4mgSiA58efxPyh7QrmFhSU8GPFxMp1haXPIz9kPGxOBvmjol8Pvisb6RXpyxRvStaMW2aY0PM9z4Sr1awvPOAVR1jL+ayUkEZSx4LCtbTA=;5:TcVRuLM7jRt+l13GyxM34NUj9whRnu6EwcYRNe9tfKH++Z0ds/WGdOk2GOH2R6LRqrqMdISskaud9FczckfxDQO+HoKN8sGrqagfVeN99IH8iTgpmDk5PCIgJDPr3PYnCFto2onS6YujUnboZYatNsEobQ+ja8U4RyU5hUGZFrE=;24:/BPdvJl7XNEJJwcePfME8/o6QjbWjwY/cRFqG4sMmWc7zXRkBX+GttrdhHxYSFWKtXQlg0wJXfRppVK8IpWmGHRLy3nkdlt93Wfyltb9pZU=;7:UstqG0MYNC6w3oeCLZbn23EJg3KAH1RrnrcIqen6t9BsA3RZPZE+5D4sFyTFP6XcDLTU1zcwdI328S+cW8M9QBBGeWf3xgy2ti5gfo5AdFAkGaxOf/7GCFvl3Amg30KXSXEb4hjCycQw4JaSrUOhO2pQCBm+bOYmfDADPwmpwvzssK1c1kcdRtTkByrJSVK0oeJwCP5kLS1D5XO5ufiXweUCxHancqrJKDNpiIkB73EUowSgze+zeQe5UxGl8unI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN1PR12MB0159;20:6Nhw8tnLI08RhYeV0LIh3/+MwZACX2dxaNS5tLQNqgBNxcqv18xfofA8rrJpAzOo3UQ/lgeDOJqCbjmiA6YC/3kKYKbOUaAtYmD+tL3vFbfpxzMJJNB7ZrXej3q/CjeDm5wk6NkmaCs2j9bGDFl8suhJxgr36wOTlap3ytdQQBR89b+HsAv9bvOLboXZiGusTXR6n80S7Ps0ABWojBPoQxN+LF8UyOziznlHfjdB+7b5jVE1CYVvEQE5FozqiSwy X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Nov 2017 18:12:05.2224 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0552d4a1-0f82-459f-b6e4-08d52541e37f X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0159 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 Improvements-by: Borislav Petkov Signed-off-by: Brijesh Singh Reviewed-by: Borislav Petkov --- 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 e3e29892167e..2f13260fcc7c 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3410,6 +3410,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 f7f68c1e6162..1be6f17499de 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1068,6 +1068,8 @@ struct kvm_x86_ops { int (*enable_smi_window)(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 7bbed0c0ba79..926f55cecf2e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4287,6 +4287,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