Lines Matching refs:ghcb
161 static __always_inline void vc_ghcb_invalidate(struct ghcb *ghcb) in vc_ghcb_invalidate() argument
163 ghcb->save.sw_exit_code = 0; in vc_ghcb_invalidate()
164 __builtin_memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap)); in vc_ghcb_invalidate()
194 static enum es_result verify_exception_info(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in verify_exception_info() argument
198 ret = ghcb->save.sw_exit_info_1 & GENMASK_ULL(31, 0); in verify_exception_info()
203 u64 info = ghcb->save.sw_exit_info_2; in verify_exception_info()
222 static enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb, in sev_es_ghcb_hv_call() argument
228 ghcb->protocol_version = ghcb_version; in sev_es_ghcb_hv_call()
229 ghcb->ghcb_usage = GHCB_DEFAULT_USAGE; in sev_es_ghcb_hv_call()
231 ghcb_set_sw_exit_code(ghcb, exit_code); in sev_es_ghcb_hv_call()
232 ghcb_set_sw_exit_info_1(ghcb, exit_info_1); in sev_es_ghcb_hv_call()
233 ghcb_set_sw_exit_info_2(ghcb, exit_info_2); in sev_es_ghcb_hv_call()
235 sev_es_wr_ghcb_msr(__pa(ghcb)); in sev_es_ghcb_hv_call()
238 return verify_exception_info(ghcb, ctxt); in sev_es_ghcb_hv_call()
740 static enum es_result vc_handle_ioio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_ioio() argument
767 ghcb_count = sizeof(ghcb->shared_buffer) / io_bytes; in vc_handle_ioio()
779 ghcb->shared_buffer, io_bytes, in vc_handle_ioio()
790 sw_scratch = __pa(ghcb) + offsetof(struct ghcb, shared_buffer); in vc_handle_ioio()
791 ghcb_set_sw_scratch(ghcb, sw_scratch); in vc_handle_ioio()
792 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, in vc_handle_ioio()
801 ghcb->shared_buffer, io_bytes, in vc_handle_ioio()
832 ghcb_set_rax(ghcb, rax); in vc_handle_ioio()
834 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, exit_info_1, 0); in vc_handle_ioio()
839 if (!ghcb_rax_is_valid(ghcb)) in vc_handle_ioio()
841 regs->ax = lower_bits(ghcb->save.rax, bits); in vc_handle_ioio()
866 static enum es_result vc_handle_cpuid(struct ghcb *ghcb, in vc_handle_cpuid() argument
880 ghcb_set_rax(ghcb, regs->ax); in vc_handle_cpuid()
881 ghcb_set_rcx(ghcb, regs->cx); in vc_handle_cpuid()
885 ghcb_set_xcr0(ghcb, xgetbv(XCR_XFEATURE_ENABLED_MASK)); in vc_handle_cpuid()
888 ghcb_set_xcr0(ghcb, 1); in vc_handle_cpuid()
890 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_CPUID, 0, 0); in vc_handle_cpuid()
894 if (!(ghcb_rax_is_valid(ghcb) && in vc_handle_cpuid()
895 ghcb_rbx_is_valid(ghcb) && in vc_handle_cpuid()
896 ghcb_rcx_is_valid(ghcb) && in vc_handle_cpuid()
897 ghcb_rdx_is_valid(ghcb))) in vc_handle_cpuid()
900 regs->ax = ghcb->save.rax; in vc_handle_cpuid()
901 regs->bx = ghcb->save.rbx; in vc_handle_cpuid()
902 regs->cx = ghcb->save.rcx; in vc_handle_cpuid()
903 regs->dx = ghcb->save.rdx; in vc_handle_cpuid()
908 static enum es_result vc_handle_rdtsc(struct ghcb *ghcb, in vc_handle_rdtsc() argument
915 ret = sev_es_ghcb_hv_call(ghcb, ctxt, exit_code, 0, 0); in vc_handle_rdtsc()
919 if (!(ghcb_rax_is_valid(ghcb) && ghcb_rdx_is_valid(ghcb) && in vc_handle_rdtsc()
920 (!rdtscp || ghcb_rcx_is_valid(ghcb)))) in vc_handle_rdtsc()
923 ctxt->regs->ax = ghcb->save.rax; in vc_handle_rdtsc()
924 ctxt->regs->dx = ghcb->save.rdx; in vc_handle_rdtsc()
926 ctxt->regs->cx = ghcb->save.rcx; in vc_handle_rdtsc()