Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1198692pxb; Wed, 10 Feb 2021 02:35:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJyqwyAa6Hizw9rYqir5g47OLBlx/ePnj5saj+wEp1z62JCp6z95CQQddqlSlZuCIK9XQ+DP X-Received: by 2002:a05:6402:1152:: with SMTP id g18mr2587505edw.18.1612953303026; Wed, 10 Feb 2021 02:35:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612953303; cv=none; d=google.com; s=arc-20160816; b=f6bxfE7tg4kWkDoT4MJ96iGw7RvUeWEbfUCeof1mr8kWNITZEn1g82pmCRS1cqP6Q6 hEpjnB04KQS9ZzcHJpdao5FcFfoymdjbpXpU1j4PcETi5XF/q6xIAgTLxANZnHrYi2g5 qXHyIvMIhEPWgJJIjPepoD0UqgRPN9WXm9B5IQqR48+hHPwlJe7kGdx7zbtHOG9FC1kR v+an5Jiwrt8DhnGD4G7y8TjUOF+R8E1m+GXDz+6XXZQHSP5wSVlaP+UtAbe9HTSxfcBU mzflcJHaK0R8ywm3MZ9rWgBzJvIgV53Yu0PNji9MDB7OHYCXdTlBW6SgS2rOo0Bq67qy 5KTw== 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=3lEe5SwHwGHqGtpZyT06oizbKqs4IHHng9lPgVSF9oY=; b=W6oPgz1QPmmIvJJyhhe9a6rUqsHPUIJukCi729g8ro/oFou5eIyqhB9Xt27RrXBnGf i76Q2w26MryRMt4k4MfTAFjaxTynMy0ZGo9BTpChItxIMXLZyFI96M/A7mgJjGs7CRcL +QJNw1DFxLy8zT7PtSOS7lglqE4/s2E+3Kj0v/Ez3RC/bWdFPpmRwyIaLcjXG3k6W+ya Vt/Z/EM4rObL/lPK0+2QHqboafTnluY42r9tbOb/wllm2dnhfeBKh6MMgi1GtD/Dt6cJ gO56ed7sfJcZxEiHhiMa59K5MML9iKhulogR3IGEnpmGR8z1t532G7TGnO6D4F2/JYoi 5/Ig== 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=8bytes.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o6si1004957ejg.674.2021.02.10.02.34.40; Wed, 10 Feb 2021 02:35:03 -0800 (PST) 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=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230420AbhBJKcw (ORCPT + 99 others); Wed, 10 Feb 2021 05:32:52 -0500 Received: from 8bytes.org ([81.169.241.247]:55184 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230306AbhBJKWk (ORCPT ); Wed, 10 Feb 2021 05:22:40 -0500 Received: from cap.home.8bytes.org (p549adcf6.dip0.t-ipconnect.de [84.154.220.246]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by theia.8bytes.org (Postfix) with ESMTPSA id 1FBD846E; Wed, 10 Feb 2021 11:21:57 +0100 (CET) From: Joerg Roedel To: x86@kernel.org Cc: Joerg Roedel , Joerg Roedel , hpa@zytor.com, Andy Lutomirski , Dave Hansen , Peter Zijlstra , Jiri Slaby , Dan Williams , Tom Lendacky , Juergen Gross , Kees Cook , David Rientjes , Cfir Cohen , Erdem Aktas , Masami Hiramatsu , Mike Stunes , Sean Christopherson , Martin Radev , Arvind Sankar , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: [PATCH 4/7] x86/boot/compressed/64: Add 32-bit boot #VC handler Date: Wed, 10 Feb 2021 11:21:32 +0100 Message-Id: <20210210102135.30667-5-joro@8bytes.org> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20210210102135.30667-1-joro@8bytes.org> References: <20210210102135.30667-1-joro@8bytes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel Add a #VC exception handler which is used when the kernel still executes in protected mode. This boot-path already uses CPUID, which will cause #VC exceptions in an SEV-ES guest. Signed-off-by: Joerg Roedel --- arch/x86/boot/compressed/head_64.S | 6 ++ arch/x86/boot/compressed/mem_encrypt.S | 77 +++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 8deeec78cdb4..eadaa0a082b8 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -34,6 +34,7 @@ #include #include #include +#include #include "pgtable.h" /* @@ -856,6 +857,11 @@ SYM_FUNC_START(startup32_set_idt_entry) SYM_FUNC_END(startup32_set_idt_entry) SYM_FUNC_START(startup32_load_idt) + /* #VC handler */ + leal rva(startup32_vc_handler)(%ebp), %eax + movl $X86_TRAP_VC, %edx + call startup32_set_idt_entry + /* Load IDT */ leal rva(boot32_idt)(%ebp), %eax movl %eax, rva(boot32_idt_desc+2)(%ebp) diff --git a/arch/x86/boot/compressed/mem_encrypt.S b/arch/x86/boot/compressed/mem_encrypt.S index aa561795efd1..350ecb56c7e4 100644 --- a/arch/x86/boot/compressed/mem_encrypt.S +++ b/arch/x86/boot/compressed/mem_encrypt.S @@ -67,10 +67,85 @@ SYM_FUNC_START(get_sev_encryption_bit) ret SYM_FUNC_END(get_sev_encryption_bit) +/* + * Emit code to request an CPUID register from the Hypervisor using + * the MSR-based protocol. + * + * fn: The register containing the CPUID function + * reg: Register requested + * 1 = EAX + * 2 = EBX + * 3 = ECX + * 4 = EDX + * + * Result is in EDX. Jumps to .Lfail on error + */ +.macro SEV_ES_REQ_CPUID fn:req reg:req + /* Request CPUID[%ebx].EAX */ + movl $\reg, %eax + shll $30, %eax + orl $0x00000004, %eax + movl \fn, %edx + movl $MSR_AMD64_SEV_ES_GHCB, %ecx + wrmsr + rep; vmmcall + rdmsr + /* Check response code */ + andl $0xfff, %eax + cmpl $5, %eax + jne .Lfail + /* All good */ +.endm + +SYM_CODE_START(startup32_vc_handler) + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + + /* Keep CPUID function in %ebx */ + movl %eax, %ebx + + /* Check if error-code == SVM_EXIT_CPUID */ + cmpl $0x72, 16(%esp) + jne .Lfail + + /* Request CPUID[%ebx].EAX */ + SEV_ES_REQ_CPUID fn=%ebx reg=0 + movl %edx, 12(%esp) + + /* Request CPUID[%ebx].EBX */ + SEV_ES_REQ_CPUID fn=%ebx reg=1 + movl %edx, 8(%esp) + + /* Request CPUID[%ebx].ECX */ + SEV_ES_REQ_CPUID fn=%ebx reg=2 + movl %edx, 4(%esp) + + /* Request CPUID[%ebx].EDX */ + SEV_ES_REQ_CPUID fn=%ebx reg=3 + movl %edx, (%esp) + + popl %edx + popl %ecx + popl %ebx + popl %eax + + /* Remove error code */ + addl $4, %esp + + /* Jump over CPUID instruction */ + addl $2, (%esp) + + iret +.Lfail: + hlt + jmp .Lfail +SYM_CODE_END(startup32_vc_handler) + .code64 #include "../../kernel/sev_verify_cbit.S" - SYM_FUNC_START(set_sev_encryption_mask) #ifdef CONFIG_AMD_MEM_ENCRYPT push %rbp -- 2.30.0