Skip to content

Commit b81fc74

Browse files
codomaniasuryasaimadhu
authored andcommitted
x86/sev: Move GHCB MSR protocol and NAE definitions in a common header
The guest and the hypervisor contain separate macros to get and set the GHCB MSR protocol and NAE event fields. Consolidate the GHCB protocol definitions and helper macros in one place. Leave the supported protocol version define in separate files to keep the guest and hypervisor flexibility to support different GHCB version in the same release. There is no functional change intended. Signed-off-by: Brijesh Singh <[email protected]> Signed-off-by: Borislav Petkov <[email protected]> Acked-by: Joerg Roedel <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent e759959 commit b81fc74

File tree

4 files changed

+80
-70
lines changed

4 files changed

+80
-70
lines changed

arch/x86/include/asm/sev-common.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/*
3+
* AMD SEV header common between the guest and the hypervisor.
4+
*
5+
* Author: Brijesh Singh <[email protected]>
6+
*/
7+
8+
#ifndef __ASM_X86_SEV_COMMON_H
9+
#define __ASM_X86_SEV_COMMON_H
10+
11+
#define GHCB_MSR_INFO_POS 0
12+
#define GHCB_MSR_INFO_MASK (BIT_ULL(12) - 1)
13+
14+
#define GHCB_MSR_SEV_INFO_RESP 0x001
15+
#define GHCB_MSR_SEV_INFO_REQ 0x002
16+
#define GHCB_MSR_VER_MAX_POS 48
17+
#define GHCB_MSR_VER_MAX_MASK 0xffff
18+
#define GHCB_MSR_VER_MIN_POS 32
19+
#define GHCB_MSR_VER_MIN_MASK 0xffff
20+
#define GHCB_MSR_CBIT_POS 24
21+
#define GHCB_MSR_CBIT_MASK 0xff
22+
#define GHCB_MSR_SEV_INFO(_max, _min, _cbit) \
23+
((((_max) & GHCB_MSR_VER_MAX_MASK) << GHCB_MSR_VER_MAX_POS) | \
24+
(((_min) & GHCB_MSR_VER_MIN_MASK) << GHCB_MSR_VER_MIN_POS) | \
25+
(((_cbit) & GHCB_MSR_CBIT_MASK) << GHCB_MSR_CBIT_POS) | \
26+
GHCB_MSR_SEV_INFO_RESP)
27+
#define GHCB_MSR_INFO(v) ((v) & 0xfffUL)
28+
#define GHCB_MSR_PROTO_MAX(v) (((v) >> GHCB_MSR_VER_MAX_POS) & GHCB_MSR_VER_MAX_MASK)
29+
#define GHCB_MSR_PROTO_MIN(v) (((v) >> GHCB_MSR_VER_MIN_POS) & GHCB_MSR_VER_MIN_MASK)
30+
31+
#define GHCB_MSR_CPUID_REQ 0x004
32+
#define GHCB_MSR_CPUID_RESP 0x005
33+
#define GHCB_MSR_CPUID_FUNC_POS 32
34+
#define GHCB_MSR_CPUID_FUNC_MASK 0xffffffff
35+
#define GHCB_MSR_CPUID_VALUE_POS 32
36+
#define GHCB_MSR_CPUID_VALUE_MASK 0xffffffff
37+
#define GHCB_MSR_CPUID_REG_POS 30
38+
#define GHCB_MSR_CPUID_REG_MASK 0x3
39+
#define GHCB_CPUID_REQ_EAX 0
40+
#define GHCB_CPUID_REQ_EBX 1
41+
#define GHCB_CPUID_REQ_ECX 2
42+
#define GHCB_CPUID_REQ_EDX 3
43+
#define GHCB_CPUID_REQ(fn, reg) \
44+
(GHCB_MSR_CPUID_REQ | \
45+
(((unsigned long)reg & GHCB_MSR_CPUID_REG_MASK) << GHCB_MSR_CPUID_REG_POS) | \
46+
(((unsigned long)fn) << GHCB_MSR_CPUID_FUNC_POS))
47+
48+
#define GHCB_MSR_TERM_REQ 0x100
49+
#define GHCB_MSR_TERM_REASON_SET_POS 12
50+
#define GHCB_MSR_TERM_REASON_SET_MASK 0xf
51+
#define GHCB_MSR_TERM_REASON_POS 16
52+
#define GHCB_MSR_TERM_REASON_MASK 0xff
53+
#define GHCB_SEV_TERM_REASON(reason_set, reason_val) \
54+
(((((u64)reason_set) & GHCB_MSR_TERM_REASON_SET_MASK) << GHCB_MSR_TERM_REASON_SET_POS) | \
55+
((((u64)reason_val) & GHCB_MSR_TERM_REASON_MASK) << GHCB_MSR_TERM_REASON_POS))
56+
57+
#define GHCB_SEV_ES_REASON_GENERAL_REQUEST 0
58+
#define GHCB_SEV_ES_REASON_PROTOCOL_UNSUPPORTED 1
59+
60+
#define GHCB_RESP_CODE(v) ((v) & GHCB_MSR_INFO_MASK)
61+
62+
#endif

arch/x86/include/asm/sev.h

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,12 @@
1010

1111
#include <linux/types.h>
1212
#include <asm/insn.h>
13+
#include <asm/sev-common.h>
1314

14-
#define GHCB_SEV_INFO 0x001UL
15-
#define GHCB_SEV_INFO_REQ 0x002UL
16-
#define GHCB_INFO(v) ((v) & 0xfffUL)
17-
#define GHCB_PROTO_MAX(v) (((v) >> 48) & 0xffffUL)
18-
#define GHCB_PROTO_MIN(v) (((v) >> 32) & 0xffffUL)
19-
#define GHCB_PROTO_OUR 0x0001UL
20-
#define GHCB_SEV_CPUID_REQ 0x004UL
21-
#define GHCB_CPUID_REQ_EAX 0
22-
#define GHCB_CPUID_REQ_EBX 1
23-
#define GHCB_CPUID_REQ_ECX 2
24-
#define GHCB_CPUID_REQ_EDX 3
25-
#define GHCB_CPUID_REQ(fn, reg) (GHCB_SEV_CPUID_REQ | \
26-
(((unsigned long)reg & 3) << 30) | \
27-
(((unsigned long)fn) << 32))
15+
#define GHCB_PROTO_OUR 0x0001UL
16+
#define GHCB_PROTOCOL_MAX 1ULL
17+
#define GHCB_DEFAULT_USAGE 0ULL
2818

29-
#define GHCB_PROTOCOL_MAX 0x0001UL
30-
#define GHCB_DEFAULT_USAGE 0x0000UL
31-
32-
#define GHCB_SEV_CPUID_RESP 0x005UL
33-
#define GHCB_SEV_TERMINATE 0x100UL
34-
#define GHCB_SEV_TERMINATE_REASON(reason_set, reason_val) \
35-
(((((u64)reason_set) & 0x7) << 12) | \
36-
((((u64)reason_val) & 0xff) << 16))
37-
#define GHCB_SEV_ES_REASON_GENERAL_REQUEST 0
38-
#define GHCB_SEV_ES_REASON_PROTOCOL_UNSUPPORTED 1
39-
40-
#define GHCB_SEV_GHCB_RESP_CODE(v) ((v) & 0xfff)
4119
#define VMGEXIT() { asm volatile("rep; vmmcall\n\r"); }
4220

4321
enum es_result {

arch/x86/kernel/sev-shared.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ static bool __init sev_es_check_cpu_features(void)
2626

2727
static void __noreturn sev_es_terminate(unsigned int reason)
2828
{
29-
u64 val = GHCB_SEV_TERMINATE;
29+
u64 val = GHCB_MSR_TERM_REQ;
3030

3131
/*
3232
* Tell the hypervisor what went wrong - only reason-set 0 is
3333
* currently supported.
3434
*/
35-
val |= GHCB_SEV_TERMINATE_REASON(0, reason);
35+
val |= GHCB_SEV_TERM_REASON(0, reason);
3636

3737
/* Request Guest Termination from Hypvervisor */
3838
sev_es_wr_ghcb_msr(val);
@@ -47,15 +47,15 @@ static bool sev_es_negotiate_protocol(void)
4747
u64 val;
4848

4949
/* Do the GHCB protocol version negotiation */
50-
sev_es_wr_ghcb_msr(GHCB_SEV_INFO_REQ);
50+
sev_es_wr_ghcb_msr(GHCB_MSR_SEV_INFO_REQ);
5151
VMGEXIT();
5252
val = sev_es_rd_ghcb_msr();
5353

54-
if (GHCB_INFO(val) != GHCB_SEV_INFO)
54+
if (GHCB_MSR_INFO(val) != GHCB_MSR_SEV_INFO_RESP)
5555
return false;
5656

57-
if (GHCB_PROTO_MAX(val) < GHCB_PROTO_OUR ||
58-
GHCB_PROTO_MIN(val) > GHCB_PROTO_OUR)
57+
if (GHCB_MSR_PROTO_MAX(val) < GHCB_PROTO_OUR ||
58+
GHCB_MSR_PROTO_MIN(val) > GHCB_PROTO_OUR)
5959
return false;
6060

6161
return true;
@@ -153,28 +153,28 @@ void __init do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code)
153153
sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_EAX));
154154
VMGEXIT();
155155
val = sev_es_rd_ghcb_msr();
156-
if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
156+
if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
157157
goto fail;
158158
regs->ax = val >> 32;
159159

160160
sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_EBX));
161161
VMGEXIT();
162162
val = sev_es_rd_ghcb_msr();
163-
if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
163+
if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
164164
goto fail;
165165
regs->bx = val >> 32;
166166

167167
sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_ECX));
168168
VMGEXIT();
169169
val = sev_es_rd_ghcb_msr();
170-
if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
170+
if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
171171
goto fail;
172172
regs->cx = val >> 32;
173173

174174
sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_EDX));
175175
VMGEXIT();
176176
val = sev_es_rd_ghcb_msr();
177-
if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
177+
if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
178178
goto fail;
179179
regs->dx = val >> 32;
180180

arch/x86/kvm/svm/svm.h

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <linux/bits.h>
2121

2222
#include <asm/svm.h>
23+
#include <asm/sev-common.h>
2324

2425
#define __sme_page_pa(x) __sme_set(page_to_pfn(x) << PAGE_SHIFT)
2526

@@ -525,40 +526,9 @@ void svm_vcpu_unblocking(struct kvm_vcpu *vcpu);
525526

526527
/* sev.c */
527528

528-
#define GHCB_VERSION_MAX 1ULL
529-
#define GHCB_VERSION_MIN 1ULL
530-
531-
#define GHCB_MSR_INFO_POS 0
532-
#define GHCB_MSR_INFO_MASK (BIT_ULL(12) - 1)
533-
534-
#define GHCB_MSR_SEV_INFO_RESP 0x001
535-
#define GHCB_MSR_SEV_INFO_REQ 0x002
536-
#define GHCB_MSR_VER_MAX_POS 48
537-
#define GHCB_MSR_VER_MAX_MASK 0xffff
538-
#define GHCB_MSR_VER_MIN_POS 32
539-
#define GHCB_MSR_VER_MIN_MASK 0xffff
540-
#define GHCB_MSR_CBIT_POS 24
541-
#define GHCB_MSR_CBIT_MASK 0xff
542-
#define GHCB_MSR_SEV_INFO(_max, _min, _cbit) \
543-
((((_max) & GHCB_MSR_VER_MAX_MASK) << GHCB_MSR_VER_MAX_POS) | \
544-
(((_min) & GHCB_MSR_VER_MIN_MASK) << GHCB_MSR_VER_MIN_POS) | \
545-
(((_cbit) & GHCB_MSR_CBIT_MASK) << GHCB_MSR_CBIT_POS) | \
546-
GHCB_MSR_SEV_INFO_RESP)
547-
548-
#define GHCB_MSR_CPUID_REQ 0x004
549-
#define GHCB_MSR_CPUID_RESP 0x005
550-
#define GHCB_MSR_CPUID_FUNC_POS 32
551-
#define GHCB_MSR_CPUID_FUNC_MASK 0xffffffff
552-
#define GHCB_MSR_CPUID_VALUE_POS 32
553-
#define GHCB_MSR_CPUID_VALUE_MASK 0xffffffff
554-
#define GHCB_MSR_CPUID_REG_POS 30
555-
#define GHCB_MSR_CPUID_REG_MASK 0x3
556-
557-
#define GHCB_MSR_TERM_REQ 0x100
558-
#define GHCB_MSR_TERM_REASON_SET_POS 12
559-
#define GHCB_MSR_TERM_REASON_SET_MASK 0xf
560-
#define GHCB_MSR_TERM_REASON_POS 16
561-
#define GHCB_MSR_TERM_REASON_MASK 0xff
529+
#define GHCB_VERSION_MAX 1ULL
530+
#define GHCB_VERSION_MIN 1ULL
531+
562532

563533
extern unsigned int max_sev_asid;
564534

0 commit comments

Comments
 (0)