static int buffer_tail_hvm(xc_interface *xch, struct restore_ctx *ctx,
struct tailbuf_hvm *buf, int fd,
- unsigned int max_vcpu_id, uint64_t vcpumap,
+ unsigned int max_vcpu_id, uint64_t *vcpumap,
int ext_vcpucontext,
int vcpuextstate, uint32_t vcpuextstate_size)
{
static int buffer_tail_pv(xc_interface *xch, struct restore_ctx *ctx,
struct tailbuf_pv *buf, int fd,
- unsigned int max_vcpu_id, uint64_t vcpumap,
+ unsigned int max_vcpu_id, uint64_t *vcpumap,
int ext_vcpucontext,
int vcpuextstate,
uint32_t vcpuextstate_size)
/* VCPU contexts */
buf->vcpucount = 0;
for (i = 0; i <= max_vcpu_id; i++) {
- // DPRINTF("vcpumap: %llx, cpu: %d, bit: %llu\n", vcpumap, i, (vcpumap % (1ULL << i)));
- if ( (!(vcpumap & (1ULL << i))) )
+ // DPRINTF("vcpumap: %llx, cpu: %d, bit: %llu\n", vcpumap[i/64], i, (vcpumap[i/64] & (1ULL << (i%64))));
+ if ( (!(vcpumap[i/64] & (1ULL << (i%64)))) )
continue;
buf->vcpucount++;
}
static int buffer_tail(xc_interface *xch, struct restore_ctx *ctx,
tailbuf_t *buf, int fd, unsigned int max_vcpu_id,
- uint64_t vcpumap, int ext_vcpucontext,
+ uint64_t *vcpumap, int ext_vcpucontext,
int vcpuextstate, uint32_t vcpuextstate_size)
{
if ( buf->ishvm )
int new_ctxt_format;
int max_vcpu_id;
- uint64_t vcpumap;
+ uint64_t vcpumap[XC_SR_MAX_VCPUS/64];
uint64_t identpt;
uint64_t paging_ring_pfn;
uint64_t access_ring_pfn;
case XC_SAVE_ID_VCPU_INFO:
buf->new_ctxt_format = 1;
if ( RDEXACT(fd, &buf->max_vcpu_id, sizeof(buf->max_vcpu_id)) ||
- buf->max_vcpu_id >= 64 || RDEXACT(fd, &buf->vcpumap,
- sizeof(uint64_t)) ) {
+ buf->max_vcpu_id >= XC_SR_MAX_VCPUS ||
+ RDEXACT(fd, buf->vcpumap, vcpumap_sz(buf->max_vcpu_id)) ) {
PERROR("Error when reading max_vcpu_id");
return -1;
}
- // DPRINTF("Max VCPU ID: %d, vcpumap: %llx\n", buf->max_vcpu_id, buf->vcpumap);
+ // DPRINTF("Max VCPU ID: %d, vcpumap: %llx\n", buf->max_vcpu_id, buf->vcpumap[0]);
return pagebuf_get_one(xch, ctx, buf, fd, dom);
case XC_SAVE_ID_HVM_IDENT_PT:
struct mmuext_op pin[MAX_PIN_BATCH];
unsigned int nr_pins;
- uint64_t vcpumap = 1ULL;
+ uint64_t vcpumap[XC_SR_MAX_VCPUS/64] = { 1ULL };
unsigned int max_vcpu_id = 0;
int new_ctxt_format = 0;
if ( j == 0 ) {
/* catch vcpu updates */
if (pagebuf.new_ctxt_format) {
- vcpumap = pagebuf.vcpumap;
max_vcpu_id = pagebuf.max_vcpu_id;
+ memcpy(vcpumap, pagebuf.vcpumap, vcpumap_sz(max_vcpu_id));
}
/* should this be deferred? does it change? */
if ( pagebuf.identpt )
vcpup = tailbuf.u.pv.vcpubuf;
for ( i = 0; i <= max_vcpu_id; i++ )
{
- if ( !(vcpumap & (1ULL << i)) )
+ if ( !(vcpumap[i/64] & (1ULL << (i%64))) )
continue;
memcpy(ctxt, vcpup, ((dinfo->guest_width == 8) ? sizeof(ctxt->x64)
unsigned long needed_to_fix = 0;
unsigned long total_sent = 0;
- uint64_t vcpumap = 1ULL;
+ uint64_t vcpumap[XC_SR_MAX_VCPUS/64] = { 1ULL };
/* HVM: a buffer for holding HVM context */
uint32_t hvm_buf_size = 0;
}
{
- struct {
+ struct chunk {
int id;
int max_vcpu_id;
- uint64_t vcpumap;
+ uint64_t vcpumap[XC_SR_MAX_VCPUS/64];
} chunk = { XC_SAVE_ID_VCPU_INFO, info.max_vcpu_id };
- if ( info.max_vcpu_id >= 64 )
+ if ( info.max_vcpu_id >= XC_SR_MAX_VCPUS )
{
ERROR("Too many VCPUS in guest!");
goto out;
xc_vcpuinfo_t vinfo;
if ( (xc_vcpu_getinfo(xch, dom, i, &vinfo) == 0) &&
vinfo.online )
- vcpumap |= 1ULL << i;
+ vcpumap[i/64] |= 1ULL << (i%64);
}
- chunk.vcpumap = vcpumap;
- if ( wrexact(io_fd, &chunk, sizeof(chunk)) )
+ memcpy(chunk.vcpumap, vcpumap, vcpumap_sz(info.max_vcpu_id));
+ if ( wrexact(io_fd, &chunk, offsetof(struct chunk, vcpumap)
+ + vcpumap_sz(info.max_vcpu_id)) )
{
PERROR("Error when writing to state file");
goto out;
for ( i = 0; i <= info.max_vcpu_id; i++ )
{
- if ( !(vcpumap & (1ULL << i)) )
+ if ( !(vcpumap[i/64] & (1ULL << (i%64))) )
continue;
if ( (i != 0) && xc_vcpu_getcontext(xch, dom, i, &ctxt) )