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
1016
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1020
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1021
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1023
res = __vc_handle_msr(ghcb, &ctxt, true);
arch/x86/coco/sev/core.c
1038
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1042
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1043
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1045
ghcb_set_rax(ghcb, SVM_VMGEXIT_SAVIC_SELF_GPA);
arch/x86/coco/sev/core.c
1046
ghcb_set_rbx(ghcb, gpa);
arch/x86/coco/sev/core.c
1047
res = sev_es_ghcb_hv_call(ghcb, &ctxt, SVM_VMGEXIT_SAVIC,
arch/x86/coco/sev/core.c
1060
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1064
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1065
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1067
ghcb_set_rax(ghcb, SVM_VMGEXIT_SAVIC_SELF_GPA);
arch/x86/coco/sev/core.c
1068
res = sev_es_ghcb_hv_call(ghcb, &ctxt, SVM_VMGEXIT_SAVIC,
arch/x86/coco/sev/core.c
1071
*gpa = ghcb->save.rbx;
arch/x86/coco/sev/core.c
1081
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1084
ghcb = &data->ghcb_page;
arch/x86/coco/sev/core.c
1086
snp_register_ghcb_early(__pa(ghcb));
arch/x86/coco/sev/core.c
1135
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1137
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1140
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1141
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_HLT_LOOP);
arch/x86/coco/sev/core.c
1142
ghcb_set_sw_exit_info_1(ghcb, 0);
arch/x86/coco/sev/core.c
1143
ghcb_set_sw_exit_info_2(ghcb, 0);
arch/x86/coco/sev/core.c
1145
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/core.c
1149
if (ghcb_sw_exit_info_2_is_valid(ghcb) &&
arch/x86/coco/sev/core.c
1150
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
133
struct ghcb *boot_ghcb __section(".data");
arch/x86/coco/sev/core.c
1330
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
1341
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
1342
if (!ghcb) {
arch/x86/coco/sev/core.c
1347
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
1350
ghcb_set_rax(ghcb, input->data_gpa);
arch/x86/coco/sev/core.c
1351
ghcb_set_rbx(ghcb, input->data_npages);
arch/x86/coco/sev/core.c
1354
ret = sev_es_ghcb_hv_call(ghcb, &ctxt, req->exit_code, input->req_gpa, input->resp_gpa);
arch/x86/coco/sev/core.c
1358
req->exitinfo2 = ghcb->save.sw_exit_info_2;
arch/x86/coco/sev/core.c
1370
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
371
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
373
ghcb = boot_ghcb;
arch/x86/coco/sev/core.c
376
if (!ghcb || vmgexit_psc(ghcb, data))
arch/x86/coco/sev/core.c
444
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
449
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
451
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
454
ghcb_set_rax(ghcb, vmsa->sev_features);
arch/x86/coco/sev/core.c
456
ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_CREATION);
arch/x86/coco/sev/core.c
457
ghcb_set_sw_exit_info_1(ghcb,
arch/x86/coco/sev/core.c
461
ghcb_set_sw_exit_info_2(ghcb, __pa(vmsa));
arch/x86/coco/sev/core.c
463
sev_es_wr_ghcb_msr(__pa(ghcb));
arch/x86/coco/sev/core.c
466
if (!ghcb_sw_exit_info_1_is_valid(ghcb) ||
arch/x86/coco/sev/core.c
467
lower_32_bits(ghcb->save.sw_exit_info_1)) {
arch/x86/coco/sev/core.c
550
unsigned long addr, end, size, ghcb;
arch/x86/coco/sev/core.c
579
ghcb = (unsigned long)&data->ghcb_page;
arch/x86/coco/sev/core.c
582
if (addr <= ghcb && ghcb < addr + size) {
arch/x86/coco/sev/core.c
696
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
720
ghcb = &data->ghcb_page;
arch/x86/coco/sev/core.c
721
pte = lookup_address((unsigned long)ghcb, &level);
arch/x86/coco/sev/core.c
724
addr = (unsigned long)ghcb & page_level_mask(level);
arch/x86/coco/sev/core.c
986
struct ghcb *ghcb;
arch/x86/coco/sev/core.c
990
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/core.c
991
vc_ghcb_invalidate(ghcb);
arch/x86/coco/sev/core.c
993
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
88
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
128
ghcb = &data->ghcb_page;
arch/x86/coco/sev/noinstr.c
151
state->ghcb = &data->backup_ghcb;
arch/x86/coco/sev/noinstr.c
154
*state->ghcb = *ghcb;
arch/x86/coco/sev/noinstr.c
156
state->ghcb = NULL;
arch/x86/coco/sev/noinstr.c
160
return ghcb;
arch/x86/coco/sev/noinstr.c
166
struct ghcb *ghcb;
arch/x86/coco/sev/noinstr.c
174
ghcb = &data->ghcb_page;
arch/x86/coco/sev/noinstr.c
176
if (state->ghcb) {
arch/x86/coco/sev/noinstr.c
178
*ghcb = *state->ghcb;
arch/x86/coco/sev/noinstr.c
180
state->ghcb = NULL;
arch/x86/coco/sev/noinstr.c
186
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
78
ghcb = __sev_get_ghcb(&state);
arch/x86/coco/sev/svsm.c
80
ghcb = boot_ghcb;
arch/x86/coco/sev/svsm.c
82
ghcb = NULL;
arch/x86/coco/sev/svsm.c
85
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
567
BUILD_BUG_ON(sizeof(struct ghcb) != EXPECTED_GHCB_SIZE);
arch/x86/include/asm/svm.h
600
BUILD_BUG_RESERVED_OFFSET(ghcb, 0xff0);
arch/x86/include/asm/svm.h
664
static __always_inline bool ghcb_##field##_is_valid(const struct ghcb *ghcb) \
arch/x86/include/asm/svm.h
667
(unsigned long *)&ghcb->save.valid_bitmap); \
arch/x86/include/asm/svm.h
670
static __always_inline u64 ghcb_get_##field(struct ghcb *ghcb) \
arch/x86/include/asm/svm.h
672
return ghcb->save.field; \
arch/x86/include/asm/svm.h
675
static __always_inline u64 ghcb_get_##field##_if_valid(struct ghcb *ghcb) \
arch/x86/include/asm/svm.h
677
return ghcb_##field##_is_valid(ghcb) ? ghcb->save.field : 0; \
arch/x86/include/asm/svm.h
680
static __always_inline void ghcb_set_##field(struct ghcb *ghcb, u64 value) \
arch/x86/include/asm/svm.h
683
(unsigned long *)&ghcb->save.valid_bitmap); \
arch/x86/include/asm/svm.h
684
ghcb->save.field = value; \
arch/x86/include/asm/x86_init.h
284
void (*sev_es_hcall_prepare)(struct ghcb *ghcb, struct pt_regs *regs);
arch/x86/include/asm/x86_init.h
285
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
770
static void hv_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/cpu/mshyperv.c
773
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/kernel/cpu/mshyperv.c
774
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/kernel/cpu/mshyperv.c
775
ghcb_set_r8(ghcb, regs->r8);
arch/x86/kernel/cpu/mshyperv.c
778
static bool hv_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/cpu/vmware.c
550
static void vmware_sev_es_hcall_prepare(struct ghcb *ghcb,
arch/x86/kernel/cpu/vmware.c
554
ghcb_set_rip(ghcb, regs->ip);
arch/x86/kernel/cpu/vmware.c
555
ghcb_set_rbx(ghcb, regs->bx);
arch/x86/kernel/cpu/vmware.c
556
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/kernel/cpu/vmware.c
557
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/kernel/cpu/vmware.c
558
ghcb_set_rsi(ghcb, regs->si);
arch/x86/kernel/cpu/vmware.c
559
ghcb_set_rdi(ghcb, regs->di);
arch/x86/kernel/cpu/vmware.c
560
ghcb_set_rbp(ghcb, regs->bp);
arch/x86/kernel/cpu/vmware.c
563
static bool vmware_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/cpu/vmware.c
565
if (!(ghcb_rbx_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
566
ghcb_rcx_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
567
ghcb_rdx_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
568
ghcb_rsi_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
569
ghcb_rdi_is_valid(ghcb) &&
arch/x86/kernel/cpu/vmware.c
570
ghcb_rbp_is_valid(ghcb)))
arch/x86/kernel/cpu/vmware.c
573
regs->bx = ghcb_get_rbx(ghcb);
arch/x86/kernel/cpu/vmware.c
574
regs->cx = ghcb_get_rcx(ghcb);
arch/x86/kernel/cpu/vmware.c
575
regs->dx = ghcb_get_rdx(ghcb);
arch/x86/kernel/cpu/vmware.c
576
regs->si = ghcb_get_rsi(ghcb);
arch/x86/kernel/cpu/vmware.c
577
regs->di = ghcb_get_rdi(ghcb);
arch/x86/kernel/cpu/vmware.c
578
regs->bp = ghcb_get_rbp(ghcb);
arch/x86/kernel/kvm.c
1027
static void kvm_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kernel/kvm.c
1030
ghcb_set_rbx(ghcb, regs->bx);
arch/x86/kernel/kvm.c
1031
ghcb_set_rcx(ghcb, regs->cx);
arch/x86/kernel/kvm.c
1032
ghcb_set_rdx(ghcb, regs->dx);
arch/x86/kernel/kvm.c
1033
ghcb_set_rsi(ghcb, regs->si);
arch/x86/kernel/kvm.c
1036
static bool kvm_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs)
arch/x86/kvm/svm/sev.c
3319
struct ghcb *ghcb = svm->sev_es.ghcb;
arch/x86/kvm/svm/sev.c
3329
ghcb_set_rax(ghcb, vcpu->arch.regs[VCPU_REGS_RAX]);
arch/x86/kvm/svm/sev.c
3330
ghcb_set_rbx(ghcb, vcpu->arch.regs[VCPU_REGS_RBX]);
arch/x86/kvm/svm/sev.c
3331
ghcb_set_rcx(ghcb, vcpu->arch.regs[VCPU_REGS_RCX]);
arch/x86/kvm/svm/sev.c
3332
ghcb_set_rdx(ghcb, vcpu->arch.regs[VCPU_REGS_RDX]);
arch/x86/kvm/svm/sev.c
3339
struct ghcb *ghcb = svm->sev_es.ghcb;
arch/x86/kvm/svm/sev.c
3355
BUILD_BUG_ON(sizeof(svm->sev_es.valid_bitmap) != sizeof(ghcb->save.valid_bitmap));
arch/x86/kvm/svm/sev.c
3356
memcpy(&svm->sev_es.valid_bitmap, &ghcb->save.valid_bitmap, sizeof(ghcb->save.valid_bitmap));
arch/x86/kvm/svm/sev.c
3379
memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap));
arch/x86/kvm/svm/sev.c
3389
if (svm->sev_es.ghcb->ghcb_usage) {
arch/x86/kvm/svm/sev.c
3508
svm->sev_es.ghcb->ghcb_usage);
arch/x86/kvm/svm/sev.c
3529
if (!svm->sev_es.ghcb)
arch/x86/kvm/svm/sev.c
3551
trace_kvm_vmgexit_exit(svm->vcpu.vcpu_id, svm->sev_es.ghcb);
arch/x86/kvm/svm/sev.c
3556
svm->sev_es.ghcb = NULL;
arch/x86/kvm/svm/sev.c
3625
offsetof(struct ghcb, shared_buffer);
arch/x86/kvm/svm/sev.c
3627
offsetof(struct ghcb, reserved_0xff0);
arch/x86/kvm/svm/sev.c
3640
scratch_va = (void *)svm->sev_es.ghcb;
arch/x86/kvm/svm/sev.c
4156
ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, SNP_GUEST_ERR(vmm_error, 0));
arch/x86/kvm/svm/sev.c
4417
svm->sev_es.ghcb = svm->sev_es.ghcb_map.hva;
arch/x86/kvm/svm/sev.c
4419
trace_kvm_vmgexit_enter(vcpu->vcpu_id, svm->sev_es.ghcb);
arch/x86/kvm/svm/svm.c
2865
if (!err || !sev_es_guest(vcpu->kvm) || WARN_ON_ONCE(!svm->sev_es.ghcb))
arch/x86/kvm/svm/svm.h
226
struct ghcb *ghcb;
arch/x86/kvm/svm/svm.h
623
ghcb_set_sw_exit_info_1(svm->sev_es.ghcb, response);
arch/x86/kvm/svm/svm.h
624
ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, data);
arch/x86/kvm/svm/svm.h
949
return READ_ONCE(svm->sev_es.ghcb->save.field); \
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;