From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A4991D5CD1 for ; Tue, 17 Feb 2026 19:20:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771356028; cv=none; b=DK7IdhD2fv2hNmb591WlmGXW0NsjEz1DzJmFg+/sXgLKAkruDQii9cOtBwHAoMnmQCxDKu9TFpZd5UyxWswvWp++mfZVIA/qJjYVvG/aBdEcrMnteBIfPOXcMcw/+og8bRidWshB1EZeJ5qFT0l8MNyp6Jy9SB9mEql5kcndp0Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771356028; c=relaxed/simple; bh=Vv3QMpSIcWnjWa0xaJUaOqm9MHPLlXF/eFco6dBpQTQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gxQDMW2LH8HgRG9H/zKOR1y/UX8JCnbtOnsWkrmtuDBoPG3OplbdHyqAn4EjemBdyo3ZCLtDEBQkKMckkjuDvLCfmtAu9g7O56IV7D3rNEiRkkd0N3NikIWZPivEijMNsDNKucQn0GvwGl+2S0ZQOgbAp0syn+dKUisFKlEMIhA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Agsp8DWo; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Agsp8DWo" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-3545dbb7f14so4594248a91.0 for ; Tue, 17 Feb 2026 11:20:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1771356026; x=1771960826; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=1eH/mwAkqLmfyEh1EvqsNY2VkqyRMUhzopmOJ1U3e7Q=; b=Agsp8DWoYDyAr+ruQM2isfkX6IjXJwrQd9z+vquO5xYRioNzxAX7LdDqXfjYQ9vvN3 S3QZ6x9P9FiEsT0cGDoWjqAKARb9SN7D4OolZfEJTDKTcjl2ZFw1gvG3hknrAcKMKUlN 1Vf5XrhFZn4UyhNuqyNjxqE+KNIxYrJoEsbjTFENtSRs3/nxcZpGhLzjg8xXSh06zsgG bHIyG8xFxP3GkfzOFnnP+mEwPVWP34FcQsQboBdLec4d2fGaVpgW8D7JMqIm1Y5clPHy vPX3ubZBBxOm3OXxaQfFCWMxIwoVgJyLyfet5pQGod3BPHOMFvs3DiRkXH+3BQbzYTCv PySA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771356026; x=1771960826; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=1eH/mwAkqLmfyEh1EvqsNY2VkqyRMUhzopmOJ1U3e7Q=; b=fJacD10ynjNjtlaCx6riUIsAoV5884xgKGooPUabIt40ZFsQRM/jHQvayrIXbhdswC S80TfR/oq9eyhzWa8285IdoKmWj6rbnomTwGTUFhglqTUp87eZrw1BDQvVTDtDit61Ay YINu4SlfaMaCMYT7kqwo5UA/ErlxWCy7+xA6/YUk17DLJ4CctvHSKnsfw3++Q8w981Qa eNtErTr2SZ+PYwLeaPsv/slc4ge9/2bXwIkcIumDQv55PDZQivyP0rv+WoKbjIH3WYcX HVacaCJ8niqts+hXqavvXe/JCBkReW6bAG8PtJwQOGs7eOSCzgIiWoeAiHGsOmxiAD2C OiwA== X-Forwarded-Encrypted: i=1; AJvYcCXmMbrzM/oeV9ELQN+rHSR43AvgeG9GZFm1X9NGWMlmQOu21xcmJMjmlpOio9CBEECJoVxRtlh6W4DPk7A=@vger.kernel.org X-Gm-Message-State: AOJu0YytDiKaaGtGa1VSDpn1riB2GJfkmvW5cVcyl2q1KPXwzxVh/cDY 117mt1moySZYXJrytpWjFfqUGuCyFFbIzSkp5K7NDIDVhldzni7YFnC6gFdwQBFnL5jaPy55N3n HWU/y8A== X-Received: from pjbmd6.prod.google.com ([2002:a17:90b:23c6:b0:352:f162:7d9f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4c8a:b0:34a:9d9a:3f67 with SMTP id 98e67ed59e1d1-356aad7eacemr12756476a91.33.1771356025579; Tue, 17 Feb 2026 11:20:25 -0800 (PST) Date: Tue, 17 Feb 2026 19:20:24 +0000 In-Reply-To: <20260217191635.swit2awsmwrj57th@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260206222829.3758171-1-sagis@google.com> <20260206222829.3758171-2-sagis@google.com> <20260217180511.rvgsx7y45xfmrxvz@amd.com> <037084a1-2019-4bd2-b1ed-7f34f9128e37@amd.com> <20260217191635.swit2awsmwrj57th@amd.com> Message-ID: Subject: Re: [PATCH v3 1/2] KVM: TDX: Allow userspace to return errors to guest for MAPGPA From: Sean Christopherson To: Michael Roth Cc: Tom Lendacky , Sagi Shahar , Paolo Bonzini , Dave Hansen , Kiryl Shutsemau , Rick Edgecombe , Thomas Gleixner , Borislav Petkov , "H. Peter Anvin" , x86@kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, Vishal Annapurve Content-Type: text/plain; charset="us-ascii" On Tue, Feb 17, 2026, Michael Roth wrote: > On Tue, Feb 17, 2026 at 12:45:52PM -0600, Tom Lendacky wrote: > > On 2/17/26 12:05, Michael Roth wrote: > > >> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c > > >> index 2d7a4d52ccfb..056a44b9d78b 100644 > > >> --- a/arch/x86/kvm/vmx/tdx.c > > >> +++ b/arch/x86/kvm/vmx/tdx.c > > >> @@ -1186,10 +1186,21 @@ static void __tdx_map_gpa(struct vcpu_tdx *tdx); > > >> > > >> static int tdx_complete_vmcall_map_gpa(struct kvm_vcpu *vcpu) > > >> { > > >> + u64 hypercall_ret = READ_ONCE(vcpu->run->hypercall.ret); > > >> struct vcpu_tdx *tdx = to_tdx(vcpu); > > >> > > >> - if (vcpu->run->hypercall.ret) { > > >> - tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_INVALID_OPERAND); > > >> + if (hypercall_ret) { > > >> + if (hypercall_ret == EAGAIN) { > > >> + tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_RETRY); > > >> + } else if (vcpu->run->hypercall.ret == EINVAL) { > > >> + tdvmcall_set_return_code( > > >> + vcpu, TDVMCALL_STATUS_INVALID_OPERAND); > > >> + } else { > > >> + WARN_ON_ONCE( > > >> + kvm_is_valid_map_gpa_range_ret(hypercall_ret)); > > >> + return -EINVAL; > > >> + } > > >> + > > >> tdx->vp_enter_args.r11 = tdx->map_gpa_next; > > >> return 1; > > >> } > > > > > > Maybe slightly more readable? > > > > > > switch (hypercall_ret) { > > > case EAGAIN: > > > tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_RETRY); > > > /* fallthrough */ > > > > I think you want a break here, not a fallthrough, so that you don't set > > the return code twice with the last one not being correct for EAGAIN. > > Doh, thanks for the catch. I guess a break for the EINVAL case as well would > be more consistent then. > > switch (hypercall_ret) { > case EAGAIN: > tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_RETRY); > break; > case EINVAL: > tdvmcall_set_return_code(vcpu, TDVMCALL_STATUS_INVALID_OPERAND); > break; > case 0: > break; > case default: > WARN_ON_ONCE(kvm_is_valid_map_gpa_range_ret(hypercall_ret)); > return -EINVAL; > } > > tdx->vp_enter_args.r11 = tdx->map_gpa_next; > return 1; Heh, except then KVM will fail to handle the next chunk on success. I like the idea of a switch statement, so what if we add that and dedup the error handling? static int tdx_complete_vmcall_map_gpa(struct kvm_vcpu *vcpu) { u64 hypercall_ret = READ_ONCE(vcpu->run->hypercall.ret); struct vcpu_tdx *tdx = to_tdx(vcpu); long rc; switch (hypercall_ret) { case 0: break; case EAGAIN: rc = TDVMCALL_STATUS_RETRY; goto propagate_error; case EINVAL: rc = TDVMCALL_STATUS_INVALID_OPERAND; goto propagate_error; default: WARN_ON_ONCE(kvm_is_valid_map_gpa_range_ret(hypercall_ret)); return -EINVAL; } tdx->map_gpa_next += TDX_MAP_GPA_MAX_LEN; if (tdx->map_gpa_next >= tdx->map_gpa_end) return 1; /* * Stop processing the remaining part if there is a pending interrupt, * which could be qualified to deliver. Skip checking pending RVI for * TDVMCALL_MAP_GPA, see comments in tdx_protected_apic_has_interrupt(). */ if (kvm_vcpu_has_events(vcpu)) { rc = TDVMCALL_STATUS_RETRY; goto propagate_error; } __tdx_map_gpa(tdx); return 0; propagate_error: tdvmcall_set_return_code(vcpu, rc); tdx->vp_enter_args.r11 = tdx->map_gpa_next; return 1; }