int xc_shadow_control(xc_interface *xch,
uint32_t domid,
unsigned int sop,
- xc_hypercall_buffer_t *dirty_bitmap,
- unsigned long pages,
- unsigned long *mb,
- uint32_t mode,
- xc_shadow_op_stats_t *stats);
+ unsigned int *mb,
+ unsigned int mode);
+long long xc_logdirty_control(xc_interface *xch,
+ uint32_t domid,
+ unsigned int sop,
+ xc_hypercall_buffer_t *dirty_bitmap,
+ unsigned long pages,
+ unsigned int mode,
+ xc_shadow_op_stats_t *stats);
int xc_sched_credit_domain_set(xc_interface *xch,
uint32_t domid,
int xc_shadow_control(xc_interface *xch,
uint32_t domid,
unsigned int sop,
- xc_hypercall_buffer_t *dirty_bitmap,
- unsigned long pages,
- unsigned long *mb,
- uint32_t mode,
- xc_shadow_op_stats_t *stats)
+ unsigned int *mb,
+ unsigned int mode)
{
int rc;
DECLARE_DOMCTL;
- DECLARE_HYPERCALL_BUFFER_ARGUMENT(dirty_bitmap);
memset(&domctl, 0, sizeof(domctl));
domctl.cmd = XEN_DOMCTL_shadow_op;
domctl.domain = domid;
domctl.u.shadow_op.op = sop;
- domctl.u.shadow_op.pages = pages;
domctl.u.shadow_op.mb = mb ? *mb : 0;
domctl.u.shadow_op.mode = mode;
- if (dirty_bitmap != NULL)
+
+ rc = do_domctl(xch, &domctl);
+
+ if ( mb )
+ *mb = domctl.u.shadow_op.mb;
+
+ return rc;
+}
+
+long long xc_logdirty_control(xc_interface *xch,
+ uint32_t domid,
+ unsigned int sop,
+ xc_hypercall_buffer_t *dirty_bitmap,
+ unsigned long pages,
+ unsigned int mode,
+ xc_shadow_op_stats_t *stats)
+{
+ int rc;
+ struct xen_domctl domctl = {
+ .cmd = XEN_DOMCTL_shadow_op,
+ .domain = domid,
+ .u.shadow_op = {
+ .op = sop,
+ .pages = pages,
+ .mode = mode,
+ }
+ };
+ DECLARE_HYPERCALL_BUFFER_ARGUMENT(dirty_bitmap);
+
+ if ( dirty_bitmap )
set_xen_guest_handle(domctl.u.shadow_op.dirty_bitmap,
dirty_bitmap);
memcpy(stats, &domctl.u.shadow_op.stats,
sizeof(xc_shadow_op_stats_t));
- if ( mb )
- *mb = domctl.u.shadow_op.mb;
-
return (rc == 0) ? domctl.u.shadow_op.pages : rc;
}
DECLARE_HYPERCALL_BUFFER_SHADOW(unsigned long, dirty_bitmap,
&ctx->restore.dirty_bitmap_hbuf);
- if ( xc_shadow_control(
+ if ( xc_logdirty_control(
xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_CLEAN,
HYPERCALL_BUFFER(dirty_bitmap), ctx->restore.p2m_size,
- NULL, 0, &stats) != ctx->restore.p2m_size )
+ 0, &stats) != ctx->restore.p2m_size )
{
PERROR("Failed to retrieve logdirty bitmap");
goto err;
/* This juggling is required if logdirty is enabled for VRAM tracking. */
rc = xc_shadow_control(xch, ctx->domid,
XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY,
- NULL, 0, NULL, 0, NULL);
+ NULL, 0);
if ( rc < 0 )
{
on1 = errno;
rc = xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_OFF,
- NULL, 0, NULL, 0, NULL);
+ NULL, 0);
if ( rc < 0 )
off = errno;
else {
rc = xc_shadow_control(xch, ctx->domid,
XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY,
- NULL, 0, NULL, 0, NULL);
+ NULL, 0);
if ( rc < 0 )
on2 = errno;
}
if ( policy_decision != XGS_POLICY_CONTINUE_PRECOPY )
break;
- if ( xc_shadow_control(
+ if ( xc_logdirty_control(
xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_CLEAN,
&ctx->save.dirty_bitmap_hbuf, ctx->save.p2m_size,
- NULL, 0, &stats) != ctx->save.p2m_size )
+ 0, &stats) != ctx->save.p2m_size )
{
PERROR("Failed to retrieve logdirty bitmap");
rc = -1;
if ( rc )
goto out;
- if ( xc_shadow_control(
+ if ( xc_logdirty_control(
xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_CLEAN,
HYPERCALL_BUFFER(dirty_bitmap), ctx->save.p2m_size,
- NULL, XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL, &stats) !=
+ XEN_DOMCTL_SHADOW_LOGDIRTY_FINAL, &stats) !=
ctx->save.p2m_size )
{
PERROR("Failed to retrieve logdirty bitmap");
if ( rc )
goto out;
- if ( xc_shadow_control(
+ if ( xc_logdirty_control(
xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_PEEK,
&ctx->save.dirty_bitmap_hbuf, ctx->save.p2m_size,
- NULL, 0, &stats) != ctx->save.p2m_size )
+ 0, &stats) != ctx->save.p2m_size )
{
PERROR("Failed to retrieve logdirty bitmap");
rc = -1;
xc_shadow_control(xch, ctx->domid, XEN_DOMCTL_SHADOW_OP_OFF,
- NULL, 0, NULL, 0, NULL);
+ NULL, 0);
if ( ctx->save.ops.cleanup(ctx) )
PERROR("Failed to clean up");
/* we need to know which pages are dirty to restore the guest */
if (xc_shadow_control(CTX->xch, domid,
XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY,
- NULL, 0, NULL, 0, NULL) < 0) {
+ NULL, 0) < 0) {
LOGD(ERROR, domid, "cannot enable secondary vm's logdirty");
lds->callback(egc, lds, ERROR_FAIL);
return;
/* we need to know which pages are dirty to restore the guest */
if (xc_shadow_control(CTX->xch, domid, XEN_DOMCTL_SHADOW_OP_OFF,
- NULL, 0, NULL, 0, NULL) < 0)
+ NULL, 0) < 0)
LOGD(WARN, domid, "cannot disable secondary vm's logdirty");
if (crs->hvm) {
xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset);
if (d_config->b_info.type != LIBXL_DOMAIN_TYPE_PV) {
- unsigned long shadow_mb = DIV_ROUNDUP(d_config->b_info.shadow_memkb,
- 1024);
+ unsigned int shadow_mb = DIV_ROUNDUP(d_config->b_info.shadow_memkb,
+ 1024);
int r = xc_shadow_control(ctx->xch, domid,
XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION,
- NULL, 0, &shadow_mb, 0, NULL);
+ &shadow_mb, 0);
if (r) {
LOGED(ERROR, domid,
- "Failed to set %lu MiB %s allocation",
+ "Failed to set %u MiB %s allocation",
shadow_mb,
libxl_defbool_val(d_config->c_info.hap) ? "HAP" : "shadow");
ret = ERROR_FAIL;
{
CAMLparam2(xch, domid);
CAMLlocal1(mb);
- unsigned long c_mb;
+ unsigned int c_mb;
int ret;
caml_enter_blocking_section();
ret = xc_shadow_control(_H(xch), _D(domid),
XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION,
- NULL, 0, &c_mb, 0, NULL);
+ &c_mb, 0);
caml_leave_blocking_section();
if (ret != 0)
failwith_xc(_H(xch));
value mb)
{
CAMLparam3(xch, domid, mb);
- unsigned long c_mb;
+ unsigned int c_mb;
int ret;
c_mb = Int_val(mb);
caml_enter_blocking_section();
ret = xc_shadow_control(_H(xch), _D(domid),
XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION,
- NULL, 0, &c_mb, 0, NULL);
+ &c_mb, 0);
caml_leave_blocking_section();
if (ret != 0)
failwith_xc(_H(xch));
&dom, &op) )
return NULL;
- if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, NULL, 0, NULL)
- < 0 )
+ if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0) < 0 )
return pyxc_error_to_exception(xc->xc_handle);
Py_INCREF(zero);
int op;
uint32_t dom;
int mbarg = -1;
- unsigned long mb;
+ unsigned int mb;
static char *kwd_list[] = { "dom", "mb", NULL };
mb = mbarg;
op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION;
}
- if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 )
+ if ( xc_shadow_control(xc->xc_handle, dom, op, &mb, 0) < 0 )
return pyxc_error_to_exception(xc->xc_handle);
mbarg = mb;