Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp1119554ybg; Wed, 29 Jul 2020 06:23:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzI6fc9mCGDKBJJF5qwXy3JePNz3GELXomRiLy9Q3KHQ6jCwA7mZUn6E2mIOS7EJ6Z3HWH8 X-Received: by 2002:a17:906:3282:: with SMTP id 2mr22581918ejw.11.1596029035585; Wed, 29 Jul 2020 06:23:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596029035; cv=none; d=google.com; s=arc-20160816; b=VNZx6MftqdFGF7yl6jB7AhAjAHK2d27IajwJXzjfiQuiU5jMb4WjlMpoupXjOPrFCs 99mU4VA9xi6Cu44j3yyhV+nRN/Y6vFWdFkieq3gkKhg9lbqnr+zGw2ReuAWkRwjyxdjM uLuztAX9OPiM0SWNduhtEL2Wx76TrlcvfWMNe5pW67gZwGobyBgFm4vS2Hiu7PEkySSx F4M8EVsz33/DcPpHI9ECB60XMgE98TX2q58NPoRqW63C77Tw/OdI3Vbzx7TiKUy4dfN5 x0jsvC3L/Ufm3DYCMvKGr2Rsl5t2Zbh4qKs5V5ztVf5K/22O4AXhRKLBRy2X+sPkKPip TYfw== 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=/GcO32VRZl8Vd6pfEggKJikT9kN7KfXt56py3bSh8PE=; b=AbLsAIrFoBuBtzY8PwulLzxfQyOLcg7Y0UfuGCgV+9psMV7ayTO4nAFk0SRUaVPwB3 kbTTBdW3SPFc0bi/+JYcLE0zK5jhgxntEKfUi+luPLVKqUqK6ERxRIYAemkLBTexKBW0 CZT3f6doh/5ExyPeJuP3PyAKMyW5gE8WUFroy+8JvFvLp8YZVt8cPW08BJBCRgpaxD1M cLHn2t4BiUrUBTON8T8gYVCCIqX7enkVCWm+kfZPCwR7aw4BzC8bt/+UZtsJLhv5GW6I 1adcHxCDUokKXNwWploBuN7mt/3f6A1yGN2yoVo8FQlTCEf0WpemZ0ZzSxKoyazg400i rrog== 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 m14si1287290edb.344.2020.07.29.06.23.32; Wed, 29 Jul 2020 06:23:55 -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 S1727800AbgG2NWx (ORCPT + 99 others); Wed, 29 Jul 2020 09:22:53 -0400 Received: from 8bytes.org ([81.169.241.247]:33846 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727031AbgG2NWr (ORCPT ); Wed, 29 Jul 2020 09:22:47 -0400 Received: by theia.8bytes.org (Postfix, from userid 1000) id 85F8C76D; Wed, 29 Jul 2020 15:22:45 +0200 (CEST) From: Joerg Roedel To: Paolo Bonzini Cc: Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Joerg Roedel Subject: [PATCH 3/4] KVM: SVM: Add GHCB Accessor functions Date: Wed, 29 Jul 2020 15:22:33 +0200 Message-Id: <20200729132234.2346-4-joro@8bytes.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200729132234.2346-1-joro@8bytes.org> References: <20200729132234.2346-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. Signed-off-by: Joerg Roedel --- arch/x86/include/asm/svm.h | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 9a3e0b802716..0420250b008b 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -341,4 +341,65 @@ struct __attribute__ ((__packed__)) vmcb { #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP) +/* GHCB Accessor functions */ + +#define DEFINE_GHCB_INDICES(field) \ + u16 idx = offsetof(struct vmcb_save_area, field) / 8; \ + u16 byte_idx = idx / 8; \ + u16 bit_idx = idx % 8; \ + BUILD_BUG_ON(byte_idx > ARRAY_SIZE(ghcb->save.valid_bitmap)); + +#define GHCB_SET_VALID(ghcb, field) \ + { \ + DEFINE_GHCB_INDICES(field) \ + (ghcb)->save.valid_bitmap[byte_idx] |= BIT(bit_idx); \ + } + +#define DEFINE_GHCB_SETTER(field) \ + static inline void \ + ghcb_set_##field(struct ghcb *ghcb, u64 value) \ + { \ + GHCB_SET_VALID(ghcb, field) \ + (ghcb)->save.field = value; \ + } + +#define DEFINE_GHCB_ACCESSORS(field) \ + static inline bool ghcb_is_valid_##field(const struct ghcb *ghcb) \ + { \ + DEFINE_GHCB_INDICES(field) \ + return !!((ghcb)->save.valid_bitmap[byte_idx] \ + & BIT(bit_idx)); \ + } \ + \ + 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