| /linux/arch/x86/coco/sev/ |
| H A D | vc-shared.c | 308 static enum es_result vc_handle_ioio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_ioio() argument 335 ghcb_count = sizeof(ghcb->shared_buffer) / io_bytes; in vc_handle_ioio() 347 ghcb->shared_buffer, io_bytes, in vc_handle_ioio() 358 sw_scratch = __pa(ghcb) + offsetof(struct ghcb, shared_buffer); in vc_handle_ioio() 359 ghcb_set_sw_scratch(ghcb, sw_scratch); in vc_handle_ioio() 360 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, in vc_handle_ioio() 369 ghcb->shared_buffer, io_bytes, in vc_handle_ioio() 400 ghcb_set_rax(ghcb, rax); in vc_handle_ioio() 402 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_IOIO, exit_info_1, 0); in vc_handle_ioio() 407 if (!ghcb_rax_is_valid(ghcb)) in vc_handle_ioio() [all …]
|
| H A D | noinstr.c | 96 struct ghcb *ghcb; in __sev_es_nmi_complete() local 98 ghcb = __sev_get_ghcb(&state); in __sev_es_nmi_complete() 100 vc_ghcb_invalidate(ghcb); in __sev_es_nmi_complete() 101 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_NMI_COMPLETE); in __sev_es_nmi_complete() 102 ghcb_set_sw_exit_info_1(ghcb, 0); in __sev_es_nmi_complete() 103 ghcb_set_sw_exit_info_2(ghcb, 0); in __sev_es_nmi_complete() 105 sev_es_wr_ghcb_msr(__pa_nodebug(ghcb)); in __sev_es_nmi_complete() 117 noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state) in __sev_get_ghcb() 120 struct ghcb *ghcb; in __sev_get_ghcb() local 128 ghcb = &data->ghcb_page; in __sev_get_ghcb() [all …]
|
| H A D | vc-handle.c | 39 static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt, in vc_slow_virt_to_phys() argument 407 enum es_result __vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt, bool write) in __vc_handle_msr() argument 433 ghcb_set_rcx(ghcb, regs->cx); in __vc_handle_msr() 435 ghcb_set_rax(ghcb, regs->ax); in __vc_handle_msr() 436 ghcb_set_rdx(ghcb, regs->dx); in __vc_handle_msr() 439 ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_MSR, write, 0); in __vc_handle_msr() 442 regs->ax = ghcb->save.rax; in __vc_handle_msr() 443 regs->dx = ghcb->save.rdx; in __vc_handle_msr() 449 static enum es_result vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt) in vc_handle_msr() argument 451 return __vc_handle_msr(ghcb, ctxt, ctxt->insn.opcode.bytes[1] == 0x30); in vc_handle_msr() [all …]
|
| H A D | core.c | 127 static struct ghcb boot_ghcb_page __bss_decrypted __aligned(PAGE_SIZE); 133 struct ghcb *boot_ghcb __section(".data"); 159 struct ghcb *ghcb; in get_jump_table_addr() local 167 ghcb = __sev_get_ghcb(&state); in get_jump_table_addr() 169 vc_ghcb_invalidate(ghcb); in get_jump_table_addr() 170 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_AP_JUMP_TABLE); in get_jump_table_addr() 171 ghcb_set_sw_exit_info_1(ghcb, SVM_VMGEXIT_GET_AP_JUMP_TABLE); in get_jump_table_addr() 172 ghcb_set_sw_exit_info_2(ghcb, 0); in get_jump_table_addr() 174 sev_es_wr_ghcb_msr(__pa(ghcb)); in get_jump_table_addr() 177 if (ghcb_sw_exit_info_1_is_valid(ghcb) && in get_jump_table_addr() [all …]
|
| H A D | svsm.c | 30 static int svsm_perform_ghcb_protocol(struct ghcb *ghcb, struct svsm_call *call) in svsm_perform_ghcb_protocol() argument 35 vc_ghcb_invalidate(ghcb); in svsm_perform_ghcb_protocol() 41 ghcb->protocol_version = ghcb_version; in svsm_perform_ghcb_protocol() 42 ghcb->ghcb_usage = GHCB_DEFAULT_USAGE; in svsm_perform_ghcb_protocol() 44 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_SNP_RUN_VMPL); in svsm_perform_ghcb_protocol() 45 ghcb_set_sw_exit_info_1(ghcb, 0); in svsm_perform_ghcb_protocol() 46 ghcb_set_sw_exit_info_2(ghcb, 0); in svsm_perform_ghcb_protocol() 48 sev_es_wr_ghcb_msr(__pa(ghcb)); in svsm_perform_ghcb_protocol() 55 switch (verify_exception_info(ghcb, &ctxt)) { in svsm_perform_ghcb_protocol() 72 struct ghcb *ghcb; in svsm_perform_call_protocol() local [all …]
|
| H A D | internal.h | 12 struct ghcb ghcb_page; 21 struct ghcb backup_ghcb; 48 struct ghcb *ghcb; member 53 struct ghcb *__sev_get_ghcb(struct ghcb_state *state); 67 enum es_result verify_exception_info(struct ghcb *ghcb, struct es_em_ctxt *ctxt); 88 enum es_result __vc_handle_msr(struct ghcb *ghcb, struct es_em_ctxt *ctxt, bool write);
|
| /linux/arch/x86/kernel/cpu/ |
| H A D | vmware.c | 550 static void vmware_sev_es_hcall_prepare(struct ghcb *ghcb, in vmware_sev_es_hcall_prepare() argument 554 ghcb_set_rip(ghcb, regs->ip); in vmware_sev_es_hcall_prepare() 555 ghcb_set_rbx(ghcb, regs->bx); in vmware_sev_es_hcall_prepare() 556 ghcb_set_rcx(ghcb, regs->cx); in vmware_sev_es_hcall_prepare() 557 ghcb_set_rdx(ghcb, regs->dx); in vmware_sev_es_hcall_prepare() 558 ghcb_set_rsi(ghcb, regs->si); in vmware_sev_es_hcall_prepare() 559 ghcb_set_rdi(ghcb, regs->di); in vmware_sev_es_hcall_prepare() 560 ghcb_set_rbp(ghcb, regs->bp); in vmware_sev_es_hcall_prepare() 563 static bool vmware_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs) in vmware_sev_es_hcall_finish() argument 565 if (!(ghcb_rbx_is_valid(ghcb) && in vmware_sev_es_hcall_finish() [all …]
|
| H A D | mshyperv.c | 770 static void hv_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs) in hv_sev_es_hcall_prepare() argument 773 ghcb_set_rcx(ghcb, regs->cx); in hv_sev_es_hcall_prepare() 774 ghcb_set_rdx(ghcb, regs->dx); in hv_sev_es_hcall_prepare() 775 ghcb_set_r8(ghcb, regs->r8); in hv_sev_es_hcall_prepare() 778 static bool hv_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs) in hv_sev_es_hcall_finish() argument
|
| /linux/arch/x86/hyperv/ |
| H A D | ivm.c | 36 struct ghcb ghcb; member 92 hv_ghcb->ghcb.protocol_version = GHCB_PROTOCOL_MAX; in hv_ghcb_hypercall() 93 hv_ghcb->ghcb.ghcb_usage = GHCB_USAGE_HYPERV_CALL; in hv_ghcb_hypercall() 104 hv_ghcb->ghcb.ghcb_usage = 0xffffffff; in hv_ghcb_hypercall() 105 memset(hv_ghcb->ghcb.save.valid_bitmap, 0, in hv_ghcb_hypercall() 106 sizeof(hv_ghcb->ghcb.save.valid_bitmap)); in hv_ghcb_hypercall() 125 static enum es_result hv_ghcb_hv_call(struct ghcb *ghcb, u64 exit_code, in hv_ghcb_hv_call() argument 129 ghcb->protocol_version = hv_ghcb_version; in hv_ghcb_hv_call() 130 ghcb->ghcb_usage = GHCB_DEFAULT_USAGE; in hv_ghcb_hv_call() 132 ghcb_set_sw_exit_code(ghcb, exit_code); in hv_ghcb_hv_call() [all …]
|
| /linux/arch/x86/boot/compressed/ |
| H A D | sev.c | 30 static struct ghcb boot_ghcb_page __aligned(PAGE_SIZE); 31 struct ghcb *boot_ghcb __section(".data"); 146 static void __noreturn sev_es_ghcb_terminate(struct ghcb *ghcb, unsigned int set, in sev_es_ghcb_terminate() argument 151 vc_ghcb_invalidate(ghcb); in sev_es_ghcb_terminate() 152 ghcb_set_sw_exit_code(ghcb, SVM_VMGEXIT_TERM_REQUEST); in sev_es_ghcb_terminate() 153 ghcb_set_sw_exit_info_1(ghcb, exit_info_1); in sev_es_ghcb_terminate() 154 ghcb_set_sw_exit_info_2(ghcb, exit_info_2); in sev_es_ghcb_terminate() 156 sev_es_wr_ghcb_msr(__pa(ghcb)); in sev_es_ghcb_terminate()
|
| /linux/arch/x86/include/asm/ |
| H A D | svm.h | 525 struct ghcb { struct 567 BUILD_BUG_ON(sizeof(struct ghcb) != EXPECTED_GHCB_SIZE); in __unused_size_checks() 600 BUILD_BUG_RESERVED_OFFSET(ghcb, 0xff0); in __unused_size_checks() 664 static __always_inline bool ghcb_##field##_is_valid(const struct ghcb *ghcb) \ 667 (unsigned long *)&ghcb->save.valid_bitmap); \ 670 static __always_inline u64 ghcb_get_##field(struct ghcb *ghcb) \ 672 return ghcb->save.field; \ 675 static __always_inline u64 ghcb_get_##field##_if_valid(struct ghcb *ghcb) \ 677 return ghcb_##field##_is_valid(ghcb) ? ghcb->save.field : 0; \ 680 static __always_inline void ghcb_set_##field(struct ghcb *ghcb, u64 value) \ [all …]
|
| H A D | x86_init.h | 5 struct ghcb; 284 void (*sev_es_hcall_prepare)(struct ghcb *ghcb, struct pt_regs *regs); 285 bool (*sev_es_hcall_finish)(struct ghcb *ghcb, struct pt_regs *regs);
|
| H A D | sev.h | 539 static __always_inline void vc_ghcb_invalidate(struct ghcb *ghcb) in vc_ghcb_invalidate() argument 541 ghcb->save.sw_exit_code = 0; in vc_ghcb_invalidate() 542 __builtin_memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap)); in vc_ghcb_invalidate() 564 enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb, 573 extern struct ghcb *boot_ghcb;
|
| /linux/arch/x86/kernel/ |
| H A D | kvm.c | 1027 static void kvm_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs) in kvm_sev_es_hcall_prepare() argument 1030 ghcb_set_rbx(ghcb, regs->bx); in kvm_sev_es_hcall_prepare() 1031 ghcb_set_rcx(ghcb, regs->cx); in kvm_sev_es_hcall_prepare() 1032 ghcb_set_rdx(ghcb, regs->dx); in kvm_sev_es_hcall_prepare() 1033 ghcb_set_rsi(ghcb, regs->si); in kvm_sev_es_hcall_prepare() 1036 static bool kvm_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs) in kvm_sev_es_hcall_finish() argument
|
| /linux/arch/x86/kvm/ |
| H A D | trace.h | 1845 TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb), 1846 TP_ARGS(vcpu_id, ghcb), 1857 __entry->exit_reason = ghcb->save.sw_exit_code; 1858 __entry->info1 = ghcb->save.sw_exit_info_1; 1859 __entry->info2 = ghcb->save.sw_exit_info_2; 1871 TP_PROTO(unsigned int vcpu_id, struct ghcb *ghcb), 1872 TP_ARGS(vcpu_id, ghcb), 1883 __entry->exit_reason = ghcb->save.sw_exit_code; 1884 __entry->info1 = ghcb->save.sw_exit_info_1; 1885 __entry->info2 = ghcb->save.sw_exit_info_2;
|
| /linux/arch/x86/kvm/svm/ |
| H A D | sev.c | 3319 struct ghcb *ghcb = svm->sev_es.ghcb; in sev_es_sync_to_ghcb() local 3329 ghcb_set_rax(ghcb, vcpu->arch.regs[VCPU_REGS_RAX]); in sev_es_sync_to_ghcb() 3330 ghcb_set_rbx(ghcb, vcpu->arch.regs[VCPU_REGS_RBX]); in sev_es_sync_to_ghcb() 3331 ghcb_set_rcx(ghcb, vcpu->arch.regs[VCPU_REGS_RCX]); in sev_es_sync_to_ghcb() 3332 ghcb_set_rdx(ghcb, vcpu->arch.regs[VCPU_REGS_RDX]); in sev_es_sync_to_ghcb() 3339 struct ghcb *ghcb = svm->sev_es.ghcb; in sev_es_sync_from_ghcb() local 3355 BUILD_BUG_ON(sizeof(svm->sev_es.valid_bitmap) != sizeof(ghcb->save.valid_bitmap)); in sev_es_sync_from_ghcb() 3356 memcpy(&svm->sev_es.valid_bitmap, &ghcb->save.valid_bitmap, sizeof(ghcb->save.valid_bitmap)); in sev_es_sync_from_ghcb() 3379 memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap)); in sev_es_sync_from_ghcb() 3389 if (svm->sev_es.ghcb->ghcb_usage) { in sev_es_validate_vmgexit() [all …]
|
| H A D | svm.h | 226 struct ghcb *ghcb; member 623 ghcb_set_sw_exit_info_1(svm->sev_es.ghcb, response); in svm_vmgexit_set_return_code() 624 ghcb_set_sw_exit_info_2(svm->sev_es.ghcb, data); in svm_vmgexit_set_return_code() 949 return READ_ONCE(svm->sev_es.ghcb->save.field); \
|
| H A D | svm.c | 2865 if (!err || !sev_es_guest(vcpu->kvm) || WARN_ON_ONCE(!svm->sev_es.ghcb)) in svm_complete_emulated_msr()
|