[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v7 03/15] x86/hvm: Introduce hvm_save_cpu_ctxt_one func
This is used to save data from a single instance. Signed-off-by: Alexandru Isaila <aisaila@xxxxxxxxxxxxxxx> --- xen/arch/x86/hvm/hvm.c | 195 +++++++++++++++++++++++++------------------------ 1 file changed, 100 insertions(+), 95 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 76f7db9..b254378 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -785,11 +785,109 @@ 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) +{ + struct segment_register seg; + + /* Architecture-specific vmcs/vmcb bits */ + hvm_funcs.save_cpu_ctxt(v, ctxt); + + ctxt->tsc = hvm_get_guest_tsc_fixed(v, v->domain->arch.hvm_domain.sync_tsc); + + 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; + + hvm_get_segment_register(v, x86_seg_gdtr, &seg); + 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; + + 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; + + 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; + + 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; + + 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; + + 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; + + 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; + + 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; + + 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; - struct segment_register seg; for_each_vcpu ( d, v ) { @@ -799,100 +897,7 @@ static int hvm_save_cpu_ctxt(struct domain *d, hvm_domain_context_t *h) continue; memset(&ctxt, 0, sizeof(ctxt)); - - /* Architecture-specific vmcs/vmcb bits */ - hvm_funcs.save_cpu_ctxt(v, &ctxt); - - ctxt.tsc = hvm_get_guest_tsc_fixed(v, d->arch.hvm_domain.sync_tsc); - - 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; - - hvm_get_segment_register(v, x86_seg_gdtr, &seg); - 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; - - 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; - - 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; - - 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; - - 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; - - 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; - - 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; - - 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; - - 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]; + hvm_save_cpu_ctxt_one(v, &ctxt); if ( hvm_save_entry(CPU, v->vcpu_id, h, &ctxt) != 0 ) return 1; -- 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 |