Lines Matching refs:ctx
5 static xen_pfn_t pfn_to_mfn(const struct xc_sr_context *ctx, xen_pfn_t pfn) in pfn_to_mfn() argument
7 assert(pfn <= ctx->x86.pv.max_pfn); in pfn_to_mfn()
9 return xc_pfn_to_mfn(pfn, ctx->x86.pv.p2m, ctx->x86.pv.width); in pfn_to_mfn()
18 static int expand_p2m(struct xc_sr_context *ctx, unsigned long max_pfn) in expand_p2m() argument
20 xc_interface *xch = ctx->xch; in expand_p2m()
21 unsigned long old_max = ctx->x86.pv.max_pfn, i; in expand_p2m()
22 unsigned int fpp = PAGE_SIZE / ctx->x86.pv.width; in expand_p2m()
31 p2msz = (max_pfn + 1) * ctx->x86.pv.width; in expand_p2m()
32 p2m = realloc(ctx->x86.pv.p2m, p2msz); in expand_p2m()
38 ctx->x86.pv.p2m = p2m; in expand_p2m()
41 pfn_types = realloc(ctx->x86.pv.restore.pfn_types, pfn_typesz); in expand_p2m()
47 ctx->x86.pv.restore.pfn_types = pfn_types; in expand_p2m()
50 p2m_pfns = realloc(ctx->x86.pv.p2m_pfns, p2m_pfnsz); in expand_p2m()
56 ctx->x86.pv.p2m_frames = end_frame; in expand_p2m()
57 ctx->x86.pv.p2m_pfns = p2m_pfns; in expand_p2m()
59 ctx->x86.pv.max_pfn = max_pfn; in expand_p2m()
62 ctx->restore.ops.set_gfn(ctx, i, INVALID_MFN); in expand_p2m()
63 ctx->restore.ops.set_page_type(ctx, i, 0); in expand_p2m()
67 ctx->x86.pv.p2m_pfns[i] = INVALID_MFN; in expand_p2m()
76 static int pin_pagetables(struct xc_sr_context *ctx) in pin_pagetables() argument
78 xc_interface *xch = ctx->xch; in pin_pagetables()
82 for ( i = nr_pins = 0; i <= ctx->x86.pv.max_pfn; ++i ) in pin_pagetables()
84 if ( (ctx->x86.pv.restore.pfn_types[i] & in pin_pagetables()
88 switch ( (ctx->x86.pv.restore.pfn_types[i] & in pin_pagetables()
107 pin[nr_pins].arg1.mfn = pfn_to_mfn(ctx, i); in pin_pagetables()
112 if ( xc_mmuext_op(xch, pin, nr_pins, ctx->domid) != 0 ) in pin_pagetables()
121 if ( (nr_pins > 0) && (xc_mmuext_op(xch, pin, nr_pins, ctx->domid) < 0) ) in pin_pagetables()
133 static int process_start_info(struct xc_sr_context *ctx, in process_start_info() argument
136 xc_interface *xch = ctx->xch; in process_start_info()
141 pfn = GET_FIELD(vcpu, user_regs.edx, ctx->x86.pv.width); in process_start_info()
143 if ( pfn > ctx->x86.pv.max_pfn ) in process_start_info()
149 if ( ctx->x86.pv.restore.pfn_types[pfn] != XEN_DOMCTL_PFINFO_NOTAB ) in process_start_info()
152 (ctx->x86.pv.restore.pfn_types[pfn] >> in process_start_info()
157 mfn = pfn_to_mfn(ctx, pfn); in process_start_info()
158 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in process_start_info()
161 dump_bad_pseudophysmap_entry(ctx, mfn); in process_start_info()
165 SET_FIELD(vcpu, user_regs.edx, mfn, ctx->x86.pv.width); in process_start_info()
167 xch, ctx->domid, PAGE_SIZE, PROT_READ | PROT_WRITE, mfn); in process_start_info()
175 pfn = GET_FIELD(guest_start_info, store_mfn, ctx->x86.pv.width); in process_start_info()
176 if ( pfn > ctx->x86.pv.max_pfn ) in process_start_info()
182 mfn = pfn_to_mfn(ctx, pfn); in process_start_info()
183 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in process_start_info()
186 dump_bad_pseudophysmap_entry(ctx, mfn); in process_start_info()
190 ctx->restore.xenstore_gfn = mfn; in process_start_info()
191 SET_FIELD(guest_start_info, store_mfn, mfn, ctx->x86.pv.width); in process_start_info()
193 ctx->restore.xenstore_evtchn, ctx->x86.pv.width); in process_start_info()
196 pfn = GET_FIELD(guest_start_info, console.domU.mfn, ctx->x86.pv.width); in process_start_info()
197 if ( pfn > ctx->x86.pv.max_pfn ) in process_start_info()
203 mfn = pfn_to_mfn(ctx, pfn); in process_start_info()
204 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in process_start_info()
207 dump_bad_pseudophysmap_entry(ctx, mfn); in process_start_info()
211 ctx->restore.console_gfn = mfn; in process_start_info()
212 SET_FIELD(guest_start_info, console.domU.mfn, mfn, ctx->x86.pv.width); in process_start_info()
214 ctx->restore.console_evtchn, ctx->x86.pv.width); in process_start_info()
218 ctx->x86.pv.max_pfn + 1, ctx->x86.pv.width); in process_start_info()
220 ctx->dominfo.shared_info_frame << PAGE_SHIFT, ctx->x86.pv.width); in process_start_info()
221 SET_FIELD(guest_start_info, flags, 0, ctx->x86.pv.width); in process_start_info()
235 static int process_vcpu_basic(struct xc_sr_context *ctx, in process_vcpu_basic() argument
238 xc_interface *xch = ctx->xch; in process_vcpu_basic()
239 vcpu_guest_context_any_t *vcpu = ctx->x86.pv.restore.vcpus[vcpuid].basic.ptr; in process_vcpu_basic()
247 rc = process_start_info(ctx, vcpu); in process_vcpu_basic()
254 GET_FIELD(vcpu, flags, ctx->x86.pv.width) | VGCF_online, in process_vcpu_basic()
255 ctx->x86.pv.width); in process_vcpu_basic()
257 gdt_count = GET_FIELD(vcpu, gdt_ents, ctx->x86.pv.width); in process_vcpu_basic()
270 pfn = GET_FIELD(vcpu, gdt_frames[i], ctx->x86.pv.width); in process_vcpu_basic()
271 if ( pfn > ctx->x86.pv.max_pfn ) in process_vcpu_basic()
277 if ( (ctx->x86.pv.restore.pfn_types[pfn] != XEN_DOMCTL_PFINFO_NOTAB) ) in process_vcpu_basic()
280 (ctx->x86.pv.restore.pfn_types[pfn] >> in process_vcpu_basic()
285 mfn = pfn_to_mfn(ctx, pfn); in process_vcpu_basic()
286 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in process_vcpu_basic()
289 dump_bad_pseudophysmap_entry(ctx, mfn); in process_vcpu_basic()
293 SET_FIELD(vcpu, gdt_frames[i], mfn, ctx->x86.pv.width); in process_vcpu_basic()
297 pfn = cr3_to_mfn(ctx, GET_FIELD(vcpu, ctrlreg[3], ctx->x86.pv.width)); in process_vcpu_basic()
298 if ( pfn > ctx->x86.pv.max_pfn ) in process_vcpu_basic()
304 if ( (ctx->x86.pv.restore.pfn_types[pfn] & in process_vcpu_basic()
306 (((xen_pfn_t)ctx->x86.pv.levels) << XEN_DOMCTL_PFINFO_LTAB_SHIFT) ) in process_vcpu_basic()
309 (ctx->x86.pv.restore.pfn_types[pfn] >> in process_vcpu_basic()
311 ctx->x86.pv.levels); in process_vcpu_basic()
315 mfn = pfn_to_mfn(ctx, pfn); in process_vcpu_basic()
316 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in process_vcpu_basic()
319 dump_bad_pseudophysmap_entry(ctx, mfn); in process_vcpu_basic()
323 SET_FIELD(vcpu, ctrlreg[3], mfn_to_cr3(ctx, mfn), ctx->x86.pv.width); in process_vcpu_basic()
326 if ( ctx->x86.pv.levels == 4 && (vcpu->x64.ctrlreg[1] & 1) ) in process_vcpu_basic()
330 if ( pfn > ctx->x86.pv.max_pfn ) in process_vcpu_basic()
336 if ( (ctx->x86.pv.restore.pfn_types[pfn] & in process_vcpu_basic()
338 (((xen_pfn_t)ctx->x86.pv.levels) << XEN_DOMCTL_PFINFO_LTAB_SHIFT) ) in process_vcpu_basic()
341 (ctx->x86.pv.restore.pfn_types[pfn] >> in process_vcpu_basic()
343 ctx->x86.pv.levels); in process_vcpu_basic()
347 mfn = pfn_to_mfn(ctx, pfn); in process_vcpu_basic()
348 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in process_vcpu_basic()
351 dump_bad_pseudophysmap_entry(ctx, mfn); in process_vcpu_basic()
358 if ( xc_vcpu_setcontext(xch, ctx->domid, vcpuid, vcpu) ) in process_vcpu_basic()
373 static int process_vcpu_extended(struct xc_sr_context *ctx, in process_vcpu_extended() argument
376 xc_interface *xch = ctx->xch; in process_vcpu_extended()
378 &ctx->x86.pv.restore.vcpus[vcpuid]; in process_vcpu_extended()
382 domctl.domain = ctx->domid; in process_vcpu_extended()
397 static int process_vcpu_xsave(struct xc_sr_context *ctx, in process_vcpu_xsave() argument
400 xc_interface *xch = ctx->xch; in process_vcpu_xsave()
402 &ctx->x86.pv.restore.vcpus[vcpuid]; in process_vcpu_xsave()
416 domctl.domain = ctx->domid; in process_vcpu_xsave()
435 static int process_vcpu_msrs(struct xc_sr_context *ctx, in process_vcpu_msrs() argument
438 xc_interface *xch = ctx->xch; in process_vcpu_msrs()
440 &ctx->x86.pv.restore.vcpus[vcpuid]; in process_vcpu_msrs()
454 domctl.domain = ctx->domid; in process_vcpu_msrs()
473 static int update_vcpu_context(struct xc_sr_context *ctx) in update_vcpu_context() argument
475 xc_interface *xch = ctx->xch; in update_vcpu_context()
480 for ( i = 0; i < ctx->x86.pv.restore.nr_vcpus; ++i ) in update_vcpu_context()
482 vcpu = &ctx->x86.pv.restore.vcpus[i]; in update_vcpu_context()
486 rc = process_vcpu_basic(ctx, i); in update_vcpu_context()
498 rc = process_vcpu_extended(ctx, i); in update_vcpu_context()
505 rc = process_vcpu_xsave(ctx, i); in update_vcpu_context()
512 rc = process_vcpu_msrs(ctx, i); in update_vcpu_context()
526 static int update_guest_p2m(struct xc_sr_context *ctx) in update_guest_p2m() argument
528 xc_interface *xch = ctx->xch; in update_guest_p2m()
533 for ( i = 0; i < ctx->x86.pv.p2m_frames; ++i ) in update_guest_p2m()
535 pfn = ctx->x86.pv.p2m_pfns[i]; in update_guest_p2m()
537 if ( pfn > ctx->x86.pv.max_pfn ) in update_guest_p2m()
544 if ( (ctx->x86.pv.restore.pfn_types[pfn] != XEN_DOMCTL_PFINFO_NOTAB) ) in update_guest_p2m()
547 (ctx->x86.pv.restore.pfn_types[pfn] >> in update_guest_p2m()
552 mfn = pfn_to_mfn(ctx, pfn); in update_guest_p2m()
553 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in update_guest_p2m()
556 dump_bad_pseudophysmap_entry(ctx, mfn); in update_guest_p2m()
560 ctx->x86.pv.p2m_pfns[i] = mfn; in update_guest_p2m()
563 guest_p2m = xc_map_foreign_pages(xch, ctx->domid, PROT_WRITE, in update_guest_p2m()
564 ctx->x86.pv.p2m_pfns, in update_guest_p2m()
565 ctx->x86.pv.p2m_frames); in update_guest_p2m()
572 memcpy(guest_p2m, ctx->x86.pv.p2m, in update_guest_p2m()
573 (ctx->x86.pv.max_pfn + 1) * ctx->x86.pv.width); in update_guest_p2m()
578 munmap(guest_p2m, ctx->x86.pv.p2m_frames * PAGE_SIZE); in update_guest_p2m()
601 static int handle_x86_pv_info(struct xc_sr_context *ctx, in handle_x86_pv_info() argument
604 xc_interface *xch = ctx->xch; in handle_x86_pv_info()
607 if ( ctx->x86.pv.restore.seen_pv_info ) in handle_x86_pv_info()
631 if ( info->guest_width != ctx->x86.pv.width ) in handle_x86_pv_info()
634 .domain = ctx->domid, in handle_x86_pv_info()
643 ctx->domid, info->guest_width * 8); in handle_x86_pv_info()
648 rc = x86_pv_domain_info(ctx); in handle_x86_pv_info()
657 if ( (info->guest_width != ctx->x86.pv.width) || in handle_x86_pv_info()
658 (info->pt_levels != ctx->x86.pv.levels) ) in handle_x86_pv_info()
661 info->guest_width, info->pt_levels, ctx->domid, in handle_x86_pv_info()
662 ctx->x86.pv.width, ctx->x86.pv.levels); in handle_x86_pv_info()
666 ctx->x86.pv.restore.seen_pv_info = true; in handle_x86_pv_info()
674 static int handle_x86_pv_p2m_frames(struct xc_sr_context *ctx, in handle_x86_pv_p2m_frames() argument
677 xc_interface *xch = ctx->xch; in handle_x86_pv_p2m_frames()
679 unsigned int start, end, x, fpp = PAGE_SIZE / ctx->x86.pv.width; in handle_x86_pv_p2m_frames()
683 if ( ctx->restore.format_version < 3 && !ctx->restore.seen_static_data_end ) in handle_x86_pv_p2m_frames()
685 rc = handle_static_data_end(ctx); in handle_x86_pv_p2m_frames()
693 if ( !ctx->restore.seen_static_data_end ) in handle_x86_pv_p2m_frames()
699 if ( !ctx->x86.pv.restore.seen_pv_info ) in handle_x86_pv_p2m_frames()
731 if ( data->end_pfn > ctx->x86.pv.max_pfn ) in handle_x86_pv_p2m_frames()
733 rc = expand_p2m(ctx, data->end_pfn); in handle_x86_pv_p2m_frames()
739 ctx->x86.pv.p2m_pfns[start + x] = data->p2m_pfns[x]; in handle_x86_pv_p2m_frames()
750 static int handle_x86_pv_vcpu_blob(struct xc_sr_context *ctx, in handle_x86_pv_vcpu_blob() argument
753 xc_interface *xch = ctx->xch; in handle_x86_pv_vcpu_blob()
808 if ( vhdr->vcpu_id >= ctx->x86.pv.restore.nr_vcpus ) in handle_x86_pv_vcpu_blob()
811 rec_name, vhdr->vcpu_id, ctx->x86.pv.restore.nr_vcpus - 1); in handle_x86_pv_vcpu_blob()
815 vcpu = &ctx->x86.pv.restore.vcpus[vhdr->vcpu_id]; in handle_x86_pv_vcpu_blob()
822 size_t vcpusz = ctx->x86.pv.width == 8 ? in handle_x86_pv_vcpu_blob()
879 static int handle_shared_info(struct xc_sr_context *ctx, in handle_shared_info() argument
882 xc_interface *xch = ctx->xch; in handle_shared_info()
888 if ( !ctx->x86.pv.restore.seen_pv_info ) in handle_shared_info()
902 xch, ctx->domid, PAGE_SIZE, PROT_READ | PROT_WRITE, in handle_shared_info()
903 ctx->dominfo.shared_info_frame); in handle_shared_info()
907 ctx->dominfo.shared_info_frame); in handle_shared_info()
911 MEMCPY_FIELD(guest_shinfo, old_shinfo, vcpu_info, ctx->x86.pv.width); in handle_shared_info()
912 MEMCPY_FIELD(guest_shinfo, old_shinfo, arch, ctx->x86.pv.width); in handle_shared_info()
915 0, ctx->x86.pv.width); in handle_shared_info()
917 MEMSET_ARRAY_FIELD(guest_shinfo, evtchn_pending, 0, ctx->x86.pv.width); in handle_shared_info()
920 0, ctx->x86.pv.width); in handle_shared_info()
922 MEMSET_ARRAY_FIELD(guest_shinfo, evtchn_mask, 0xff, ctx->x86.pv.width); in handle_shared_info()
934 static bool x86_pv_pfn_is_valid(const struct xc_sr_context *ctx, xen_pfn_t pfn) in x86_pv_pfn_is_valid() argument
936 return pfn <= ctx->x86.pv.max_pfn; in x86_pv_pfn_is_valid()
940 static void x86_pv_set_page_type(struct xc_sr_context *ctx, xen_pfn_t pfn, in x86_pv_set_page_type() argument
943 assert(pfn <= ctx->x86.pv.max_pfn); in x86_pv_set_page_type()
945 ctx->x86.pv.restore.pfn_types[pfn] = type; in x86_pv_set_page_type()
949 static void x86_pv_set_gfn(struct xc_sr_context *ctx, xen_pfn_t pfn, in x86_pv_set_gfn() argument
952 assert(pfn <= ctx->x86.pv.max_pfn); in x86_pv_set_gfn()
954 if ( ctx->x86.pv.width == sizeof(uint64_t) ) in x86_pv_set_gfn()
956 ((uint64_t *)ctx->x86.pv.p2m)[pfn] = mfn == INVALID_MFN ? ~0ULL : mfn; in x86_pv_set_gfn()
959 ((uint32_t *)ctx->x86.pv.p2m)[pfn] = mfn; in x86_pv_set_gfn()
967 static int x86_pv_localise_page(struct xc_sr_context *ctx, in x86_pv_localise_page() argument
970 xc_interface *xch = ctx->xch; in x86_pv_localise_page()
1001 if ( pfn_to_mfn(ctx, pfn) == INVALID_MFN ) in x86_pv_localise_page()
1006 if ( to_populate && populate_pfns(ctx, to_populate, pfns, NULL) ) in x86_pv_localise_page()
1018 mfn = pfn_to_mfn(ctx, pfn); in x86_pv_localise_page()
1020 if ( !mfn_in_pseudophysmap(ctx, mfn) ) in x86_pv_localise_page()
1024 dump_bad_pseudophysmap_entry(ctx, mfn); in x86_pv_localise_page()
1040 static int x86_pv_setup(struct xc_sr_context *ctx) in x86_pv_setup() argument
1042 xc_interface *xch = ctx->xch; in x86_pv_setup()
1045 if ( ctx->restore.guest_type != DHDR_TYPE_X86_PV ) in x86_pv_setup()
1048 dhdr_type_to_str(ctx->restore.guest_type)); in x86_pv_setup()
1052 if ( ctx->restore.guest_page_size != PAGE_SIZE ) in x86_pv_setup()
1055 ctx->restore.guest_page_size); in x86_pv_setup()
1059 rc = x86_pv_domain_info(ctx); in x86_pv_setup()
1063 ctx->x86.pv.restore.nr_vcpus = ctx->dominfo.max_vcpu_id + 1; in x86_pv_setup()
1064 ctx->x86.pv.restore.vcpus = calloc(sizeof(struct xc_sr_x86_pv_restore_vcpu), in x86_pv_setup()
1065 ctx->x86.pv.restore.nr_vcpus); in x86_pv_setup()
1066 if ( !ctx->x86.pv.restore.vcpus ) in x86_pv_setup()
1072 rc = x86_pv_map_m2p(ctx); in x86_pv_setup()
1082 static int x86_pv_process_record(struct xc_sr_context *ctx, in x86_pv_process_record() argument
1088 return handle_x86_pv_info(ctx, rec); in x86_pv_process_record()
1091 return handle_x86_pv_p2m_frames(ctx, rec); in x86_pv_process_record()
1097 return handle_x86_pv_vcpu_blob(ctx, rec); in x86_pv_process_record()
1100 return handle_shared_info(ctx, rec); in x86_pv_process_record()
1103 return handle_x86_tsc_info(ctx, rec); in x86_pv_process_record()
1106 return handle_x86_cpuid_policy(ctx, rec); in x86_pv_process_record()
1109 return handle_x86_msr_policy(ctx, rec); in x86_pv_process_record()
1120 static int x86_pv_stream_complete(struct xc_sr_context *ctx) in x86_pv_stream_complete() argument
1122 xc_interface *xch = ctx->xch; in x86_pv_stream_complete()
1125 rc = update_vcpu_context(ctx); in x86_pv_stream_complete()
1129 rc = pin_pagetables(ctx); in x86_pv_stream_complete()
1133 rc = update_guest_p2m(ctx); in x86_pv_stream_complete()
1137 rc = xc_dom_gnttab_seed(xch, ctx->domid, false, in x86_pv_stream_complete()
1138 ctx->restore.console_gfn, in x86_pv_stream_complete()
1139 ctx->restore.xenstore_gfn, in x86_pv_stream_complete()
1140 ctx->restore.console_domid, in x86_pv_stream_complete()
1141 ctx->restore.xenstore_domid); in x86_pv_stream_complete()
1154 static int x86_pv_cleanup(struct xc_sr_context *ctx) in x86_pv_cleanup() argument
1156 free(ctx->x86.pv.p2m); in x86_pv_cleanup()
1157 free(ctx->x86.pv.p2m_pfns); in x86_pv_cleanup()
1159 if ( ctx->x86.pv.restore.vcpus ) in x86_pv_cleanup()
1163 for ( i = 0; i < ctx->x86.pv.restore.nr_vcpus; ++i ) in x86_pv_cleanup()
1166 &ctx->x86.pv.restore.vcpus[i]; in x86_pv_cleanup()
1174 free(ctx->x86.pv.restore.vcpus); in x86_pv_cleanup()
1177 free(ctx->x86.pv.restore.pfn_types); in x86_pv_cleanup()
1179 if ( ctx->x86.pv.m2p ) in x86_pv_cleanup()
1180 munmap(ctx->x86.pv.m2p, ctx->x86.pv.nr_m2p_frames * PAGE_SIZE); in x86_pv_cleanup()
1182 free(ctx->x86.restore.cpuid.ptr); in x86_pv_cleanup()
1183 free(ctx->x86.restore.msr.ptr); in x86_pv_cleanup()