#include "../config.h"
#include "../util.h"
#include <xen/hvm/hvm_xs_strings.h>
+#include <xen/hvm/params.h>
#define ACPI_MAX_SECONDARY_TABLES 16
static int new_vm_gid(struct acpi_info *acpi_info)
{
uint64_t vm_gid[2], *buf;
- char addr[12];
const char * s;
char *end;
return 0;
memcpy(buf, vm_gid, sizeof(vm_gid));
- /* set into ACPI table and XenStore the address */
+ /* set into ACPI table and HVM param the address */
acpi_info->vm_gid_addr = virt_to_phys(buf);
- if ( snprintf(addr, sizeof(addr), "0x%lx", virt_to_phys(buf))
- >= sizeof(addr) )
- return 0;
- xenstore_write("hvmloader/generation-id-address", addr);
+ hvm_param_set(HVM_PARAM_VM_GENERATION_ID_ADDR, acpi_info->vm_gid_addr);
return 1;
}
domid_t store_domid, unsigned int console_evtchn,
unsigned long *console_mfn, domid_t console_domid,
unsigned int hvm, unsigned int pae, int superpages,
- int no_incr_generationid, int checkpointed_stream,
- unsigned long *vm_generationid_addr,
+ int checkpointed_stream,
struct restore_callbacks *callbacks)
{
DECLARE_DOMCTL;
xc_hvm_param_set(xch, dom, HVM_PARAM_VM86_TSS, pagebuf.vm86_tss);
if ( pagebuf.console_pfn )
console_pfn = pagebuf.console_pfn;
- if ( pagebuf.vm_generationid_addr ) {
- if ( !no_incr_generationid ) {
- unsigned int offset;
- unsigned char *buf;
- unsigned long long generationid;
-
- /*
- * Map the VM generation id buffer and inject the new value.
- */
-
- pfn = pagebuf.vm_generationid_addr >> PAGE_SHIFT;
- offset = pagebuf.vm_generationid_addr & (PAGE_SIZE - 1);
-
- if ( (pfn >= dinfo->p2m_size) ||
- (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) )
- {
- ERROR("generation id buffer frame is bad");
- goto out;
- }
-
- mfn = ctx->p2m[pfn];
- buf = xc_map_foreign_range(xch, dom, PAGE_SIZE,
- PROT_READ | PROT_WRITE, mfn);
- if ( buf == NULL )
- {
- ERROR("xc_map_foreign_range for generation id"
- " buffer failed");
- goto out;
- }
-
- generationid = *(unsigned long long *)(buf + offset);
- *(unsigned long long *)(buf + offset) = generationid + 1;
-
- munmap(buf, PAGE_SIZE);
- }
-
- *vm_generationid_addr = pagebuf.vm_generationid_addr;
- }
+ if ( pagebuf.vm_generationid_addr )
+ xc_hvm_param_set(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR,
+ pagebuf.vm_generationid_addr);
break; /* our work here is done */
}
int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
uint32_t max_factor, uint32_t flags,
- struct save_callbacks* callbacks, int hvm,
- unsigned long vm_generationid_addr)
+ struct save_callbacks* callbacks, int hvm)
{
xc_dominfo_t info;
DECLARE_DOMCTL;
} chunk = { 0, };
chunk.id = XC_SAVE_ID_HVM_GENERATION_ID_ADDR;
- chunk.data = vm_generationid_addr;
+ xc_hvm_param_get(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
uint32_t max_factor, uint32_t flags,
- struct save_callbacks* callbacks, int hvm,
- unsigned long vm_generationid_addr)
+ struct save_callbacks* callbacks, int hvm)
{
errno = ENOSYS;
return -1;
domid_t store_domid, unsigned int console_evtchn,
unsigned long *console_mfn, domid_t console_domid,
unsigned int hvm, unsigned int pae, int superpages,
- int no_incr_generationid, int checkpointed_stream,
- unsigned long *vm_generationid_addr,
+ int checkpointed_stream,
struct restore_callbacks *callbacks)
{
errno = ENOSYS;
*/
int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
- struct save_callbacks* callbacks, int hvm,
- unsigned long vm_generationid_addr);
+ struct save_callbacks* callbacks, int hvm);
/* callbacks provided by xc_domain_restore */
* @parm hvm non-zero if this is a HVM restore
* @parm pae non-zero if this HVM domain has PAE support enabled
* @parm superpages non-zero to allocate guest memory with superpages
- * @parm no_incr_generationid non-zero if generation id is NOT to be incremented
* @parm checkpointed_stream non-zero if the far end of the stream is using checkpointing
- * @parm vm_generationid_addr returned with the address of the generation id buffer
* @parm callbacks non-NULL to receive a callback to restore toolstack
* specific data
* @return 0 on success, -1 on failure
domid_t store_domid, unsigned int console_evtchn,
unsigned long *console_mfn, domid_t console_domid,
unsigned int hvm, unsigned int pae, int superpages,
- int no_incr_generationid, int checkpointed_stream,
- unsigned long *vm_generationid_addr,
+ int checkpointed_stream,
struct restore_callbacks *callbacks);
/**
* xc_domain_restore writes a file to disk that contains the device
ARRAY_SIZE(rwperm));
}
- if (info->type == LIBXL_DOMAIN_TYPE_HVM)
- libxl__xs_mkdir(gc, t,
- libxl__sprintf(gc, "%s/hvmloader/generation-id-address", dom_path),
- rwperm, ARRAY_SIZE(rwperm));
-
- vm_list = libxl_list_vm(ctx, &nb_vm);
+ vm_list = libxl_list_vm(ctx, &nb_vm);
if (!vm_list) {
LOG(ERROR, "cannot get number of running guests");
rc = ERROR_FAIL;
goto out;
}
libxl__xc_domain_restore(egc, dcs,
- hvm, pae, superpages, 1);
+ hvm, pae, superpages);
return;
out:
}
void libxl__srm_callout_callback_restore_results(unsigned long store_mfn,
- unsigned long console_mfn, unsigned long genidad, void *user)
+ unsigned long console_mfn, void *user)
{
libxl__save_helper_state *shs = user;
libxl__domain_create_state *dcs = CONTAINER_OF(shs, *dcs, shs);
state->store_mfn = store_mfn;
state->console_mfn = console_mfn;
- state->vm_generationid_addr = genidad;
shs->need_results = 0;
}
state->store_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->store_domid);
state->console_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->console_domid);
- state->vm_generationid_addr = 0;
if (info->type == LIBXL_DOMAIN_TYPE_HVM)
hvm_set_conf_params(ctx->xch, domid, info);
libxl_ctx *ctx = libxl__gc_owner(gc);
char *dom_path, *vm_path;
xs_transaction_t t;
- char **ents, **hvm_ents;
+ char **ents;
int i, rc;
rc = libxl_domain_sched_params_set(CTX, domid, &info->sched_params);
? "online" : "offline";
}
- hvm_ents = NULL;
- if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
- hvm_ents = libxl__calloc(gc, 3, sizeof(char *));
- hvm_ents[0] = "hvmloader/generation-id-address";
- hvm_ents[1] = GCSPRINTF("0x%lx", state->vm_generationid_addr);
- }
-
dom_path = libxl__xs_get_dompath(gc, domid);
if (!dom_path) {
return ERROR_FAIL;
t = xs_transaction_start(ctx->xsh);
libxl__xs_writev(gc, t, dom_path, ents);
- if (info->type == LIBXL_DOMAIN_TYPE_HVM)
- libxl__xs_writev(gc, t, dom_path, hvm_ents);
-
libxl__xs_writev(gc, t, dom_path, local_ents);
libxl__xs_writev(gc, t, vm_path, vms_ents);
STATE_AO_GC(dss->ao);
int port;
int rc = ERROR_FAIL;
- unsigned long vm_generationid_addr;
/* Convenience aliases */
const uint32_t domid = dss->domid;
switch (type) {
case LIBXL_DOMAIN_TYPE_HVM: {
- char *path;
- char *addr;
-
- path = GCSPRINTF("%s/hvmloader/generation-id-address",
- libxl__xs_get_dompath(gc, domid));
- addr = libxl__xs_read(gc, XBT_NULL, path);
-
- vm_generationid_addr = (addr) ? strtoul(addr, NULL, 0) : 0;
dss->hvm = 1;
break;
}
case LIBXL_DOMAIN_TYPE_PV:
- vm_generationid_addr = 0;
dss->hvm = 0;
break;
default:
callbacks->switch_qemu_logdirty = libxl__domain_suspend_common_switch_qemu_logdirty;
dss->shs.callbacks.save.toolstack_save = libxl__toolstack_save;
- libxl__xc_domain_save(egc, dss, vm_generationid_addr);
+ libxl__xc_domain_save(egc, dss);
return;
out:
uint32_t console_domid;
unsigned long console_mfn;
- unsigned long vm_generationid_addr;
-
char *saved_state;
libxl__file_reference pv_kernel;
/* calls libxl__xc_domain_suspend_done when done */
-_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*,
- unsigned long vm_generationid_addr);
+_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*);
/* If rc==0 then retval is the return value from xc_domain_save
* and errnoval is the errno value it provided.
* If rc!=0, retval and errnoval are undefined. */
/* calls libxl__xc_domain_restore_done when done */
_hidden void libxl__xc_domain_restore(libxl__egc *egc,
libxl__domain_create_state *dcs,
- int hvm, int pae, int superpages,
- int no_incr_generationid);
+ int hvm, int pae, int superpages);
/* If rc==0 then retval is the return value from xc_domain_save
* and errnoval is the errno value it provided.
* If rc!=0, retval and errnoval are undefined. */
/*----- entrypoints -----*/
void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs,
- int hvm, int pae, int superpages,
- int no_incr_generationid)
+ int hvm, int pae, int superpages)
{
STATE_AO_GC(dcs->ao);
state->store_port,
state->store_domid, state->console_port,
state->console_domid,
- hvm, pae, superpages, no_incr_generationid,
+ hvm, pae, superpages,
cbflags, dcs->checkpointed_stream,
};
argnums, ARRAY_SIZE(argnums));
}
-void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss,
- unsigned long vm_generationid_addr)
+void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss)
{
STATE_AO_GC(dss->ao);
int r, rc, toolstack_data_fd = -1;
}
const unsigned long argnums[] = {
- dss->domid, 0, 0, dss->xcflags, dss->hvm, vm_generationid_addr,
+ dss->domid, 0, 0, dss->xcflags, dss->hvm,
toolstack_data_fd, toolstack_data_len,
cbflags,
};
uint32_t max_factor = strtoul(NEXTARG,0,10);
uint32_t flags = strtoul(NEXTARG,0,10);
int hvm = atoi(NEXTARG);
- unsigned long genidad = strtoul(NEXTARG,0,10);
toolstack_save_fd = atoi(NEXTARG);
toolstack_save_len = strtoul(NEXTARG,0,10);
unsigned cbflags = strtoul(NEXTARG,0,10);
startup("save");
r = xc_domain_save(xch, io_fd, dom, max_iters, max_factor, flags,
- &helper_save_callbacks, hvm, genidad);
+ &helper_save_callbacks, hvm);
complete(r);
} else if (!strcmp(mode,"--restore-domain")) {
unsigned int hvm = strtoul(NEXTARG,0,10);
unsigned int pae = strtoul(NEXTARG,0,10);
int superpages = strtoul(NEXTARG,0,10);
- int no_incr_genidad = strtoul(NEXTARG,0,10);
unsigned cbflags = strtoul(NEXTARG,0,10);
int checkpointed = strtoul(NEXTARG,0,10);
assert(!*++argv);
unsigned long store_mfn = 0;
unsigned long console_mfn = 0;
- unsigned long genidad = 0;
startup("restore");
r = xc_domain_restore(xch, io_fd, dom, store_evtchn, &store_mfn,
store_domid, console_evtchn, &console_mfn,
console_domid, hvm, pae, superpages,
- no_incr_genidad, checkpointed, &genidad,
+ checkpointed,
&helper_restore_callbacks);
- helper_stub_restore_results(store_mfn,console_mfn,genidad,0);
+ helper_stub_restore_results(store_mfn,console_mfn,0);
complete(r);
} else {
[ 7, 'rcxW', "toolstack_restore", [qw(uint32_t domid
BLOCK tsdata)] ],
[ 8, 'r', "restore_results", ['unsigned long', 'store_mfn',
- 'unsigned long', 'console_mfn',
- 'unsigned long', 'genidad'] ],
+ 'unsigned long', 'console_mfn'] ],
[ 9, 'srW', "complete", [qw(int retval
int errnoval)] ],
);