Lines Matching refs:ghcb
64 static __always_inline void vc_ghcb_invalidate(struct ghcb *ghcb) in vc_ghcb_invalidate() argument
66 ghcb->save.sw_exit_code = 0; in vc_ghcb_invalidate()
67 memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap)); in vc_ghcb_invalidate()
97 static enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb, in sev_es_ghcb_hv_call() argument
105 ghcb->protocol_version = GHCB_PROTOCOL_MAX; in sev_es_ghcb_hv_call()
106 ghcb->ghcb_usage = GHCB_DEFAULT_USAGE; in sev_es_ghcb_hv_call()
108 ghcb_set_sw_exit_code(ghcb, exit_code); in sev_es_ghcb_hv_call()
109 ghcb_set_sw_exit_info_1(ghcb, exit_info_1); in sev_es_ghcb_hv_call()
110 ghcb_set_sw_exit_info_2(ghcb, exit_info_2); in sev_es_ghcb_hv_call()
112 sev_es_wr_ghcb_msr(__pa(ghcb)); in sev_es_ghcb_hv_call()
115 if ((ghcb->save.sw_exit_info_1 & 0xffffffff) == 1) { in sev_es_ghcb_hv_call()
116 u64 info = ghcb->save.sw_exit_info_2; in sev_es_ghcb_hv_call()
119 info = ghcb->save.sw_exit_info_2; in sev_es_ghcb_hv_call()
133 } else if (ghcb->save.sw_exit_info_1 & 0xffffffff) { in sev_es_ghcb_hv_call()
364 static enum es_result vc_handle_ioio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_ioio() argument
391 ghcb_count = sizeof(ghcb->shared_buffer) / io_bytes; in vc_handle_ioio()
403 ghcb->shared_buffer, io_bytes, in vc_handle_ioio()
414 sw_scratch = __pa(ghcb) + offsetof(struct ghcb, shared_buffer); in vc_handle_ioio()
415 ghcb_set_sw_scratch(ghcb, sw_scratch); in vc_handle_ioio()
416 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, in vc_handle_ioio()
425 ghcb->shared_buffer, io_bytes, in vc_handle_ioio()
456 ghcb_set_rax(ghcb, rax); in vc_handle_ioio()
458 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, exit_info_1, 0); in vc_handle_ioio()
463 if (!ghcb_rax_is_valid(ghcb)) in vc_handle_ioio()
465 regs->ax = lower_bits(ghcb->save.rax, bits); in vc_handle_ioio()
472 static enum es_result vc_handle_cpuid(struct ghcb *ghcb, in vc_handle_cpuid() argument
479 ghcb_set_rax(ghcb, regs->ax); in vc_handle_cpuid()
480 ghcb_set_rcx(ghcb, regs->cx); in vc_handle_cpuid()
484 ghcb_set_xcr0(ghcb, xgetbv(XCR_XFEATURE_ENABLED_MASK)); in vc_handle_cpuid()
487 ghcb_set_xcr0(ghcb, 1); in vc_handle_cpuid()
489 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_CPUID, 0, 0); in vc_handle_cpuid()
493 if (!(ghcb_rax_is_valid(ghcb) && in vc_handle_cpuid()
494 ghcb_rbx_is_valid(ghcb) && in vc_handle_cpuid()
495 ghcb_rcx_is_valid(ghcb) && in vc_handle_cpuid()
496 ghcb_rdx_is_valid(ghcb))) in vc_handle_cpuid()
499 regs->ax = ghcb->save.rax; in vc_handle_cpuid()
500 regs->bx = ghcb->save.rbx; in vc_handle_cpuid()
501 regs->cx = ghcb->save.rcx; in vc_handle_cpuid()
502 regs->dx = ghcb->save.rdx; in vc_handle_cpuid()
507 static enum es_result vc_handle_rdtsc(struct ghcb *ghcb, in vc_handle_rdtsc() argument
514 ret = sev_es_ghcb_hv_call(ghcb, ctxt, exit_code, 0, 0); in vc_handle_rdtsc()
518 if (!(ghcb_rax_is_valid(ghcb) && ghcb_rdx_is_valid(ghcb) && in vc_handle_rdtsc()
519 (!rdtscp || ghcb_rcx_is_valid(ghcb)))) in vc_handle_rdtsc()
522 ctxt->regs->ax = ghcb->save.rax; in vc_handle_rdtsc()
523 ctxt->regs->dx = ghcb->save.rdx; in vc_handle_rdtsc()
525 ctxt->regs->cx = ghcb->save.rcx; in vc_handle_rdtsc()