x86/sev-es: Setup an early #VC handler
[linux-2.6-block.git] / arch / x86 / include / asm / sev-es.h
CommitLineData
29dcc60f
JR
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * AMD Encrypted Register State Support
4 *
5 * Author: Joerg Roedel <jroedel@suse.de>
6 */
7
8#ifndef __ASM_ENCRYPTED_STATE_H
9#define __ASM_ENCRYPTED_STATE_H
10
11#include <linux/types.h>
597cfe48 12#include <asm/insn.h>
29dcc60f 13
597cfe48
JR
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
29dcc60f
JR
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))
28
597cfe48
JR
29#define GHCB_PROTOCOL_MAX 0x0001UL
30#define GHCB_DEFAULT_USAGE 0x0000UL
31
29dcc60f
JR
32#define GHCB_SEV_CPUID_RESP 0x005UL
33#define GHCB_SEV_TERMINATE 0x100UL
597cfe48
JR
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
29dcc60f
JR
39
40#define GHCB_SEV_GHCB_RESP_CODE(v) ((v) & 0xfff)
41#define VMGEXIT() { asm volatile("rep; vmmcall\n\r"); }
42
597cfe48
JR
43enum es_result {
44 ES_OK, /* All good */
45 ES_UNSUPPORTED, /* Requested operation not supported */
46 ES_VMM_ERROR, /* Unexpected state from the VMM */
47 ES_DECODE_FAILED, /* Instruction decoding failed */
48 ES_EXCEPTION, /* Instruction caused exception */
49 ES_RETRY, /* Retry instruction emulation */
50};
51
52struct es_fault_info {
53 unsigned long vector;
54 unsigned long error_code;
55 unsigned long cr2;
56};
57
58struct pt_regs;
59
60/* ES instruction emulation context */
61struct es_em_ctxt {
62 struct pt_regs *regs;
63 struct insn insn;
64 struct es_fault_info fi;
65};
66
29dcc60f
JR
67void do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code);
68
69static inline u64 lower_bits(u64 val, unsigned int bits)
70{
71 u64 mask = (1ULL << bits) - 1;
72
73 return (val & mask);
74}
75
74d8d9d5
JR
76/* Early IDT entry points for #VC handler */
77extern void vc_no_ghcb(void);
78
29dcc60f 79#endif