Lines Matching refs:ghcb

61 static struct ghcb boot_ghcb_page __bss_decrypted __aligned(PAGE_SIZE);
67 static struct ghcb *boot_ghcb __section(".data");
74 struct ghcb ghcb_page;
83 struct ghcb backup_ghcb;
110 struct ghcb *ghcb; member
202 static noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state) in __sev_get_ghcb()
205 struct ghcb *ghcb; in __sev_get_ghcb() local
210 ghcb = &data->ghcb_page; in __sev_get_ghcb()
233 state->ghcb = &data->backup_ghcb; in __sev_get_ghcb()
236 *state->ghcb = *ghcb; in __sev_get_ghcb()
238 state->ghcb = NULL; in __sev_get_ghcb()
242 return ghcb; in __sev_get_ghcb()
480 static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt, in vc_slow_virt_to_phys() argument
521 struct ghcb *ghcb; in __sev_put_ghcb() local
526 ghcb = &data->ghcb_page; in __sev_put_ghcb()
528 if (state->ghcb) { in __sev_put_ghcb()
530 *ghcb = *state->ghcb; in __sev_put_ghcb()
532 state->ghcb = NULL; in __sev_put_ghcb()
538 vc_ghcb_invalidate(ghcb); in __sev_put_ghcb()
546 struct ghcb *ghcb; in __sev_es_nmi_complete() local
548 ghcb = __sev_get_ghcb(&state); in __sev_es_nmi_complete()
550 vc_ghcb_invalidate(ghcb); in __sev_es_nmi_complete()
551 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_NMI_COMPLETE); in __sev_es_nmi_complete()
552 ghcb_set_sw_exit_info_1(ghcb, 0); in __sev_es_nmi_complete()
553 ghcb_set_sw_exit_info_2(ghcb, 0); in __sev_es_nmi_complete()
555 sev_es_wr_ghcb_msr(__pa_nodebug(ghcb)); in __sev_es_nmi_complete()
617 struct ghcb *ghcb; in get_jump_table_addr() local
625 ghcb = __sev_get_ghcb(&state); in get_jump_table_addr()
627 vc_ghcb_invalidate(ghcb); in get_jump_table_addr()
628 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_JUMP_TABLE); in get_jump_table_addr()
629 ghcb_set_sw_exit_info_1(ghcb, SVM_VMGEXIT_GET_AP_JUMP_TABLE); in get_jump_table_addr()
630 ghcb_set_sw_exit_info_2(ghcb, 0); in get_jump_table_addr()
632 sev_es_wr_ghcb_msr(__pa(ghcb)); in get_jump_table_addr()
635 if (ghcb_sw_exit_info_1_is_valid(ghcb) && in get_jump_table_addr()
636 ghcb_sw_exit_info_2_is_valid(ghcb)) in get_jump_table_addr()
637 ret = ghcb->save.sw_exit_info_2; in get_jump_table_addr()
764 struct ghcb *ghcb; in vmgexit_psc() local
772 ghcb = __sev_get_ghcb(&state); in vmgexit_psc()
773 if (!ghcb) { in vmgexit_psc()
779 data = (struct snp_psc_desc *)ghcb->shared_buffer; in vmgexit_psc()
780 memcpy(ghcb->shared_buffer, desc, min_t(int, GHCB_SHARED_BUF_SIZE, sizeof(*desc))); in vmgexit_psc()
798 ghcb_set_sw_scratch(ghcb, (u64)__pa(data)); in vmgexit_psc()
801 ret = sev_es_ghcb_hv_call(ghcb, &ctxt, SVM_VMGEXIT_PSC, 0, 0); in vmgexit_psc()
807 if (WARN(ret || ghcb->save.sw_exit_info_2, in vmgexit_psc()
809 ret, ghcb->save.sw_exit_info_2)) { in vmgexit_psc()
990 struct ghcb *ghcb; in wakeup_cpu_via_vmgexit() local
1097 ghcb = __sev_get_ghcb(&state); in wakeup_cpu_via_vmgexit()
1099 vc_ghcb_invalidate(ghcb); in wakeup_cpu_via_vmgexit()
1100 ghcb_set_rax(ghcb, vmsa->sev_features); in wakeup_cpu_via_vmgexit()
1101 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_CREATION); in wakeup_cpu_via_vmgexit()
1102 ghcb_set_sw_exit_info_1(ghcb, ((u64)apic_id << 32) | SVM_VMGEXIT_AP_CREATE); in wakeup_cpu_via_vmgexit()
1103 ghcb_set_sw_exit_info_2(ghcb, __pa(vmsa)); in wakeup_cpu_via_vmgexit()
1105 sev_es_wr_ghcb_msr(__pa(ghcb)); in wakeup_cpu_via_vmgexit()
1108 if (!ghcb_sw_exit_info_1_is_valid(ghcb) || in wakeup_cpu_via_vmgexit()
1109 lower_32_bits(ghcb->save.sw_exit_info_1)) { in wakeup_cpu_via_vmgexit()
1212 static enum es_result vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_msr() argument
1221 ghcb_set_rcx(ghcb, regs->cx); in vc_handle_msr()
1223 ghcb_set_rax(ghcb, regs->ax); in vc_handle_msr()
1224 ghcb_set_rdx(ghcb, regs->dx); in vc_handle_msr()
1227 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MSR, exit_info_1, 0); in vc_handle_msr()
1230 regs->ax = ghcb->save.rax; in vc_handle_msr()
1231 regs->dx = ghcb->save.rdx; in vc_handle_msr()
1240 struct ghcb *ghcb; in snp_register_per_cpu_ghcb() local
1243 ghcb = &data->ghcb_page; in snp_register_per_cpu_ghcb()
1245 snp_register_ghcb_early(__pa(ghcb)); in snp_register_per_cpu_ghcb()
1289 struct ghcb *ghcb; in sev_es_ap_hlt_loop() local
1291 ghcb = __sev_get_ghcb(&state); in sev_es_ap_hlt_loop()
1294 vc_ghcb_invalidate(ghcb); in sev_es_ap_hlt_loop()
1295 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_HLT_LOOP); in sev_es_ap_hlt_loop()
1296 ghcb_set_sw_exit_info_1(ghcb, 0); in sev_es_ap_hlt_loop()
1297 ghcb_set_sw_exit_info_2(ghcb, 0); in sev_es_ap_hlt_loop()
1299 sev_es_wr_ghcb_msr(__pa(ghcb)); in sev_es_ap_hlt_loop()
1303 if (ghcb_sw_exit_info_2_is_valid(ghcb) && in sev_es_ap_hlt_loop()
1304 ghcb->save.sw_exit_info_2) in sev_es_ap_hlt_loop()
1437 static enum es_result vc_do_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt, in vc_do_mmio() argument
1441 unsigned long ghcb_pa = __pa(ghcb); in vc_do_mmio()
1452 res = vc_slow_virt_to_phys(ghcb, ctxt, (unsigned long)ref, &paddr); in vc_do_mmio()
1464 ghcb_set_sw_scratch(ghcb, ghcb_pa + offsetof(struct ghcb, shared_buffer)); in vc_do_mmio()
1466 return sev_es_ghcb_hv_call(ghcb, ctxt, exit_code, exit_info_1, exit_info_2); in vc_do_mmio()
1536 static enum es_result vc_handle_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_mmio() argument
1557 memcpy(ghcb->shared_buffer, reg_data, bytes); in vc_handle_mmio()
1558 ret = vc_do_mmio(ghcb, ctxt, bytes, false); in vc_handle_mmio()
1561 memcpy(ghcb->shared_buffer, insn->immediate1.bytes, bytes); in vc_handle_mmio()
1562 ret = vc_do_mmio(ghcb, ctxt, bytes, false); in vc_handle_mmio()
1565 ret = vc_do_mmio(ghcb, ctxt, bytes, true); in vc_handle_mmio()
1573 memcpy(reg_data, ghcb->shared_buffer, bytes); in vc_handle_mmio()
1576 ret = vc_do_mmio(ghcb, ctxt, bytes, true); in vc_handle_mmio()
1582 memcpy(reg_data, ghcb->shared_buffer, bytes); in vc_handle_mmio()
1585 ret = vc_do_mmio(ghcb, ctxt, bytes, true); in vc_handle_mmio()
1590 u8 *val = (u8 *)ghcb->shared_buffer; in vc_handle_mmio()
1594 u16 *val = (u16 *)ghcb->shared_buffer; in vc_handle_mmio()
1601 memcpy(reg_data, ghcb->shared_buffer, bytes); in vc_handle_mmio()
1614 static enum es_result vc_handle_dr7_write(struct ghcb *ghcb, in vc_handle_dr7_write() argument
1641 ghcb_set_rax(ghcb, val); in vc_handle_dr7_write()
1642 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_WRITE_DR7, 0, 0); in vc_handle_dr7_write()
1652 static enum es_result vc_handle_dr7_read(struct ghcb *ghcb, in vc_handle_dr7_read() argument
1669 static enum es_result vc_handle_wbinvd(struct ghcb *ghcb, in vc_handle_wbinvd() argument
1672 return sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_WBINVD, 0, 0); in vc_handle_wbinvd()
1675 static enum es_result vc_handle_rdpmc(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_rdpmc() argument
1679 ghcb_set_rcx(ghcb, ctxt->regs->cx); in vc_handle_rdpmc()
1681 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_RDPMC, 0, 0); in vc_handle_rdpmc()
1685 if (!(ghcb_rax_is_valid(ghcb) && ghcb_rdx_is_valid(ghcb))) in vc_handle_rdpmc()
1688 ctxt->regs->ax = ghcb->save.rax; in vc_handle_rdpmc()
1689 ctxt->regs->dx = ghcb->save.rdx; in vc_handle_rdpmc()
1694 static enum es_result vc_handle_monitor(struct ghcb *ghcb, in vc_handle_monitor() argument
1704 static enum es_result vc_handle_mwait(struct ghcb *ghcb, in vc_handle_mwait() argument
1711 static enum es_result vc_handle_vmmcall(struct ghcb *ghcb, in vc_handle_vmmcall() argument
1716 ghcb_set_rax(ghcb, ctxt->regs->ax); in vc_handle_vmmcall()
1717 ghcb_set_cpl(ghcb, user_mode(ctxt->regs) ? 3 : 0); in vc_handle_vmmcall()
1720 x86_platform.hyper.sev_es_hcall_prepare(ghcb, ctxt->regs); in vc_handle_vmmcall()
1722 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_VMMCALL, 0, 0); in vc_handle_vmmcall()
1726 if (!ghcb_rax_is_valid(ghcb)) in vc_handle_vmmcall()
1729 ctxt->regs->ax = ghcb->save.rax; in vc_handle_vmmcall()
1737 !x86_platform.hyper.sev_es_hcall_finish(ghcb, ctxt->regs)) in vc_handle_vmmcall()
1743 static enum es_result vc_handle_trap_ac(struct ghcb *ghcb, in vc_handle_trap_ac() argument
1757 struct ghcb *ghcb, in vc_handle_exitcode() argument
1764 result = vc_handle_dr7_read(ghcb, ctxt); in vc_handle_exitcode()
1767 result = vc_handle_dr7_write(ghcb, ctxt); in vc_handle_exitcode()
1770 result = vc_handle_trap_ac(ghcb, ctxt); in vc_handle_exitcode()
1774 result = vc_handle_rdtsc(ghcb, ctxt, exit_code); in vc_handle_exitcode()
1777 result = vc_handle_rdpmc(ghcb, ctxt); in vc_handle_exitcode()
1784 result = vc_handle_cpuid(ghcb, ctxt); in vc_handle_exitcode()
1787 result = vc_handle_ioio(ghcb, ctxt); in vc_handle_exitcode()
1790 result = vc_handle_msr(ghcb, ctxt); in vc_handle_exitcode()
1793 result = vc_handle_vmmcall(ghcb, ctxt); in vc_handle_exitcode()
1796 result = vc_handle_wbinvd(ghcb, ctxt); in vc_handle_exitcode()
1799 result = vc_handle_monitor(ghcb, ctxt); in vc_handle_exitcode()
1802 result = vc_handle_mwait(ghcb, ctxt); in vc_handle_exitcode()
1805 result = vc_handle_mmio(ghcb, ctxt); in vc_handle_exitcode()
1869 struct ghcb *ghcb; in vc_raw_handle_exception() local
1872 ghcb = __sev_get_ghcb(&state); in vc_raw_handle_exception()
1874 vc_ghcb_invalidate(ghcb); in vc_raw_handle_exception()
1878 result = vc_handle_exitcode(&ctxt, ghcb, error_code); in vc_raw_handle_exception()
2183 struct ghcb *ghcb; in snp_issue_guest_request() local
2198 ghcb = __sev_get_ghcb(&state); in snp_issue_guest_request()
2199 if (!ghcb) { in snp_issue_guest_request()
2204 vc_ghcb_invalidate(ghcb); in snp_issue_guest_request()
2207 ghcb_set_rax(ghcb, input->data_gpa); in snp_issue_guest_request()
2208 ghcb_set_rbx(ghcb, input->data_npages); in snp_issue_guest_request()
2211 ret = sev_es_ghcb_hv_call(ghcb, &ctxt, exit_code, input->req_gpa, input->resp_gpa); in snp_issue_guest_request()
2215 if (ghcb->save.sw_exit_info_2) { in snp_issue_guest_request()
2218 ghcb->save.sw_exit_info_2 == SNP_GUEST_REQ_INVALID_LEN) in snp_issue_guest_request()
2219 input->data_npages = ghcb_get_rbx(ghcb); in snp_issue_guest_request()
2221 *fw_err = ghcb->save.sw_exit_info_2; in snp_issue_guest_request()