WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: Error reporting capabilities for libxc

To: "Daniel P. Berrange" <berrange@xxxxxxxxxx>
Subject: [Xen-devel] Re: Error reporting capabilities for libxc
From: Anthony Liguori <aliguori@xxxxxxxxxx>
Date: Mon, 23 Oct 2006 14:17:40 -0500
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Mon, 23 Oct 2006 12:18:38 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20061023180017.GE25795@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <3AAA99889D105740BE010EB6D5A5A3B202A3B1@xxxxxxxxxxxxxxxxxxxxxxxxxx> <20061023180017.GE25795@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5.0.7 (X11/20060918)
Daniel P. Berrange wrote:
On Tue, Sep 26, 2006 at 01:58:11PM +0100, Ian Pratt wrote:
On 26/9/06 12:45, "Stephen C. Tweedie" <sct@xxxxxxxxxx> wrote:

So, I've prototyped a simple error reporting mechanism for
libxc. The
idea is we first define an enum for the broad classes of
errors which can occur.
...

Any way, the upshot of all this work:
  # xm create error
  Using config file "error".
Error: [2, 'Kernel ELF architecture 3 does not match Xen architecture 62']
IMHO this is sorely needed.  Any comments from XenSource people?
I'd agree something like this is necessary in the 3.0.4 timeframe. I'll let one of the guys more acquainted with xend comment in detail. There's also the question of how this will integrate with the proposed 'XenAPI'.
Yep, definitely needs to happen. However, I think we should at least
discuss alternative potentially less clunky implementation methods.
Perhaps we should use a thread local errno and error string variables?

Attached is an update to the original patch which annotates the static
variables with __thread so that they are setup per-thread. It also adds
more informative error reporting for bad kernels.

What versions of GCC have you tested this with?

I've found in the past that __thread can have problems when using shared libraries (the exact instance was a Python binding).

Regards,

Anthony Liguori


The only issue is that __thread is a GCC specific extension, so I'm not
sure this will work for the Solaris folks ?

  http://gcc.gnu.org/onlinedocs/gcc/Thread_002dLocal.html

The other option is to use the POSIX APIs pthread_getspecific & pthread_setspecific. It'll make the code alot more cumbersome, but
would certainly be portable. I'm certainly willing to do this though
if need be...

  Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx>

Regards,
Dan.


------------------------------------------------------------------------

diff -ruN xen-3.0.3_0-src.orig/tools/libxc/xc_hvm_build.c 
xen-3.0.3_0-src.new/tools/libxc/xc_hvm_build.c
--- xen-3.0.3_0-src.orig/tools/libxc/xc_hvm_build.c     2006-10-15 
08:22:03.000000000 -0400
+++ xen-3.0.3_0-src.new/tools/libxc/xc_hvm_build.c      2006-10-23 
11:43:17.000000000 -0400
@@ -460,7 +460,6 @@
                      ctxt, domctl.u.getdomaininfo.shared_info_frame,
                      vcpus, pae, acpi, apic, store_evtchn, store_mfn) < 0)
     {
-        ERROR("Error constructing guest OS");
         goto error_out;
     }
@@ -529,26 +528,30 @@ if ( !IS_ELF(*ehdr) )
     {
-        ERROR("Kernel image does not have an ELF header.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Kernel image does not have an ELF header.");
         return -EINVAL;
     }
if ( (ehdr->e_phoff + (ehdr->e_phnum * ehdr->e_phentsize)) > elfsize )
     {
-        ERROR("ELF program headers extend beyond end of image.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF program headers extend beyond end of image.");
         return -EINVAL;
     }
if ( (ehdr->e_shoff + (ehdr->e_shnum * ehdr->e_shentsize)) > elfsize )
     {
-        ERROR("ELF section headers extend beyond end of image.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF section headers extend beyond end of image.");
         return -EINVAL;
     }
/* Find the section-header strings table. */
     if ( ehdr->e_shstrndx == SHN_UNDEF )
     {
-        ERROR("ELF image has no section-header strings table (shstrtab).");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF image has no section-header strings table 
(shstrtab).");
         return -EINVAL;
     }
     shdr = (Elf32_Shdr *)(elfbase + ehdr->e_shoff +
@@ -570,7 +573,8 @@
          (ehdr->e_entry < kernstart) ||
          (ehdr->e_entry > kernend) )
     {
-        ERROR("Malformed ELF image.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Malformed ELF image.");
         return -EINVAL;
     }
diff -ruN xen-3.0.3_0-src.orig/tools/libxc/xc_linux_build.c xen-3.0.3_0-src.new/tools/libxc/xc_linux_build.c
--- xen-3.0.3_0-src.orig/tools/libxc/xc_linux_build.c   2006-10-15 
08:22:03.000000000 -0400
+++ xen-3.0.3_0-src.new/tools/libxc/xc_linux_build.c    2006-10-23 
13:30:13.000000000 -0400
@@ -121,7 +121,7 @@
     if ( probe_elf(image, image_size, load_funcs) &&
          probe_bin(image, image_size, load_funcs) )
     {
-        ERROR( "Unrecognized image format" );
+        xc_set_error(XC_INVALID_KERNEL, "Not a valid ELF or raw kernel image");
         return -EINVAL;
     }
@@ -611,17 +611,20 @@
     xen_capabilities_info_t xen_caps = "";
if (xc_version(xc_handle, XENVER_capabilities, &xen_caps) != 0) {
-        ERROR("Cannot determine host capabilities.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Cannot determine host capabilities.");
         return 0;
     }
if (strstr(xen_caps, "xen-3.0-x86_32p")) {
         if (dsi->pae_kernel == PAEKERN_no) {
-            ERROR("Non PAE-kernel on PAE host.");
+            xc_set_error(XC_INVALID_KERNEL,
+                         "Non PAE-kernel on PAE host.");
             return 0;
         }
     } else if (dsi->pae_kernel != PAEKERN_no) {
-        ERROR("PAE-kernel on non-PAE host.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "PAE-kernel on non-PAE host.");
         return 0;
     }
@@ -1167,7 +1170,6 @@
                      console_evtchn, console_mfn,
                      features_bitmap) < 0 )
     {
-        ERROR("Error constructing guest OS");
         goto error_out;
     }
diff -ruN xen-3.0.3_0-src.orig/tools/libxc/xc_load_elf.c xen-3.0.3_0-src.new/tools/libxc/xc_load_elf.c
--- xen-3.0.3_0-src.orig/tools/libxc/xc_load_elf.c      2006-10-15 
08:22:03.000000000 -0400
+++ xen-3.0.3_0-src.new/tools/libxc/xc_load_elf.c       2006-10-23 
13:36:06.000000000 -0400
@@ -29,20 +29,46 @@
  */
 #if defined(__ia64__)
 #define ELFCLASS   ELFCLASS64
+#define ELFCLASS_DESC "64-bit"
+
 #define ELFDATA    ELFDATA2LSB
+#define ELFDATA_DESC "Little-Endian"
+
 #define ELFMACHINE EM_IA_64
+#define ELFMACHINE_DESC "ia64"
+
+
 #elif defined(__i386__)
 #define ELFCLASS   ELFCLASS32
+#define ELFCLASS_DESC "32-bit"
+
 #define ELFDATA    ELFDATA2LSB
+#define ELFDATA_DESC "Little-Endian"
+
 #define ELFMACHINE EM_386
+#define ELFMACHINE_DESC "i386"
+
+
 #elif defined(__x86_64__)
 #define ELFCLASS   ELFCLASS64
+#define ELFCLASS_DESC "64-bit"
+
 #define ELFDATA    ELFDATA2LSB
+#define ELFDATA_DESC "Little-Endian"
+
 #define ELFMACHINE EM_X86_64
+#define ELFMACHINE_DESC "x86_64"
+
+
 #elif defined(__powerpc__)
 #define ELFCLASS   ELFCLASS64
+#define ELFCLASS_DESC "64-bit"
+
 #define ELFDATA    ELFDATA2MSB
+#define ELFDATA_DESC "Big-Endian"
+
 #define ELFMACHINE EM_PPC64
+#define ELFMACHINE_DESC "ppc64"
 #endif
int probe_elf(const char *image,
@@ -231,7 +257,8 @@
         *defined = 1;
         return *(uint64_t*)ELFNOTE_DESC(note);
     default:
-        ERROR("elfnotes: unknown data size %#x for numeric type note %#x\n",
+        xc_set_error(XC_INVALID_KERNEL,
+                     "elfnotes: unknown data size %#x for numeric type note 
%#x\n",
               note->descsz, type);
         return 0;
     }
@@ -250,35 +277,59 @@
if ( !IS_ELF(*ehdr) )
     {
-        ERROR("Kernel image does not have an ELF header.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Kernel image does not have an ELF header.");
         return -EINVAL;
     }
- if ( (ehdr->e_ident[EI_CLASS] != ELFCLASS) ||
-         (ehdr->e_machine != ELFMACHINE) ||
-         (ehdr->e_ident[EI_DATA] != ELFDATA) ||
-         (ehdr->e_type != ET_EXEC) )
+    if (ehdr->e_machine != ELFMACHINE)
+    {
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Kernel ELF architecture '%d' does not match Xen architecture 
'%d' (%s)",
+                     ehdr->e_machine, ELFMACHINE, ELFMACHINE_DESC);
+        return -EINVAL;
+    }
+    if (ehdr->e_ident[EI_CLASS] != ELFCLASS)
+    {
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Kernel ELF wordsize '%d' does not match Xen wordsize '%d' 
(%s)",
+                     ehdr->e_ident[EI_CLASS], ELFCLASS, ELFCLASS_DESC);
+        return -EINVAL;
+    }
+    if (ehdr->e_ident[EI_DATA] != ELFDATA)
+    {
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Kernel ELF endianness '%d' does not match Xen endianness '%d' 
(%s)",
+                     ehdr->e_ident[EI_DATA], ELFDATA, ELFDATA_DESC);
+        return -EINVAL;
+    }
+    if (ehdr->e_type != ET_EXEC)
     {
-        ERROR("Kernel not a Xen-compatible Elf image.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Kernel ELF type '%d' does not match Xen type '%d'",
+                     ehdr->e_type, ET_EXEC);
         return -EINVAL;
     }
if ( (ehdr->e_phoff + (ehdr->e_phnum*ehdr->e_phentsize)) > image_len )
     {
-        ERROR("ELF program headers extend beyond end of image.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF program headers extend beyond end of image.");
         return -EINVAL;
     }
if ( (ehdr->e_shoff + (ehdr->e_shnum*ehdr->e_shentsize)) > image_len )
     {
-        ERROR("ELF section headers extend beyond end of image.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF section headers extend beyond end of image.");
         return -EINVAL;
     }
/* Find the section-header strings table. */
     if ( ehdr->e_shstrndx == SHN_UNDEF )
     {
-        ERROR("ELF image has no section-header strings table (shstrtab).");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF image has no section-header strings table 
(shstrtab).");
         return -EINVAL;
     }
     shdr = (Elf_Shdr *)(image + ehdr->e_shoff +
@@ -325,22 +376,25 @@
         if ( ( loader == NULL || strncmp(loader, "generic", 7) ) &&
              ( guest_os == NULL || strncmp(guest_os, "linux", 5) ) )
         {
-            ERROR("Will only load images built for the generic loader "
-                  "or Linux images");
+            xc_set_error(XC_INVALID_KERNEL,
+                         "Will only load images built for the generic loader "
+                         "or Linux images");
             return -EINVAL;
         }
if ( xen_version == NULL || strncmp(xen_version, "xen-3.0", 7) )
         {
-            ERROR("Will only load images built for Xen v3.0");
+            xc_set_error(XC_INVALID_KERNEL,
+                         "Will only load images built for Xen v3.0");
             return -EINVAL;
         }
     }
     else
     {
 #if defined(__x86_64__) || defined(__i386__)
-        ERROR("Not a Xen-ELF image: "
-              "No ELF notes or '__xen_guest' section found.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Not a Xen-ELF image: "
+                     "No ELF notes or '__xen_guest' section found.");
         return -EINVAL;
 #endif
     }
@@ -396,8 +450,9 @@
if ( elf_pa_off_defined && !virt_base_defined )
     {
-        ERROR("Neither ELF_PADDR_OFFSET nor VIRT_BASE found in ELF "
-              " notes or __xen_guest section.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "Neither ELF_PADDR_OFFSET nor VIRT_BASE found in ELF "
+                     " notes or __xen_guest section.");
         return -EINVAL;
     }
@@ -409,7 +464,8 @@
         vaddr = phdr->p_paddr - dsi->elf_paddr_offset + dsi->v_start;
         if ( (vaddr + phdr->p_memsz) < vaddr )
         {
-            ERROR("ELF program header %d is too large.", h);
+            xc_set_error(XC_INVALID_KERNEL,
+                         "ELF program header %d is too large.", h);
             return -EINVAL;
         }
@@ -431,7 +487,8 @@
          (dsi->v_kernentry > kernend) ||
          (dsi->v_start > kernstart) )
     {
-        ERROR("ELF start or entries are out of bounds.");
+        xc_set_error(XC_INVALID_KERNEL,
+                     "ELF start or entries are out of bounds.");
         return -EINVAL;
     }
diff -ruN xen-3.0.3_0-src.orig/tools/libxc/xc_private.c xen-3.0.3_0-src.new/tools/libxc/xc_private.c
--- xen-3.0.3_0-src.orig/tools/libxc/xc_private.c       2006-10-15 
08:22:03.000000000 -0400
+++ xen-3.0.3_0-src.new/tools/libxc/xc_private.c        2006-10-23 
13:47:54.000000000 -0400
@@ -6,6 +6,85 @@
#include <inttypes.h>
 #include "xc_private.h"
+#include <stdarg.h>
+
+static __thread int last_error_code = XC_ERROR_NONE;
+static __thread char *last_error_message = NULL;
+#if DEBUG
+static xc_error_handler error_handler = xc_default_error_handler;
+#else
+static xc_error_handler error_handler = NULL;
+#endif
+
+void xc_default_error_handler(int code, const char *msg) {
+    const char *desc = xc_error_code_to_desc(code);
+    fprintf(stderr, "ERROR %s: %s\n", desc, msg);
+}
+
+int xc_get_last_error_code(void) {
+    return last_error_code;
+}
+
+const char *xc_get_last_error_message(void) {
+    return last_error_message;
+}
+
+void xc_clear_last_error(void) {
+    last_error_code = XC_ERROR_NONE;
+    if (last_error_message) {
+        free(last_error_message);
+        last_error_message = NULL;
+    }
+}
+
+const char *xc_error_code_to_desc(int code) {
+    /* Sync to members of xc_error_code enumeration in xenctrl.h */
+    switch (code) {
+    case XC_ERROR_NONE: return "No error details";
+    case XC_INTERNAL_ERROR: return "Internal error";
+    case XC_INVALID_KERNEL: return "Invalid kernel";
+    default:
+        return "Unknown error code";
+    }
+}
+
+xc_error_handler xc_set_error_handler(xc_error_handler handler) {
+    xc_error_handler old = error_handler;
+    error_handler = handler;
+    return old;
+}
+
+
+static void _xc_set_error(int code, const char *msg) {
+    xc_clear_last_error();
+    last_error_code = code;
+    /* NB, we delibrately ignore the OOM condition when
+       strdup()'ing here - there's not really anything
+       we can - particularly if the error we're reporting
+       was an OOM in the first place. The caller can always
+       find the latter via errno */
+    last_error_message = strdup(msg);
+}
+
+#define XC_MAX_ERROR_MSG 4096
+void xc_set_error(int code, const char *fmt, ...) {
+    int saved_errno = errno;
+    char msg[XC_MAX_ERROR_MSG];
+    va_list args;
+
+    va_start(args, fmt);
+    vsnprintf(msg, XC_MAX_ERROR_MSG-1, fmt, args);
+    msg[XC_MAX_ERROR_MSG-1] = '\0';
+    va_end(args);
+
+    _xc_set_error(code, msg);
+
+    errno = saved_errno;
+
+    if (error_handler)
+        error_handler(code, msg);
+}
+
/* NB: arr must be mlock'ed */
 int xc_get_pfn_type_batch(int xc_handle,
diff -ruN xen-3.0.3_0-src.orig/tools/libxc/xc_private.h 
xen-3.0.3_0-src.new/tools/libxc/xc_private.h
--- xen-3.0.3_0-src.orig/tools/libxc/xc_private.h       2006-10-15 
08:22:03.000000000 -0400
+++ xen-3.0.3_0-src.new/tools/libxc/xc_private.h        2006-10-23 
11:43:17.000000000 -0400
@@ -56,25 +56,13 @@
 #define PPRINTF(_f, _a...)
 #endif
-#define ERR(_f, _a...) do { \
-    DPRINTF(_f ": %d\n" , ## _a, errno);        \
-    fflush(stderr); }                           \
-while (0)
-
-#define ERROR(_m, _a...)                        \
-do {                                            \
-    int __saved_errno = errno;                  \
-    DPRINTF("ERROR: " _m "\n" , ## _a );        \
-    errno = __saved_errno;                      \
-} while (0)
-
-#define PERROR(_m, _a...)                               \
-do {                                                    \
-    int __saved_errno = errno;                          \
-    DPRINTF("ERROR: " _m " (%d = %s)\n" , ## _a ,       \
-            __saved_errno, strerror(__saved_errno));    \
-    errno = __saved_errno;                              \
-} while (0)
+void xc_set_error(int code, const char *fmt, ...);
+
+#define ERR(_f, _a...) ERROR(_f, ## _a)
+
+#define ERROR(_m, _a...) xc_set_error(XC_INTERNAL_ERROR, _m, ## _a)
+
+#define PERROR(_m, _a...) xc_set_error(XC_INTERNAL_ERROR, "%s (%d = %s)", _m, 
errno, strerror(errno))
static inline void safe_munlock(const void *addr, size_t len)
 {
diff -ruN xen-3.0.3_0-src.orig/tools/libxc/xenctrl.h 
xen-3.0.3_0-src.new/tools/libxc/xenctrl.h
--- xen-3.0.3_0-src.orig/tools/libxc/xenctrl.h  2006-10-15 08:22:03.000000000 
-0400
+++ xen-3.0.3_0-src.new/tools/libxc/xenctrl.h   2006-10-23 11:46:31.000000000 
-0400
@@ -656,4 +656,43 @@
  */
 int xc_evtchn_unmask(int xce_handle, evtchn_port_t port);
+
+typedef enum {
+  XC_ERROR_NONE = 0,
+  XC_INTERNAL_ERROR = 1,
+  XC_INVALID_KERNEL = 2,
+} xc_error_code;
+
+/*
+ * Return the code of the last error to occurr
+ */
+int xc_get_last_error_code(void);
+
+/*
+ * Return the message associated with the last error to occur
+ */
+const char *xc_get_last_error_message(void);
+
+/*
+ * Clear the last error
+ */
+void xc_clear_last_error(void);
+
+typedef void (*xc_error_handler)(int code, const char *msg);
+
+/*
+ * The default error handler which prints to stderr
+ */
+void xc_default_error_handler(int code, const char *msg);
+
+/*
+ * Convert an error code into a text description
+ */
+const char *xc_error_code_to_desc(int code);
+
+/*
+ * Registers a callback to handle errors
+ */
+xc_error_handler xc_set_error_handler(xc_error_handler handler);
+
 #endif
diff -ruN xen-3.0.3_0-src.orig/tools/python/xen/lowlevel/xc/xc.c 
xen-3.0.3_0-src.new/tools/python/xen/lowlevel/xc/xc.c
--- xen-3.0.3_0-src.orig/tools/python/xen/lowlevel/xc/xc.c      2006-10-15 
08:22:03.000000000 -0400
+++ xen-3.0.3_0-src.new/tools/python/xen/lowlevel/xc/xc.c       2006-10-23 
11:50:00.000000000 -0400
@@ -37,6 +37,24 @@
 static PyObject *dom_op(XcObject *self, PyObject *args,
                         int (*fn)(int, uint32_t));
+static PyObject *pyxc_error_to_exception(void)
+{
+    PyObject *err;
+    int code = xc_get_last_error_code();
+    const char *desc = xc_error_code_to_desc(code);
+    const char *msg = xc_get_last_error_message();
+
+    if (msg)
+       err = Py_BuildValue("[iss]", code, desc, msg);
+    else
+       err = Py_BuildValue("[is]", code, desc);
+
+    xc_clear_last_error();
+
+    PyErr_SetObject(xc_error, err);
+
+    return NULL;
+}
static PyObject *pyxc_domain_dumpcore(XcObject *self, PyObject *args)
 {
@@ -50,7 +68,7 @@
         return NULL;
if (xc_domain_dumpcore(self->xc_handle, dom, corefile) != 0)
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -95,12 +113,11 @@
     }
if ( (ret = xc_domain_create(self->xc_handle, ssidref, handle, &dom)) < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return PyInt_FromLong(dom); out_exception:
-    errno = EINVAL;
     PyErr_SetFromErrno(xc_error);
     return NULL;
 }
@@ -113,7 +130,7 @@
       return NULL;
if (xc_domain_max_vcpus(self->xc_handle, dom, max) != 0)
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -158,7 +175,7 @@
     }
if ( xc_vcpu_setaffinity(self->xc_handle, dom, vcpu, cpumap) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -178,7 +195,7 @@
         return NULL;
if ( xc_domain_setcpuweight(self->xc_handle, dom, cpuweight) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -209,13 +226,12 @@
     }
if (xc_domain_sethandle(self->xc_handle, dom, handle) < 0)
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
out_exception:
-    errno = EINVAL;
     PyErr_SetFromErrno(xc_error);
     return NULL;
 }
@@ -245,7 +261,7 @@
     if (nr_doms < 0)
     {
         free(info);
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
     }
list = PyList_New(nr_doms);
@@ -299,10 +315,10 @@
rc = xc_vcpu_getinfo(self->xc_handle, dom, vcpu, &info);
     if ( rc < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
     rc = xc_vcpu_getaffinity(self->xc_handle, dom, vcpu, &cpumap);
     if ( rc < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
info_dict = Py_BuildValue("{s:i,s:i,s:i,s:L,s:i}",
                               "online",   info.online,
@@ -352,9 +368,7 @@
                         ramdisk, cmdline, features, flags,
                         store_evtchn, &store_mfn,
                         console_evtchn, &console_mfn) != 0 ) {
-        if (!errno)
-             errno = EINVAL;
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
     }
return Py_BuildValue("{s:i,s:i}", "store_mfn", store_mfn,
@@ -385,7 +399,7 @@
if ( xc_hvm_build(self->xc_handle, dom, memsize, image,
                       vcpus, pae, acpi, apic, store_evtchn, &store_mfn) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return Py_BuildValue("{s:i}", "store_mfn", store_mfn);
 }
@@ -404,7 +418,7 @@
         return NULL;
if ( (port = xc_evtchn_alloc_unbound(self->xc_handle, dom, remote_dom)) < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return PyInt_FromLong(port);
 }
@@ -425,7 +439,7 @@
     ret = xc_physdev_pci_access_modify(
         self->xc_handle, dom, bus, dev, func, enable);
     if ( ret != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -447,7 +461,7 @@
ret = xc_readconsolering(self->xc_handle, &str, &count, clear);
     if ( ret < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return PyString_FromStringAndSize(str, count);
 }
@@ -477,7 +491,7 @@
     int i;
if ( xc_physinfo(self->xc_handle, &info) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
*q=0;
     for(i=0;i<sizeof(info.hw_cap)/4;i++)
@@ -515,25 +529,25 @@
     xen_version = xc_version(self->xc_handle, XENVER_version, NULL);
if ( xc_version(self->xc_handle, XENVER_extraversion, &xen_extra) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
if ( xc_version(self->xc_handle, XENVER_compile_info, &xen_cc) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
if ( xc_version(self->xc_handle, XENVER_changeset, &xen_chgset) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
if ( xc_version(self->xc_handle, XENVER_capabilities, &xen_caps) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
if ( xc_version(self->xc_handle, XENVER_platform_parameters, &p_parms) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
sprintf(str, "virt_start=0x%lx", p_parms.virt_start); xen_pagesize = xc_version(self->xc_handle, XENVER_pagesize, NULL);
     if (xen_pagesize < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return Py_BuildValue("{s:i,s:i,s:s,s:s,s:i,s:s,s:s,s:s,s:s,s:s,s:s}",
                          "xen_major", xen_version >> 16,
@@ -566,7 +580,7 @@
         return NULL;
    if ( xc_sedf_domain_set(self->xc_handle, domid, period,
                            slice, latency, extratime,weight) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -583,7 +597,7 @@
if (xc_sedf_domain_get(self->xc_handle, domid, &period,
                            &slice,&latency,&extratime,&weight))
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return Py_BuildValue("{s:i,s:L,s:L,s:L,s:i,s:i}",
                          "domain",    domid,
@@ -611,7 +625,7 @@
if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, NULL, 0, NULL) < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -641,7 +655,7 @@
         op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION;
     }
     if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
mbarg = mb;
     return Py_BuildValue("i", mbarg);
@@ -668,7 +682,7 @@
     sdom.cap = cap;
if ( xc_sched_credit_domain_set(self->xc_handle, domid, &sdom) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -683,7 +697,7 @@
         return NULL;
if ( xc_sched_credit_domain_get(self->xc_handle, domid, &sdom) != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
return Py_BuildValue("{s:H,s:H}",
                          "weight",  sdom.weight,
@@ -699,7 +713,7 @@
         return NULL;
if (xc_domain_setmaxmem(self->xc_handle, dom, maxmem_kb) != 0)
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -726,7 +740,7 @@
if ( xc_domain_memory_increase_reservation(self->xc_handle, dom, nr_extents, extent_order, address_bits, NULL) )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -748,7 +762,7 @@
     ret = xc_domain_ioport_permission(
         self->xc_handle, dom, first_port, nr_ports, allow_access);
     if ( ret != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -771,7 +785,7 @@
     ret = xc_domain_irq_permission(
         xc->xc_handle, dom, pirq, allow_access);
     if ( ret != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -794,7 +808,7 @@
     ret = xc_domain_iomem_permission(
         xc->xc_handle, dom, first_pfn, nr_pfns, allow_access);
     if ( ret != 0 )
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -834,7 +848,7 @@
         return NULL;
if (fn(self->xc_handle, dom) != 0)
-        return PyErr_SetFromErrno(xc_error);
+        return pyxc_error_to_exception();
Py_INCREF(zero);
     return zero;
@@ -1157,7 +1171,7 @@
 PyXc_init(XcObject *self, PyObject *args, PyObject *kwds)
 {
     if ((self->xc_handle = xc_interface_open()) == -1) {
-        PyErr_SetFromErrno(xc_error);
+        pyxc_error_to_exception();
         return -1;
     }

------------------------------------------------------------------------

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel