int cpumask_to_xenctl_cpumap( struct xenctl_cpumap *xenctl_cpumap, const cpumask_t *cpumask) { unsigned int guest_bytes, copy_bytes, i; uint8_t zero = 0; int err = 0; uint8_t *bytemap = xmalloc_array(uint8_t, (nr_cpu_ids + 7) / 8); if ( !bytemap ) return -ENOMEM; guest_bytes = (xenctl_cpumap->nr_cpus + 7) / 8; copy_bytes = min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / 8); bitmap_long_to_byte(bytemap, cpumask_bits(cpumask), nr_cpu_ids); if ( copy_bytes != 0 ) if ( copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes) ) err = -EFAULT; for ( i = copy_bytes; !err && i < guest_bytes; i++ ) if ( copy_to_guest_offset(xenctl_cpumap->bitmap, i, &zero, 1) ) err = -EFAULT; xfree(bytemap); return err; }
static int write_raw(struct write_iter_t *iter, const void *data, size_t data_len) { if ( iter->real && copy_to_guest_offset(iter->ptr, iter->write_offset, (const unsigned char *) data, data_len) ) return -EFAULT; iter->write_offset += data_len; return 0; }
static int xenmem_add_to_physmap_range(struct domain *d, struct xen_add_to_physmap_range *xatpr) { int rc; /* Process entries in reverse order to allow continuations */ while ( xatpr->size > 0 ) { xen_ulong_t idx; xen_pfn_t gpfn; rc = copy_from_guest_offset(&idx, xatpr->idxs, xatpr->size-1, 1); if ( rc < 0 ) goto out; rc = copy_from_guest_offset(&gpfn, xatpr->gpfns, xatpr->size-1, 1); if ( rc < 0 ) goto out; rc = xenmem_add_to_physmap_one(d, xatpr->space, xatpr->foreign_domid, idx, gpfn); rc = copy_to_guest_offset(xatpr->errs, xatpr->size-1, &rc, 1); if ( rc < 0 ) goto out; xatpr->size--; /* Check for continuation if it's not the last interation */ if ( xatpr->size > 0 && hypercall_preempt_check() ) { rc = -EAGAIN; goto out; } } rc = 0; out: return rc; }
long read_console_ring(struct xen_sysctl_readconsole *op) { XEN_GUEST_HANDLE_PARAM(char) str; uint32_t idx, len, max, sofar, c; str = guest_handle_cast(op->buffer, char), max = op->count; sofar = 0; c = conringc; if ( op->incremental && ((int32_t)(op->index - c) > 0) ) c = op->index; while ( (c != conringp) && (sofar < max) ) { idx = CONRING_IDX_MASK(c); len = conringp - c; if ( (idx + len) > conring_size ) len = conring_size - idx; if ( (sofar + len) > max ) len = max - sofar; if ( copy_to_guest_offset(str, sofar, &conring[idx], len) ) return -EFAULT; sofar += len; c += len; } if ( op->clear ) { spin_lock_irq(&console_lock); if ( (uint32_t)(conringp - c) > conring_size ) conringc = conringp - conring_size; else conringc = c; spin_unlock_irq(&console_lock); } op->count = sofar; op->index = c; return 0; }