struct xc_interface_core *xc_interface_open(xentoollog_logger *logger, xentoollog_logger *dombuild_logger, unsigned open_flags) { struct xc_interface_core xch_buf = { 0 }, *xch = &xch_buf; xch->flags = open_flags; xch->dombuild_logger_file = 0; xc_clear_last_error(xch); xch->error_handler = logger; xch->error_handler_tofree = 0; xch->dombuild_logger = dombuild_logger; xch->dombuild_logger_tofree = 0; if (!xch->error_handler) { xch->error_handler = xch->error_handler_tofree = (xentoollog_logger*) xtl_createlogger_stdiostream(stderr, XTL_PROGRESS, 0); if (!xch->error_handler) goto err; } xch = malloc(sizeof(*xch)); if (!xch) { xch = &xch_buf; PERROR("Could not allocate new xc_interface struct"); goto err; } *xch = xch_buf; if (open_flags & XC_OPENFLAG_DUMMY) return xch; /* We are done */ xch->xcall = xencall_open(xch->error_handler, open_flags & XC_OPENFLAG_NON_REENTRANT ? XENCALL_OPENFLAG_NON_REENTRANT : 0U); if ( xch->xcall == NULL ) goto err; xch->fmem = xenforeignmemory_open(xch->error_handler, 0); if ( xch->fmem == NULL ) goto err; xch->dmod = xendevicemodel_open(xch->error_handler, 0); if ( xch->dmod == NULL ) goto err; return xch; err: xenforeignmemory_close(xch->fmem); xencall_close(xch->xcall); xtl_logger_destroy(xch->error_handler_tofree); if (xch != &xch_buf) free(xch); return NULL; }
static void failwith_oss_xc(xc_interface *xch, char *fct) { char buf[80]; const xc_error *error; error = xc_get_last_error(xch); if (error->code == XC_ERROR_NONE) snprintf(buf, 80, "%s: [%d] %s", fct, errno, strerror(errno)); else snprintf(buf, 80, "%s: [%d] %s", fct, error->code, error->message); xc_clear_last_error(xch); caml_failwith(buf); }
static void failwith_oss_xc(char *fct) { char buf[80]; const xc_error *error; error = xc_get_last_error(xch); if (error->code == XC_ERROR_NONE) snprintf(buf, 80, "%s: [%d] %s", fct, errno, strerror(errno)); else snprintf(buf, 80, "%s: [%d] %s", fct, error->code, error->message); xc_clear_last_error(xch); xg_err("xenguest: %s\n", buf); exit(1); }
static xc_error * _xc_get_last_error(void) { xc_error *last_error; pthread_once(&last_error_pkey_once, _xc_init_last_error); last_error = pthread_getspecific(last_error_pkey); if (last_error == NULL) { last_error = malloc(sizeof(xc_error)); pthread_setspecific(last_error_pkey, last_error); xc_clear_last_error(); } return last_error; }
static struct xc_interface_core *xc_interface_open_common(xentoollog_logger *logger, xentoollog_logger *dombuild_logger, unsigned open_flags, enum xc_osdep_type type) { struct xc_interface_core xch_buf, *xch = &xch_buf; xch->type = type; xch->flags = open_flags; xch->dombuild_logger_file = 0; xc_clear_last_error(xch); xch->error_handler = logger; xch->error_handler_tofree = 0; xch->dombuild_logger = dombuild_logger; xch->dombuild_logger_tofree = 0; xch->hypercall_buffer_cache_nr = 0; xch->hypercall_buffer_total_allocations = 0; xch->hypercall_buffer_total_releases = 0; xch->hypercall_buffer_current_allocations = 0; xch->hypercall_buffer_maximum_allocations = 0; xch->hypercall_buffer_cache_hits = 0; xch->hypercall_buffer_cache_misses = 0; xch->hypercall_buffer_cache_toobig = 0; xch->ops_handle = XC_OSDEP_OPEN_ERROR; xch->ops = NULL; if (!xch->error_handler) { xch->error_handler = xch->error_handler_tofree = (xentoollog_logger*) xtl_createlogger_stdiostream(stderr, XTL_PROGRESS, 0); if (!xch->error_handler) goto err; } xch = malloc(sizeof(*xch)); if (!xch) { xch = &xch_buf; PERROR("Could not allocate new xc_interface struct"); goto err; } *xch = xch_buf; if (!(open_flags & XC_OPENFLAG_DUMMY)) { if ( xc_osdep_get_info(xch, &xch->osdep) < 0 ) goto err; xch->ops = xch->osdep.init(xch, type); if ( xch->ops == NULL ) { DPRINTF("OSDEP: interface %d (%s) not supported on this platform", type, xc_osdep_type_name(type)); goto err_put_iface; } xch->ops_handle = xch->ops->open(xch); if (xch->ops_handle == XC_OSDEP_OPEN_ERROR) goto err_put_iface; } return xch; err_put_iface: xc_osdep_put(&xch->osdep); err: xtl_logger_destroy(xch->error_handler_tofree); if (xch != &xch_buf) free(xch); return NULL; }