Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp2033587ybg; Thu, 30 Jul 2020 08:44:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwKHB6oUd1eJOq/nbdhFBIB2evIn3Ml+/wtHbnSR0cVwQ4smqGzjZxQAl9bg4EN1OevNKZz X-Received: by 2002:aa7:da4c:: with SMTP id w12mr3198391eds.122.1596123862493; Thu, 30 Jul 2020 08:44:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596123862; cv=none; d=google.com; s=arc-20160816; b=eaIJSSL2xzh9x/IKLTyA3ObC5XIGzozOJ6nEjQM1qv4EN2rA7ZNliYukwUTet0+t4c 3XqihEBgasEW/c0dZxDYd8DFH4/PdTgACkhSjMZ0gXuuzrlfviz+lxzk7DroVmN2inAY qNjtZ5xcS58z9otUXobX4OKdiW31IJtJ9kAK5egEz6urASyBai2xiJQmYBUqJnhsPNcQ KXLjY9d0SlZcEx2IUUqDO8wsDmbMh8/TYqoDKRK708ZV3WNQNMbB3QjV0lQpMCDBI6g9 0U2NiL7NhIWVkkjClirP1GonWbUHjjyiAlXeqAua8i7KryW5EyDCy1ptuTMxuxWSS+So bhZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=ErkxixQQXlDdw5IKZWJXKa3A5XJ+EhnRFcS7zO+XoOw=; b=w2kZuxYaJWd9tSk8ELaMb5GDkjTUom5t7QrWnMytPdHHbBQOmaDU0rQpRfy/O26Sh5 7HINbX+yRnRuj9UZgIOaIxP99bDv1VPVWKzx7iwjEw/OAeNOcFNgO8PCoU5FofnFbQm5 fO51oYVPU1FLH3y5X1OxqxOsmkPWQ5rxSItDscGfUZTALlKbTbBUzy5cEp0bPKjHhspf tuG9cRL/7y3jBrOqZ7u/fYqIS1/tLOXSZb5aCLHcR0OCFmVPcHX/fpM+ppzFogWi9TLM PJK/qXV+cznEIsM1nbYXSjgSiSio6Q7WV4DGLvg84PusCj33FHcmARnAvrMBos9YHW3H NUWQ== 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 c16si3281587ejb.57.2020.07.30.08.43.59; Thu, 30 Jul 2020 08:44:22 -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 S1729806AbgG3Pnr (ORCPT + 99 others); Thu, 30 Jul 2020 11:43:47 -0400 Received: from 8bytes.org ([81.169.241.247]:34112 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728286AbgG3Pnq (ORCPT ); Thu, 30 Jul 2020 11:43:46 -0400 Received: by theia.8bytes.org (Postfix, from userid 1000) id CBEB99CE; Thu, 30 Jul 2020 17:43:44 +0200 (CEST) From: Joerg Roedel To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Tom Lendacky , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Joerg Roedel Subject: [PATCH v2 3/4] KVM: SVM: Add GHCB Accessor functions Date: Thu, 30 Jul 2020 17:43:39 +0200 Message-Id: <20200730154340.14021-4-joro@8bytes.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200730154340.14021-1-joro@8bytes.org> References: <20200730154340.14021-1-joro@8bytes.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel Building a correct GHCB for the hypervisor requires setting valid bits in the GHCB. Simplify that process by providing accessor functions to set values and to update the valid bitmap and to check the valid bitmap in KVM. Signed-off-by: Joerg Roedel --- arch/x86/include/asm/svm.h | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 9a3e0b802716..8744817358bf 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -341,4 +341,50 @@ struct __attribute__ ((__packed__)) vmcb { #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP) +/* GHCB Accessor functions */ + +#define GHB_BITMAP_IDX(field) \ + (offsetof(struct vmcb_save_area, field) / sizeof(u64)) + +#define GHCB_SET_VALID(ghcb, field) \ + __set_bit(GHB_BITMAP_IDX(field), (unsigned long *)&(ghcb)->save.valid_bitmap); \ + +#define DEFINE_GHCB_ACCESSORS(field) \ + static inline bool ghcb_##field##_is_valid(const struct ghcb *ghcb) \ + { \ + int idx = offsetof(struct vmcb_save_area, field) / sizeof(u64); \ + return test_bit(idx, (unsigned long *)&(ghcb)->save.valid_bitmap); \ + } \ + \ + static inline void \ + ghcb_set_##field(struct ghcb *ghcb, u64 value) \ + { \ + GHCB_SET_VALID(ghcb, field) \ + ghcb->save.field = value; \ + } + +DEFINE_GHCB_ACCESSORS(cpl) +DEFINE_GHCB_ACCESSORS(rip) +DEFINE_GHCB_ACCESSORS(rsp) +DEFINE_GHCB_ACCESSORS(rax) +DEFINE_GHCB_ACCESSORS(rcx) +DEFINE_GHCB_ACCESSORS(rdx) +DEFINE_GHCB_ACCESSORS(rbx) +DEFINE_GHCB_ACCESSORS(rbp) +DEFINE_GHCB_ACCESSORS(rsi) +DEFINE_GHCB_ACCESSORS(rdi) +DEFINE_GHCB_ACCESSORS(r8) +DEFINE_GHCB_ACCESSORS(r9) +DEFINE_GHCB_ACCESSORS(r10) +DEFINE_GHCB_ACCESSORS(r11) +DEFINE_GHCB_ACCESSORS(r12) +DEFINE_GHCB_ACCESSORS(r13) +DEFINE_GHCB_ACCESSORS(r14) +DEFINE_GHCB_ACCESSORS(r15) +DEFINE_GHCB_ACCESSORS(sw_exit_code) +DEFINE_GHCB_ACCESSORS(sw_exit_info_1) +DEFINE_GHCB_ACCESSORS(sw_exit_info_2) +DEFINE_GHCB_ACCESSORS(sw_scratch) +DEFINE_GHCB_ACCESSORS(xcr0) + #endif -- 2.17.1