Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp8198227rwl; Tue, 10 Jan 2023 10:10:54 -0800 (PST) X-Google-Smtp-Source: AMrXdXuRkZTLyM/VZCdUMIQmFCy94CBhDT2UjL/shz1GdiLVU2nnCcGu0srcuvvRqJgYxbsp2D0g X-Received: by 2002:a05:6a21:6da5:b0:b0:4c16:10a6 with SMTP id wl37-20020a056a216da500b000b04c1610a6mr109565067pzb.0.1673374254244; Tue, 10 Jan 2023 10:10:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673374254; cv=none; d=google.com; s=arc-20160816; b=pKT9zf/10heSY01IVU01fe5ggOp7qQjcBeHr5u4GE5elclnQszwSgxRKT9z2Nkx8V4 v+dBmPBya6qFPjUJy1NWLibujVsJ96IzYpaFy81UbbE4QFuUZAdV18IKLIQ7K4yLJhrO UcBZolDBx+5ObZyDQ8M0g3x3hgXzW+AEF1rFZOSepuUPtIbJ1H0aVzQ2cnWK9Q3wy6AS rd1dxYwZrKvuij/rcA5LcMAxCSn+7Ss0udzMnRgE8N37XBB5lqEkY4jnhFZLnrFPVDZt leto66Ruj+gmzo5/pYT7n8oVwg+g0z8O34+07flGbUXn4IG+94lm0bEVegWFyceS9OS0 ICjw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=/dYhmS2NZxWY/VFZHy6ajrVuqyokrP3tFv8//sZMydY=; b=fmnhm2ma9ln9n7Jwk4BGHe1mo5ilnPq4RgAIq9EpAOrQqEW3kxOsN36rBHA9VRrnXV d8lt8G6vIfCjia3ug1spIkIR9m90WV0YwMu6ppMG88/Wj0EcfiHGQv1ws3elnb2QLXRm oakksoqCmVokR7sPmD0cWzRP1dCcJ1seiN8FeBjP5OeSES15WCPo5mo0R/hIptq0tNmC w4jCy1s6/5K9IfblNzVTrjpZQDHN2suxo7MFh7qYkhXY2WPoARY4ybvMZnPPBaa4cctz NHRQ+aau1va3FHQSKZnQRpjuAhJAKi+6T508E0ogWcCsuRUKvLI7pJxwjg4wpaR9FIHq znhw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@alien8.de header.s=dkim header.b=ks1+TdpG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=alien8.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n18-20020a63ee52000000b004a4eae7c943si12129525pgk.535.2023.01.10.10.10.46; Tue, 10 Jan 2023 10:10:54 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@alien8.de header.s=dkim header.b=ks1+TdpG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=alien8.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235255AbjAJSDq (ORCPT + 55 others); Tue, 10 Jan 2023 13:03:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42852 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235395AbjAJSDP (ORCPT ); Tue, 10 Jan 2023 13:03:15 -0500 Received: from mail.skyhub.de (mail.skyhub.de [5.9.137.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2AC38327; Tue, 10 Jan 2023 10:00:48 -0800 (PST) Received: from zn.tnic (p5de8e9fe.dip0.t-ipconnect.de [93.232.233.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.skyhub.de (SuperMail on ZX Spectrum 128k) with ESMTPSA id 65ABB1EC0528; Tue, 10 Jan 2023 19:00:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alien8.de; s=dkim; t=1673373647; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references; bh=/dYhmS2NZxWY/VFZHy6ajrVuqyokrP3tFv8//sZMydY=; b=ks1+TdpGuJ2W4YpBrD56LtdKuPidjM6q5+mPo9BQJSn73a0oXd0+luPdORVeqezXA8KtTv 9XReJmQFsz2UtX17EBZDvYJsT3tKTc7PXd/W75P0CGz8VjQh6VbIWF0pApMZlXnq4BUAKf UyNTl2EybWpgMbXpBl3MG0KyGptw9i0= Date: Tue, 10 Jan 2023 19:00:42 +0100 From: Borislav Petkov To: Alexey Kardashevskiy , Tom Lendacky Cc: kvm@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Venu Busireddy , Tony Luck , Thomas Gleixner , Sean Christopherson , Sandipan Das , Peter Zijlstra , Pawan Gupta , Paolo Bonzini , Michael Roth , Mario Limonciello , Jan Kara , Ingo Molnar , Huang Rui , Dave Hansen , Daniel Sneddon , Brijesh Singh , Arnaldo Carvalho de Melo , Andrew Cooper , Alexander Shishkin , Adrian Hunter , "Jason A. Donenfeld" , "H. Peter Anvin" Subject: Re: [PATCH kernel v2 2/3] KVM: SEV: Enable data breakpoints in SEV-ES Message-ID: References: <20221209043804.942352-1-aik@amd.com> <20221209043804.942352-3-aik@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20221209043804.942352-3-aik@amd.com> X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Dec 09, 2022 at 03:38:03PM +1100, Alexey Kardashevskiy wrote: > AMD Milan (Fam 19h) introduces support for the swapping, as type 'B', "type B" means nothing to people who don't have an intimate APM knowledge. Let's try again, this time with a more accessible formulation: "The debug registers are handled a bit differently when doing a world switch of a SEV-ES guest: the guest debug registers values are saved and restored as usual and as one would expect. The *host* debug registers are not saved to the host save area so if the host is doing any debug activity, that host should take care to stash its debug registers values into the host save area before running guests. See Table B-3. Swap Types and the AMD APM volume 2." And now you can go into detail explaining which regs exactly and so on. > of DR[0-3] and DR[0-3]_ADDR_MASK registers. Software enables this by > setting SEV_FEATURES[5] (called "DebugSwap") in the VMSA which makes > data breakpoints work in SEV-ES VMs. > > For type 'B' swaps the hardware saves/restores the VM state on > VMEXIT/VMRUN in VMSA, and restores the host state on VMEXIT. Yeah, close but I'd prefer a more detailed explanation and a reference to the APM so that people can follow and read more info if needed. > > Enable DebugSwap in VMSA but only if CPUID Fn80000021_EAX[0] > ("NoNestedDataBp", "Processor ignores nested data breakpoints") is > supported by the SOC as otherwise a malicious guest can cause > the infinite #DB loop DoS. > > Save DR[0-3] / DR[0-3]_ADDR_MASK in the host save area before VMRUN > as type 'B' swap does not do this part. > > Eliminate DR7 and #DB intercepts as: > - they are not needed when DebugSwap is supported; > - #VC for these intercepts is most likely not supported anyway and > kills the VM. > Keep DR7 intercepted unless DebugSwap enabled to prevent > the infinite #DB loop DoS. > > Signed-off-by: Alexey Kardashevskiy > --- > Changes: > v2: > * debug_swap moved from vcpu to module_param > * rewrote commit log > > --- > > "DR7 access must remain intercepted for an SEV-ES guest" - I could not > figure out the exact reasoning why it is there in the first place, > IIUC this is to prevent loop of #DBs in the VM. Let's ask Mr. Lendacky: 8d4846b9b150 ("KVM: SVM: Prevent debugging under SEV-ES") > diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c > index efaaef2b7ae1..800ea2a778cc 100644 > --- a/arch/x86/kvm/svm/sev.c > +++ b/arch/x86/kvm/svm/sev.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > > #include "mmu.h" > #include "x86.h" > @@ -52,11 +53,21 @@ module_param_named(sev, sev_enabled, bool, 0444); > /* enable/disable SEV-ES support */ > static bool sev_es_enabled = true; > module_param_named(sev_es, sev_es_enabled, bool, 0444); > + > +/* enable/disable SEV-ES DebugSwap support */ > +static bool sev_es_debug_swap_enabled = true; > +module_param_named(debug_swap, sev_es_debug_swap_enabled, bool, 0644); > #else > #define sev_enabled false > #define sev_es_enabled false > +#define sev_es_debug_swap false > #endif /* CONFIG_KVM_AMD_SEV */ > > +bool sev_es_is_debug_swap_enabled(void) > +{ > + return sev_es_debug_swap_enabled; > +} > + > static u8 sev_enc_bit; > static DECLARE_RWSEM(sev_deactivate_lock); > static DEFINE_MUTEX(sev_bitmap_lock); > @@ -604,6 +615,9 @@ static int sev_es_sync_vmsa(struct vcpu_svm *svm) > save->xss = svm->vcpu.arch.ia32_xss; > save->dr6 = svm->vcpu.arch.dr6; > > + if (sev_es_is_debug_swap_enabled()) > + save->sev_features |= SVM_SEV_FEAT_DEBUG_SWAP; > + > pr_debug("Virtual Machine Save Area (VMSA):\n"); > print_hex_dump_debug("", DUMP_PREFIX_NONE, 16, 1, save, sizeof(*save), false); > > @@ -2249,6 +2263,9 @@ void __init sev_hardware_setup(void) > out: > sev_enabled = sev_supported; > sev_es_enabled = sev_es_supported; > + if (sev_es_debug_swap_enabled) > + sev_es_debug_swap_enabled = sev_es_enabled && > + boot_cpu_has(X86_FEATURE_NO_NESTED_DATA_BP); check_for_deprecated_apis: WARNING: arch/x86/kvm/svm/sev.c:2268: Do not use boot_cpu_has() - use cpu_feature_enabled() instead. -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette