Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp226795pxb; Mon, 13 Sep 2021 17:41:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxoi2czEjk6w0rgOAQOZApsPpHWYv6gnTnKIqJ6qeVu8vPvz7NnenmLm04w5yu95zwuJ0ip X-Received: by 2002:aa7:c9cd:: with SMTP id i13mr16543458edt.178.1631580114981; Mon, 13 Sep 2021 17:41:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631580114; cv=none; d=google.com; s=arc-20160816; b=PRxRdHjX5QvDm+m2T/BNZhPeBzw1IgYHYSvNO8Pz8SJkifxBYJeF8HPQlcJJEYgMyG rpA3kc+60ZLfkeXKv/BTCn1kzphRLEesXcOpbBnHmDHXO3ehciKr+RNos/CHbsY1P0Oa 8rqKfZF/uWK8EH7duvEuYbC/C9GzsnuaV8Jysaf+NKZfzOF4ou8oGW15T542Ji8LsVnG vE32HS9fwZQFjwhL8RfJxce3Zyw4u3TcrxsxsZ0fDnzeFAnONvAmvXN09175XGuFlhrb ivZk6idmqc8OtiQSQ5xOxqYBOTff+Ti0tWNiTfbO1Pcs/kPd34DvwweM1mIqndVqmh+w spjQ== 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 :message-id:date:subject:cc:to:from; bh=y6gQhBQcBXEImUrfLfIKLyxI+VwF/YfdOlQb9wnV0fo=; b=qamUqffBoNLsBpEFTQbRvmwB+ty3IIos7+4OeP/cyYSCH7dwat0/VqBuU2xh+F9RgV 9+93FupaDIMdGxsn5VyO0RHcCbdmfQoBOHDSgoQPOnNJgzjjH9CsTNSljuD4JRLMwYtI uE93g71U4NTgaZcNLsjSR5D3naN+wdxIoUHC9fFdfOR+LvPaVxZ+cKvR0zPUuYZkvOUn 9PZGNGuaSer9EDmQJsm34K14ZP+rBQnxOwCsGLxi6H3dnHqPhL3JkBXxKiIjNJkmETVE hDbDbm3fACKBDK6zfoE49WulhuMYrWPU3k8V/J1++WVS0KX/SDiE9MSU+D+iOqJTnYq0 lORA== 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 s21si9435068edd.522.2021.09.13.17.41.27; Mon, 13 Sep 2021 17:41:54 -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=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244551AbhIMP5h (ORCPT + 99 others); Mon, 13 Sep 2021 11:57:37 -0400 Received: from 8bytes.org ([81.169.241.247]:56748 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229627AbhIMP5e (ORCPT ); Mon, 13 Sep 2021 11:57:34 -0400 Received: from cap.home.8bytes.org (p549ad441.dip0.t-ipconnect.de [84.154.212.65]) (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 290F3247; Mon, 13 Sep 2021 17:56:16 +0200 (CEST) From: Joerg Roedel To: x86@kernel.org Cc: Eric Biederman , kexec@lists.infradead.org, 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 , Joerg Roedel , linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: [PATCH v2 00/12] x86/sev: KEXEC/KDUMP support for SEV-ES guests Date: Mon, 13 Sep 2021 17:55:51 +0200 Message-Id: <20210913155603.28383-1-joro@8bytes.org> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel Hi, here are changes to enable kexec/kdump in SEV-ES guests. The biggest problem for supporting kexec/kdump under SEV-ES is to find a way to hand the non-boot CPUs (APs) from one kernel to another. Without SEV-ES the first kernel parks the CPUs in a HLT loop until they get reset by the kexec'ed kernel via an INIT-SIPI-SIPI sequence. For virtual machines the CPU reset is emulated by the hypervisor, which sets the vCPU registers back to reset state. This does not work under SEV-ES, because the hypervisor has no access to the vCPU registers and can't make modifications to them. So an SEV-ES guest needs to reset the vCPU itself and park it using the AP-reset-hold protocol. Upon wakeup the guest needs to jump to real-mode and to the reset-vector configured in the AP-Jump-Table. The code to do this is the main part of this patch-set. It works by placing code on the AP Jump-Table page itself to park the vCPU and for jumping to the reset vector upon wakeup. The code on the AP Jump Table runs in 16-bit protected mode with segment base set to the beginning of the page. The AP Jump-Table is usually not within the first 1MB of memory, so the code can't run in real-mode. The AP Jump-Table is the best place to put the parking code, because the memory is owned, but read-only by the firmware and writeable by the OS. Only the first 4 bytes are used for the reset-vector, leaving the rest of the page for code/data/stack to park a vCPU. The code can't be in kernel memory because by the time the vCPU wakes up the memory will be owned by the new kernel, which might have overwritten it already. The other patches add initial GHCB Version 2 protocol support, because kexec/kdump need the MSR-based (without a GHCB) AP-reset-hold VMGEXIT, which is a GHCB protocol version 2 feature. The kexec'ed kernel is also entered via the decompressor and needs MMIO support there, so this patch-set also adds MMIO #VC support to the decompressor and support for handling CLFLUSH instructions. Finally there is also code to disable kexec/kdump support at runtime when the environment does not support it (e.g. no GHCB protocol version 2 support or AP Jump Table over 4GB). The diffstat looks big, but most of it is moving code for MMIO #VC support around to make it available to the decompressor. These patches need a fix I sent out earlier today to work reliably: https://lore.kernel.org/lkml/20210913095236.24937-1-joro@8bytes.org/ Please review. Thanks, Joerg Changes v1->v2: - Rebased to v5.15-rc1 - Fixed occasional triple-faults when parking APs, see separate fix Joerg Roedel (12): kexec: Allow architecture code to opt-out at runtime x86/kexec/64: Forbid kexec when running as an SEV-ES guest x86/sev: Save and print negotiated GHCB protocol version x86/sev: Do not hardcode GHCB protocol version x86/sev: Use GHCB protocol version 2 if supported x86/sev: Cache AP Jump Table Address x86/sev: Setup code to park APs in the AP Jump Table x86/sev: Park APs on AP Jump Table with GHCB protocol version 2 x86/sev: Use AP Jump Table blob to stop CPU x86/sev: Add MMIO handling support to boot/compressed/ code x86/sev: Handle CLFLUSH MMIO events x86/sev: Support kexec under SEV-ES with AP Jump Table blob arch/x86/boot/compressed/sev.c | 56 +- arch/x86/include/asm/realmode.h | 5 + arch/x86/include/asm/sev-ap-jumptable.h | 25 + arch/x86/include/asm/sev.h | 13 +- arch/x86/kernel/machine_kexec_64.c | 12 + arch/x86/kernel/process.c | 8 + arch/x86/kernel/sev-shared.c | 333 +++++++++- arch/x86/kernel/sev.c | 494 ++++++--------- arch/x86/lib/insn-eval-shared.c | 805 ++++++++++++++++++++++++ arch/x86/lib/insn-eval.c | 802 +---------------------- arch/x86/realmode/Makefile | 9 +- arch/x86/realmode/rm/Makefile | 11 +- arch/x86/realmode/rm/header.S | 3 + arch/x86/realmode/rm/sev_ap_park.S | 89 +++ arch/x86/realmode/rmpiggy.S | 6 + arch/x86/realmode/sev/Makefile | 41 ++ arch/x86/realmode/sev/ap_jump_table.S | 130 ++++ arch/x86/realmode/sev/ap_jump_table.lds | 24 + include/linux/kexec.h | 1 + kernel/kexec.c | 14 + kernel/kexec_file.c | 9 + 21 files changed, 1764 insertions(+), 1126 deletions(-) create mode 100644 arch/x86/include/asm/sev-ap-jumptable.h create mode 100644 arch/x86/lib/insn-eval-shared.c create mode 100644 arch/x86/realmode/rm/sev_ap_park.S create mode 100644 arch/x86/realmode/sev/Makefile create mode 100644 arch/x86/realmode/sev/ap_jump_table.S create mode 100644 arch/x86/realmode/sev/ap_jump_table.lds base-commit: 6880fa6c56601bb8ed59df6c30fd390cc5f6dd8f -- 2.33.0