Lines Matching refs:ghcb

87 static struct ghcb boot_ghcb_page __bss_decrypted __aligned(PAGE_SIZE);
93 static struct ghcb *boot_ghcb __section(".data");
112 struct ghcb ghcb_page;
121 struct ghcb backup_ghcb;
148 struct ghcb *ghcb; member
236 static noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state) in __sev_get_ghcb()
239 struct ghcb *ghcb; in __sev_get_ghcb() local
244 ghcb = &data->ghcb_page; in __sev_get_ghcb()
267 state->ghcb = &data->backup_ghcb; in __sev_get_ghcb()
270 *state->ghcb = *ghcb; in __sev_get_ghcb()
272 state->ghcb = NULL; in __sev_get_ghcb()
276 return ghcb; in __sev_get_ghcb()
514 static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt, in vc_slow_virt_to_phys() argument
635 struct ghcb *ghcb; in __sev_put_ghcb() local
640 ghcb = &data->ghcb_page; in __sev_put_ghcb()
642 if (state->ghcb) { in __sev_put_ghcb()
644 *ghcb = *state->ghcb; in __sev_put_ghcb()
646 state->ghcb = NULL; in __sev_put_ghcb()
652 vc_ghcb_invalidate(ghcb); in __sev_put_ghcb()
661 struct ghcb *ghcb; in svsm_perform_call_protocol() local
676 ghcb = __sev_get_ghcb(&state); in svsm_perform_call_protocol()
678 ghcb = RIP_REL_REF(boot_ghcb); in svsm_perform_call_protocol()
680 ghcb = NULL; in svsm_perform_call_protocol()
683 ret = ghcb ? svsm_perform_ghcb_protocol(ghcb, call) in svsm_perform_call_protocol()
698 struct ghcb *ghcb; in __sev_es_nmi_complete() local
700 ghcb = __sev_get_ghcb(&state); in __sev_es_nmi_complete()
702 vc_ghcb_invalidate(ghcb); in __sev_es_nmi_complete()
703 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_NMI_COMPLETE); in __sev_es_nmi_complete()
704 ghcb_set_sw_exit_info_1(ghcb, 0); in __sev_es_nmi_complete()
705 ghcb_set_sw_exit_info_2(ghcb, 0); in __sev_es_nmi_complete()
707 sev_es_wr_ghcb_msr(__pa_nodebug(ghcb)); in __sev_es_nmi_complete()
737 struct ghcb *ghcb; in get_jump_table_addr() local
745 ghcb = __sev_get_ghcb(&state); in get_jump_table_addr()
747 vc_ghcb_invalidate(ghcb); in get_jump_table_addr()
748 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_JUMP_TABLE); in get_jump_table_addr()
749 ghcb_set_sw_exit_info_1(ghcb, SVM_VMGEXIT_GET_AP_JUMP_TABLE); in get_jump_table_addr()
750 ghcb_set_sw_exit_info_2(ghcb, 0); in get_jump_table_addr()
752 sev_es_wr_ghcb_msr(__pa(ghcb)); in get_jump_table_addr()
755 if (ghcb_sw_exit_info_1_is_valid(ghcb) && in get_jump_table_addr()
756 ghcb_sw_exit_info_2_is_valid(ghcb)) in get_jump_table_addr()
757 ret = ghcb->save.sw_exit_info_2; in get_jump_table_addr()
856 struct ghcb *ghcb; in __set_pages_state() local
899 ghcb = __sev_get_ghcb(&state); in __set_pages_state()
901 ghcb = boot_ghcb; in __set_pages_state()
904 if (!ghcb || vmgexit_psc(ghcb, data)) in __set_pages_state()
979 unsigned long addr, end, size, ghcb; in unshare_all_memory() local
1008 ghcb = (unsigned long)&data->ghcb_page; in unshare_all_memory()
1010 if (addr <= ghcb && ghcb <= addr + size) { in unshare_all_memory()
1065 struct ghcb *ghcb; in snp_kexec_finish() local
1087 ghcb = &data->ghcb_page; in snp_kexec_finish()
1088 pte = lookup_address((unsigned long)ghcb, &level); in snp_kexec_finish()
1090 set_pte_enc(pte, level, (void *)ghcb); in snp_kexec_finish()
1091 snp_set_memory_private((unsigned long)ghcb, (size / PAGE_SIZE)); in snp_kexec_finish()
1188 struct ghcb *ghcb; in wakeup_cpu_via_vmgexit() local
1304 ghcb = __sev_get_ghcb(&state); in wakeup_cpu_via_vmgexit()
1306 vc_ghcb_invalidate(ghcb); in wakeup_cpu_via_vmgexit()
1307 ghcb_set_rax(ghcb, vmsa->sev_features); in wakeup_cpu_via_vmgexit()
1308 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_CREATION); in wakeup_cpu_via_vmgexit()
1309 ghcb_set_sw_exit_info_1(ghcb, in wakeup_cpu_via_vmgexit()
1313 ghcb_set_sw_exit_info_2(ghcb, __pa(vmsa)); in wakeup_cpu_via_vmgexit()
1315 sev_es_wr_ghcb_msr(__pa(ghcb)); in wakeup_cpu_via_vmgexit()
1318 if (!ghcb_sw_exit_info_1_is_valid(ghcb) || in wakeup_cpu_via_vmgexit()
1319 lower_32_bits(ghcb->save.sw_exit_info_1)) { in wakeup_cpu_via_vmgexit()
1469 static enum es_result vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_msr() argument
1491 ghcb_set_rcx(ghcb, regs->cx); in vc_handle_msr()
1493 ghcb_set_rax(ghcb, regs->ax); in vc_handle_msr()
1494 ghcb_set_rdx(ghcb, regs->dx); in vc_handle_msr()
1497 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MSR, write, 0); in vc_handle_msr()
1500 regs->ax = ghcb->save.rax; in vc_handle_msr()
1501 regs->dx = ghcb->save.rdx; in vc_handle_msr()
1510 struct ghcb *ghcb; in snp_register_per_cpu_ghcb() local
1513 ghcb = &data->ghcb_page; in snp_register_per_cpu_ghcb()
1515 snp_register_ghcb_early(__pa(ghcb)); in snp_register_per_cpu_ghcb()
1564 struct ghcb *ghcb; in sev_es_ap_hlt_loop() local
1566 ghcb = __sev_get_ghcb(&state); in sev_es_ap_hlt_loop()
1569 vc_ghcb_invalidate(ghcb); in sev_es_ap_hlt_loop()
1570 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_HLT_LOOP); in sev_es_ap_hlt_loop()
1571 ghcb_set_sw_exit_info_1(ghcb, 0); in sev_es_ap_hlt_loop()
1572 ghcb_set_sw_exit_info_2(ghcb, 0); in sev_es_ap_hlt_loop()
1574 sev_es_wr_ghcb_msr(__pa(ghcb)); in sev_es_ap_hlt_loop()
1578 if (ghcb_sw_exit_info_2_is_valid(ghcb) && in sev_es_ap_hlt_loop()
1579 ghcb->save.sw_exit_info_2) in sev_es_ap_hlt_loop()
1745 static enum es_result vc_do_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt, in vc_do_mmio() argument
1749 unsigned long ghcb_pa = __pa(ghcb); in vc_do_mmio()
1760 res = vc_slow_virt_to_phys(ghcb, ctxt, (unsigned long)ref, &paddr); in vc_do_mmio()
1772 ghcb_set_sw_scratch(ghcb, ghcb_pa + offsetof(struct ghcb, shared_buffer)); in vc_do_mmio()
1774 return sev_es_ghcb_hv_call(ghcb, ctxt, exit_code, exit_info_1, exit_info_2); in vc_do_mmio()
1844 static enum es_result vc_handle_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_mmio() argument
1868 memcpy(ghcb->shared_buffer, reg_data, bytes); in vc_handle_mmio()
1869 ret = vc_do_mmio(ghcb, ctxt, bytes, false); in vc_handle_mmio()
1872 memcpy(ghcb->shared_buffer, insn->immediate1.bytes, bytes); in vc_handle_mmio()
1873 ret = vc_do_mmio(ghcb, ctxt, bytes, false); in vc_handle_mmio()
1876 ret = vc_do_mmio(ghcb, ctxt, bytes, true); in vc_handle_mmio()
1884 memcpy(reg_data, ghcb->shared_buffer, bytes); in vc_handle_mmio()
1887 ret = vc_do_mmio(ghcb, ctxt, bytes, true); in vc_handle_mmio()
1893 memcpy(reg_data, ghcb->shared_buffer, bytes); in vc_handle_mmio()
1896 ret = vc_do_mmio(ghcb, ctxt, bytes, true); in vc_handle_mmio()
1901 u8 *val = (u8 *)ghcb->shared_buffer; in vc_handle_mmio()
1905 u16 *val = (u16 *)ghcb->shared_buffer; in vc_handle_mmio()
1912 memcpy(reg_data, ghcb->shared_buffer, bytes); in vc_handle_mmio()
1925 static enum es_result vc_handle_dr7_write(struct ghcb *ghcb, in vc_handle_dr7_write() argument
1955 ghcb_set_rax(ghcb, val); in vc_handle_dr7_write()
1956 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_WRITE_DR7, 0, 0); in vc_handle_dr7_write()
1966 static enum es_result vc_handle_dr7_read(struct ghcb *ghcb, in vc_handle_dr7_read() argument
1986 static enum es_result vc_handle_wbinvd(struct ghcb *ghcb, in vc_handle_wbinvd() argument
1989 return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_WBINVD, 0, 0); in vc_handle_wbinvd()
1992 static enum es_result vc_handle_rdpmc(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_rdpmc() argument
1996 ghcb_set_rcx(ghcb, ctxt->regs->cx); in vc_handle_rdpmc()
1998 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_RDPMC, 0, 0); in vc_handle_rdpmc()
2002 if (!(ghcb_rax_is_valid(ghcb) && ghcb_rdx_is_valid(ghcb))) in vc_handle_rdpmc()
2005 ctxt->regs->ax = ghcb->save.rax; in vc_handle_rdpmc()
2006 ctxt->regs->dx = ghcb->save.rdx; in vc_handle_rdpmc()
2011 static enum es_result vc_handle_monitor(struct ghcb *ghcb, in vc_handle_monitor() argument
2021 static enum es_result vc_handle_mwait(struct ghcb *ghcb, in vc_handle_mwait() argument
2028 static enum es_result vc_handle_vmmcall(struct ghcb *ghcb, in vc_handle_vmmcall() argument
2033 ghcb_set_rax(ghcb, ctxt->regs->ax); in vc_handle_vmmcall()
2034 ghcb_set_cpl(ghcb, user_mode(ctxt->regs) ? 3 : 0); in vc_handle_vmmcall()
2037 x86_platform.hyper.sev_es_hcall_prepare(ghcb, ctxt->regs); in vc_handle_vmmcall()
2039 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_VMMCALL, 0, 0); in vc_handle_vmmcall()
2043 if (!ghcb_rax_is_valid(ghcb)) in vc_handle_vmmcall()
2046 ctxt->regs->ax = ghcb->save.rax; in vc_handle_vmmcall()
2054 !x86_platform.hyper.sev_es_hcall_finish(ghcb, ctxt->regs)) in vc_handle_vmmcall()
2060 static enum es_result vc_handle_trap_ac(struct ghcb *ghcb, in vc_handle_trap_ac() argument
2074 struct ghcb *ghcb, in vc_handle_exitcode() argument
2084 result = vc_handle_dr7_read(ghcb, ctxt); in vc_handle_exitcode()
2087 result = vc_handle_dr7_write(ghcb, ctxt); in vc_handle_exitcode()
2090 result = vc_handle_trap_ac(ghcb, ctxt); in vc_handle_exitcode()
2094 result = vc_handle_rdtsc(ghcb, ctxt, exit_code); in vc_handle_exitcode()
2097 result = vc_handle_rdpmc(ghcb, ctxt); in vc_handle_exitcode()
2104 result = vc_handle_cpuid(ghcb, ctxt); in vc_handle_exitcode()
2107 result = vc_handle_ioio(ghcb, ctxt); in vc_handle_exitcode()
2110 result = vc_handle_msr(ghcb, ctxt); in vc_handle_exitcode()
2113 result = vc_handle_vmmcall(ghcb, ctxt); in vc_handle_exitcode()
2116 result = vc_handle_wbinvd(ghcb, ctxt); in vc_handle_exitcode()
2119 result = vc_handle_monitor(ghcb, ctxt); in vc_handle_exitcode()
2122 result = vc_handle_mwait(ghcb, ctxt); in vc_handle_exitcode()
2125 result = vc_handle_mmio(ghcb, ctxt); in vc_handle_exitcode()
2162 struct ghcb *ghcb; in vc_raw_handle_exception() local
2165 ghcb = __sev_get_ghcb(&state); in vc_raw_handle_exception()
2167 vc_ghcb_invalidate(ghcb); in vc_raw_handle_exception()
2171 result = vc_handle_exitcode(&ctxt, ghcb, error_code); in vc_raw_handle_exception()
2573 struct ghcb *ghcb; in snp_issue_guest_request() local
2584 ghcb = __sev_get_ghcb(&state); in snp_issue_guest_request()
2585 if (!ghcb) { in snp_issue_guest_request()
2590 vc_ghcb_invalidate(ghcb); in snp_issue_guest_request()
2593 ghcb_set_rax(ghcb, input->data_gpa); in snp_issue_guest_request()
2594 ghcb_set_rbx(ghcb, input->data_npages); in snp_issue_guest_request()
2597 ret = sev_es_ghcb_hv_call(ghcb, &ctxt, req->exit_code, input->req_gpa, input->resp_gpa); in snp_issue_guest_request()
2601 rio->exitinfo2 = ghcb->save.sw_exit_info_2; in snp_issue_guest_request()
2613 input->data_npages = ghcb_get_rbx(ghcb); in snp_issue_guest_request()