/* let guest execution resume */ int checkpoint_resume(checkpoint_state* s) { struct timeval tv; int rc; if (xc_domain_resume(s->xch, s->domid, 1)) { snprintf(errbuf, sizeof(errbuf), "error resuming domain: %d", errno); s->errstr = errbuf; return -1; } gettimeofday(&tv, NULL); fprintf(stderr, "PROF: resumed at %lu.%06lu\n", (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec); if (s->domtype > dt_pv && resume_qemu(s) < 0) return -1; /* restore watchability in xenstore */ if (xs_resume_domain(s->xsh, s->domid) < 0) fprintf(stderr, "error resuming domain in xenstore\n"); s->suspended = 0; if (s->suspend_thr) { if ((rc = sem_post(&s->resumed_sem))) fprintf(stderr, "error posting resume semaphore\n"); } return 0; }
/* this is the slow version of resume for uncooperative domain, * the fast version is available in close source xc */ int stub_xc_domain_resume_slow(void) { int r; /* hard code fast to 0, we only want to expose the slow version here */ r = xc_domain_resume(xch, domid, 0); if (r) failwith_oss_xc("xc_domain_resume"); return 0; }
/* this is the slow version of resume for uncooperative domain, * the fast version is available in close source xc */ CAMLprim value stub_xc_domain_resume_slow(value handle, value domid) { CAMLparam2(handle, domid); int r; /* hard code fast to 0, we only want to expose the slow version here */ r = xc_domain_resume(_H(handle), _D(domid), 0); if (r) failwith_oss_xc(_H(handle), "xc_domain_resume"); CAMLreturn(Val_unit); }
static int hp_mem_offline_func(int argc, char *argv[]) { uint32_t status, domid; int ret; unsigned long mfn; if (argc != 1) { show_help(); return -1; } sscanf(argv[0], "%lx", &mfn); printf("Prepare to offline MEMORY mfn %lx\n", mfn); ret = xc_mark_page_offline(xch, mfn, mfn, &status); if (ret < 0) { fprintf(stderr, "Offlining page mfn %lx failed, error %x\n", mfn, ret); if (status & (PG_OFFLINE_XENPAGE | PG_OFFLINE_FAILED)) fprintf(stderr, "XEN_PAGE is not permitted be offlined\n"); else if (status & (PG_OFFLINE_FAILED | PG_OFFLINE_NOT_CONV_RAM)) fprintf(stderr, "RESERVED RAM is not permitted to be offlined\n"); } else { switch(status & PG_OFFLINE_STATUS_MASK) { case PG_OFFLINE_OFFLINED: { printf("Memory mfn %lx offlined successfully, current state is" " [PG_OFFLINE_OFFLINED]\n", mfn); if (status & PG_OFFLINE_BROKEN) printf("And this offlined PAGE is already marked broken" " before!\n"); break; } case PG_OFFLINE_FAILED: { fprintf(stderr, "Memory mfn %lx offline failed\n", mfn); if ( status & PG_OFFLINE_ANONYMOUS) fprintf(stderr, "the memory is an anonymous page!\n"); ret = -1; break; } case PG_OFFLINE_PENDING: { if (status & PG_OFFLINE_XENPAGE) { ret = -1; fprintf(stderr, "Memory mfn %lx offlined succssefully," "this page is xen page, current state is" " [PG_OFFLINE_PENDING, PG_OFFLINE_XENPAGE]\n", mfn); } else if (status & PG_OFFLINE_OWNED) { int result, suspend_evtchn = -1, suspend_lockfd = -1; xc_evtchn *xce; xce = xc_evtchn_open(NULL, 0); if (xce == NULL) { fprintf(stderr, "When exchange page, fail" " to open evtchn\n"); return -1; } domid = status >> PG_OFFLINE_OWNER_SHIFT; if (suspend_guest(xch, xce, domid, &suspend_evtchn, &suspend_lockfd)) { fprintf(stderr, "Failed to suspend guest %d for" " mfn %lx\n", domid, mfn); xc_evtchn_close(xce); return -1; } result = xc_exchange_page(xch, domid, mfn); /* Exchange page successfully */ if (result == 0) printf("Memory mfn %lx offlined successfully, this " "page is DOM%d page and being swapped " "successfully, current state is " "[PG_OFFLINE_OFFLINED, PG_OFFLINE_OWNED]\n", mfn, domid); else { ret = -1; fprintf(stderr, "Memory mfn %lx offlined successfully" " , this page is DOM%d page yet failed to be " "exchanged. current state is " "[PG_OFFLINE_PENDING, PG_OFFLINE_OWNED]\n", mfn, domid); } xc_domain_resume(xch, domid, 1); xc_suspend_evtchn_release(xch, xce, domid, suspend_evtchn, &suspend_lockfd); xc_evtchn_close(xce); } break; } }//end of switch }//end of if