Symbol: ghcb
arch/x86/boot/compressed/sev.c
146
static void __noreturn sev_es_ghcb_terminate(struct ghcb *ghcb, unsigned int set,
arch/x86/boot/compressed/sev.c
151
vc_ghcb_invalidate(ghcb);
arch/x86/boot/compressed/sev.c
152
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_TERM_REQUEST);
arch/x86/boot/compressed/sev.c
153
ghcb_set_sw_exit_info_1(ghcb, exit_info_1);
arch/x86/boot/compressed/sev.c
154
ghcb_set_sw_exit_info_2(ghcb, exit_info_2);
arch/x86/boot/compressed/sev.c
156
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/boot/compressed/sev.c
30
static struct ghcb boot_ghcb_page __aligned(PAGE_SIZE);
arch/x86/boot/compressed/sev.c
31
struct ghcb *boot_ghcb __section(".data");
arch/x86/coco/sev/core.c
1012
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1016
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1017
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1019
res = __vc_handle_msr(ghcb, &ctxt, true);
arch/x86/coco/sev/core.c
1034
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1038
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1039
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1041
ghcb_set_rax(ghcb, SVM_VMGEXIT_SAVIC_SELF_GPA);
arch/x86/coco/sev/core.c
1042
ghcb_set_rbx(ghcb, gpa);
arch/x86/coco/sev/core.c
1043
res = sev_es_ghcb_hv_call(ghcb, &ctxt, SVM_VMGEXIT_SAVIC,
arch/x86/coco/sev/core.c
1056
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1060
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1061
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1063
ghcb_set_rax(ghcb, SVM_VMGEXIT_SAVIC_SELF_GPA);
arch/x86/coco/sev/core.c
1064
res = sev_es_ghcb_hv_call(ghcb, &ctxt, SVM_VMGEXIT_SAVIC,
arch/x86/coco/sev/core.c
1067
*gpa = ghcb->save.rbx;
arch/x86/coco/sev/core.c
1077
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1080
ghcb = &data->ghcb_page;
arch/x86/coco/sev/core.c
1082
snp_register_ghcb_early(__pa(ghcb));
arch/x86/coco/sev/core.c
1131
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1133
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1136
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1137
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_HLT_LOOP);
arch/x86/coco/sev/core.c
1138
ghcb_set_sw_exit_info_1(ghcb, 0);
arch/x86/coco/sev/core.c
1139
ghcb_set_sw_exit_info_2(ghcb, 0);
arch/x86/coco/sev/core.c
1141
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/core.c
1145
if (ghcb_sw_exit_info_2_is_valid(ghcb) &&
arch/x86/coco/sev/core.c
1146
ghcb->save.sw_exit_info_2)
arch/x86/coco/sev/core.c
127
static struct ghcb boot_ghcb_page __bss_decrypted __aligned(PAGE_SIZE);
arch/x86/coco/sev/core.c
1326
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
133
struct ghcb *boot_ghcb __section(".data");
arch/x86/coco/sev/core.c
1337
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1338
if (!ghcb) {
arch/x86/coco/sev/core.c
1343
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1346
ghcb_set_rax(ghcb, input->data_gpa);
arch/x86/coco/sev/core.c
1347
ghcb_set_rbx(ghcb, input->data_npages);
arch/x86/coco/sev/core.c
1350
ret = sev_es_ghcb_hv_call(ghcb, &ctxt, req->exit_code, input->req_gpa, input->resp_gpa);
arch/x86/coco/sev/core.c
1354
req->exitinfo2 = ghcb->save.sw_exit_info_2;
arch/x86/coco/sev/core.c
1366
input->data_npages = ghcb_get_rbx(ghcb);
arch/x86/coco/sev/core.c
159
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
167
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
169
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
170
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_JUMP_TABLE);
arch/x86/coco/sev/core.c
171
ghcb_set_sw_exit_info_1(ghcb, SVM_VMGEXIT_GET_AP_JUMP_TABLE);
arch/x86/coco/sev/core.c
172
ghcb_set_sw_exit_info_2(ghcb, 0);
arch/x86/coco/sev/core.c
174
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/core.c
177
if (ghcb_sw_exit_info_1_is_valid(ghcb) &&
arch/x86/coco/sev/core.c
178
ghcb_sw_exit_info_2_is_valid(ghcb))
arch/x86/coco/sev/core.c
179
ret = ghcb->save.sw_exit_info_2;
arch/x86/coco/sev/core.c
253
static int vmgexit_psc(struct ghcb *ghcb, struct snp_psc_desc *desc)
arch/x86/coco/sev/core.c
259
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
262
data = (struct snp_psc_desc *)ghcb->shared_buffer;
arch/x86/coco/sev/core.c
263
memcpy(ghcb->shared_buffer, desc, min_t(int, GHCB_SHARED_BUF_SIZE, sizeof(*desc)));
arch/x86/coco/sev/core.c
281
ghcb_set_sw_scratch(ghcb, (u64)__pa(data));
arch/x86/coco/sev/core.c
284
ret = sev_es_ghcb_hv_call(ghcb, &ctxt, SVM_VMGEXIT_PSC, 0, 0);
arch/x86/coco/sev/core.c
290
if (WARN(ret || ghcb->save.sw_exit_info_2,
arch/x86/coco/sev/core.c
292
ret, ghcb->save.sw_exit_info_2)) {
arch/x86/coco/sev/core.c
328
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
370
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
373
if (!ghcb || vmgexit_psc(ghcb, data))
arch/x86/coco/sev/core.c
440
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
445
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
447
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
450
ghcb_set_rax(ghcb, vmsa->sev_features);
arch/x86/coco/sev/core.c
452
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_CREATION);
arch/x86/coco/sev/core.c
453
ghcb_set_sw_exit_info_1(ghcb,
arch/x86/coco/sev/core.c
457
ghcb_set_sw_exit_info_2(ghcb, __pa(vmsa));
arch/x86/coco/sev/core.c
459
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/core.c
462
if (!ghcb_sw_exit_info_1_is_valid(ghcb) ||
arch/x86/coco/sev/core.c
463
lower_32_bits(ghcb->save.sw_exit_info_1)) {
arch/x86/coco/sev/core.c
546
unsigned long addr, end, size, ghcb;
arch/x86/coco/sev/core.c
575
ghcb = (unsigned long)&data->ghcb_page;
arch/x86/coco/sev/core.c
578
if (addr <= ghcb && ghcb < addr + size) {
arch/x86/coco/sev/core.c
692
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
716
ghcb = &data->ghcb_page;
arch/x86/coco/sev/core.c
717
pte = lookup_address((unsigned long)ghcb, &level);
arch/x86/coco/sev/core.c
720
addr = (unsigned long)ghcb & page_level_mask(level);
arch/x86/coco/sev/core.c
982
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
986
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
987
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
989
res = __vc_handle_msr(ghcb, &ctxt, false);
arch/x86/coco/sev/internal.h
12
struct ghcb ghcb_page;
arch/x86/coco/sev/internal.h
21
struct ghcb backup_ghcb;
arch/x86/coco/sev/internal.h
48
struct ghcb *ghcb;
arch/x86/coco/sev/internal.h
53
struct ghcb *__sev_get_ghcb(struct ghcb_state *state);
arch/x86/coco/sev/internal.h
67
enum es_result verify_exception_info(struct ghcb *ghcb, struct es_em_ctxt *ctxt);
arch/x86/coco/sev/internal.h
91
enum es_result __vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt, bool write);
arch/x86/coco/sev/noinstr.c
100
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/noinstr.c
101
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_NMI_COMPLETE);
arch/x86/coco/sev/noinstr.c
102
ghcb_set_sw_exit_info_1(ghcb, 0);
arch/x86/coco/sev/noinstr.c
103
ghcb_set_sw_exit_info_2(ghcb, 0);
arch/x86/coco/sev/noinstr.c
105
sev_es_wr_ghcb_msr(__pa_nodebug(ghcb));
arch/x86/coco/sev/noinstr.c
117
noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state)
arch/x86/coco/sev/noinstr.c
120
struct ghcb *ghcb;
arch/x86/coco/sev/noinstr.c
125
state->ghcb = NULL;
arch/x86/coco/sev/noinstr.c
130
ghcb = &data->ghcb_page;
arch/x86/coco/sev/noinstr.c
153
state->ghcb = &data->backup_ghcb;
arch/x86/coco/sev/noinstr.c
156
*state->ghcb = *ghcb;
arch/x86/coco/sev/noinstr.c
158
state->ghcb = NULL;
arch/x86/coco/sev/noinstr.c
162
return ghcb;
arch/x86/coco/sev/noinstr.c
168
struct ghcb *ghcb;
arch/x86/coco/sev/noinstr.c
176
ghcb = &data->ghcb_page;
arch/x86/coco/sev/noinstr.c
178
if (state->ghcb) {
arch/x86/coco/sev/noinstr.c
180
*ghcb = *state->ghcb;
arch/x86/coco/sev/noinstr.c
182
state->ghcb = NULL;
arch/x86/coco/sev/noinstr.c
188
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/noinstr.c
96
struct ghcb *ghcb;
arch/x86/coco/sev/noinstr.c
98
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/svsm.c
30
static int svsm_perform_ghcb_protocol(struct ghcb *ghcb, struct svsm_call *call)
arch/x86/coco/sev/svsm.c
35
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/svsm.c
41
ghcb->protocol_version = ghcb_version;
arch/x86/coco/sev/svsm.c
42
ghcb->ghcb_usage = GHCB_DEFAULT_USAGE;
arch/x86/coco/sev/svsm.c
44
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_SNP_RUN_VMPL);
arch/x86/coco/sev/svsm.c
45
ghcb_set_sw_exit_info_1(ghcb, 0);
arch/x86/coco/sev/svsm.c
46
ghcb_set_sw_exit_info_2(ghcb, 0);
arch/x86/coco/sev/svsm.c
48
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/svsm.c
55
switch (verify_exception_info(ghcb, &ctxt)) {
arch/x86/coco/sev/svsm.c
72
struct ghcb *ghcb;
arch/x86/coco/sev/svsm.c
77
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/svsm.c
80
ret = ghcb ? svsm_perform_ghcb_protocol(ghcb, call)
arch/x86/coco/sev/vc-handle.c
39
static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
arch/x86/coco/sev/vc-handle.c
407
enum es_result __vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt, bool write)
arch/x86/coco/sev/vc-handle.c
433
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/coco/sev/vc-handle.c
435
ghcb_set_rax(ghcb, regs->ax);
arch/x86/coco/sev/vc-handle.c
436
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/coco/sev/vc-handle.c
439
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MSR, write, 0);
arch/x86/coco/sev/vc-handle.c
442
regs->ax = ghcb->save.rax;
arch/x86/coco/sev/vc-handle.c
443
regs->dx = ghcb->save.rdx;
arch/x86/coco/sev/vc-handle.c
449
static enum es_result vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
arch/x86/coco/sev/vc-handle.c
451
return __vc_handle_msr(ghcb, ctxt, ctxt->insn.opcode.bytes[1] == 0x30);
arch/x86/coco/sev/vc-handle.c
480
static enum es_result vc_do_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
arch/x86/coco/sev/vc-handle.c
484
unsigned long ghcb_pa = __pa(ghcb);
arch/x86/coco/sev/vc-handle.c
495
res = vc_slow_virt_to_phys(ghcb, ctxt, (unsigned long)ref, &paddr);
arch/x86/coco/sev/vc-handle.c
507
ghcb_set_sw_scratch(ghcb, ghcb_pa + offsetof(struct ghcb, shared_buffer));
arch/x86/coco/sev/vc-handle.c
509
return sev_es_ghcb_hv_call(ghcb, ctxt, exit_code, exit_info_1, exit_info_2);
arch/x86/coco/sev/vc-handle.c
579
static enum es_result vc_handle_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
arch/x86/coco/sev/vc-handle.c
603
memcpy(ghcb->shared_buffer, reg_data, bytes);
arch/x86/coco/sev/vc-handle.c
604
ret = vc_do_mmio(ghcb, ctxt, bytes, false);
arch/x86/coco/sev/vc-handle.c
607
memcpy(ghcb->shared_buffer, insn->immediate1.bytes, bytes);
arch/x86/coco/sev/vc-handle.c
608
ret = vc_do_mmio(ghcb, ctxt, bytes, false);
arch/x86/coco/sev/vc-handle.c
611
ret = vc_do_mmio(ghcb, ctxt, bytes, true);
arch/x86/coco/sev/vc-handle.c
619
memcpy(reg_data, ghcb->shared_buffer, bytes);
arch/x86/coco/sev/vc-handle.c
622
ret = vc_do_mmio(ghcb, ctxt, bytes, true);
arch/x86/coco/sev/vc-handle.c
628
memcpy(reg_data, ghcb->shared_buffer, bytes);
arch/x86/coco/sev/vc-handle.c
631
ret = vc_do_mmio(ghcb, ctxt, bytes, true);
arch/x86/coco/sev/vc-handle.c
636
u8 *val = (u8 *)ghcb->shared_buffer;
arch/x86/coco/sev/vc-handle.c
640
u16 *val = (u16 *)ghcb->shared_buffer;
arch/x86/coco/sev/vc-handle.c
647
memcpy(reg_data, ghcb->shared_buffer, bytes);
arch/x86/coco/sev/vc-handle.c
660
static enum es_result vc_handle_dr7_write(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
690
ghcb_set_rax(ghcb, val);
arch/x86/coco/sev/vc-handle.c
691
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_WRITE_DR7, 0, 0);
arch/x86/coco/sev/vc-handle.c
701
static enum es_result vc_handle_dr7_read(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
721
static enum es_result vc_handle_wbinvd(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
724
return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_WBINVD, 0, 0);
arch/x86/coco/sev/vc-handle.c
727
static enum es_result vc_handle_rdpmc(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
arch/x86/coco/sev/vc-handle.c
731
ghcb_set_rcx(ghcb, ctxt->regs->cx);
arch/x86/coco/sev/vc-handle.c
733
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_RDPMC, 0, 0);
arch/x86/coco/sev/vc-handle.c
737
if (!(ghcb_rax_is_valid(ghcb) && ghcb_rdx_is_valid(ghcb)))
arch/x86/coco/sev/vc-handle.c
740
ctxt->regs->ax = ghcb->save.rax;
arch/x86/coco/sev/vc-handle.c
741
ctxt->regs->dx = ghcb->save.rdx;
arch/x86/coco/sev/vc-handle.c
746
static enum es_result vc_handle_monitor(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
756
static enum es_result vc_handle_mwait(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
763
static enum es_result vc_handle_vmmcall(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
768
ghcb_set_rax(ghcb, ctxt->regs->ax);
arch/x86/coco/sev/vc-handle.c
769
ghcb_set_cpl(ghcb, user_mode(ctxt->regs) ? 3 : 0);
arch/x86/coco/sev/vc-handle.c
772
x86_platform.hyper.sev_es_hcall_prepare(ghcb, ctxt->regs);
arch/x86/coco/sev/vc-handle.c
774
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_VMMCALL, 0, 0);
arch/x86/coco/sev/vc-handle.c
778
if (!ghcb_rax_is_valid(ghcb))
arch/x86/coco/sev/vc-handle.c
781
ctxt->regs->ax = ghcb->save.rax;
arch/x86/coco/sev/vc-handle.c
789
!x86_platform.hyper.sev_es_hcall_finish(ghcb, ctxt->regs))
arch/x86/coco/sev/vc-handle.c
795
static enum es_result vc_handle_trap_ac(struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
809
struct ghcb *ghcb,
arch/x86/coco/sev/vc-handle.c
819
result = vc_handle_dr7_read(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
822
result = vc_handle_dr7_write(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
825
result = vc_handle_trap_ac(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
829
result = vc_handle_rdtsc(ghcb, ctxt, exit_code);
arch/x86/coco/sev/vc-handle.c
832
result = vc_handle_rdpmc(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
839
result = vc_handle_cpuid(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
842
result = vc_handle_ioio(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
845
result = vc_handle_msr(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
848
result = vc_handle_vmmcall(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
851
result = vc_handle_wbinvd(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
854
result = vc_handle_monitor(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
857
result = vc_handle_mwait(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
860
result = vc_handle_mmio(ghcb, ctxt);
arch/x86/coco/sev/vc-handle.c
897
struct ghcb *ghcb;
arch/x86/coco/sev/vc-handle.c
900
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/vc-handle.c
902
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/vc-handle.c
906
result = vc_handle_exitcode(&ctxt, ghcb, error_code);
arch/x86/coco/sev/vc-shared.c
308
static enum es_result vc_handle_ioio(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
arch/x86/coco/sev/vc-shared.c
335
ghcb_count = sizeof(ghcb->shared_buffer) / io_bytes;
arch/x86/coco/sev/vc-shared.c
347
ghcb->shared_buffer, io_bytes,
arch/x86/coco/sev/vc-shared.c
358
sw_scratch = __pa(ghcb) + offsetof(struct ghcb, shared_buffer);
arch/x86/coco/sev/vc-shared.c
359
ghcb_set_sw_scratch(ghcb, sw_scratch);
arch/x86/coco/sev/vc-shared.c
360
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO,
arch/x86/coco/sev/vc-shared.c
369
ghcb->shared_buffer, io_bytes,
arch/x86/coco/sev/vc-shared.c
400
ghcb_set_rax(ghcb, rax);
arch/x86/coco/sev/vc-shared.c
402
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, exit_info_1, 0);
arch/x86/coco/sev/vc-shared.c
407
if (!ghcb_rax_is_valid(ghcb))
arch/x86/coco/sev/vc-shared.c
409
regs->ax = lower_bits(ghcb->save.rax, bits);
arch/x86/coco/sev/vc-shared.c
416
enum es_result verify_exception_info(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
arch/x86/coco/sev/vc-shared.c
420
ret = ghcb->save.sw_exit_info_1 & GENMASK_ULL(31, 0);
arch/x86/coco/sev/vc-shared.c
425
u64 info = ghcb->save.sw_exit_info_2;
arch/x86/coco/sev/vc-shared.c
444
enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb,
arch/x86/coco/sev/vc-shared.c
450
ghcb->protocol_version = ghcb_version;
arch/x86/coco/sev/vc-shared.c
451
ghcb->ghcb_usage = GHCB_DEFAULT_USAGE;
arch/x86/coco/sev/vc-shared.c
453
ghcb_set_sw_exit_code(ghcb, exit_code);
arch/x86/coco/sev/vc-shared.c
454
ghcb_set_sw_exit_info_1(ghcb, exit_info_1);
arch/x86/coco/sev/vc-shared.c
455
ghcb_set_sw_exit_info_2(ghcb, exit_info_2);
arch/x86/coco/sev/vc-shared.c
457
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/vc-shared.c
460
return verify_exception_info(ghcb, ctxt);
arch/x86/coco/sev/vc-shared.c
463
static int __sev_cpuid_hv_ghcb(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf)
arch/x86/coco/sev/vc-shared.c
468
ghcb_set_rax(ghcb, leaf->fn);
arch/x86/coco/sev/vc-shared.c
469
ghcb_set_rcx(ghcb, leaf->subfn);
arch/x86/coco/sev/vc-shared.c
473
ghcb_set_xcr0(ghcb, xgetbv(XCR_XFEATURE_ENABLED_MASK));
arch/x86/coco/sev/vc-shared.c
476
ghcb_set_xcr0(ghcb, 1);
arch/x86/coco/sev/vc-shared.c
478
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_CPUID, 0, 0);
arch/x86/coco/sev/vc-shared.c
482
if (!(ghcb_rax_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
483
ghcb_rbx_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
484
ghcb_rcx_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
485
ghcb_rdx_is_valid(ghcb)))
arch/x86/coco/sev/vc-shared.c
488
leaf->eax = ghcb->save.rax;
arch/x86/coco/sev/vc-shared.c
489
leaf->ebx = ghcb->save.rbx;
arch/x86/coco/sev/vc-shared.c
490
leaf->ecx = ghcb->save.rcx;
arch/x86/coco/sev/vc-shared.c
491
leaf->edx = ghcb->save.rdx;
arch/x86/coco/sev/vc-shared.c
497
struct ghcb *ghcb;
arch/x86/coco/sev/vc-shared.c
505
if (__sev_cpuid_hv_ghcb(ctx->ghcb, ctx->ctxt, leaf))
arch/x86/coco/sev/vc-shared.c
509
static int vc_handle_cpuid_snp(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
arch/x86/coco/sev/vc-shared.c
511
struct cpuid_ctx ctx = { ghcb, ctxt };
arch/x86/coco/sev/vc-shared.c
529
static enum es_result vc_handle_cpuid(struct ghcb *ghcb,
arch/x86/coco/sev/vc-shared.c
537
snp_cpuid_ret = vc_handle_cpuid_snp(ghcb, ctxt);
arch/x86/coco/sev/vc-shared.c
543
ghcb_set_rax(ghcb, regs->ax);
arch/x86/coco/sev/vc-shared.c
544
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/coco/sev/vc-shared.c
548
ghcb_set_xcr0(ghcb, xgetbv(XCR_XFEATURE_ENABLED_MASK));
arch/x86/coco/sev/vc-shared.c
551
ghcb_set_xcr0(ghcb, 1);
arch/x86/coco/sev/vc-shared.c
557
ghcb_set_xss(ghcb, m.q);
arch/x86/coco/sev/vc-shared.c
560
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_CPUID, 0, 0);
arch/x86/coco/sev/vc-shared.c
564
if (!(ghcb_rax_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
565
ghcb_rbx_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
566
ghcb_rcx_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
567
ghcb_rdx_is_valid(ghcb)))
arch/x86/coco/sev/vc-shared.c
570
regs->ax = ghcb->save.rax;
arch/x86/coco/sev/vc-shared.c
571
regs->bx = ghcb->save.rbx;
arch/x86/coco/sev/vc-shared.c
572
regs->cx = ghcb->save.rcx;
arch/x86/coco/sev/vc-shared.c
573
regs->dx = ghcb->save.rdx;
arch/x86/coco/sev/vc-shared.c
578
static enum es_result vc_handle_rdtsc(struct ghcb *ghcb,
arch/x86/coco/sev/vc-shared.c
595
ret = sev_es_ghcb_hv_call(ghcb, ctxt, exit_code, 0, 0);
arch/x86/coco/sev/vc-shared.c
599
if (!(ghcb_rax_is_valid(ghcb) && ghcb_rdx_is_valid(ghcb) &&
arch/x86/coco/sev/vc-shared.c
600
(!rdtscp || ghcb_rcx_is_valid(ghcb))))
arch/x86/coco/sev/vc-shared.c
603
ctxt->regs->ax = ghcb->save.rax;
arch/x86/coco/sev/vc-shared.c
604
ctxt->regs->dx = ghcb->save.rdx;
arch/x86/coco/sev/vc-shared.c
606
ctxt->regs->cx = ghcb->save.rcx;
arch/x86/hyperv/ivm.c
104
hv_ghcb->ghcb.ghcb_usage = 0xffffffff;
arch/x86/hyperv/ivm.c
105
memset(hv_ghcb->ghcb.save.valid_bitmap, 0,
arch/x86/hyperv/ivm.c
106
sizeof(hv_ghcb->ghcb.save.valid_bitmap));
arch/x86/hyperv/ivm.c
125
static enum es_result hv_ghcb_hv_call(struct ghcb *ghcb, u64 exit_code,
arch/x86/hyperv/ivm.c
129
ghcb->protocol_version = hv_ghcb_version;
arch/x86/hyperv/ivm.c
130
ghcb->ghcb_usage = GHCB_DEFAULT_USAGE;
arch/x86/hyperv/ivm.c
132
ghcb_set_sw_exit_code(ghcb, exit_code);
arch/x86/hyperv/ivm.c
133
ghcb_set_sw_exit_info_1(ghcb, exit_info_1);
arch/x86/hyperv/ivm.c
134
ghcb_set_sw_exit_info_2(ghcb, exit_info_2);
arch/x86/hyperv/ivm.c
138
if (ghcb->save.sw_exit_info_1 & GENMASK_ULL(31, 0))
arch/x86/hyperv/ivm.c
208
ghcb_set_rcx(&hv_ghcb->ghcb, msr);
arch/x86/hyperv/ivm.c
209
ghcb_set_rax(&hv_ghcb->ghcb, lower_32_bits(value));
arch/x86/hyperv/ivm.c
210
ghcb_set_rdx(&hv_ghcb->ghcb, upper_32_bits(value));
arch/x86/hyperv/ivm.c
212
if (hv_ghcb_hv_call(&hv_ghcb->ghcb, SVM_EXIT_MSR, 1, 0))
arch/x86/hyperv/ivm.c
240
ghcb_set_rcx(&hv_ghcb->ghcb, msr);
arch/x86/hyperv/ivm.c
241
if (hv_ghcb_hv_call(&hv_ghcb->ghcb, SVM_EXIT_MSR, 0, 0))
arch/x86/hyperv/ivm.c
244
*value = (u64)lower_32_bits(hv_ghcb->ghcb.save.rax)
arch/x86/hyperv/ivm.c
245
| ((u64)lower_32_bits(hv_ghcb->ghcb.save.rdx) << 32);
arch/x86/hyperv/ivm.c
36
struct ghcb ghcb;
arch/x86/hyperv/ivm.c
92
hv_ghcb->ghcb.protocol_version = GHCB_PROTOCOL_MAX;
arch/x86/hyperv/ivm.c
93
hv_ghcb->ghcb.ghcb_usage = GHCB_USAGE_HYPERV_CALL;
arch/x86/include/asm/sev.h
539
static __always_inline void vc_ghcb_invalidate(struct ghcb *ghcb)
arch/x86/include/asm/sev.h
541
ghcb->save.sw_exit_code = 0;
arch/x86/include/asm/sev.h
542
__builtin_memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap));
arch/x86/include/asm/sev.h
564
enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb,
arch/x86/include/asm/sev.h
573
extern struct ghcb *boot_ghcb;
arch/x86/include/asm/svm.h
571
BUILD_BUG_ON(sizeof(struct ghcb) != EXPECTED_GHCB_SIZE);
arch/x86/include/asm/svm.h
604
BUILD_BUG_RESERVED_OFFSET(ghcb, 0xff0);
arch/x86/include/asm/svm.h
671
static __always_inline bool ghcb_##field##_is_valid(const struct ghcb *ghcb) \
arch/x86/include/asm/svm.h
674
(unsigned long *)&ghcb->save.valid_bitmap); \
arch/x86/include/asm/svm.h
677
static __always_inline u64 ghcb_get_##field(struct ghcb *ghcb) \
arch/x86/include/asm/svm.h
679
return ghcb->save.field; \
arch/x86/include/asm/svm.h
682
static __always_inline u64 ghcb_get_##field##_if_valid(struct ghcb *ghcb) \
arch/x86/include/asm/svm.h
684
return ghcb_##field##_is_valid(ghcb) ? ghcb->save.field : 0; \
arch/x86/include/asm/svm.h
687
static __always_inline void ghcb_set_##field(struct ghcb *ghcb, u64 value) \
arch/x86/include/asm/svm.h
690
(unsigned long *)&ghcb->save.valid_bitmap); \
arch/x86/include/asm/svm.h
691
ghcb->save.field = value; \
arch/x86/include/asm/x86_init.h
287
void (*sev_es_hcall_prepare)(struct ghcb *ghcb, struct pt_regs *regs);
arch/x86/include/asm/x86_init.h
288
bool (*sev_es_hcall_finish)(struct ghcb *ghcb, struct pt_regs *regs);
arch/x86/include/asm/x86_init.h
5
struct ghcb;
arch/x86/kernel/cpu/mshyperv.c
784
static void hv_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/cpu/mshyperv.c
787
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/kernel/cpu/mshyperv.c
788
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/kernel/cpu/mshyperv.c
789
ghcb_set_r8(ghcb, regs->r8);
arch/x86/kernel/cpu/mshyperv.c
792
static bool hv_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/cpu/vmware.c
551
static void vmware_sev_es_hcall_prepare(struct ghcb *ghcb,
arch/x86/kernel/cpu/vmware.c
555
ghcb_set_rip(ghcb, regs->ip);
arch/x86/kernel/cpu/vmware.c
556
ghcb_set_rbx(ghcb, regs->bx);
arch/x86/kernel/cpu/vmware.c
557
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/kernel/cpu/vmware.c
558
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/kernel/cpu/vmware.c
559
ghcb_set_rsi(ghcb, regs->si);
arch/x86/kernel/cpu/vmware.c
560
ghcb_set_rdi(ghcb, regs->di);
arch/x86/kernel/cpu/vmware.c
561
ghcb_set_rbp(ghcb, regs->bp);
arch/x86/kernel/cpu/vmware.c
564
static bool vmware_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/cpu/vmware.c
566
if (!(ghcb_rbx_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
567
ghcb_rcx_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
568
ghcb_rdx_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
569
ghcb_rsi_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
570
ghcb_rdi_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
571
ghcb_rbp_is_valid(ghcb)))
arch/x86/kernel/cpu/vmware.c
574
regs->bx = ghcb_get_rbx(ghcb);
arch/x86/kernel/cpu/vmware.c
575
regs->cx = ghcb_get_rcx(ghcb);
arch/x86/kernel/cpu/vmware.c
576
regs->dx = ghcb_get_rdx(ghcb);
arch/x86/kernel/cpu/vmware.c
577
regs->si = ghcb_get_rsi(ghcb);
arch/x86/kernel/cpu/vmware.c
578
regs->di = ghcb_get_rdi(ghcb);
arch/x86/kernel/cpu/vmware.c
579
regs->bp = ghcb_get_rbp(ghcb);
arch/x86/kernel/kvm.c
1022
static void kvm_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/kvm.c
1025
ghcb_set_rbx(ghcb, regs->bx);
arch/x86/kernel/kvm.c
1026
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/kernel/kvm.c
1027
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/kernel/kvm.c
1028
ghcb_set_rsi(ghcb, regs->si);
arch/x86/kernel/kvm.c
1031
static bool kvm_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kvm/svm/sev.c
3348
struct ghcb *ghcb = svm->sev_es.ghcb;
arch/x86/kvm/svm/sev.c
3358
ghcb_set_rax(ghcb, vcpu->arch.regs[VCPU_REGS_RAX]);
arch/x86/kvm/svm/sev.c
3359
ghcb_set_rbx(ghcb, vcpu->arch.regs[VCPU_REGS_RBX]);
arch/x86/kvm/svm/sev.c
3360
ghcb_set_rcx(ghcb, vcpu->arch.regs[VCPU_REGS_RCX]);
arch/x86/kvm/svm/sev.c
3361
ghcb_set_rdx(ghcb, vcpu->arch.regs[VCPU_REGS_RDX]);
arch/x86/kvm/svm/sev.c
3368
struct ghcb *ghcb = svm->sev_es.ghcb;
arch/x86/kvm/svm/sev.c
3384
BUILD_BUG_ON(sizeof(svm->sev_es.valid_bitmap) != sizeof(ghcb->save.valid_bitmap));
arch/x86/kvm/svm/sev.c
3385
memcpy(&svm->sev_es.valid_bitmap, &ghcb->save.valid_bitmap, sizeof(ghcb->save.valid_bitmap));
arch/x86/kvm/svm/sev.c
3408
memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap));
arch/x86/kvm/svm/sev.c
3476
if (svm->sev_es.ghcb) {
arch/x86/kvm/svm/sev.c
3478
svm->sev_es.ghcb = NULL;
arch/x86/kvm/svm/sev.c
3487
if (!svm->sev_es.ghcb)
arch/x86/kvm/svm/sev.c
3500
trace_kvm_vmgexit_exit(svm->vcpu.vcpu_id, svm->sev_es.ghcb);
arch/x86/kvm/svm/sev.c
3609
offsetof(struct ghcb, shared_buffer);
arch/x86/kvm/svm/sev.c
3611
offsetof(struct ghcb, reserved_0xff0);
arch/x86/kvm/svm/sev.c
3624
scratch_va = (void *)svm->sev_es.ghcb;
arch/x86/kvm/svm/sev.c
4175
ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, SNP_GUEST_ERR(vmm_error, 0));
arch/x86/kvm/svm/sev.c
4449
svm->sev_es.ghcb = svm->sev_es.ghcb_map.hva;
arch/x86/kvm/svm/sev.c
4451
trace_kvm_vmgexit_enter(vcpu->vcpu_id, svm->sev_es.ghcb);
arch/x86/kvm/svm/sev.c
4465
if (svm->sev_es.ghcb->ghcb_usage) {
arch/x86/kvm/svm/sev.c
4467
svm->sev_es.ghcb->ghcb_usage);
arch/x86/kvm/svm/svm.c
2948
if (!err || !is_sev_es_guest(vcpu) || WARN_ON_ONCE(!svm->sev_es.ghcb))
arch/x86/kvm/svm/svm.h
1063
return READ_ONCE(svm->sev_es.ghcb->save.field); \
arch/x86/kvm/svm/svm.h
250
struct ghcb *ghcb;
arch/x86/kvm/svm/svm.h
705
ghcb_set_sw_exit_info_1(svm->sev_es.ghcb, response);
arch/x86/kvm/svm/svm.h
706
ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, data);
arch/x86/kvm/trace.h
1845
TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb),
arch/x86/kvm/trace.h
1846
TP_ARGS(vcpu_id, ghcb),
arch/x86/kvm/trace.h
1857
__entry->exit_reason = ghcb->save.sw_exit_code;
arch/x86/kvm/trace.h
1858
__entry->info1 = ghcb->save.sw_exit_info_1;
arch/x86/kvm/trace.h
1859
__entry->info2 = ghcb->save.sw_exit_info_2;
arch/x86/kvm/trace.h
1871
TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb),
arch/x86/kvm/trace.h
1872
TP_ARGS(vcpu_id, ghcb),
arch/x86/kvm/trace.h
1883
__entry->exit_reason = ghcb->save.sw_exit_code;
arch/x86/kvm/trace.h
1884
__entry->info1 = ghcb->save.sw_exit_info_1;
arch/x86/kvm/trace.h
1885
__entry->info2 = ghcb->save.sw_exit_info_2;