Received: by 2002:a05:6a10:c604:0:0:0:0 with SMTP id y4csp382402pxt; Wed, 4 Aug 2021 13:48:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyC+KjBDZTN7UWAqjzdj8HLT4B8AlLL3858cA0Euqv/R8Zu75TF8gb/L1jSWC1VhLmS/oYY X-Received: by 2002:a92:db44:: with SMTP id w4mr1106778ilq.101.1628110085057; Wed, 04 Aug 2021 13:48:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628110085; cv=none; d=google.com; s=arc-20160816; b=EV0/l4lRmVwkk2jEH3IvE4eFjmEisSoyQxvKfSqxYaXPqTBFXa4zC66Q216Hh5jz2g 5djHIqLK8GAcI6aSndn3r5s4eYiXQTGg19DkaA8djb9SiM1a/TYVS1l/QmmX1UFZ4o/G vqd8VuEmpa13eI+Wro+cNyCpl7/KDsM/bMsjEywNPMK+tocPDKrg7WRFe91fCSMlmoU8 2txy3/Sext7Z4CugEs4qvfjMGaqV2v1/wezjLK6yRVwAklIIRAPk/mgOn4lSSXpXHKxP IbLx2nEz49sVRQH0qqODXPk9pLIg2rgKEncWSHvZf44O/MIxfPhSUojIUEgBw3oiTtj5 j24w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=q8o6MiQFJodxxkAQj0JBlHHNF6T3Scf4jaSXYG6Ohxo=; b=z/giggikiulRR/RQ0rNHVG4uCDg9GWc98TMD2DNL0SxKPfe0mwtrSV7q5Cem5OsqM3 4qdzdMf3uwcX2xYqgC66vhSUNUzOUxaO31LXdVQk8QFz3+xv6PT4bdBg24c+R7r3Xvhg BNuMBXgFBaSNqfzSwVktSNsNpCM1wrcw4aaWXRd1bTEW5pU3Hkc0jr4jPHkIj0ZnvRty bAkNX4KkUl6aiHaSAmfsqC+J+AygOiJ59U9v8pv+mwZaxjIm+8ebg2ywkWyXkHKQTLue +JhFx2rbpF1pGtEu5W2sR/sLbkVfUgEAhmHwsZqEdn07+m4AmkYE/M1TRYqB+y36wmzD si4A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l41si3597315jac.52.2021.08.04.13.47.52; Wed, 04 Aug 2021 13:48:05 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240201AbhHDSPZ (ORCPT + 99 others); Wed, 4 Aug 2021 14:15:25 -0400 Received: from mga02.intel.com ([134.134.136.20]:49819 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240171AbhHDSPK (ORCPT ); Wed, 4 Aug 2021 14:15:10 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10066"; a="201151119" X-IronPort-AV: E=Sophos;i="5.84,295,1620716400"; d="scan'208";a="201151119" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2021 11:14:53 -0700 X-IronPort-AV: E=Sophos;i="5.84,295,1620716400"; d="scan'208";a="503075890" Received: from mjkendri-mobl.amr.corp.intel.com (HELO skuppusw-desk1.amr.corp.intel.com) ([10.254.17.117]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2021 11:14:52 -0700 From: Kuppuswamy Sathyanarayanan To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Peter Zijlstra , Andy Lutomirski Cc: Peter H Anvin , Dave Hansen , Tony Luck , Dan Williams , Andi Kleen , Kirill Shutemov , Sean Christopherson , Kuppuswamy Sathyanarayanan , x86@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 12/12] x86/tdx: Handle CPUID via #VE Date: Wed, 4 Aug 2021 11:13:29 -0700 Message-Id: <20210804181329.2899708-13-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210804181329.2899708-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20210804181329.2899708-1-sathyanarayanan.kuppuswamy@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Kirill A. Shutemov" TDX has three classes of CPUID leaves: some CPUID leaves are always handled by the CPU, others are handled by the TDX module, and some others are handled by the VMM. Since the VMM cannot directly intercept the instruction these are reflected with a #VE exception to the guest, which then converts it into a hypercall to the VMM, or handled directly. The TDX module EAS has a full list of CPUID leaves which are handled natively or by the TDX module in 16.2. Only unknown CPUIDs are handled by the #VE method. In practice this typically only applies to the hypervisor specific CPUIDs unknown to the native CPU. Therefore there is no risk of causing this in early CPUID code which runs before the #VE handler is set up because it will never access those exotic CPUID leaves. Signed-off-by: Kirill A. Shutemov Reviewed-by: Andi Kleen Reviewed-by: Tony Luck Signed-off-by: Kuppuswamy Sathyanarayanan --- Changes since v4: * None Changes since v3: * None arch/x86/kernel/tdx.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/arch/x86/kernel/tdx.c b/arch/x86/kernel/tdx.c index d16c7f8759ea..5d2fd6c8b01c 100644 --- a/arch/x86/kernel/tdx.c +++ b/arch/x86/kernel/tdx.c @@ -153,6 +153,21 @@ static int tdg_write_msr_safe(unsigned int msr, unsigned int low, return ret ? -EIO : 0; } +static void tdg_handle_cpuid(struct pt_regs *regs) +{ + u64 ret; + struct tdx_hypercall_output out = {0}; + + ret = _tdx_hypercall(EXIT_REASON_CPUID, regs->ax, regs->cx, 0, 0, &out); + + WARN_ON(ret); + + regs->ax = out.r12; + regs->bx = out.r13; + regs->cx = out.r14; + regs->dx = out.r15; +} + unsigned long tdg_get_ve_info(struct ve_info *ve) { u64 ret; @@ -196,6 +211,9 @@ int tdg_handle_virtualization_exception(struct pt_regs *regs, case EXIT_REASON_MSR_WRITE: ret = tdg_write_msr_safe(regs->cx, regs->ax, regs->dx); break; + case EXIT_REASON_CPUID: + tdg_handle_cpuid(regs); + break; default: pr_warn("Unexpected #VE: %lld\n", ve->exit_reason); return -EFAULT; -- 2.25.1