[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v7 10/15] x86/hvm: Remove loop from hvm_save_cpu_ctxt func
Signed-off-by: Alexandru Isaila <aisaila@xxxxxxxxxxxxxxx> --- xen/arch/x86/hvm/hvm.c | 166 ++++++++++++++++++-------------------- xen/include/asm-x86/hvm/support.h | 2 + 2 files changed, 80 insertions(+), 88 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 701e81c..38e5e96 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -772,123 +772,113 @@ static int hvm_load_tsc_adjust(struct domain *d, hvm_domain_context_t *h) HVM_REGISTER_SAVE_RESTORE(TSC_ADJUST, hvm_save_tsc_adjust, hvm_load_tsc_adjust, 1, HVMSR_PER_VCPU); -static void hvm_save_cpu_ctxt_one(struct vcpu *v, struct hvm_hw_cpu *ctxt) +static int hvm_save_cpu_ctxt(struct domain *d, hvm_domain_context_t *h) { struct segment_register seg; + struct hvm_hw_cpu ctxt = {}; + struct vcpu *v = NULL; + + /* We don't need to save state for a vcpu that is down; the restore + * code will leave it down if there is nothing saved. */ + if ( v->pause_flags & VPF_down ) + return CONTINUE; /* Architecture-specific vmcs/vmcb bits */ - hvm_funcs.save_cpu_ctxt(v, ctxt); + hvm_funcs.save_cpu_ctxt(v, &ctxt); - ctxt->tsc = hvm_get_guest_tsc_fixed(v, v->domain->arch.hvm_domain.sync_tsc); + ctxt.tsc = hvm_get_guest_tsc_fixed(v, v->domain->arch.hvm_domain.sync_tsc); - ctxt->msr_tsc_aux = hvm_msr_tsc_aux(v); + ctxt.msr_tsc_aux = hvm_msr_tsc_aux(v); hvm_get_segment_register(v, x86_seg_idtr, &seg); - ctxt->idtr_limit = seg.limit; - ctxt->idtr_base = seg.base; + ctxt.idtr_limit = seg.limit; + ctxt.idtr_base = seg.base; hvm_get_segment_register(v, x86_seg_gdtr, &seg); - ctxt->gdtr_limit = seg.limit; - ctxt->gdtr_base = seg.base; + ctxt.gdtr_limit = seg.limit; + ctxt.gdtr_base = seg.base; hvm_get_segment_register(v, x86_seg_cs, &seg); - ctxt->cs_sel = seg.sel; - ctxt->cs_limit = seg.limit; - ctxt->cs_base = seg.base; - ctxt->cs_arbytes = seg.attr; + ctxt.cs_sel = seg.sel; + ctxt.cs_limit = seg.limit; + ctxt.cs_base = seg.base; + ctxt.cs_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_ds, &seg); - ctxt->ds_sel = seg.sel; - ctxt->ds_limit = seg.limit; - ctxt->ds_base = seg.base; - ctxt->ds_arbytes = seg.attr; + ctxt.ds_sel = seg.sel; + ctxt.ds_limit = seg.limit; + ctxt.ds_base = seg.base; + ctxt.ds_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_es, &seg); - ctxt->es_sel = seg.sel; - ctxt->es_limit = seg.limit; - ctxt->es_base = seg.base; - ctxt->es_arbytes = seg.attr; + ctxt.es_sel = seg.sel; + ctxt.es_limit = seg.limit; + ctxt.es_base = seg.base; + ctxt.es_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_ss, &seg); - ctxt->ss_sel = seg.sel; - ctxt->ss_limit = seg.limit; - ctxt->ss_base = seg.base; - ctxt->ss_arbytes = seg.attr; + ctxt.ss_sel = seg.sel; + ctxt.ss_limit = seg.limit; + ctxt.ss_base = seg.base; + ctxt.ss_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_fs, &seg); - ctxt->fs_sel = seg.sel; - ctxt->fs_limit = seg.limit; - ctxt->fs_base = seg.base; - ctxt->fs_arbytes = seg.attr; + ctxt.fs_sel = seg.sel; + ctxt.fs_limit = seg.limit; + ctxt.fs_base = seg.base; + ctxt.fs_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_gs, &seg); - ctxt->gs_sel = seg.sel; - ctxt->gs_limit = seg.limit; - ctxt->gs_base = seg.base; - ctxt->gs_arbytes = seg.attr; + ctxt.gs_sel = seg.sel; + ctxt.gs_limit = seg.limit; + ctxt.gs_base = seg.base; + ctxt.gs_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_tr, &seg); - ctxt->tr_sel = seg.sel; - ctxt->tr_limit = seg.limit; - ctxt->tr_base = seg.base; - ctxt->tr_arbytes = seg.attr; + ctxt.tr_sel = seg.sel; + ctxt.tr_limit = seg.limit; + ctxt.tr_base = seg.base; + ctxt.tr_arbytes = seg.attr; hvm_get_segment_register(v, x86_seg_ldtr, &seg); - ctxt->ldtr_sel = seg.sel; - ctxt->ldtr_limit = seg.limit; - ctxt->ldtr_base = seg.base; - ctxt->ldtr_arbytes = seg.attr; + ctxt.ldtr_sel = seg.sel; + ctxt.ldtr_limit = seg.limit; + ctxt.ldtr_base = seg.base; + ctxt.ldtr_arbytes = seg.attr; if ( v->fpu_initialised ) { - memcpy(ctxt->fpu_regs, v->arch.fpu_ctxt, sizeof(ctxt->fpu_regs)); - ctxt->flags = XEN_X86_FPU_INITIALISED; - } - - ctxt->rax = v->arch.user_regs.rax; - ctxt->rbx = v->arch.user_regs.rbx; - ctxt->rcx = v->arch.user_regs.rcx; - ctxt->rdx = v->arch.user_regs.rdx; - ctxt->rbp = v->arch.user_regs.rbp; - ctxt->rsi = v->arch.user_regs.rsi; - ctxt->rdi = v->arch.user_regs.rdi; - ctxt->rsp = v->arch.user_regs.rsp; - ctxt->rip = v->arch.user_regs.rip; - ctxt->rflags = v->arch.user_regs.rflags; - ctxt->r8 = v->arch.user_regs.r8; - ctxt->r9 = v->arch.user_regs.r9; - ctxt->r10 = v->arch.user_regs.r10; - ctxt->r11 = v->arch.user_regs.r11; - ctxt->r12 = v->arch.user_regs.r12; - ctxt->r13 = v->arch.user_regs.r13; - ctxt->r14 = v->arch.user_regs.r14; - ctxt->r15 = v->arch.user_regs.r15; - ctxt->dr0 = v->arch.debugreg[0]; - ctxt->dr1 = v->arch.debugreg[1]; - ctxt->dr2 = v->arch.debugreg[2]; - ctxt->dr3 = v->arch.debugreg[3]; - ctxt->dr6 = v->arch.debugreg[6]; - ctxt->dr7 = v->arch.debugreg[7]; -} - -static int hvm_save_cpu_ctxt(struct domain *d, hvm_domain_context_t *h) -{ - struct vcpu *v; - struct hvm_hw_cpu ctxt; - - for_each_vcpu ( d, v ) - { - /* We don't need to save state for a vcpu that is down; the restore - * code will leave it down if there is nothing saved. */ - if ( v->pause_flags & VPF_down ) - continue; - - memset(&ctxt, 0, sizeof(ctxt)); - hvm_save_cpu_ctxt_one(v, &ctxt); - - if ( hvm_save_entry(CPU, v->vcpu_id, h, &ctxt) != 0 ) - return 1; - } + memcpy(ctxt.fpu_regs, v->arch.fpu_ctxt, sizeof(ctxt.fpu_regs)); + ctxt.flags = XEN_X86_FPU_INITIALISED; + } + + ctxt.rax = v->arch.user_regs.rax; + ctxt.rbx = v->arch.user_regs.rbx; + ctxt.rcx = v->arch.user_regs.rcx; + ctxt.rdx = v->arch.user_regs.rdx; + ctxt.rbp = v->arch.user_regs.rbp; + ctxt.rsi = v->arch.user_regs.rsi; + ctxt.rdi = v->arch.user_regs.rdi; + ctxt.rsp = v->arch.user_regs.rsp; + ctxt.rip = v->arch.user_regs.rip; + ctxt.rflags = v->arch.user_regs.rflags; + ctxt.r8 = v->arch.user_regs.r8; + ctxt.r9 = v->arch.user_regs.r9; + ctxt.r10 = v->arch.user_regs.r10; + ctxt.r11 = v->arch.user_regs.r11; + ctxt.r12 = v->arch.user_regs.r12; + ctxt.r13 = v->arch.user_regs.r13; + ctxt.r14 = v->arch.user_regs.r14; + ctxt.r15 = v->arch.user_regs.r15; + ctxt.dr0 = v->arch.debugreg[0]; + ctxt.dr1 = v->arch.debugreg[1]; + ctxt.dr2 = v->arch.debugreg[2]; + ctxt.dr3 = v->arch.debugreg[3]; + ctxt.dr6 = v->arch.debugreg[6]; + ctxt.dr7 = v->arch.debugreg[7]; + + if ( hvm_save_entry(CPU, v->vcpu_id, h, &ctxt) != 0 ) + return 1; return 0; } diff --git a/xen/include/asm-x86/hvm/support.h b/xen/include/asm-x86/hvm/support.h index ac33eea..f8988e0 100644 --- a/xen/include/asm-x86/hvm/support.h +++ b/xen/include/asm-x86/hvm/support.h @@ -52,6 +52,8 @@ extern unsigned int opt_hvm_debug_level; #define HVM_DBG_LOG(level, _f, _a...) do {} while (0) #endif +#define CONTINUE 2 + extern unsigned long hvm_io_bitmap[]; enum hvm_translation_result { -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |