[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries



On Fri, 2011-10-07 at 11:25 +0100, Jon Ludlam wrote:
> ocamlfind does not support namespaces, so to avoid
> name clashes the module names have become longer.
> Additionally, the xenstore and xenbus subdirs, which
> contain several modules each, have been packed into
> toplevel Xenstore and Xenbus modules.
> 
> xb becomes xenbus, xc becomes xenctrl, xl becomes xenlight,
> xs becomes xenstore, eventchn becomes xeneventchn and
> mmap becomes xenmmap.
> 
> Signed-off-by: Jon Ludlam <jonathan.ludlam@xxxxxxxxxxxxx>

I only skimmed the changes (rather than the moves which I assume are
basically identical code).

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/META.in
> --- a/tools/ocaml/libs/eventchn/META.in
> +++ b/tools/ocaml/libs/eventchn/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "Eventchn interface extension"
>  requires = "unix"
> -archive(byte) = "eventchn.cma"
> -archive(native) = "eventchn.cmxa"
> +archive(byte) = "xeneventchn.cma"
> +archive(native) = "xeneventchn.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/Makefile
> --- a/tools/ocaml/libs/eventchn/Makefile
> +++ b/tools/ocaml/libs/eventchn/Makefile
> @@ -4,11 +4,11 @@
> 
>  CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
> 
> -OBJS = eventchn
> +OBJS = xeneventchn
>  INTF = $(foreach obj, $(OBJS),$(obj).cmi)
> -LIBS = eventchn.cma eventchn.cmxa
> +LIBS = xeneventchn.cma xeneventchn.cmxa
> 
> -LIBS_evtchn = $(LDLIBS_libxenctrl)
> +LIBS_xeneventchn = $(LDLIBS_libxenctrl)
> 
>  all: $(INTF) $(LIBS) $(PROGRAMS)
> 
> @@ -16,20 +16,20 @@
> 
>  libs: $(LIBS)
> 
> -eventchn_OBJS = $(OBJS)
> -eventchn_C_OBJS = eventchn_stubs
> +xeneventchn_OBJS = $(OBJS)
> +xeneventchn_C_OBJS = xeneventchn_stubs
> 
> -OCAML_LIBRARY = eventchn
> +OCAML_LIBRARY = xeneventchn
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore eventchn 
> META $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xeneventchn 
> META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
> 
>  include $(TOPLEVEL)/Makefile.rules
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn.ml
> --- a/tools/ocaml/libs/eventchn/eventchn.ml
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -exception Error of string
> -
> -type handle
> -
> -external init: unit -> handle = "stub_eventchn_init"
> -external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> -external notify: handle -> int -> unit = "stub_eventchn_notify"
> -external bind_interdomain: handle -> int -> int -> int = 
> "stub_eventchn_bind_interdomain"
> -external bind_dom_exc_virq: handle -> int = "stub_eventchn_bind_dom_exc_virq"
> -external unbind: handle -> int -> unit = "stub_eventchn_unbind"
> -external pending: handle -> int = "stub_eventchn_pending"
> -external unmask: handle -> int -> unit = "stub_eventchn_unmask"
> -
> -let _ = Callback.register_exception "eventchn.error" (Error 
> "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn.mli
> --- a/tools/ocaml/libs/eventchn/eventchn.mli
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -exception Error of string
> -
> -type handle
> -
> -external init : unit -> handle = "stub_eventchn_init"
> -external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> -
> -external notify : handle -> int -> unit = "stub_eventchn_notify"
> -external bind_interdomain : handle -> int -> int -> int
> -  = "stub_eventchn_bind_interdomain"
> -external bind_dom_exc_virq : handle -> int = 
> "stub_eventchn_bind_dom_exc_virq"
> -external unbind : handle -> int -> unit = "stub_eventchn_unbind"
> -external pending : handle -> int = "stub_eventchn_pending"
> -external unmask : handle -> int -> unit
> -  = "stub_eventchn_unmask"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 
> tools/ocaml/libs/eventchn/eventchn_stubs.c
> --- a/tools/ocaml/libs/eventchn/eventchn_stubs.c
> +++ /dev/null
> @@ -1,143 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - */
> -
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <fcntl.h>
> -#include <unistd.h>
> -#include <errno.h>
> -#include <stdint.h>
> -#include <sys/ioctl.h>
> -#include <xen/sysctl.h>
> -#include <xen/xen.h>
> -#include <xen/sys/evtchn.h>
> -#include <xenctrl.h>
> -
> -#define CAML_NAME_SPACE
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -#include <caml/callback.h>
> -#include <caml/fail.h>
> -
> -#define _H(__h) ((xc_interface *)(__h))
> -
> -CAMLprim value stub_eventchn_init(void)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(result);
> -
> -       xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
> -       if (xce == NULL)
> -               caml_failwith("open failed");
> -
> -       result = (value)xce;
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_eventchn_fd(value xce)
> -{
> -       CAMLparam1(xce);
> -       CAMLlocal1(result);
> -       int fd;
> -
> -       fd = xc_evtchn_fd(_H(xce));
> -       if (fd == -1)
> -               caml_failwith("evtchn fd failed");
> -
> -       result = Val_int(fd);
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_eventchn_notify(value xce, value port)
> -{
> -       CAMLparam2(xce, port);
> -       int rc;
> -
> -       rc = xc_evtchn_notify(_H(xce), Int_val(port));
> -       if (rc == -1)
> -               caml_failwith("evtchn notify failed");
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
> -                                              value remote_port)
> -{
> -       CAMLparam3(xce, domid, remote_port);
> -       CAMLlocal1(port);
> -       evtchn_port_or_error_t rc;
> -
> -       rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), 
> Int_val(remote_port));
> -       if (rc == -1)
> -               caml_failwith("evtchn bind_interdomain failed");
> -       port = Val_int(rc);
> -
> -       CAMLreturn(port);
> -}
> -
> -CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
> -{
> -       CAMLparam1(xce);
> -       CAMLlocal1(port);
> -       evtchn_port_or_error_t rc;
> -
> -       rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
> -       if (rc == -1)
> -               caml_failwith("evtchn bind_dom_exc_virq failed");
> -       port = Val_int(rc);
> -
> -       CAMLreturn(port);
> -}
> -
> -CAMLprim value stub_eventchn_unbind(value xce, value port)
> -{
> -       CAMLparam2(xce, port);
> -       int rc;
> -
> -       rc = xc_evtchn_unbind(_H(xce), Int_val(port));
> -       if (rc == -1)
> -               caml_failwith("evtchn unbind failed");
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_eventchn_pending(value xce)
> -{
> -       CAMLparam1(xce);
> -       CAMLlocal1(result);
> -       evtchn_port_or_error_t port;
> -
> -       port = xc_evtchn_pending(_H(xce));
> -       if (port == -1)
> -               caml_failwith("evtchn pending failed");
> -       result = Val_int(port);
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_eventchn_unmask(value xce, value _port)
> -{
> -       CAMLparam2(xce, _port);
> -       evtchn_port_t port;
> -
> -       port = Int_val(_port);
> -       if (xc_evtchn_unmask(_H(xce), port))
> -               caml_failwith("evtchn unmask failed");
> -       CAMLreturn(Val_unit);
> -}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn.ml
> --- /dev/null
> +++ b/tools/ocaml/libs/eventchn/xeneventchn.ml
> @@ -0,0 +1,30 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +exception Error of string
> +
> +type handle
> +
> +external init: unit -> handle = "stub_eventchn_init"
> +external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> +external notify: handle -> int -> unit = "stub_eventchn_notify"
> +external bind_interdomain: handle -> int -> int -> int = 
> "stub_eventchn_bind_interdomain"
> +external bind_dom_exc_virq: handle -> int = "stub_eventchn_bind_dom_exc_virq"
> +external unbind: handle -> int -> unit = "stub_eventchn_unbind"
> +external pending: handle -> int = "stub_eventchn_pending"
> +external unmask: handle -> int -> unit = "stub_eventchn_unmask"
> +
> +let _ = Callback.register_exception "eventchn.error" (Error 
> "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn.mli
> --- /dev/null
> +++ b/tools/ocaml/libs/eventchn/xeneventchn.mli
> @@ -0,0 +1,31 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +exception Error of string
> +
> +type handle
> +
> +external init : unit -> handle = "stub_eventchn_init"
> +external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> +
> +external notify : handle -> int -> unit = "stub_eventchn_notify"
> +external bind_interdomain : handle -> int -> int -> int
> +  = "stub_eventchn_bind_interdomain"
> +external bind_dom_exc_virq : handle -> int = 
> "stub_eventchn_bind_dom_exc_virq"
> +external unbind : handle -> int -> unit = "stub_eventchn_unbind"
> +external pending : handle -> int = "stub_eventchn_pending"
> +external unmask : handle -> int -> unit
> +  = "stub_eventchn_unmask"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 
> tools/ocaml/libs/eventchn/xeneventchn_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c
> @@ -0,0 +1,143 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + */
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <errno.h>
> +#include <stdint.h>
> +#include <sys/ioctl.h>
> +#include <xen/sysctl.h>
> +#include <xen/xen.h>
> +#include <xen/sys/evtchn.h>
> +#include <xenctrl.h>
> +
> +#define CAML_NAME_SPACE
> +#include <caml/mlvalues.h>
> +#include <caml/memory.h>
> +#include <caml/alloc.h>
> +#include <caml/custom.h>
> +#include <caml/callback.h>
> +#include <caml/fail.h>
> +
> +#define _H(__h) ((xc_interface *)(__h))
> +
> +CAMLprim value stub_eventchn_init(void)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(result);
> +
> +       xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
> +       if (xce == NULL)
> +               caml_failwith("open failed");
> +
> +       result = (value)xce;
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_eventchn_fd(value xce)
> +{
> +       CAMLparam1(xce);
> +       CAMLlocal1(result);
> +       int fd;
> +
> +       fd = xc_evtchn_fd(_H(xce));
> +       if (fd == -1)
> +               caml_failwith("evtchn fd failed");
> +
> +       result = Val_int(fd);
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_eventchn_notify(value xce, value port)
> +{
> +       CAMLparam2(xce, port);
> +       int rc;
> +
> +       rc = xc_evtchn_notify(_H(xce), Int_val(port));
> +       if (rc == -1)
> +               caml_failwith("evtchn notify failed");
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
> +                                              value remote_port)
> +{
> +       CAMLparam3(xce, domid, remote_port);
> +       CAMLlocal1(port);
> +       evtchn_port_or_error_t rc;
> +
> +       rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), 
> Int_val(remote_port));
> +       if (rc == -1)
> +               caml_failwith("evtchn bind_interdomain failed");
> +       port = Val_int(rc);
> +
> +       CAMLreturn(port);
> +}
> +
> +CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
> +{
> +       CAMLparam1(xce);
> +       CAMLlocal1(port);
> +       evtchn_port_or_error_t rc;
> +
> +       rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
> +       if (rc == -1)
> +               caml_failwith("evtchn bind_dom_exc_virq failed");
> +       port = Val_int(rc);
> +
> +       CAMLreturn(port);
> +}
> +
> +CAMLprim value stub_eventchn_unbind(value xce, value port)
> +{
> +       CAMLparam2(xce, port);
> +       int rc;
> +
> +       rc = xc_evtchn_unbind(_H(xce), Int_val(port));
> +       if (rc == -1)
> +               caml_failwith("evtchn unbind failed");
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_eventchn_pending(value xce)
> +{
> +       CAMLparam1(xce);
> +       CAMLlocal1(result);
> +       evtchn_port_or_error_t port;
> +
> +       port = xc_evtchn_pending(_H(xce));
> +       if (port == -1)
> +               caml_failwith("evtchn pending failed");
> +       result = Val_int(port);
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_eventchn_unmask(value xce, value _port)
> +{
> +       CAMLparam2(xce, _port);
> +       evtchn_port_t port;
> +
> +       port = Int_val(_port);
> +       if (xc_evtchn_unmask(_H(xce), port))
> +               caml_failwith("evtchn unmask failed");
> +       CAMLreturn(Val_unit);
> +}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/META.in
> --- a/tools/ocaml/libs/mmap/META.in
> +++ b/tools/ocaml/libs/mmap/META.in
> @@ -1,4 +1,4 @@
>  version = "@VERSION@"
>  description = "Mmap interface extension"
> -archive(byte) = "mmap.cma"
> -archive(native) = "mmap.cmxa"
> +archive(byte) = "xenmmap.cma"
> +archive(native) = "xenmmap.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/Makefile
> --- a/tools/ocaml/libs/mmap/Makefile
> +++ b/tools/ocaml/libs/mmap/Makefile
> @@ -2,9 +2,9 @@
>  XEN_ROOT=$(TOPLEVEL)/../..
>  include $(TOPLEVEL)/common.make
> 
> -OBJS = mmap
> +OBJS = xenmmap
>  INTF = $(foreach obj, $(OBJS),$(obj).cmi)
> -LIBS = mmap.cma mmap.cmxa
> +LIBS = xenmmap.cma xenmmap.cmxa
> 
>  all: $(INTF) $(LIBS) $(PROGRAMS)
> 
> @@ -12,19 +12,19 @@
> 
>  libs: $(LIBS)
> 
> -mmap_OBJS = $(OBJS)
> -mmap_C_OBJS = mmap_stubs
> -OCAML_LIBRARY = mmap
> +xenmmap_OBJS = $(OBJS)
> +xenmmap_C_OBJS = xenmmap_stubs
> +OCAML_LIBRARY = xenmmap
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) mmap
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore mmap META 
> $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenmmap
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenmmap 
> META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) mmap
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenmmap
> 
>  include $(TOPLEVEL)/Makefile.rules
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap.ml
> --- a/tools/ocaml/libs/mmap/mmap.ml
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -type mmap_interface
> -
> -type mmap_prot_flag = RDONLY | WRONLY | RDWR
> -type mmap_map_flag = SHARED | PRIVATE
> -
> -(* mmap: fd -> prot_flag -> map_flag -> length -> offset -> interface *)
> -external mmap: Unix.file_descr -> mmap_prot_flag -> mmap_map_flag
> -               -> int -> int -> mmap_interface = "stub_mmap_init"
> -external unmap: mmap_interface -> unit = "stub_mmap_final"
> -(* read: interface -> start -> length -> data *)
> -external read: mmap_interface -> int -> int -> string = "stub_mmap_read"
> -(* write: interface -> data -> start -> length -> unit *)
> -external write: mmap_interface -> string -> int -> int -> unit = 
> "stub_mmap_write"
> -(* getpagesize: unit -> size of page *)
> -external getpagesize: unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap.mli
> --- a/tools/ocaml/libs/mmap/mmap.mli
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -type mmap_interface
> -type mmap_prot_flag = RDONLY | WRONLY | RDWR
> -type mmap_map_flag = SHARED | PRIVATE
> -
> -external mmap : Unix.file_descr -> mmap_prot_flag -> mmap_map_flag -> int -> 
> int
> -             -> mmap_interface = "stub_mmap_init"
> -external unmap : mmap_interface -> unit = "stub_mmap_final"
> -external read : mmap_interface -> int -> int -> string = "stub_mmap_read"
> -external write : mmap_interface -> string -> int -> int -> unit
> -               = "stub_mmap_write"
> -
> -external getpagesize : unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap_stubs.c
> --- a/tools/ocaml/libs/mmap/mmap_stubs.c
> +++ /dev/null
> @@ -1,136 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - */
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <sys/mman.h>
> -#include <string.h>
> -#include <errno.h>
> -#include "mmap_stubs.h"
> -
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#define GET_C_STRUCT(a) ((struct mmap_interface *) a)
> -
> -static int mmap_interface_init(struct mmap_interface *intf,
> -                               int fd, int pflag, int mflag,
> -                               int len, int offset)
> -{
> -       intf->len = len;
> -       intf->addr = mmap(NULL, len, pflag, mflag, fd, offset);
> -       return (intf->addr == MAP_FAILED) ? errno : 0;
> -}
> -
> -CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
> -                              value len, value offset)
> -{
> -       CAMLparam5(fd, pflag, mflag, len, offset);
> -       CAMLlocal1(result);
> -       int c_pflag, c_mflag;
> -
> -       switch (Int_val(pflag)) {
> -       case 0: c_pflag = PROT_READ; break;
> -       case 1: c_pflag = PROT_WRITE; break;
> -       case 2: c_pflag = PROT_READ|PROT_WRITE; break;
> -       default: caml_invalid_argument("protectiontype");
> -       }
> -
> -       switch (Int_val(mflag)) {
> -       case 0: c_mflag = MAP_SHARED; break;
> -       case 1: c_mflag = MAP_PRIVATE; break;
> -       default: caml_invalid_argument("maptype");
> -       }
> -
> -       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> -
> -       if (mmap_interface_init(GET_C_STRUCT(result), Int_val(fd),
> -                               c_pflag, c_mflag,
> -                               Int_val(len), Int_val(offset)))
> -               caml_failwith("mmap");
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_mmap_final(value interface)
> -{
> -       CAMLparam1(interface);
> -       struct mmap_interface *intf;
> -
> -       intf = GET_C_STRUCT(interface);
> -       if (intf->addr != MAP_FAILED)
> -               munmap(intf->addr, intf->len);
> -       intf->addr = MAP_FAILED;
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_mmap_read(value interface, value start, value len)
> -{
> -       CAMLparam3(interface, start, len);
> -       CAMLlocal1(data);
> -       struct mmap_interface *intf;
> -       int c_start;
> -       int c_len;
> -
> -       c_start = Int_val(start);
> -       c_len = Int_val(len);
> -       intf = GET_C_STRUCT(interface);
> -
> -       if (c_start > intf->len)
> -               caml_invalid_argument("start invalid");
> -       if (c_start + c_len > intf->len)
> -               caml_invalid_argument("len invalid");
> -
> -       data = caml_alloc_string(c_len);
> -       memcpy((char *) data, intf->addr + c_start, c_len);
> -
> -       CAMLreturn(data);
> -}
> -
> -CAMLprim value stub_mmap_write(value interface, value data,
> -                               value start, value len)
> -{
> -       CAMLparam4(interface, data, start, len);
> -       struct mmap_interface *intf;
> -       int c_start;
> -       int c_len;
> -
> -       c_start = Int_val(start);
> -       c_len = Int_val(len);
> -       intf = GET_C_STRUCT(interface);
> -
> -       if (c_start > intf->len)
> -               caml_invalid_argument("start invalid");
> -       if (c_start + c_len > intf->len)
> -               caml_invalid_argument("len invalid");
> -
> -       memcpy(intf->addr + c_start, (char *) data, c_len);
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_mmap_getpagesize(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLlocal1(data);
> -
> -       data = Val_int(getpagesize());
> -       CAMLreturn(data);
> -}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap.ml
> --- /dev/null
> +++ b/tools/ocaml/libs/mmap/xenmmap.ml
> @@ -0,0 +1,31 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +type mmap_interface
> +
> +type mmap_prot_flag = RDONLY | WRONLY | RDWR
> +type mmap_map_flag = SHARED | PRIVATE
> +
> +(* mmap: fd -> prot_flag -> map_flag -> length -> offset -> interface *)
> +external mmap: Unix.file_descr -> mmap_prot_flag -> mmap_map_flag
> +               -> int -> int -> mmap_interface = "stub_mmap_init"
> +external unmap: mmap_interface -> unit = "stub_mmap_final"
> +(* read: interface -> start -> length -> data *)
> +external read: mmap_interface -> int -> int -> string = "stub_mmap_read"
> +(* write: interface -> data -> start -> length -> unit *)
> +external write: mmap_interface -> string -> int -> int -> unit = 
> "stub_mmap_write"
> +(* getpagesize: unit -> size of page *)
> +external getpagesize: unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap.mli
> --- /dev/null
> +++ b/tools/ocaml/libs/mmap/xenmmap.mli
> @@ -0,0 +1,28 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +type mmap_interface
> +type mmap_prot_flag = RDONLY | WRONLY | RDWR
> +type mmap_map_flag = SHARED | PRIVATE
> +
> +external mmap : Unix.file_descr -> mmap_prot_flag -> mmap_map_flag -> int -> 
> int
> +             -> mmap_interface = "stub_mmap_init"
> +external unmap : mmap_interface -> unit = "stub_mmap_final"
> +external read : mmap_interface -> int -> int -> string = "stub_mmap_read"
> +external write : mmap_interface -> string -> int -> int -> unit
> +               = "stub_mmap_write"
> +
> +external getpagesize : unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/mmap/xenmmap_stubs.c
> @@ -0,0 +1,136 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + */
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <sys/mman.h>
> +#include <string.h>
> +#include <errno.h>
> +#include "mmap_stubs.h"
> +
> +#include <caml/mlvalues.h>
> +#include <caml/memory.h>
> +#include <caml/alloc.h>
> +#include <caml/custom.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#define GET_C_STRUCT(a) ((struct mmap_interface *) a)
> +
> +static int mmap_interface_init(struct mmap_interface *intf,
> +                               int fd, int pflag, int mflag,
> +                               int len, int offset)
> +{
> +       intf->len = len;
> +       intf->addr = mmap(NULL, len, pflag, mflag, fd, offset);
> +       return (intf->addr == MAP_FAILED) ? errno : 0;
> +}
> +
> +CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
> +                              value len, value offset)
> +{
> +       CAMLparam5(fd, pflag, mflag, len, offset);
> +       CAMLlocal1(result);
> +       int c_pflag, c_mflag;
> +
> +       switch (Int_val(pflag)) {
> +       case 0: c_pflag = PROT_READ; break;
> +       case 1: c_pflag = PROT_WRITE; break;
> +       case 2: c_pflag = PROT_READ|PROT_WRITE; break;
> +       default: caml_invalid_argument("protectiontype");
> +       }
> +
> +       switch (Int_val(mflag)) {
> +       case 0: c_mflag = MAP_SHARED; break;
> +       case 1: c_mflag = MAP_PRIVATE; break;
> +       default: caml_invalid_argument("maptype");
> +       }
> +
> +       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> +
> +       if (mmap_interface_init(GET_C_STRUCT(result), Int_val(fd),
> +                               c_pflag, c_mflag,
> +                               Int_val(len), Int_val(offset)))
> +               caml_failwith("mmap");
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_mmap_final(value interface)
> +{
> +       CAMLparam1(interface);
> +       struct mmap_interface *intf;
> +
> +       intf = GET_C_STRUCT(interface);
> +       if (intf->addr != MAP_FAILED)
> +               munmap(intf->addr, intf->len);
> +       intf->addr = MAP_FAILED;
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_mmap_read(value interface, value start, value len)
> +{
> +       CAMLparam3(interface, start, len);
> +       CAMLlocal1(data);
> +       struct mmap_interface *intf;
> +       int c_start;
> +       int c_len;
> +
> +       c_start = Int_val(start);
> +       c_len = Int_val(len);
> +       intf = GET_C_STRUCT(interface);
> +
> +       if (c_start > intf->len)
> +               caml_invalid_argument("start invalid");
> +       if (c_start + c_len > intf->len)
> +               caml_invalid_argument("len invalid");
> +
> +       data = caml_alloc_string(c_len);
> +       memcpy((char *) data, intf->addr + c_start, c_len);
> +
> +       CAMLreturn(data);
> +}
> +
> +CAMLprim value stub_mmap_write(value interface, value data,
> +                               value start, value len)
> +{
> +       CAMLparam4(interface, data, start, len);
> +       struct mmap_interface *intf;
> +       int c_start;
> +       int c_len;
> +
> +       c_start = Int_val(start);
> +       c_len = Int_val(len);
> +       intf = GET_C_STRUCT(interface);
> +
> +       if (c_start > intf->len)
> +               caml_invalid_argument("start invalid");
> +       if (c_start + c_len > intf->len)
> +               caml_invalid_argument("len invalid");
> +
> +       memcpy(intf->addr + c_start, (char *) data, c_len);
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_mmap_getpagesize(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLlocal1(data);
> +
> +       data = Val_int(getpagesize());
> +       CAMLreturn(data);
> +}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/META.in
> --- a/tools/ocaml/libs/xb/META.in
> +++ b/tools/ocaml/libs/xb/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "XenBus Interface"
> -requires = "unix,mmap"
> -archive(byte) = "xb.cma"
> -archive(native) = "xb.cmxa"
> +requires = "unix,xenmmap"
> +archive(byte) = "xenbus.cma"
> +archive(native) = "xenbus.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/Makefile
> --- a/tools/ocaml/libs/xb/Makefile
> +++ b/tools/ocaml/libs/xb/Makefile
> @@ -6,6 +6,7 @@
>  CFLAGS += $(CFLAGS_libxenctrl) # For xen_mb()
>  CFLAGS += $(CFLAGS_xeninclude)
>  OCAMLINCLUDE += -I ../mmap
> +OCAMLOPTFLAGS += -for-pack Xenbus
> 
>  .NOTPARALLEL:
>  # Ocaml is such a PITA!
> @@ -15,7 +16,7 @@
>  PRELIBS = $(foreach obj, $(PREOBJS),$(obj).cmo) $(foreach 
> obj,$(PREOJBS),$(obj).cmx)
>  OBJS = op partial packet xs_ring xb
>  INTF = op.cmi packet.cmi xb.cmi
> -LIBS = xb.cma xb.cmxa
> +LIBS = xenbus.cma xenbus.cmxa
> 
>  ALL_OCAML_OBJS = $(OBJS) $(PREOJBS)
> 
> @@ -25,22 +26,30 @@
> 
>  libs: $(LIBS)
> 
> -xb_OBJS = $(OBJS)
> -xb_C_OBJS = xs_ring_stubs xb_stubs
> -OCAML_LIBRARY = xb
> +xenbus_OBJS = xenbus
> +xenbus_C_OBJS = xs_ring_stubs xenbus_stubs
> +OCAML_LIBRARY = xenbus
> +
> +xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> +       $(E) " CMX       $@"
> +       $(OCAMLOPT) -pack -o $@ $^
> +
> +xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> +       $(E) " CMO       $@"
> +       $(OCAMLC) -pack -o $@ $^
> 
>  %.mli: %.ml
>         $(E) " MLI       $@"
> -       $(Q)$(OCAMLC) -i $< $o
> +       $(Q)$(OCAMLC) $(OCAMLINCLUDE) -i $< $o
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xb
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xb META 
> $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenbus META 
> $(LIBS) xenbus.cmo xenbus.cmi xenbus.cmx *.a *.so
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xb
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
> 
>  include $(TOPLEVEL)/Makefile.rules
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb.ml
> --- a/tools/ocaml/libs/xb/xb.ml
> +++ b/tools/ocaml/libs/xb/xb.ml
> @@ -24,7 +24,7 @@
> 
>  type backend_mmap =
>  {
> -       mmap: Mmap.mmap_interface;     (* mmaped interface = xs_ring *)
> +       mmap: Xenmmap.mmap_interface;     (* mmaped interface = xs_ring *)
>         eventchn_notify: unit -> unit; (* function to notify through eventchn 
> *)
>         mutable work_again: bool;
>  }
> @@ -34,7 +34,7 @@
>         fd: Unix.file_descr;
>  }
> 
> -type backend = Fd of backend_fd | Mmap of backend_mmap
> +type backend = Fd of backend_fd | Xenmmap of backend_mmap
> 
>  type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * string
> 
> @@ -68,7 +68,7 @@
>  let read con s len =
>         match con.backend with
>         | Fd backfd     -> read_fd backfd con s len
> -       | Mmap backmmap -> read_mmap backmmap con s len
> +       | Xenmmap backmmap -> read_mmap backmmap con s len
> 
>  let write_fd back con s len =
>         Unix.write back.fd s 0 len
> @@ -82,7 +82,7 @@
>  let write con s len =
>         match con.backend with
>         | Fd backfd     -> write_fd backfd con s len
> -       | Mmap backmmap -> write_mmap backmmap con s len
> +       | Xenmmap backmmap -> write_mmap backmmap con s len
> 
>  let output con =
>         (* get the output string from a string_of(packet) or partial_out *)
> @@ -145,7 +145,7 @@
>  let open_fd fd = newcon (Fd { fd = fd; })
> 
>  let open_mmap mmap notifyfct =
> -       newcon (Mmap {
> +       newcon (Xenmmap {
>                 mmap = mmap;
>                 eventchn_notify = notifyfct;
>                 work_again = false; })
> @@ -153,12 +153,12 @@
>  let close con =
>         match con.backend with
>         | Fd backend   -> Unix.close backend.fd
> -       | Mmap backend -> Mmap.unmap backend.mmap
> +       | Xenmmap backend -> Xenmmap.unmap backend.mmap
> 
>  let is_fd con =
>         match con.backend with
>         | Fd _   -> true
> -       | Mmap _ -> false
> +       | Xenmmap _ -> false
> 
>  let is_mmap con = not (is_fd con)
> 
> @@ -176,14 +176,14 @@
>  let has_more_input con =
>         match con.backend with
>         | Fd _         -> false
> -       | Mmap backend -> backend.work_again
> +       | Xenmmap backend -> backend.work_again
> 
>  let is_selectable con =
>         match con.backend with
>         | Fd _   -> true
> -       | Mmap _ -> false
> +       | Xenmmap _ -> false
> 
>  let get_fd con =
>         match con.backend with
>         | Fd backend -> backend.fd
> -       | Mmap _     -> raise (Failure "get_fd")
> +       | Xenmmap _     -> raise (Failure "get_fd")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb.mli
> --- a/tools/ocaml/libs/xb/xb.mli
> +++ b/tools/ocaml/libs/xb/xb.mli
> @@ -1,83 +1,103 @@
> -module Op:
> -sig
> -       type operation = Op.operation =
> -               | Debug
> -               | Directory
> -               | Read
> -               | Getperms
> -               | Watch
> -               | Unwatch
> -               | Transaction_start
> -               | Transaction_end
> -               | Introduce
> -               | Release
> -               | Getdomainpath
> -               | Write
> -               | Mkdir
> -               | Rm
> -               | Setperms
> -               | Watchevent
> -               | Error
> -               | Isintroduced
> -               | Resume
> -               | Set_target
> -               | Restrict
> -       val to_string : operation -> string
> -end
> -
> -module Packet:
> -sig
> -       type t
> -
> -       exception Error of string
> -       exception DataError of string
> -
> -       val create : int -> int -> Op.operation -> string -> t
> -       val unpack : t -> int * int * Op.operation * string
> -
> -       val get_tid : t -> int
> -       val get_ty : t -> Op.operation
> -       val get_data : t -> string
> -       val get_rid: t -> int
> -end
> -
> +module Op :
> +  sig
> +    type operation =
> +      Op.operation =
> +        Debug
> +      | Directory
> +      | Read
> +      | Getperms
> +      | Watch
> +      | Unwatch
> +      | Transaction_start
> +      | Transaction_end
> +      | Introduce
> +      | Release
> +      | Getdomainpath
> +      | Write
> +      | Mkdir
> +      | Rm
> +      | Setperms
> +      | Watchevent
> +      | Error
> +      | Isintroduced
> +      | Resume
> +      | Set_target
> +      | Restrict
> +    val operation_c_mapping : operation array
> +    val size : int
> +    val offset_pq : int
> +    val operation_c_mapping_pq : 'a array
> +    val size_pq : int
> +    val array_search : 'a -> 'a array -> int
> +    val of_cval : int -> operation
> +    val to_cval : operation -> int
> +    val to_string : operation -> string
> +  end
> +module Packet :
> +  sig
> +    type t =
> +      Packet.t = {
> +      tid : int;
> +      rid : int;
> +      ty : Op.operation;
> +      data : string;
> +    }
> +    exception Error of string
> +    exception DataError of string
> +    external string_of_header : int -> int -> int -> int -> string
> +      = "stub_string_of_header"
> +    val create : int -> int -> Op.operation -> string -> t
> +    val of_partialpkt : Partial.pkt -> t
> +    val to_string : t -> string
> +    val unpack : t -> int * int * Op.operation * string
> +    val get_tid : t -> int
> +    val get_ty : t -> Op.operation
> +    val get_data : t -> string
> +    val get_rid : t -> int
> +  end
>  exception End_of_file
>  exception Eagain
>  exception Noent
>  exception Invalid
> -
> -type t
> -
> -(** queue a packet into the output queue for later sending *)
> +type backend_mmap = {
> +  mmap : Xenmmap.mmap_interface;
> +  eventchn_notify : unit -> unit;
> +  mutable work_again : bool;
> +}
> +type backend_fd = { fd : Unix.file_descr; }
> +type backend = Fd of backend_fd | Xenmmap of backend_mmap
> +type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * string
> +type t = {
> +  backend : backend;
> +  pkt_in : Packet.t Queue.t;
> +  pkt_out : Packet.t Queue.t;
> +  mutable partial_in : partial_buf;
> +  mutable partial_out : string;
> +}
> +val init_partial_in : unit -> partial_buf
>  val queue : t -> Packet.t -> unit
> -
> -(** process the output queue, return if a packet has been totally sent *)
> +val read_fd : backend_fd -> 'a -> string -> int -> int
> +val read_mmap : backend_mmap -> 'a -> string -> int -> int
> +val read : t -> string -> int -> int
> +val write_fd : backend_fd -> 'a -> string -> int -> int
> +val write_mmap : backend_mmap -> 'a -> string -> int -> int
> +val write : t -> string -> int -> int
>  val output : t -> bool
> -
> -(** process the input queue, return if a packet has been totally received *)
>  val input : t -> bool
> -
> -(** create new connection using a fd interface *)
> +val newcon : backend -> t
>  val open_fd : Unix.file_descr -> t
> -(** create new connection using a mmap intf and a function to notify 
> eventchn *)
> -val open_mmap : Mmap.mmap_interface -> (unit -> unit) -> t
> -
> -(* close a connection *)
> +val open_mmap : Xenmmap.mmap_interface -> (unit -> unit) -> t
>  val close : t -> unit
> -
>  val is_fd : t -> bool
>  val is_mmap : t -> bool
> -
>  val output_len : t -> int
>  val has_new_output : t -> bool
>  val has_old_output : t -> bool
>  val has_output : t -> bool
>  val peek_output : t -> Packet.t
> -
>  val input_len : t -> int
>  val has_in_packet : t -> bool
>  val get_in_packet : t -> Packet.t
>  val has_more_input : t -> bool
> -
>  val is_selectable : t -> bool
>  val get_fd : t -> Unix.file_descr
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb_stubs.c
> --- a/tools/ocaml/libs/xb/xb_stubs.c
> +++ /dev/null
> @@ -1,71 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - */
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <sys/mman.h>
> -#include <string.h>
> -#include <errno.h>
> -
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#include <xenctrl.h>
> -#include <xen/io/xs_wire.h>
> -
> -CAMLprim value stub_header_size(void)
> -{
> -       CAMLparam0();
> -       CAMLreturn(Val_int(sizeof(struct xsd_sockmsg)));
> -}
> -
> -CAMLprim value stub_header_of_string(value s)
> -{
> -       CAMLparam1(s);
> -       CAMLlocal1(ret);
> -       struct xsd_sockmsg *hdr;
> -
> -       if (caml_string_length(s) != sizeof(struct xsd_sockmsg))
> -               caml_failwith("xb header incomplete");
> -       ret = caml_alloc_tuple(4);
> -       hdr = (struct xsd_sockmsg *) String_val(s);
> -       Store_field(ret, 0, Val_int(hdr->tx_id));
> -       Store_field(ret, 1, Val_int(hdr->req_id));
> -       Store_field(ret, 2, Val_int(hdr->type));
> -       Store_field(ret, 3, Val_int(hdr->len));
> -       CAMLreturn(ret);
> -}
> -
> -CAMLprim value stub_string_of_header(value tid, value rid, value ty, value 
> len)
> -{
> -       CAMLparam4(tid, rid, ty, len);
> -       CAMLlocal1(ret);
> -       struct xsd_sockmsg xsd = {
> -               .type = Int_val(ty),
> -               .tx_id = Int_val(tid),
> -               .req_id = Int_val(rid),
> -               .len = Int_val(len),
> -       };
> -
> -       ret = caml_alloc_string(sizeof(struct xsd_sockmsg));
> -       memcpy(String_val(ret), &xsd, sizeof(struct xsd_sockmsg));
> -
> -       CAMLreturn(ret);
> -}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xenbus_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/xb/xenbus_stubs.c
> @@ -0,0 +1,71 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + */
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <sys/mman.h>
> +#include <string.h>
> +#include <errno.h>
> +
> +#include <caml/mlvalues.h>
> +#include <caml/memory.h>
> +#include <caml/alloc.h>
> +#include <caml/custom.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#include <xenctrl.h>
> +#include <xen/io/xs_wire.h>
> +
> +CAMLprim value stub_header_size(void)
> +{
> +       CAMLparam0();
> +       CAMLreturn(Val_int(sizeof(struct xsd_sockmsg)));
> +}
> +
> +CAMLprim value stub_header_of_string(value s)
> +{
> +       CAMLparam1(s);
> +       CAMLlocal1(ret);
> +       struct xsd_sockmsg *hdr;
> +
> +       if (caml_string_length(s) != sizeof(struct xsd_sockmsg))
> +               caml_failwith("xb header incomplete");
> +       ret = caml_alloc_tuple(4);
> +       hdr = (struct xsd_sockmsg *) String_val(s);
> +       Store_field(ret, 0, Val_int(hdr->tx_id));
> +       Store_field(ret, 1, Val_int(hdr->req_id));
> +       Store_field(ret, 2, Val_int(hdr->type));
> +       Store_field(ret, 3, Val_int(hdr->len));
> +       CAMLreturn(ret);
> +}
> +
> +CAMLprim value stub_string_of_header(value tid, value rid, value ty, value 
> len)
> +{
> +       CAMLparam4(tid, rid, ty, len);
> +       CAMLlocal1(ret);
> +       struct xsd_sockmsg xsd = {
> +               .type = Int_val(ty),
> +               .tx_id = Int_val(tid),
> +               .req_id = Int_val(rid),
> +               .len = Int_val(len),
> +       };
> +
> +       ret = caml_alloc_string(sizeof(struct xsd_sockmsg));
> +       memcpy(String_val(ret), &xsd, sizeof(struct xsd_sockmsg));
> +
> +       CAMLreturn(ret);
> +}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xs_ring.ml
> --- a/tools/ocaml/libs/xb/xs_ring.ml
> +++ b/tools/ocaml/libs/xb/xs_ring.ml
> @@ -14,5 +14,5 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> -external read: Mmap.mmap_interface -> string -> int -> int = 
> "ml_interface_read"
> -external write: Mmap.mmap_interface -> string -> int -> int = 
> "ml_interface_write"
> +external read: Xenmmap.mmap_interface -> string -> int -> int = 
> "ml_interface_read"
> +external write: Xenmmap.mmap_interface -> string -> int -> int = 
> "ml_interface_write"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/META.in
> --- a/tools/ocaml/libs/xc/META.in
> +++ b/tools/ocaml/libs/xc/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "Xen Control Interface"
> -requires = "mmap,uuid"
> -archive(byte) = "xc.cma"
> -archive(native) = "xc.cmxa"
> +requires = "xenmmap,uuid"
> +archive(byte) = "xenctrl.cma"
> +archive(native) = "xenctrl.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/Makefile
> --- a/tools/ocaml/libs/xc/Makefile
> +++ b/tools/ocaml/libs/xc/Makefile
> @@ -5,16 +5,16 @@
>  CFLAGS += -I../mmap $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
>  OCAMLINCLUDE += -I ../mmap -I ../uuid
> 
> -OBJS = xc
> -INTF = xc.cmi
> -LIBS = xc.cma xc.cmxa
> +OBJS = xenctrl
> +INTF = xenctrl.cmi
> +LIBS = xenctrl.cma xenctrl.cmxa
> 
> -LIBS_xc = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
> +LIBS_xenctrl = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
> 
> -xc_OBJS = $(OBJS)
> -xc_C_OBJS = xc_stubs
> +xenctrl_OBJS = $(OBJS)
> +xenctrl_C_OBJS = xenctrl_stubs
> 
> -OCAML_LIBRARY = xc
> +OCAML_LIBRARY = xenctrl
> 
>  all: $(INTF) $(LIBS)
> 
> @@ -23,11 +23,11 @@
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xc
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xc META 
> $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenctrl 
> META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xc
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
> 
>  include $(TOPLEVEL)/Makefile.rules
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc.ml
> --- a/tools/ocaml/libs/xc/xc.ml
> +++ /dev/null
> @@ -1,326 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -(** *)
> -type domid = int
> -
> -(* ** xenctrl.h ** *)
> -
> -type vcpuinfo =
> -{
> -       online: bool;
> -       blocked: bool;
> -       running: bool;
> -       cputime: int64;
> -       cpumap: int32;
> -}
> -
> -type domaininfo =
> -{
> -       domid             : domid;
> -       dying             : bool;
> -       shutdown          : bool;
> -       paused            : bool;
> -       blocked           : bool;
> -       running           : bool;
> -       hvm_guest         : bool;
> -       shutdown_code     : int;
> -       total_memory_pages: nativeint;
> -       max_memory_pages  : nativeint;
> -       shared_info_frame : int64;
> -       cpu_time          : int64;
> -       nr_online_vcpus   : int;
> -       max_vcpu_id       : int;
> -       ssidref           : int32;
> -       handle            : int array;
> -}
> -
> -type sched_control =
> -{
> -       weight : int;
> -       cap    : int;
> -}
> -
> -type physinfo_cap_flag =
> -       | CAP_HVM
> -       | CAP_DirectIO
> -
> -type physinfo =
> -{
> -       threads_per_core : int;
> -       cores_per_socket : int;
> -       nr_cpus          : int;
> -       max_node_id      : int;
> -       cpu_khz          : int;
> -       total_pages      : nativeint;
> -       free_pages       : nativeint;
> -       scrub_pages      : nativeint;
> -       (* XXX hw_cap *)
> -       capabilities     : physinfo_cap_flag list;
> -}
> -
> -type version =
> -{
> -       major : int;
> -       minor : int;
> -       extra : string;
> -}
> -
> -
> -type compile_info =
> -{
> -       compiler : string;
> -       compile_by : string;
> -       compile_domain : string;
> -       compile_date : string;
> -}
> -
> -type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> -
> -type domain_create_flag = CDF_HVM | CDF_HAP
> -
> -exception Error of string
> -
> -type handle
> -
> -(* this is only use by coredumping *)
> -external sizeof_core_header: unit -> int
> -       = "stub_sizeof_core_header"
> -external sizeof_vcpu_guest_context: unit -> int
> -       = "stub_sizeof_vcpu_guest_context"
> -external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn"
> -(* end of use *)
> -
> -external interface_open: unit -> handle = "stub_xc_interface_open"
> -external interface_close: handle -> unit = "stub_xc_interface_close"
> -
> -external is_fake: unit -> bool = "stub_xc_interface_is_fake"
> -
> -let with_intf f =
> -       let xc = interface_open () in
> -       let r = try f xc with exn -> interface_close xc; raise exn in
> -       interface_close xc;
> -       r
> -
> -external _domain_create: handle -> int32 -> domain_create_flag list -> int 
> array -> domid
> -       = "stub_xc_domain_create"
> -
> -let domain_create handle n flags uuid =
> -       _domain_create handle n flags (Uuid.int_array_of_uuid uuid)
> -
> -external _domain_sethandle: handle -> domid -> int array -> unit
> -                          = "stub_xc_domain_sethandle"
> -
> -let domain_sethandle handle n uuid =
> -       _domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
> -
> -external domain_max_vcpus: handle -> domid -> int -> unit
> -       = "stub_xc_domain_max_vcpus"
> -
> -external domain_pause: handle -> domid -> unit = "stub_xc_domain_pause"
> -external domain_unpause: handle -> domid -> unit = "stub_xc_domain_unpause"
> -external domain_resume_fast: handle -> domid -> unit = 
> "stub_xc_domain_resume_fast"
> -external domain_destroy: handle -> domid -> unit = "stub_xc_domain_destroy"
> -
> -external domain_shutdown: handle -> domid -> shutdown_reason -> unit
> -       = "stub_xc_domain_shutdown"
> -
> -external _domain_getinfolist: handle -> domid -> int -> domaininfo list
> -       = "stub_xc_domain_getinfolist"
> -
> -let domain_getinfolist handle first_domain =
> -       let nb = 2 in
> -       let last_domid l = (List.hd l).domid + 1 in
> -       let rec __getlist from =
> -               let l = _domain_getinfolist handle from nb in
> -               (if List.length l = nb then __getlist (last_domid l) else []) 
> @ l
> -               in
> -       List.rev (__getlist first_domain)
> -
> -external domain_getinfo: handle -> domid -> domaininfo= 
> "stub_xc_domain_getinfo"
> -
> -external domain_get_vcpuinfo: handle -> int -> int -> vcpuinfo
> -       = "stub_xc_vcpu_getinfo"
> -
> -external domain_ioport_permission: handle -> domid -> int -> int -> bool -> 
> unit
> -       = "stub_xc_domain_ioport_permission"
> -external domain_iomem_permission: handle -> domid -> nativeint -> nativeint 
> -> bool -> unit
> -       = "stub_xc_domain_iomem_permission"
> -external domain_irq_permission: handle -> domid -> int -> bool -> unit
> -       = "stub_xc_domain_irq_permission"
> -
> -external vcpu_affinity_set: handle -> domid -> int -> bool array -> unit
> -       = "stub_xc_vcpu_setaffinity"
> -external vcpu_affinity_get: handle -> domid -> int -> bool array
> -       = "stub_xc_vcpu_getaffinity"
> -
> -external vcpu_context_get: handle -> domid -> int -> string
> -       = "stub_xc_vcpu_context_get"
> -
> -external sched_id: handle -> int = "stub_xc_sched_id"
> -
> -external sched_credit_domain_set: handle -> domid -> sched_control -> unit
> -       = "stub_sched_credit_domain_set"
> -external sched_credit_domain_get: handle -> domid -> sched_control
> -       = "stub_sched_credit_domain_get"
> -
> -external shadow_allocation_set: handle -> domid -> int -> unit
> -       = "stub_shadow_allocation_set"
> -external shadow_allocation_get: handle -> domid -> int
> -       = "stub_shadow_allocation_get"
> -
> -external evtchn_alloc_unbound: handle -> domid -> domid -> int
> -       = "stub_xc_evtchn_alloc_unbound"
> -external evtchn_reset: handle -> domid -> unit = "stub_xc_evtchn_reset"
> -
> -external readconsolering: handle -> string = "stub_xc_readconsolering"
> -
> -external send_debug_keys: handle -> string -> unit = 
> "stub_xc_send_debug_keys"
> -external physinfo: handle -> physinfo = "stub_xc_physinfo"
> -external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> -
> -external domain_setmaxmem: handle -> domid -> int64 -> unit
> -       = "stub_xc_domain_setmaxmem"
> -external domain_set_memmap_limit: handle -> domid -> int64 -> unit
> -       = "stub_xc_domain_set_memmap_limit"
> -external domain_memory_increase_reservation: handle -> domid -> int64 -> unit
> -       = "stub_xc_domain_memory_increase_reservation"
> -
> -external domain_set_machine_address_size: handle -> domid -> int -> unit
> -       = "stub_xc_domain_set_machine_address_size"
> -external domain_get_machine_address_size: handle -> domid -> int
> -       = "stub_xc_domain_get_machine_address_size"
> -
> -external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> -                        -> string option array
> -                        -> string option array
> -       = "stub_xc_domain_cpuid_set"
> -external domain_cpuid_apply_policy: handle -> domid -> unit
> -       = "stub_xc_domain_cpuid_apply_policy"
> -external cpuid_check: handle -> (int64 * (int64 option)) -> string option 
> array -> (bool * string option array)
> -       = "stub_xc_cpuid_check"
> -
> -external map_foreign_range: handle -> domid -> int
> -                         -> nativeint -> Mmap.mmap_interface
> -       = "stub_map_foreign_range"
> -
> -external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
> -       = "stub_xc_domain_get_pfn_list"
> -
> -external domain_assign_device: handle -> domid -> (int * int * int * int) -> 
> unit
> -       = "stub_xc_domain_assign_device"
> -external domain_deassign_device: handle -> domid -> (int * int * int * int) 
> -> unit
> -       = "stub_xc_domain_deassign_device"
> -external domain_test_assign_device: handle -> domid -> (int * int * int * 
> int) -> bool
> -       = "stub_xc_domain_test_assign_device"
> -
> -external version: handle -> version = "stub_xc_version_version"
> -external version_compile_info: handle -> compile_info
> -       = "stub_xc_version_compile_info"
> -external version_changeset: handle -> string = "stub_xc_version_changeset"
> -external version_capabilities: handle -> string =
> -  "stub_xc_version_capabilities"
> -
> -external watchdog : handle -> int -> int32 -> int
> -  = "stub_xc_watchdog"
> -
> -(* core dump structure *)
> -type core_magic = Magic_hvm | Magic_pv
> -
> -type core_header = {
> -       xch_magic: core_magic;
> -       xch_nr_vcpus: int;
> -       xch_nr_pages: nativeint;
> -       xch_index_offset: int64;
> -       xch_ctxt_offset: int64;
> -       xch_pages_offset: int64;
> -}
> -
> -external marshall_core_header: core_header -> string = 
> "stub_marshall_core_header"
> -
> -(* coredump *)
> -let coredump xch domid fd =
> -       let dump s =
> -               let wd = Unix.write fd s 0 (String.length s) in
> -               if wd <> String.length s then
> -                       failwith "error while writing";
> -               in
> -
> -       let info = domain_getinfo xch domid in
> -
> -       let nrpages = info.total_memory_pages in
> -       let ctxt = Array.make info.max_vcpu_id None in
> -       let nr_vcpus = ref 0 in
> -       for i = 0 to info.max_vcpu_id - 1
> -       do
> -               ctxt.(i) <- try
> -                       let v = vcpu_context_get xch domid i in
> -                       incr nr_vcpus;
> -                       Some v
> -                       with _ -> None
> -       done;
> -
> -       (* FIXME page offset if not rounded to sup *)
> -       let page_offset =
> -               Int64.add
> -                       (Int64.of_int (sizeof_core_header () +
> -                        (sizeof_vcpu_guest_context () * !nr_vcpus)))
> -                       (Int64.of_nativeint (
> -                               Nativeint.mul
> -                                       (Nativeint.of_int (sizeof_xen_pfn ()))
> -                                       nrpages)
> -                               )
> -               in
> -
> -       let header = {
> -               xch_magic = if info.hvm_guest then Magic_hvm else Magic_pv;
> -               xch_nr_vcpus = !nr_vcpus;
> -               xch_nr_pages = nrpages;
> -               xch_ctxt_offset = Int64.of_int (sizeof_core_header ());
> -               xch_index_offset = Int64.of_int (sizeof_core_header ()
> -                                       + sizeof_vcpu_guest_context ());
> -               xch_pages_offset = page_offset;
> -       } in
> -
> -       dump (marshall_core_header header);
> -       for i = 0 to info.max_vcpu_id - 1
> -       do
> -               match ctxt.(i) with
> -               | None -> ()
> -               | Some ctxt_i -> dump ctxt_i
> -       done;
> -       let pfns = domain_get_pfn_list xch domid nrpages in
> -       if Array.length pfns <> Nativeint.to_int nrpages then
> -               failwith "could not get the page frame list";
> -
> -       let page_size = Mmap.getpagesize () in
> -       for i = 0 to Nativeint.to_int nrpages - 1
> -       do
> -               let page = map_foreign_range xch domid page_size pfns.(i) in
> -               let data = Mmap.read page 0 page_size in
> -               Mmap.unmap page;
> -               dump data
> -       done
> -
> -(* ** Misc ** *)
> -
> -(**
> -   Convert the given number of pages to an amount in KiB, rounded up.
> - *)
> -external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> -let pages_to_mib pages = Int64.div (pages_to_kib pages) 1024L
> -
> -let _ = Callback.register_exception "xc.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc.mli
> --- a/tools/ocaml/libs/xc/xc.mli
> +++ /dev/null
> @@ -1,184 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -type domid = int
> -type vcpuinfo = {
> -  online : bool;
> -  blocked : bool;
> -  running : bool;
> -  cputime : int64;
> -  cpumap : int32;
> -}
> -type domaininfo = {
> -  domid : domid;
> -  dying : bool;
> -  shutdown : bool;
> -  paused : bool;
> -  blocked : bool;
> -  running : bool;
> -  hvm_guest : bool;
> -  shutdown_code : int;
> -  total_memory_pages : nativeint;
> -  max_memory_pages : nativeint;
> -  shared_info_frame : int64;
> -  cpu_time : int64;
> -  nr_online_vcpus : int;
> -  max_vcpu_id : int;
> -  ssidref : int32;
> -  handle : int array;
> -}
> -type sched_control = { weight : int; cap : int; }
> -type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
> -type physinfo = {
> -  threads_per_core : int;
> -  cores_per_socket : int;
> -  nr_cpus          : int;
> -  max_node_id      : int;
> -  cpu_khz          : int;
> -  total_pages      : nativeint;
> -  free_pages       : nativeint;
> -  scrub_pages      : nativeint;
> -  capabilities     : physinfo_cap_flag list;
> -}
> -type version = { major : int; minor : int; extra : string; }
> -type compile_info = {
> -  compiler : string;
> -  compile_by : string;
> -  compile_domain : string;
> -  compile_date : string;
> -}
> -type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> -
> -type domain_create_flag = CDF_HVM | CDF_HAP
> -
> -exception Error of string
> -type handle
> -external sizeof_core_header : unit -> int = "stub_sizeof_core_header"
> -external sizeof_vcpu_guest_context : unit -> int
> -  = "stub_sizeof_vcpu_guest_context"
> -external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn"
> -external interface_open : unit -> handle = "stub_xc_interface_open"
> -external is_fake : unit -> bool = "stub_xc_interface_is_fake"
> -external interface_close : handle -> unit = "stub_xc_interface_close"
> -val with_intf : (handle -> 'a) -> 'a
> -external _domain_create : handle -> int32 -> domain_create_flag list -> int 
> array -> domid
> -  = "stub_xc_domain_create"
> -val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t 
> -> domid
> -external _domain_sethandle : handle -> domid -> int array -> unit
> -  = "stub_xc_domain_sethandle"
> -val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
> -external domain_max_vcpus : handle -> domid -> int -> unit
> -  = "stub_xc_domain_max_vcpus"
> -external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
> -external domain_unpause : handle -> domid -> unit = "stub_xc_domain_unpause"
> -external domain_resume_fast : handle -> domid -> unit
> -  = "stub_xc_domain_resume_fast"
> -external domain_destroy : handle -> domid -> unit = "stub_xc_domain_destroy"
> -external domain_shutdown : handle -> domid -> shutdown_reason -> unit
> -  = "stub_xc_domain_shutdown"
> -external _domain_getinfolist : handle -> domid -> int -> domaininfo list
> -  = "stub_xc_domain_getinfolist"
> -val domain_getinfolist : handle -> domid -> domaininfo list
> -external domain_getinfo : handle -> domid -> domaininfo
> -  = "stub_xc_domain_getinfo"
> -external domain_get_vcpuinfo : handle -> int -> int -> vcpuinfo
> -  = "stub_xc_vcpu_getinfo"
> -external domain_ioport_permission: handle -> domid -> int -> int -> bool -> 
> unit
> -       = "stub_xc_domain_ioport_permission"
> -external domain_iomem_permission: handle -> domid -> nativeint -> nativeint 
> -> bool -> unit
> -       = "stub_xc_domain_iomem_permission"
> -external domain_irq_permission: handle -> domid -> int -> bool -> unit
> -       = "stub_xc_domain_irq_permission"
> -external vcpu_affinity_set : handle -> domid -> int -> bool array -> unit
> -  = "stub_xc_vcpu_setaffinity"
> -external vcpu_affinity_get : handle -> domid -> int -> bool array
> -  = "stub_xc_vcpu_getaffinity"
> -external vcpu_context_get : handle -> domid -> int -> string
> -  = "stub_xc_vcpu_context_get"
> -external sched_id : handle -> int = "stub_xc_sched_id"
> -external sched_credit_domain_set : handle -> domid -> sched_control -> unit
> -  = "stub_sched_credit_domain_set"
> -external sched_credit_domain_get : handle -> domid -> sched_control
> -  = "stub_sched_credit_domain_get"
> -external shadow_allocation_set : handle -> domid -> int -> unit
> -  = "stub_shadow_allocation_set"
> -external shadow_allocation_get : handle -> domid -> int
> -  = "stub_shadow_allocation_get"
> -external evtchn_alloc_unbound : handle -> domid -> domid -> int
> -  = "stub_xc_evtchn_alloc_unbound"
> -external evtchn_reset : handle -> domid -> unit = "stub_xc_evtchn_reset"
> -external readconsolering : handle -> string = "stub_xc_readconsolering"
> -external send_debug_keys : handle -> string -> unit = 
> "stub_xc_send_debug_keys"
> -external physinfo : handle -> physinfo = "stub_xc_physinfo"
> -external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> -external domain_setmaxmem : handle -> domid -> int64 -> unit
> -  = "stub_xc_domain_setmaxmem"
> -external domain_set_memmap_limit : handle -> domid -> int64 -> unit
> -  = "stub_xc_domain_set_memmap_limit"
> -external domain_memory_increase_reservation :
> -  handle -> domid -> int64 -> unit
> -  = "stub_xc_domain_memory_increase_reservation"
> -external map_foreign_range :
> -  handle -> domid -> int -> nativeint -> Mmap.mmap_interface
> -  = "stub_map_foreign_range"
> -external domain_get_pfn_list :
> -  handle -> domid -> nativeint -> nativeint array
> -  = "stub_xc_domain_get_pfn_list"
> -
> -external domain_assign_device: handle -> domid -> (int * int * int * int) -> 
> unit
> -       = "stub_xc_domain_assign_device"
> -external domain_deassign_device: handle -> domid -> (int * int * int * int) 
> -> unit
> -       = "stub_xc_domain_deassign_device"
> -external domain_test_assign_device: handle -> domid -> (int * int * int * 
> int) -> bool
> -       = "stub_xc_domain_test_assign_device"
> -
> -external version : handle -> version = "stub_xc_version_version"
> -external version_compile_info : handle -> compile_info
> -  = "stub_xc_version_compile_info"
> -external version_changeset : handle -> string = "stub_xc_version_changeset"
> -external version_capabilities : handle -> string
> -  = "stub_xc_version_capabilities"
> -type core_magic = Magic_hvm | Magic_pv
> -type core_header = {
> -  xch_magic : core_magic;
> -  xch_nr_vcpus : int;
> -  xch_nr_pages : nativeint;
> -  xch_index_offset : int64;
> -  xch_ctxt_offset : int64;
> -  xch_pages_offset : int64;
> -}
> -external marshall_core_header : core_header -> string
> -  = "stub_marshall_core_header"
> -val coredump : handle -> domid -> Unix.file_descr -> unit
> -external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> -val pages_to_mib : int64 -> int64
> -external watchdog : handle -> int -> int32 -> int
> -  = "stub_xc_watchdog"
> -
> -external domain_set_machine_address_size: handle -> domid -> int -> unit
> -  = "stub_xc_domain_set_machine_address_size"
> -external domain_get_machine_address_size: handle -> domid -> int
> -       = "stub_xc_domain_get_machine_address_size"
> -
> -external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> -                        -> string option array
> -                        -> string option array
> -       = "stub_xc_domain_cpuid_set"
> -external domain_cpuid_apply_policy: handle -> domid -> unit
> -       = "stub_xc_domain_cpuid_apply_policy"
> -external cpuid_check: handle -> (int64 * (int64 option)) -> string option 
> array -> (bool * string option array)
> -       = "stub_xc_cpuid_check"
> -
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc_stubs.c
> --- a/tools/ocaml/libs/xc/xc_stubs.c
> +++ /dev/null
> @@ -1,1161 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - */
> -
> -#define _XOPEN_SOURCE 600
> -#include <stdlib.h>
> -#include <errno.h>
> -
> -#define CAML_NAME_SPACE
> -#include <caml/alloc.h>
> -#include <caml/memory.h>
> -#include <caml/signals.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#include <sys/mman.h>
> -#include <stdint.h>
> -#include <string.h>
> -
> -#include <xenctrl.h>
> -
> -#include "mmap_stubs.h"
> -
> -#define PAGE_SHIFT             12
> -#define PAGE_SIZE               (1UL << PAGE_SHIFT)
> -#define PAGE_MASK               (~(PAGE_SIZE-1))
> -
> -#define _H(__h) ((xc_interface *)(__h))
> -#define _D(__d) ((uint32_t)Int_val(__d))
> -
> -#define Val_none (Val_int(0))
> -
> -#define string_of_option_array(array, index) \
> -       ((Field(array, index) == Val_none) ? NULL : 
> String_val(Field(Field(array, index), 0)))
> -
> -/* maybe here we should check the range of the input instead of blindly
> - * casting it to uint32 */
> -#define cpuid_input_of_val(i1, i2, input) \
> -       i1 = (uint32_t) Int64_val(Field(input, 0)); \
> -       i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) 
> Int64_val(Field(Field(input, 1), 0)));
> -
> -#define ERROR_STRLEN 1024
> -void failwith_xc(xc_interface *xch)
> -{
> -       static char error_str[ERROR_STRLEN];
> -       if (xch) {
> -               const xc_error *error = xc_get_last_error(xch);
> -               if (error->code == XC_ERROR_NONE)
> -                       snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, 
> strerror(errno));
> -               else
> -                       snprintf(error_str, ERROR_STRLEN, "%d: %s: %s",
> -                                error->code,
> -                                xc_error_code_to_desc(error->code),
> -                                error->message);
> -       } else {
> -               snprintf(error_str, ERROR_STRLEN, "Unable to open XC 
> interface");
> -       }
> -       caml_raise_with_string(*caml_named_value("xc.error"), error_str);
> -}
> -
> -CAMLprim value stub_sizeof_core_header(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLreturn(Val_int(sizeof(struct xc_core_header)));
> -}
> -
> -CAMLprim value stub_sizeof_vcpu_guest_context(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLreturn(Val_int(sizeof(struct vcpu_guest_context)));
> -}
> -
> -CAMLprim value stub_sizeof_xen_pfn(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLreturn(Val_int(sizeof(xen_pfn_t)));
> -}
> -
> -#define XC_CORE_MAGIC     0xF00FEBED
> -#define XC_CORE_MAGIC_HVM 0xF00FEBEE
> -
> -CAMLprim value stub_marshall_core_header(value header)
> -{
> -       CAMLparam1(header);
> -       CAMLlocal1(s);
> -       struct xc_core_header c_header;
> -
> -       c_header.xch_magic = (Field(header, 0))
> -               ? XC_CORE_MAGIC
> -               : XC_CORE_MAGIC_HVM;
> -       c_header.xch_nr_vcpus = Int_val(Field(header, 1));
> -       c_header.xch_nr_pages = Nativeint_val(Field(header, 2));
> -       c_header.xch_ctxt_offset = Int64_val(Field(header, 3));
> -       c_header.xch_index_offset = Int64_val(Field(header, 4));
> -       c_header.xch_pages_offset = Int64_val(Field(header, 5));
> -
> -       s = caml_alloc_string(sizeof(c_header));
> -       memcpy(String_val(s), (char *) &c_header, sizeof(c_header));
> -       CAMLreturn(s);
> -}
> -
> -CAMLprim value stub_xc_interface_open(void)
> -{
> -       CAMLparam0();
> -        xc_interface *xch;
> -        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
> -        if (xch == NULL)
> -               failwith_xc(NULL);
> -        CAMLreturn((value)xch);
> -}
> -
> -
> -CAMLprim value stub_xc_interface_is_fake(void)
> -{
> -       CAMLparam0();
> -       int is_fake = xc_interface_is_fake();
> -       CAMLreturn(Val_int(is_fake));
> -}
> -
> -CAMLprim value stub_xc_interface_close(value xch)
> -{
> -       CAMLparam1(xch);
> -
> -       // caml_enter_blocking_section();
> -       xc_interface_close(_H(xch));
> -       // caml_leave_blocking_section();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static int domain_create_flag_table[] = {
> -       XEN_DOMCTL_CDF_hvm_guest,
> -       XEN_DOMCTL_CDF_hap,
> -};
> -
> -CAMLprim value stub_xc_domain_create(value xch, value ssidref,
> -                                     value flags, value handle)
> -{
> -       CAMLparam4(xch, ssidref, flags, handle);
> -
> -       uint32_t domid = 0;
> -       xen_domain_handle_t h = { 0 };
> -       int result;
> -       int i;
> -       uint32_t c_ssidref = Int32_val(ssidref);
> -       unsigned int c_flags = 0;
> -       value l;
> -
> -        if (Wosize_val(handle) != 16)
> -               caml_invalid_argument("Handle not a 16-integer array");
> -
> -       for (i = 0; i < sizeof(h); i++) {
> -               h[i] = Int_val(Field(handle, i)) & 0xff;
> -       }
> -
> -       for (l = flags; l != Val_none; l = Field(l, 1)) {
> -               int v = Int_val(Field(l, 0));
> -               c_flags |= domain_create_flag_table[v];
> -       }
> -
> -       // caml_enter_blocking_section();
> -       result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
> -       // caml_leave_blocking_section();
> -
> -       if (result < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_int(domid));
> -}
> -
> -CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid,
> -                                        value max_vcpus)
> -{
> -       CAMLparam3(xch, domid, max_vcpus);
> -       int r;
> -
> -       r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus));
> -       if (r)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -
> -value stub_xc_domain_sethandle(value xch, value domid, value handle)
> -{
> -       CAMLparam3(xch, domid, handle);
> -       xen_domain_handle_t h = { 0 };
> -       int i;
> -
> -        if (Wosize_val(handle) != 16)
> -               caml_invalid_argument("Handle not a 16-integer array");
> -
> -       for (i = 0; i < sizeof(h); i++) {
> -               h[i] = Int_val(Field(handle, i)) & 0xff;
> -       }
> -
> -       i = xc_domain_sethandle(_H(xch), _D(domid), h);
> -       if (i)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static value dom_op(value xch, value domid, int (*fn)(xc_interface *, 
> uint32_t))
> -{
> -       CAMLparam2(xch, domid);
> -
> -       uint32_t c_domid = _D(domid);
> -
> -       // caml_enter_blocking_section();
> -       int result = fn(_H(xch), c_domid);
> -       // caml_leave_blocking_section();
> -        if (result)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_pause(value xch, value domid)
> -{
> -       return dom_op(xch, domid, xc_domain_pause);
> -}
> -
> -
> -CAMLprim value stub_xc_domain_unpause(value xch, value domid)
> -{
> -       return dom_op(xch, domid, xc_domain_unpause);
> -}
> -
> -CAMLprim value stub_xc_domain_destroy(value xch, value domid)
> -{
> -       return dom_op(xch, domid, xc_domain_destroy);
> -}
> -
> -CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -
> -       uint32_t c_domid = _D(domid);
> -
> -       // caml_enter_blocking_section();
> -       int result = xc_domain_resume(_H(xch), c_domid, 1);
> -       // caml_leave_blocking_section();
> -        if (result)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason)
> -{
> -       CAMLparam3(xch, domid, reason);
> -       int ret;
> -
> -       ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason));
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static value alloc_domaininfo(xc_domaininfo_t * info)
> -{
> -       CAMLparam0();
> -       CAMLlocal2(result, tmp);
> -       int i;
> -
> -       result = caml_alloc_tuple(16);
> -
> -       Store_field(result,  0, Val_int(info->domain));
> -       Store_field(result,  1, Val_bool(info->flags & XEN_DOMINF_dying));
> -       Store_field(result,  2, Val_bool(info->flags & XEN_DOMINF_shutdown));
> -       Store_field(result,  3, Val_bool(info->flags & XEN_DOMINF_paused));
> -       Store_field(result,  4, Val_bool(info->flags & XEN_DOMINF_blocked));
> -       Store_field(result,  5, Val_bool(info->flags & XEN_DOMINF_running));
> -       Store_field(result,  6, Val_bool(info->flags & XEN_DOMINF_hvm_guest));
> -       Store_field(result,  7, Val_int((info->flags >> 
> XEN_DOMINF_shutdownshift)
> -                                        & XEN_DOMINF_shutdownmask));
> -       Store_field(result,  8, caml_copy_nativeint(info->tot_pages));
> -       Store_field(result,  9, caml_copy_nativeint(info->max_pages));
> -       Store_field(result, 10, caml_copy_int64(info->shared_info_frame));
> -       Store_field(result, 11, caml_copy_int64(info->cpu_time));
> -       Store_field(result, 12, Val_int(info->nr_online_vcpus));
> -       Store_field(result, 13, Val_int(info->max_vcpu_id));
> -       Store_field(result, 14, caml_copy_int32(info->ssidref));
> -
> -        tmp = caml_alloc_small(16, 0);
> -       for (i = 0; i < 16; i++) {
> -               Field(tmp, i) = Val_int(info->handle[i]);
> -       }
> -
> -       Store_field(result, 15, tmp);
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, 
> value nb)
> -{
> -       CAMLparam3(xch, first_domain, nb);
> -       CAMLlocal2(result, temp);
> -       xc_domaininfo_t * info;
> -       int i, ret, toalloc, retval;
> -       unsigned int c_max_domains;
> -       uint32_t c_first_domain;
> -
> -       /* get the minimum number of allocate byte we need and bump it up to 
> page boundary */
> -       toalloc = (sizeof(xc_domaininfo_t) * Int_val(nb)) | 0xfff;
> -       ret = posix_memalign((void **) ((void *) &info), 4096, toalloc);
> -       if (ret)
> -               caml_raise_out_of_memory();
> -
> -       result = temp = Val_emptylist;
> -
> -       c_first_domain = _D(first_domain);
> -       c_max_domains = Int_val(nb);
> -       // caml_enter_blocking_section();
> -       retval = xc_domain_getinfolist(_H(xch), c_first_domain,
> -                                      c_max_domains, info);
> -       // caml_leave_blocking_section();
> -
> -       if (retval < 0) {
> -               free(info);
> -               failwith_xc(_H(xch));
> -       }
> -       for (i = 0; i < retval; i++) {
> -               result = caml_alloc_small(2, Tag_cons);
> -               Field(result, 0) = Val_int(0);
> -               Field(result, 1) = temp;
> -               temp = result;
> -
> -               Store_field(result, 0, alloc_domaininfo(info + i));
> -       }
> -
> -       free(info);
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_domain_getinfo(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       CAMLlocal1(result);
> -       xc_domaininfo_t info;
> -       int ret;
> -
> -       ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info);
> -       if (ret != 1)
> -               failwith_xc(_H(xch));
> -       if (info.domain != _D(domid))
> -               failwith_xc(_H(xch));
> -
> -       result = alloc_domaininfo(&info);
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu)
> -{
> -       CAMLparam3(xch, domid, vcpu);
> -       CAMLlocal1(result);
> -       xc_vcpuinfo_t info;
> -       int retval;
> -
> -       uint32_t c_domid = _D(domid);
> -       uint32_t c_vcpu = Int_val(vcpu);
> -       // caml_enter_blocking_section();
> -       retval = xc_vcpu_getinfo(_H(xch), c_domid,
> -                                c_vcpu, &info);
> -       // caml_leave_blocking_section();
> -       if (retval < 0)
> -               failwith_xc(_H(xch));
> -
> -       result = caml_alloc_tuple(5);
> -       Store_field(result, 0, Val_bool(info.online));
> -       Store_field(result, 1, Val_bool(info.blocked));
> -       Store_field(result, 2, Val_bool(info.running));
> -       Store_field(result, 3, caml_copy_int64(info.cpu_time));
> -       Store_field(result, 4, caml_copy_int32(info.cpu));
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_vcpu_context_get(value xch, value domid,
> -                                        value cpu)
> -{
> -       CAMLparam3(xch, domid, cpu);
> -       CAMLlocal1(context);
> -       int ret;
> -       vcpu_guest_context_any_t ctxt;
> -
> -       ret = xc_vcpu_getcontext(_H(xch), _D(domid), Int_val(cpu), &ctxt);
> -
> -       context = caml_alloc_string(sizeof(ctxt));
> -       memcpy(String_val(context), (char *) &ctxt.c, sizeof(ctxt.c));
> -
> -       CAMLreturn(context);
> -}
> -
> -static int get_cpumap_len(value xch, value cpumap)
> -{
> -       int ml_len = Wosize_val(cpumap);
> -       int xc_len = xc_get_max_cpus(_H(xch));
> -
> -       if (ml_len < xc_len)
> -               return ml_len;
> -       else
> -               return xc_len;
> -}
> -
> -CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid,
> -                                        value vcpu, value cpumap)
> -{
> -       CAMLparam4(xch, domid, vcpu, cpumap);
> -       int i, len = get_cpumap_len(xch, cpumap);
> -       xc_cpumap_t c_cpumap;
> -       int retval;
> -
> -       c_cpumap = xc_cpumap_alloc(_H(xch));
> -       if (c_cpumap == NULL)
> -               failwith_xc(_H(xch));
> -
> -       for (i=0; i<len; i++) {
> -               if (Bool_val(Field(cpumap, i)))
> -                       c_cpumap[i/8] |= i << (i&7);
> -       }
> -       retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
> -                                    Int_val(vcpu), c_cpumap);
> -       free(c_cpumap);
> -
> -       if (retval < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid,
> -                                        value vcpu)
> -{
> -       CAMLparam3(xch, domid, vcpu);
> -       CAMLlocal1(ret);
> -       xc_cpumap_t c_cpumap;
> -       int i, len = xc_get_max_cpus(_H(xch));
> -       int retval;
> -
> -       c_cpumap = xc_cpumap_alloc(_H(xch));
> -       if (c_cpumap == NULL)
> -               failwith_xc(_H(xch));
> -
> -       retval = xc_vcpu_getaffinity(_H(xch), _D(domid),
> -                                    Int_val(vcpu), c_cpumap);
> -       free(c_cpumap);
> -
> -       if (retval < 0) {
> -               free(c_cpumap);
> -               failwith_xc(_H(xch));
> -       }
> -
> -       ret = caml_alloc(len, 0);
> -
> -       for (i=0; i<len; i++) {
> -               if (c_cpumap[i%8] & 1 << (i&7))
> -                       Store_field(ret, i, Val_true);
> -               else
> -                       Store_field(ret, i, Val_false);
> -       }
> -
> -       free(c_cpumap);
> -
> -       CAMLreturn(ret);
> -}
> -
> -CAMLprim value stub_xc_sched_id(value xch)
> -{
> -       CAMLparam1(xch);
> -       int sched_id;
> -
> -       if (xc_sched_id(_H(xch), &sched_id))
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_int(sched_id));
> -}
> -
> -CAMLprim value stub_xc_evtchn_alloc_unbound(value xch,
> -                                            value local_domid,
> -                                            value remote_domid)
> -{
> -       CAMLparam3(xch, local_domid, remote_domid);
> -
> -       uint32_t c_local_domid = _D(local_domid);
> -       uint32_t c_remote_domid = _D(remote_domid);
> -
> -       // caml_enter_blocking_section();
> -       int result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid,
> -                                            c_remote_domid);
> -       // caml_leave_blocking_section();
> -
> -       if (result < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_int(result));
> -}
> -
> -CAMLprim value stub_xc_evtchn_reset(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       int r;
> -
> -       r = xc_evtchn_reset(_H(xch), _D(domid));
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -
> -#define RING_SIZE 32768
> -static char ring[RING_SIZE];
> -
> -CAMLprim value stub_xc_readconsolering(value xch)
> -{
> -       unsigned int size = RING_SIZE;
> -       char *ring_ptr = ring;
> -
> -       CAMLparam1(xch);
> -
> -       // caml_enter_blocking_section();
> -       int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       ring[size] = '\0';
> -       CAMLreturn(caml_copy_string(ring));
> -}
> -
> -CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
> -{
> -       CAMLparam2(xch, keys);
> -       int r;
> -
> -       r = xc_send_debug_keys(_H(xch), String_val(keys));
> -       if (r)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_physinfo(value xch)
> -{
> -       CAMLparam1(xch);
> -       CAMLlocal3(physinfo, cap_list, tmp);
> -       xc_physinfo_t c_physinfo;
> -       int r;
> -
> -       // caml_enter_blocking_section();
> -       r = xc_physinfo(_H(xch), &c_physinfo);
> -       // caml_leave_blocking_section();
> -
> -       if (r)
> -               failwith_xc(_H(xch));
> -
> -       tmp = cap_list = Val_emptylist;
> -       for (r = 0; r < 2; r++) {
> -               if ((c_physinfo.capabilities >> r) & 1) {
> -                       tmp = caml_alloc_small(2, Tag_cons);
> -                       Field(tmp, 0) = Val_int(r);
> -                       Field(tmp, 1) = cap_list;
> -                       cap_list = tmp;
> -               }
> -       }
> -
> -       physinfo = caml_alloc_tuple(9);
> -       Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
> -       Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
> -       Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
> -       Store_field(physinfo, 3, Val_int(c_physinfo.max_node_id));
> -       Store_field(physinfo, 4, Val_int(c_physinfo.cpu_khz));
> -       Store_field(physinfo, 5, caml_copy_nativeint(c_physinfo.total_pages));
> -       Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
> -       Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
> -       Store_field(physinfo, 8, cap_list);
> -
> -       CAMLreturn(physinfo);
> -}
> -
> -CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus)
> -{
> -       CAMLparam2(xch, nr_cpus);
> -       CAMLlocal2(pcpus, v);
> -       xc_cpuinfo_t *info;
> -       int r, size;
> -
> -       if (Int_val(nr_cpus) < 1)
> -               caml_invalid_argument("nr_cpus");
> -
> -       info = calloc(Int_val(nr_cpus) + 1, sizeof(*info));
> -       if (!info)
> -               caml_raise_out_of_memory();
> -
> -       // caml_enter_blocking_section();
> -       r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
> -       // caml_leave_blocking_section();
> -
> -       if (r) {
> -               free(info);
> -               failwith_xc(_H(xch));
> -       }
> -
> -       if (size > 0) {
> -               int i;
> -               pcpus = caml_alloc(size, 0);
> -               for (i = 0; i < size; i++) {
> -                       v = caml_copy_int64(info[i].idletime);
> -                       caml_modify(&Field(pcpus, i), v);
> -               }
> -       } else
> -               pcpus = Atom(0);
> -       free(info);
> -       CAMLreturn(pcpus);
> -}
> -
> -CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid,
> -                                        value max_memkb)
> -{
> -       CAMLparam3(xch, domid, max_memkb);
> -
> -       uint32_t c_domid = _D(domid);
> -       unsigned int c_max_memkb = Int64_val(max_memkb);
> -       // caml_enter_blocking_section();
> -       int retval = xc_domain_setmaxmem(_H(xch), c_domid,
> -                                        c_max_memkb);
> -       // caml_leave_blocking_section();
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid,
> -                                               value map_limitkb)
> -{
> -       CAMLparam3(xch, domid, map_limitkb);
> -       unsigned long v;
> -       int retval;
> -
> -       v = Int64_val(map_limitkb);
> -       retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v);
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_memory_increase_reservation(value xch,
> -                                                          value domid,
> -                                                          value mem_kb)
> -{
> -       CAMLparam3(xch, domid, mem_kb);
> -
> -       unsigned long nr_extents = ((unsigned long)(Int64_val(mem_kb))) >> 
> (PAGE_SHIFT - 10);
> -
> -       uint32_t c_domid = _D(domid);
> -       // caml_enter_blocking_section();
> -       int retval = xc_domain_increase_reservation_exact(_H(xch), c_domid,
> -                                                         nr_extents, 0, 0, 
> NULL);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_set_machine_address_size(value xch,
> -                                                      value domid,
> -                                                      value width)
> -{
> -       CAMLparam3(xch, domid, width);
> -       uint32_t c_domid = _D(domid);
> -       int c_width = Int_val(width);
> -
> -       int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, 
> c_width);
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_get_machine_address_size(value xch,
> -                                                       value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       int retval;
> -
> -       retval = xc_domain_get_machine_address_size(_H(xch), _D(domid));
> -       if (retval < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_int(retval));
> -}
> -
> -CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid,
> -                                        value input,
> -                                        value config)
> -{
> -       CAMLparam4(xch, domid, input, config);
> -       CAMLlocal2(array, tmp);
> -       int r;
> -       unsigned int c_input[2];
> -       char *c_config[4], *out_config[4];
> -
> -       c_config[0] = string_of_option_array(config, 0);
> -       c_config[1] = string_of_option_array(config, 1);
> -       c_config[2] = string_of_option_array(config, 2);
> -       c_config[3] = string_of_option_array(config, 3);
> -
> -       cpuid_input_of_val(c_input[0], c_input[1], input);
> -
> -       array = caml_alloc(4, 0);
> -       for (r = 0; r < 4; r++) {
> -               tmp = Val_none;
> -               if (c_config[r]) {
> -                       tmp = caml_alloc_small(1, 0);
> -                       Field(tmp, 0) = caml_alloc_string(32);
> -               }
> -               Store_field(array, r, tmp);
> -       }
> -
> -       for (r = 0; r < 4; r++)
> -               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, 
> r), 0)) : NULL;
> -
> -       r = xc_cpuid_set(_H(xch), _D(domid),
> -                        c_input, (const char **)c_config, out_config);
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(array);
> -}
> -
> -CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       int r;
> -
> -       r = xc_cpuid_apply_policy(_H(xch), _D(domid));
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_cpuid_check(value xch, value input, value config)
> -{
> -       CAMLparam3(xch, input, config);
> -       CAMLlocal3(ret, array, tmp);
> -       int r;
> -       unsigned int c_input[2];
> -       char *c_config[4], *out_config[4];
> -
> -       c_config[0] = string_of_option_array(config, 0);
> -       c_config[1] = string_of_option_array(config, 1);
> -       c_config[2] = string_of_option_array(config, 2);
> -       c_config[3] = string_of_option_array(config, 3);
> -
> -       cpuid_input_of_val(c_input[0], c_input[1], input);
> -
> -       array = caml_alloc(4, 0);
> -       for (r = 0; r < 4; r++) {
> -               tmp = Val_none;
> -               if (c_config[r]) {
> -                       tmp = caml_alloc_small(1, 0);
> -                       Field(tmp, 0) = caml_alloc_string(32);
> -               }
> -               Store_field(array, r, tmp);
> -       }
> -
> -       for (r = 0; r < 4; r++)
> -               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, 
> r), 0)) : NULL;
> -
> -       r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, 
> out_config);
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -
> -       ret = caml_alloc_tuple(2);
> -       Store_field(ret, 0, Val_bool(r));
> -       Store_field(ret, 1, array);
> -
> -       CAMLreturn(ret);
> -}
> -
> -CAMLprim value stub_xc_version_version(value xch)
> -{
> -       CAMLparam1(xch);
> -       CAMLlocal1(result);
> -       xen_extraversion_t extra;
> -       long packed;
> -       int retval;
> -
> -       // caml_enter_blocking_section();
> -       packed = xc_version(_H(xch), XENVER_version, NULL);
> -       retval = xc_version(_H(xch), XENVER_extraversion, &extra);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       result = caml_alloc_tuple(3);
> -
> -       Store_field(result, 0, Val_int(packed >> 16));
> -       Store_field(result, 1, Val_int(packed & 0xffff));
> -       Store_field(result, 2, caml_copy_string(extra));
> -
> -       CAMLreturn(result);
> -}
> -
> -
> -CAMLprim value stub_xc_version_compile_info(value xch)
> -{
> -       CAMLparam1(xch);
> -       CAMLlocal1(result);
> -       xen_compile_info_t ci;
> -       int retval;
> -
> -       // caml_enter_blocking_section();
> -       retval = xc_version(_H(xch), XENVER_compile_info, &ci);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       result = caml_alloc_tuple(4);
> -
> -       Store_field(result, 0, caml_copy_string(ci.compiler));
> -       Store_field(result, 1, caml_copy_string(ci.compile_by));
> -       Store_field(result, 2, caml_copy_string(ci.compile_domain));
> -       Store_field(result, 3, caml_copy_string(ci.compile_date));
> -
> -       CAMLreturn(result);
> -}
> -
> -
> -static value xc_version_single_string(value xch, int code, void *info)
> -{
> -       CAMLparam1(xch);
> -       int retval;
> -
> -       // caml_enter_blocking_section();
> -       retval = xc_version(_H(xch), code, info);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(caml_copy_string((char *)info));
> -}
> -
> -
> -CAMLprim value stub_xc_version_changeset(value xch)
> -{
> -       xen_changeset_info_t ci;
> -
> -       return xc_version_single_string(xch, XENVER_changeset, &ci);
> -}
> -
> -
> -CAMLprim value stub_xc_version_capabilities(value xch)
> -{
> -       xen_capabilities_info_t ci;
> -
> -       return xc_version_single_string(xch, XENVER_capabilities, &ci);
> -}
> -
> -
> -CAMLprim value stub_pages_to_kib(value pages)
> -{
> -       CAMLparam1(pages);
> -
> -       CAMLreturn(caml_copy_int64(Int64_val(pages) << (PAGE_SHIFT - 10)));
> -}
> -
> -
> -CAMLprim value stub_map_foreign_range(value xch, value dom,
> -                                      value size, value mfn)
> -{
> -       CAMLparam4(xch, dom, size, mfn);
> -       CAMLlocal1(result);
> -       struct mmap_interface *intf;
> -       uint32_t c_dom;
> -       unsigned long c_mfn;
> -
> -       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> -       intf = (struct mmap_interface *) result;
> -
> -       intf->len = Int_val(size);
> -
> -       c_dom = _D(dom);
> -       c_mfn = Nativeint_val(mfn);
> -       // caml_enter_blocking_section();
> -       intf->addr = xc_map_foreign_range(_H(xch), c_dom,
> -                                         intf->len, PROT_READ|PROT_WRITE,
> -                                         c_mfn);
> -       // caml_leave_blocking_section();
> -       if (!intf->addr)
> -               caml_failwith("xc_map_foreign_range error");
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_sched_credit_domain_get(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       CAMLlocal1(sdom);
> -       struct xen_domctl_sched_credit c_sdom;
> -       int ret;
> -
> -       // caml_enter_blocking_section();
> -       ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
> -       // caml_leave_blocking_section();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       sdom = caml_alloc_tuple(2);
> -       Store_field(sdom, 0, Val_int(c_sdom.weight));
> -       Store_field(sdom, 1, Val_int(c_sdom.cap));
> -
> -       CAMLreturn(sdom);
> -}
> -
> -CAMLprim value stub_sched_credit_domain_set(value xch, value domid,
> -                                            value sdom)
> -{
> -       CAMLparam3(xch, domid, sdom);
> -       struct xen_domctl_sched_credit c_sdom;
> -       int ret;
> -
> -       c_sdom.weight = Int_val(Field(sdom, 0));
> -       c_sdom.cap = Int_val(Field(sdom, 1));
> -       // caml_enter_blocking_section();
> -       ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
> -       // caml_leave_blocking_section();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_shadow_allocation_get(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       CAMLlocal1(mb);
> -       unsigned long 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);
> -       // caml_leave_blocking_section();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       mb = Val_int(c_mb);
> -       CAMLreturn(mb);
> -}
> -
> -CAMLprim value stub_shadow_allocation_set(value xch, value domid,
> -                                         value mb)
> -{
> -       CAMLparam3(xch, domid, mb);
> -       unsigned long 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);
> -       // caml_leave_blocking_section();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
> -                                           value nr_pfns)
> -{
> -       CAMLparam3(xch, domid, nr_pfns);
> -       CAMLlocal2(array, v);
> -       unsigned long c_nr_pfns;
> -       long ret, i;
> -       uint64_t *c_array;
> -
> -       c_nr_pfns = Nativeint_val(nr_pfns);
> -
> -       c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
> -       if (!c_array)
> -               caml_raise_out_of_memory();
> -
> -       ret = xc_get_pfn_list(_H(xch), _D(domid),
> -                             c_array, c_nr_pfns);
> -       if (ret < 0) {
> -               free(c_array);
> -               failwith_xc(_H(xch));
> -       }
> -
> -       array = caml_alloc(ret, 0);
> -       for (i = 0; i < ret; i++) {
> -               v = caml_copy_nativeint(c_array[i]);
> -               Store_field(array, i, v);
> -       }
> -       free(c_array);
> -
> -       CAMLreturn(array);
> -}
> -
> -CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
> -                                              value start_port, value 
> nr_ports,
> -                                              value allow)
> -{
> -       CAMLparam5(xch, domid, start_port, nr_ports, allow);
> -       uint32_t c_start_port, c_nr_ports;
> -       uint8_t c_allow;
> -       int ret;
> -
> -       c_start_port = Int_val(start_port);
> -       c_nr_ports = Int_val(nr_ports);
> -       c_allow = Bool_val(allow);
> -
> -       ret = xc_domain_ioport_permission(_H(xch), _D(domid),
> -                                        c_start_port, c_nr_ports, c_allow);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid,
> -                                              value start_pfn, value nr_pfns,
> -                                              value allow)
> -{
> -       CAMLparam5(xch, domid, start_pfn, nr_pfns, allow);
> -       unsigned long c_start_pfn, c_nr_pfns;
> -       uint8_t c_allow;
> -       int ret;
> -
> -       c_start_pfn = Nativeint_val(start_pfn);
> -       c_nr_pfns = Nativeint_val(nr_pfns);
> -       c_allow = Bool_val(allow);
> -
> -       ret = xc_domain_iomem_permission(_H(xch), _D(domid),
> -                                        c_start_pfn, c_nr_pfns, c_allow);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_irq_permission(value xch, value domid,
> -                                            value pirq, value allow)
> -{
> -       CAMLparam4(xch, domid, pirq, allow);
> -       uint8_t c_pirq;
> -       uint8_t c_allow;
> -       int ret;
> -
> -       c_pirq = Int_val(pirq);
> -       c_allow = Bool_val(allow);
> -
> -       ret = xc_domain_irq_permission(_H(xch), _D(domid),
> -                                      c_pirq, c_allow);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func)
> -{
> -       uint32_t bdf = 0;
> -       bdf |= (bus & 0xff) << 16;
> -       bdf |= (slot & 0x1f) << 11;
> -       bdf |= (func & 0x7) << 8;
> -       return bdf;
> -}
> -
> -CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, 
> value desc)
> -{
> -       CAMLparam3(xch, domid, desc);
> -       int ret;
> -       int domain, bus, slot, func;
> -       uint32_t bdf;
> -
> -       domain = Int_val(Field(desc, 0));
> -       bus = Int_val(Field(desc, 1));
> -       slot = Int_val(Field(desc, 2));
> -       func = Int_val(Field(desc, 3));
> -       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> -
> -       ret = xc_test_assign_device(_H(xch), _D(domid), bdf);
> -
> -       CAMLreturn(Val_bool(ret == 0));
> -}
> -
> -CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value 
> desc)
> -{
> -       CAMLparam3(xch, domid, desc);
> -       int ret;
> -       int domain, bus, slot, func;
> -       uint32_t bdf;
> -
> -       domain = Int_val(Field(desc, 0));
> -       bus = Int_val(Field(desc, 1));
> -       slot = Int_val(Field(desc, 2));
> -       func = Int_val(Field(desc, 3));
> -       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> -
> -       ret = xc_assign_device(_H(xch), _D(domid), bdf);
> -
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value 
> desc)
> -{
> -       CAMLparam3(xch, domid, desc);
> -       int ret;
> -       int domain, bus, slot, func;
> -       uint32_t bdf;
> -
> -       domain = Int_val(Field(desc, 0));
> -       bus = Int_val(Field(desc, 1));
> -       slot = Int_val(Field(desc, 2));
> -       func = Int_val(Field(desc, 3));
> -       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> -
> -       ret = xc_deassign_device(_H(xch), _D(domid), bdf);
> -
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_watchdog(value xch, value domid, value timeout)
> -{
> -       CAMLparam3(xch, domid, timeout);
> -       int ret;
> -       unsigned int c_timeout = Int32_val(timeout);
> -
> -       ret = xc_watchdog(_H(xch), _D(domid), c_timeout);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_int(ret));
> -}
> -
> -/*
> - * Local variables:
> - *  indent-tabs-mode: t
> - *  c-basic-offset: 8
> - *  tab-width: 8
> - * End:
> - */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl.ml
> --- /dev/null
> +++ b/tools/ocaml/libs/xc/xenctrl.ml
> @@ -0,0 +1,326 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +(** *)
> +type domid = int
> +
> +(* ** xenctrl.h ** *)
> +
> +type vcpuinfo =
> +{
> +       online: bool;
> +       blocked: bool;
> +       running: bool;
> +       cputime: int64;
> +       cpumap: int32;
> +}
> +
> +type domaininfo =
> +{
> +       domid             : domid;
> +       dying             : bool;
> +       shutdown          : bool;
> +       paused            : bool;
> +       blocked           : bool;
> +       running           : bool;
> +       hvm_guest         : bool;
> +       shutdown_code     : int;
> +       total_memory_pages: nativeint;
> +       max_memory_pages  : nativeint;
> +       shared_info_frame : int64;
> +       cpu_time          : int64;
> +       nr_online_vcpus   : int;
> +       max_vcpu_id       : int;
> +       ssidref           : int32;
> +       handle            : int array;
> +}
> +
> +type sched_control =
> +{
> +       weight : int;
> +       cap    : int;
> +}
> +
> +type physinfo_cap_flag =
> +       | CAP_HVM
> +       | CAP_DirectIO
> +
> +type physinfo =
> +{
> +       threads_per_core : int;
> +       cores_per_socket : int;
> +       nr_cpus          : int;
> +       max_node_id      : int;
> +       cpu_khz          : int;
> +       total_pages      : nativeint;
> +       free_pages       : nativeint;
> +       scrub_pages      : nativeint;
> +       (* XXX hw_cap *)
> +       capabilities     : physinfo_cap_flag list;
> +}
> +
> +type version =
> +{
> +       major : int;
> +       minor : int;
> +       extra : string;
> +}
> +
> +
> +type compile_info =
> +{
> +       compiler : string;
> +       compile_by : string;
> +       compile_domain : string;
> +       compile_date : string;
> +}
> +
> +type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> +
> +type domain_create_flag = CDF_HVM | CDF_HAP
> +
> +exception Error of string
> +
> +type handle
> +
> +(* this is only use by coredumping *)
> +external sizeof_core_header: unit -> int
> +       = "stub_sizeof_core_header"
> +external sizeof_vcpu_guest_context: unit -> int
> +       = "stub_sizeof_vcpu_guest_context"
> +external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn"
> +(* end of use *)
> +
> +external interface_open: unit -> handle = "stub_xc_interface_open"
> +external interface_close: handle -> unit = "stub_xc_interface_close"
> +
> +external is_fake: unit -> bool = "stub_xc_interface_is_fake"
> +
> +let with_intf f =
> +       let xc = interface_open () in
> +       let r = try f xc with exn -> interface_close xc; raise exn in
> +       interface_close xc;
> +       r
> +
> +external _domain_create: handle -> int32 -> domain_create_flag list -> int 
> array -> domid
> +       = "stub_xc_domain_create"
> +
> +let domain_create handle n flags uuid =
> +       _domain_create handle n flags (Uuid.int_array_of_uuid uuid)
> +
> +external _domain_sethandle: handle -> domid -> int array -> unit
> +                          = "stub_xc_domain_sethandle"
> +
> +let domain_sethandle handle n uuid =
> +       _domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
> +
> +external domain_max_vcpus: handle -> domid -> int -> unit
> +       = "stub_xc_domain_max_vcpus"
> +
> +external domain_pause: handle -> domid -> unit = "stub_xc_domain_pause"
> +external domain_unpause: handle -> domid -> unit = "stub_xc_domain_unpause"
> +external domain_resume_fast: handle -> domid -> unit = 
> "stub_xc_domain_resume_fast"
> +external domain_destroy: handle -> domid -> unit = "stub_xc_domain_destroy"
> +
> +external domain_shutdown: handle -> domid -> shutdown_reason -> unit
> +       = "stub_xc_domain_shutdown"
> +
> +external _domain_getinfolist: handle -> domid -> int -> domaininfo list
> +       = "stub_xc_domain_getinfolist"
> +
> +let domain_getinfolist handle first_domain =
> +       let nb = 2 in
> +       let last_domid l = (List.hd l).domid + 1 in
> +       let rec __getlist from =
> +               let l = _domain_getinfolist handle from nb in
> +               (if List.length l = nb then __getlist (last_domid l) else []) 
> @ l
> +               in
> +       List.rev (__getlist first_domain)
> +
> +external domain_getinfo: handle -> domid -> domaininfo= 
> "stub_xc_domain_getinfo"
> +
> +external domain_get_vcpuinfo: handle -> int -> int -> vcpuinfo
> +       = "stub_xc_vcpu_getinfo"
> +
> +external domain_ioport_permission: handle -> domid -> int -> int -> bool -> 
> unit
> +       = "stub_xc_domain_ioport_permission"
> +external domain_iomem_permission: handle -> domid -> nativeint -> nativeint 
> -> bool -> unit
> +       = "stub_xc_domain_iomem_permission"
> +external domain_irq_permission: handle -> domid -> int -> bool -> unit
> +       = "stub_xc_domain_irq_permission"
> +
> +external vcpu_affinity_set: handle -> domid -> int -> bool array -> unit
> +       = "stub_xc_vcpu_setaffinity"
> +external vcpu_affinity_get: handle -> domid -> int -> bool array
> +       = "stub_xc_vcpu_getaffinity"
> +
> +external vcpu_context_get: handle -> domid -> int -> string
> +       = "stub_xc_vcpu_context_get"
> +
> +external sched_id: handle -> int = "stub_xc_sched_id"
> +
> +external sched_credit_domain_set: handle -> domid -> sched_control -> unit
> +       = "stub_sched_credit_domain_set"
> +external sched_credit_domain_get: handle -> domid -> sched_control
> +       = "stub_sched_credit_domain_get"
> +
> +external shadow_allocation_set: handle -> domid -> int -> unit
> +       = "stub_shadow_allocation_set"
> +external shadow_allocation_get: handle -> domid -> int
> +       = "stub_shadow_allocation_get"
> +
> +external evtchn_alloc_unbound: handle -> domid -> domid -> int
> +       = "stub_xc_evtchn_alloc_unbound"
> +external evtchn_reset: handle -> domid -> unit = "stub_xc_evtchn_reset"
> +
> +external readconsolering: handle -> string = "stub_xc_readconsolering"
> +
> +external send_debug_keys: handle -> string -> unit = 
> "stub_xc_send_debug_keys"
> +external physinfo: handle -> physinfo = "stub_xc_physinfo"
> +external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> +
> +external domain_setmaxmem: handle -> domid -> int64 -> unit
> +       = "stub_xc_domain_setmaxmem"
> +external domain_set_memmap_limit: handle -> domid -> int64 -> unit
> +       = "stub_xc_domain_set_memmap_limit"
> +external domain_memory_increase_reservation: handle -> domid -> int64 -> unit
> +       = "stub_xc_domain_memory_increase_reservation"
> +
> +external domain_set_machine_address_size: handle -> domid -> int -> unit
> +       = "stub_xc_domain_set_machine_address_size"
> +external domain_get_machine_address_size: handle -> domid -> int
> +       = "stub_xc_domain_get_machine_address_size"
> +
> +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> +                        -> string option array
> +                        -> string option array
> +       = "stub_xc_domain_cpuid_set"
> +external domain_cpuid_apply_policy: handle -> domid -> unit
> +       = "stub_xc_domain_cpuid_apply_policy"
> +external cpuid_check: handle -> (int64 * (int64 option)) -> string option 
> array -> (bool * string option array)
> +       = "stub_xc_cpuid_check"
> +
> +external map_foreign_range: handle -> domid -> int
> +                         -> nativeint -> Xenmmap.mmap_interface
> +       = "stub_map_foreign_range"
> +
> +external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
> +       = "stub_xc_domain_get_pfn_list"
> +
> +external domain_assign_device: handle -> domid -> (int * int * int * int) -> 
> unit
> +       = "stub_xc_domain_assign_device"
> +external domain_deassign_device: handle -> domid -> (int * int * int * int) 
> -> unit
> +       = "stub_xc_domain_deassign_device"
> +external domain_test_assign_device: handle -> domid -> (int * int * int * 
> int) -> bool
> +       = "stub_xc_domain_test_assign_device"
> +
> +external version: handle -> version = "stub_xc_version_version"
> +external version_compile_info: handle -> compile_info
> +       = "stub_xc_version_compile_info"
> +external version_changeset: handle -> string = "stub_xc_version_changeset"
> +external version_capabilities: handle -> string =
> +  "stub_xc_version_capabilities"
> +
> +external watchdog : handle -> int -> int32 -> int
> +  = "stub_xc_watchdog"
> +
> +(* core dump structure *)
> +type core_magic = Magic_hvm | Magic_pv
> +
> +type core_header = {
> +       xch_magic: core_magic;
> +       xch_nr_vcpus: int;
> +       xch_nr_pages: nativeint;
> +       xch_index_offset: int64;
> +       xch_ctxt_offset: int64;
> +       xch_pages_offset: int64;
> +}
> +
> +external marshall_core_header: core_header -> string = 
> "stub_marshall_core_header"
> +
> +(* coredump *)
> +let coredump xch domid fd =
> +       let dump s =
> +               let wd = Unix.write fd s 0 (String.length s) in
> +               if wd <> String.length s then
> +                       failwith "error while writing";
> +               in
> +
> +       let info = domain_getinfo xch domid in
> +
> +       let nrpages = info.total_memory_pages in
> +       let ctxt = Array.make info.max_vcpu_id None in
> +       let nr_vcpus = ref 0 in
> +       for i = 0 to info.max_vcpu_id - 1
> +       do
> +               ctxt.(i) <- try
> +                       let v = vcpu_context_get xch domid i in
> +                       incr nr_vcpus;
> +                       Some v
> +                       with _ -> None
> +       done;
> +
> +       (* FIXME page offset if not rounded to sup *)
> +       let page_offset =
> +               Int64.add
> +                       (Int64.of_int (sizeof_core_header () +
> +                        (sizeof_vcpu_guest_context () * !nr_vcpus)))
> +                       (Int64.of_nativeint (
> +                               Nativeint.mul
> +                                       (Nativeint.of_int (sizeof_xen_pfn ()))
> +                                       nrpages)
> +                               )
> +               in
> +
> +       let header = {
> +               xch_magic = if info.hvm_guest then Magic_hvm else Magic_pv;
> +               xch_nr_vcpus = !nr_vcpus;
> +               xch_nr_pages = nrpages;
> +               xch_ctxt_offset = Int64.of_int (sizeof_core_header ());
> +               xch_index_offset = Int64.of_int (sizeof_core_header ()
> +                                       + sizeof_vcpu_guest_context ());
> +               xch_pages_offset = page_offset;
> +       } in
> +
> +       dump (marshall_core_header header);
> +       for i = 0 to info.max_vcpu_id - 1
> +       do
> +               match ctxt.(i) with
> +               | None -> ()
> +               | Some ctxt_i -> dump ctxt_i
> +       done;
> +       let pfns = domain_get_pfn_list xch domid nrpages in
> +       if Array.length pfns <> Nativeint.to_int nrpages then
> +               failwith "could not get the page frame list";
> +
> +       let page_size = Xenmmap.getpagesize () in
> +       for i = 0 to Nativeint.to_int nrpages - 1
> +       do
> +               let page = map_foreign_range xch domid page_size pfns.(i) in
> +               let data = Xenmmap.read page 0 page_size in
> +               Xenmmap.unmap page;
> +               dump data
> +       done
> +
> +(* ** Misc ** *)
> +
> +(**
> +   Convert the given number of pages to an amount in KiB, rounded up.
> + *)
> +external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> +let pages_to_mib pages = Int64.div (pages_to_kib pages) 1024L
> +
> +let _ = Callback.register_exception "xc.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl.mli
> --- /dev/null
> +++ b/tools/ocaml/libs/xc/xenctrl.mli
> @@ -0,0 +1,184 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +type domid = int
> +type vcpuinfo = {
> +  online : bool;
> +  blocked : bool;
> +  running : bool;
> +  cputime : int64;
> +  cpumap : int32;
> +}
> +type domaininfo = {
> +  domid : domid;
> +  dying : bool;
> +  shutdown : bool;
> +  paused : bool;
> +  blocked : bool;
> +  running : bool;
> +  hvm_guest : bool;
> +  shutdown_code : int;
> +  total_memory_pages : nativeint;
> +  max_memory_pages : nativeint;
> +  shared_info_frame : int64;
> +  cpu_time : int64;
> +  nr_online_vcpus : int;
> +  max_vcpu_id : int;
> +  ssidref : int32;
> +  handle : int array;
> +}
> +type sched_control = { weight : int; cap : int; }
> +type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
> +type physinfo = {
> +  threads_per_core : int;
> +  cores_per_socket : int;
> +  nr_cpus          : int;
> +  max_node_id      : int;
> +  cpu_khz          : int;
> +  total_pages      : nativeint;
> +  free_pages       : nativeint;
> +  scrub_pages      : nativeint;
> +  capabilities     : physinfo_cap_flag list;
> +}
> +type version = { major : int; minor : int; extra : string; }
> +type compile_info = {
> +  compiler : string;
> +  compile_by : string;
> +  compile_domain : string;
> +  compile_date : string;
> +}
> +type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> +
> +type domain_create_flag = CDF_HVM | CDF_HAP
> +
> +exception Error of string
> +type handle
> +external sizeof_core_header : unit -> int = "stub_sizeof_core_header"
> +external sizeof_vcpu_guest_context : unit -> int
> +  = "stub_sizeof_vcpu_guest_context"
> +external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn"
> +external interface_open : unit -> handle = "stub_xc_interface_open"
> +external is_fake : unit -> bool = "stub_xc_interface_is_fake"
> +external interface_close : handle -> unit = "stub_xc_interface_close"
> +val with_intf : (handle -> 'a) -> 'a
> +external _domain_create : handle -> int32 -> domain_create_flag list -> int 
> array -> domid
> +  = "stub_xc_domain_create"
> +val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t 
> -> domid
> +external _domain_sethandle : handle -> domid -> int array -> unit
> +  = "stub_xc_domain_sethandle"
> +val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
> +external domain_max_vcpus : handle -> domid -> int -> unit
> +  = "stub_xc_domain_max_vcpus"
> +external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
> +external domain_unpause : handle -> domid -> unit = "stub_xc_domain_unpause"
> +external domain_resume_fast : handle -> domid -> unit
> +  = "stub_xc_domain_resume_fast"
> +external domain_destroy : handle -> domid -> unit = "stub_xc_domain_destroy"
> +external domain_shutdown : handle -> domid -> shutdown_reason -> unit
> +  = "stub_xc_domain_shutdown"
> +external _domain_getinfolist : handle -> domid -> int -> domaininfo list
> +  = "stub_xc_domain_getinfolist"
> +val domain_getinfolist : handle -> domid -> domaininfo list
> +external domain_getinfo : handle -> domid -> domaininfo
> +  = "stub_xc_domain_getinfo"
> +external domain_get_vcpuinfo : handle -> int -> int -> vcpuinfo
> +  = "stub_xc_vcpu_getinfo"
> +external domain_ioport_permission: handle -> domid -> int -> int -> bool -> 
> unit
> +       = "stub_xc_domain_ioport_permission"
> +external domain_iomem_permission: handle -> domid -> nativeint -> nativeint 
> -> bool -> unit
> +       = "stub_xc_domain_iomem_permission"
> +external domain_irq_permission: handle -> domid -> int -> bool -> unit
> +       = "stub_xc_domain_irq_permission"
> +external vcpu_affinity_set : handle -> domid -> int -> bool array -> unit
> +  = "stub_xc_vcpu_setaffinity"
> +external vcpu_affinity_get : handle -> domid -> int -> bool array
> +  = "stub_xc_vcpu_getaffinity"
> +external vcpu_context_get : handle -> domid -> int -> string
> +  = "stub_xc_vcpu_context_get"
> +external sched_id : handle -> int = "stub_xc_sched_id"
> +external sched_credit_domain_set : handle -> domid -> sched_control -> unit
> +  = "stub_sched_credit_domain_set"
> +external sched_credit_domain_get : handle -> domid -> sched_control
> +  = "stub_sched_credit_domain_get"
> +external shadow_allocation_set : handle -> domid -> int -> unit
> +  = "stub_shadow_allocation_set"
> +external shadow_allocation_get : handle -> domid -> int
> +  = "stub_shadow_allocation_get"
> +external evtchn_alloc_unbound : handle -> domid -> domid -> int
> +  = "stub_xc_evtchn_alloc_unbound"
> +external evtchn_reset : handle -> domid -> unit = "stub_xc_evtchn_reset"
> +external readconsolering : handle -> string = "stub_xc_readconsolering"
> +external send_debug_keys : handle -> string -> unit = 
> "stub_xc_send_debug_keys"
> +external physinfo : handle -> physinfo = "stub_xc_physinfo"
> +external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> +external domain_setmaxmem : handle -> domid -> int64 -> unit
> +  = "stub_xc_domain_setmaxmem"
> +external domain_set_memmap_limit : handle -> domid -> int64 -> unit
> +  = "stub_xc_domain_set_memmap_limit"
> +external domain_memory_increase_reservation :
> +  handle -> domid -> int64 -> unit
> +  = "stub_xc_domain_memory_increase_reservation"
> +external map_foreign_range :
> +  handle -> domid -> int -> nativeint -> Xenmmap.mmap_interface
> +  = "stub_map_foreign_range"
> +external domain_get_pfn_list :
> +  handle -> domid -> nativeint -> nativeint array
> +  = "stub_xc_domain_get_pfn_list"
> +
> +external domain_assign_device: handle -> domid -> (int * int * int * int) -> 
> unit
> +       = "stub_xc_domain_assign_device"
> +external domain_deassign_device: handle -> domid -> (int * int * int * int) 
> -> unit
> +       = "stub_xc_domain_deassign_device"
> +external domain_test_assign_device: handle -> domid -> (int * int * int * 
> int) -> bool
> +       = "stub_xc_domain_test_assign_device"
> +
> +external version : handle -> version = "stub_xc_version_version"
> +external version_compile_info : handle -> compile_info
> +  = "stub_xc_version_compile_info"
> +external version_changeset : handle -> string = "stub_xc_version_changeset"
> +external version_capabilities : handle -> string
> +  = "stub_xc_version_capabilities"
> +type core_magic = Magic_hvm | Magic_pv
> +type core_header = {
> +  xch_magic : core_magic;
> +  xch_nr_vcpus : int;
> +  xch_nr_pages : nativeint;
> +  xch_index_offset : int64;
> +  xch_ctxt_offset : int64;
> +  xch_pages_offset : int64;
> +}
> +external marshall_core_header : core_header -> string
> +  = "stub_marshall_core_header"
> +val coredump : handle -> domid -> Unix.file_descr -> unit
> +external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> +val pages_to_mib : int64 -> int64
> +external watchdog : handle -> int -> int32 -> int
> +  = "stub_xc_watchdog"
> +
> +external domain_set_machine_address_size: handle -> domid -> int -> unit
> +  = "stub_xc_domain_set_machine_address_size"
> +external domain_get_machine_address_size: handle -> domid -> int
> +       = "stub_xc_domain_get_machine_address_size"
> +
> +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> +                        -> string option array
> +                        -> string option array
> +       = "stub_xc_domain_cpuid_set"
> +external domain_cpuid_apply_policy: handle -> domid -> unit
> +       = "stub_xc_domain_cpuid_apply_policy"
> +external cpuid_check: handle -> (int64 * (int64 option)) -> string option 
> array -> (bool * string option array)
> +       = "stub_xc_cpuid_check"
> +
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -0,0 +1,1161 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + */
> +
> +#define _XOPEN_SOURCE 600
> +#include <stdlib.h>
> +#include <errno.h>
> +
> +#define CAML_NAME_SPACE
> +#include <caml/alloc.h>
> +#include <caml/memory.h>
> +#include <caml/signals.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#include <sys/mman.h>
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include <xenctrl.h>
> +
> +#include "mmap_stubs.h"
> +
> +#define PAGE_SHIFT             12
> +#define PAGE_SIZE               (1UL << PAGE_SHIFT)
> +#define PAGE_MASK               (~(PAGE_SIZE-1))
> +
> +#define _H(__h) ((xc_interface *)(__h))
> +#define _D(__d) ((uint32_t)Int_val(__d))
> +
> +#define Val_none (Val_int(0))
> +
> +#define string_of_option_array(array, index) \
> +       ((Field(array, index) == Val_none) ? NULL : 
> String_val(Field(Field(array, index), 0)))
> +
> +/* maybe here we should check the range of the input instead of blindly
> + * casting it to uint32 */
> +#define cpuid_input_of_val(i1, i2, input) \
> +       i1 = (uint32_t) Int64_val(Field(input, 0)); \
> +       i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) 
> Int64_val(Field(Field(input, 1), 0)));
> +
> +#define ERROR_STRLEN 1024
> +void failwith_xc(xc_interface *xch)
> +{
> +       static char error_str[ERROR_STRLEN];
> +       if (xch) {
> +               const xc_error *error = xc_get_last_error(xch);
> +               if (error->code == XC_ERROR_NONE)
> +                       snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, 
> strerror(errno));
> +               else
> +                       snprintf(error_str, ERROR_STRLEN, "%d: %s: %s",
> +                                error->code,
> +                                xc_error_code_to_desc(error->code),
> +                                error->message);
> +       } else {
> +               snprintf(error_str, ERROR_STRLEN, "Unable to open XC 
> interface");
> +       }
> +       caml_raise_with_string(*caml_named_value("xc.error"), error_str);
> +}
> +
> +CAMLprim value stub_sizeof_core_header(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLreturn(Val_int(sizeof(struct xc_core_header)));
> +}
> +
> +CAMLprim value stub_sizeof_vcpu_guest_context(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLreturn(Val_int(sizeof(struct vcpu_guest_context)));
> +}
> +
> +CAMLprim value stub_sizeof_xen_pfn(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLreturn(Val_int(sizeof(xen_pfn_t)));
> +}
> +
> +#define XC_CORE_MAGIC     0xF00FEBED
> +#define XC_CORE_MAGIC_HVM 0xF00FEBEE
> +
> +CAMLprim value stub_marshall_core_header(value header)
> +{
> +       CAMLparam1(header);
> +       CAMLlocal1(s);
> +       struct xc_core_header c_header;
> +
> +       c_header.xch_magic = (Field(header, 0))
> +               ? XC_CORE_MAGIC
> +               : XC_CORE_MAGIC_HVM;
> +       c_header.xch_nr_vcpus = Int_val(Field(header, 1));
> +       c_header.xch_nr_pages = Nativeint_val(Field(header, 2));
> +       c_header.xch_ctxt_offset = Int64_val(Field(header, 3));
> +       c_header.xch_index_offset = Int64_val(Field(header, 4));
> +       c_header.xch_pages_offset = Int64_val(Field(header, 5));
> +
> +       s = caml_alloc_string(sizeof(c_header));
> +       memcpy(String_val(s), (char *) &c_header, sizeof(c_header));
> +       CAMLreturn(s);
> +}
> +
> +CAMLprim value stub_xc_interface_open(void)
> +{
> +       CAMLparam0();
> +        xc_interface *xch;
> +        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
> +        if (xch == NULL)
> +               failwith_xc(NULL);
> +        CAMLreturn((value)xch);
> +}
> +
> +
> +CAMLprim value stub_xc_interface_is_fake(void)
> +{
> +       CAMLparam0();
> +       int is_fake = xc_interface_is_fake();
> +       CAMLreturn(Val_int(is_fake));
> +}
> +
> +CAMLprim value stub_xc_interface_close(value xch)
> +{
> +       CAMLparam1(xch);
> +
> +       // caml_enter_blocking_section();
> +       xc_interface_close(_H(xch));
> +       // caml_leave_blocking_section();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static int domain_create_flag_table[] = {
> +       XEN_DOMCTL_CDF_hvm_guest,
> +       XEN_DOMCTL_CDF_hap,
> +};
> +
> +CAMLprim value stub_xc_domain_create(value xch, value ssidref,
> +                                     value flags, value handle)
> +{
> +       CAMLparam4(xch, ssidref, flags, handle);
> +
> +       uint32_t domid = 0;
> +       xen_domain_handle_t h = { 0 };
> +       int result;
> +       int i;
> +       uint32_t c_ssidref = Int32_val(ssidref);
> +       unsigned int c_flags = 0;
> +       value l;
> +
> +        if (Wosize_val(handle) != 16)
> +               caml_invalid_argument("Handle not a 16-integer array");
> +
> +       for (i = 0; i < sizeof(h); i++) {
> +               h[i] = Int_val(Field(handle, i)) & 0xff;
> +       }
> +
> +       for (l = flags; l != Val_none; l = Field(l, 1)) {
> +               int v = Int_val(Field(l, 0));
> +               c_flags |= domain_create_flag_table[v];
> +       }
> +
> +       // caml_enter_blocking_section();
> +       result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
> +       // caml_leave_blocking_section();
> +
> +       if (result < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_int(domid));
> +}
> +
> +CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid,
> +                                        value max_vcpus)
> +{
> +       CAMLparam3(xch, domid, max_vcpus);
> +       int r;
> +
> +       r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus));
> +       if (r)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +
> +value stub_xc_domain_sethandle(value xch, value domid, value handle)
> +{
> +       CAMLparam3(xch, domid, handle);
> +       xen_domain_handle_t h = { 0 };
> +       int i;
> +
> +        if (Wosize_val(handle) != 16)
> +               caml_invalid_argument("Handle not a 16-integer array");
> +
> +       for (i = 0; i < sizeof(h); i++) {
> +               h[i] = Int_val(Field(handle, i)) & 0xff;
> +       }
> +
> +       i = xc_domain_sethandle(_H(xch), _D(domid), h);
> +       if (i)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static value dom_op(value xch, value domid, int (*fn)(xc_interface *, 
> uint32_t))
> +{
> +       CAMLparam2(xch, domid);
> +
> +       uint32_t c_domid = _D(domid);
> +
> +       // caml_enter_blocking_section();
> +       int result = fn(_H(xch), c_domid);
> +       // caml_leave_blocking_section();
> +        if (result)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_pause(value xch, value domid)
> +{
> +       return dom_op(xch, domid, xc_domain_pause);
> +}
> +
> +
> +CAMLprim value stub_xc_domain_unpause(value xch, value domid)
> +{
> +       return dom_op(xch, domid, xc_domain_unpause);
> +}
> +
> +CAMLprim value stub_xc_domain_destroy(value xch, value domid)
> +{
> +       return dom_op(xch, domid, xc_domain_destroy);
> +}
> +
> +CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +
> +       uint32_t c_domid = _D(domid);
> +
> +       // caml_enter_blocking_section();
> +       int result = xc_domain_resume(_H(xch), c_domid, 1);
> +       // caml_leave_blocking_section();
> +        if (result)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason)
> +{
> +       CAMLparam3(xch, domid, reason);
> +       int ret;
> +
> +       ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason));
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static value alloc_domaininfo(xc_domaininfo_t * info)
> +{
> +       CAMLparam0();
> +       CAMLlocal2(result, tmp);
> +       int i;
> +
> +       result = caml_alloc_tuple(16);
> +
> +       Store_field(result,  0, Val_int(info->domain));
> +       Store_field(result,  1, Val_bool(info->flags & XEN_DOMINF_dying));
> +       Store_field(result,  2, Val_bool(info->flags & XEN_DOMINF_shutdown));
> +       Store_field(result,  3, Val_bool(info->flags & XEN_DOMINF_paused));
> +       Store_field(result,  4, Val_bool(info->flags & XEN_DOMINF_blocked));
> +       Store_field(result,  5, Val_bool(info->flags & XEN_DOMINF_running));
> +       Store_field(result,  6, Val_bool(info->flags & XEN_DOMINF_hvm_guest));
> +       Store_field(result,  7, Val_int((info->flags >> 
> XEN_DOMINF_shutdownshift)
> +                                        & XEN_DOMINF_shutdownmask));
> +       Store_field(result,  8, caml_copy_nativeint(info->tot_pages));
> +       Store_field(result,  9, caml_copy_nativeint(info->max_pages));
> +       Store_field(result, 10, caml_copy_int64(info->shared_info_frame));
> +       Store_field(result, 11, caml_copy_int64(info->cpu_time));
> +       Store_field(result, 12, Val_int(info->nr_online_vcpus));
> +       Store_field(result, 13, Val_int(info->max_vcpu_id));
> +       Store_field(result, 14, caml_copy_int32(info->ssidref));
> +
> +        tmp = caml_alloc_small(16, 0);
> +       for (i = 0; i < 16; i++) {
> +               Field(tmp, i) = Val_int(info->handle[i]);
> +       }
> +
> +       Store_field(result, 15, tmp);
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, 
> value nb)
> +{
> +       CAMLparam3(xch, first_domain, nb);
> +       CAMLlocal2(result, temp);
> +       xc_domaininfo_t * info;
> +       int i, ret, toalloc, retval;
> +       unsigned int c_max_domains;
> +       uint32_t c_first_domain;
> +
> +       /* get the minimum number of allocate byte we need and bump it up to 
> page boundary */
> +       toalloc = (sizeof(xc_domaininfo_t) * Int_val(nb)) | 0xfff;
> +       ret = posix_memalign((void **) ((void *) &info), 4096, toalloc);
> +       if (ret)
> +               caml_raise_out_of_memory();
> +
> +       result = temp = Val_emptylist;
> +
> +       c_first_domain = _D(first_domain);
> +       c_max_domains = Int_val(nb);
> +       // caml_enter_blocking_section();
> +       retval = xc_domain_getinfolist(_H(xch), c_first_domain,
> +                                      c_max_domains, info);
> +       // caml_leave_blocking_section();
> +
> +       if (retval < 0) {
> +               free(info);
> +               failwith_xc(_H(xch));
> +       }
> +       for (i = 0; i < retval; i++) {
> +               result = caml_alloc_small(2, Tag_cons);
> +               Field(result, 0) = Val_int(0);
> +               Field(result, 1) = temp;
> +               temp = result;
> +
> +               Store_field(result, 0, alloc_domaininfo(info + i));
> +       }
> +
> +       free(info);
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_domain_getinfo(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       CAMLlocal1(result);
> +       xc_domaininfo_t info;
> +       int ret;
> +
> +       ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info);
> +       if (ret != 1)
> +               failwith_xc(_H(xch));
> +       if (info.domain != _D(domid))
> +               failwith_xc(_H(xch));
> +
> +       result = alloc_domaininfo(&info);
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu)
> +{
> +       CAMLparam3(xch, domid, vcpu);
> +       CAMLlocal1(result);
> +       xc_vcpuinfo_t info;
> +       int retval;
> +
> +       uint32_t c_domid = _D(domid);
> +       uint32_t c_vcpu = Int_val(vcpu);
> +       // caml_enter_blocking_section();
> +       retval = xc_vcpu_getinfo(_H(xch), c_domid,
> +                                c_vcpu, &info);
> +       // caml_leave_blocking_section();
> +       if (retval < 0)
> +               failwith_xc(_H(xch));
> +
> +       result = caml_alloc_tuple(5);
> +       Store_field(result, 0, Val_bool(info.online));
> +       Store_field(result, 1, Val_bool(info.blocked));
> +       Store_field(result, 2, Val_bool(info.running));
> +       Store_field(result, 3, caml_copy_int64(info.cpu_time));
> +       Store_field(result, 4, caml_copy_int32(info.cpu));
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_vcpu_context_get(value xch, value domid,
> +                                        value cpu)
> +{
> +       CAMLparam3(xch, domid, cpu);
> +       CAMLlocal1(context);
> +       int ret;
> +       vcpu_guest_context_any_t ctxt;
> +
> +       ret = xc_vcpu_getcontext(_H(xch), _D(domid), Int_val(cpu), &ctxt);
> +
> +       context = caml_alloc_string(sizeof(ctxt));
> +       memcpy(String_val(context), (char *) &ctxt.c, sizeof(ctxt.c));
> +
> +       CAMLreturn(context);
> +}
> +
> +static int get_cpumap_len(value xch, value cpumap)
> +{
> +       int ml_len = Wosize_val(cpumap);
> +       int xc_len = xc_get_max_cpus(_H(xch));
> +
> +       if (ml_len < xc_len)
> +               return ml_len;
> +       else
> +               return xc_len;
> +}
> +
> +CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid,
> +                                        value vcpu, value cpumap)
> +{
> +       CAMLparam4(xch, domid, vcpu, cpumap);
> +       int i, len = get_cpumap_len(xch, cpumap);
> +       xc_cpumap_t c_cpumap;
> +       int retval;
> +
> +       c_cpumap = xc_cpumap_alloc(_H(xch));
> +       if (c_cpumap == NULL)
> +               failwith_xc(_H(xch));
> +
> +       for (i=0; i<len; i++) {
> +               if (Bool_val(Field(cpumap, i)))
> +                       c_cpumap[i/8] |= i << (i&7);
> +       }
> +       retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
> +                                    Int_val(vcpu), c_cpumap);
> +       free(c_cpumap);
> +
> +       if (retval < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid,
> +                                        value vcpu)
> +{
> +       CAMLparam3(xch, domid, vcpu);
> +       CAMLlocal1(ret);
> +       xc_cpumap_t c_cpumap;
> +       int i, len = xc_get_max_cpus(_H(xch));
> +       int retval;
> +
> +       c_cpumap = xc_cpumap_alloc(_H(xch));
> +       if (c_cpumap == NULL)
> +               failwith_xc(_H(xch));
> +
> +       retval = xc_vcpu_getaffinity(_H(xch), _D(domid),
> +                                    Int_val(vcpu), c_cpumap);
> +       free(c_cpumap);
> +
> +       if (retval < 0) {
> +               free(c_cpumap);
> +               failwith_xc(_H(xch));
> +       }
> +
> +       ret = caml_alloc(len, 0);
> +
> +       for (i=0; i<len; i++) {
> +               if (c_cpumap[i%8] & 1 << (i&7))
> +                       Store_field(ret, i, Val_true);
> +               else
> +                       Store_field(ret, i, Val_false);
> +       }
> +
> +       free(c_cpumap);
> +
> +       CAMLreturn(ret);
> +}
> +
> +CAMLprim value stub_xc_sched_id(value xch)
> +{
> +       CAMLparam1(xch);
> +       int sched_id;
> +
> +       if (xc_sched_id(_H(xch), &sched_id))
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_int(sched_id));
> +}
> +
> +CAMLprim value stub_xc_evtchn_alloc_unbound(value xch,
> +                                            value local_domid,
> +                                            value remote_domid)
> +{
> +       CAMLparam3(xch, local_domid, remote_domid);
> +
> +       uint32_t c_local_domid = _D(local_domid);
> +       uint32_t c_remote_domid = _D(remote_domid);
> +
> +       // caml_enter_blocking_section();
> +       int result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid,
> +                                            c_remote_domid);
> +       // caml_leave_blocking_section();
> +
> +       if (result < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_int(result));
> +}
> +
> +CAMLprim value stub_xc_evtchn_reset(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       int r;
> +
> +       r = xc_evtchn_reset(_H(xch), _D(domid));
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +
> +#define RING_SIZE 32768
> +static char ring[RING_SIZE];
> +
> +CAMLprim value stub_xc_readconsolering(value xch)
> +{
> +       unsigned int size = RING_SIZE;
> +       char *ring_ptr = ring;
> +
> +       CAMLparam1(xch);
> +
> +       // caml_enter_blocking_section();
> +       int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       ring[size] = '\0';
> +       CAMLreturn(caml_copy_string(ring));
> +}
> +
> +CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
> +{
> +       CAMLparam2(xch, keys);
> +       int r;
> +
> +       r = xc_send_debug_keys(_H(xch), String_val(keys));
> +       if (r)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_physinfo(value xch)
> +{
> +       CAMLparam1(xch);
> +       CAMLlocal3(physinfo, cap_list, tmp);
> +       xc_physinfo_t c_physinfo;
> +       int r;
> +
> +       // caml_enter_blocking_section();
> +       r = xc_physinfo(_H(xch), &c_physinfo);
> +       // caml_leave_blocking_section();
> +
> +       if (r)
> +               failwith_xc(_H(xch));
> +
> +       tmp = cap_list = Val_emptylist;
> +       for (r = 0; r < 2; r++) {
> +               if ((c_physinfo.capabilities >> r) & 1) {
> +                       tmp = caml_alloc_small(2, Tag_cons);
> +                       Field(tmp, 0) = Val_int(r);
> +                       Field(tmp, 1) = cap_list;
> +                       cap_list = tmp;
> +               }
> +       }
> +
> +       physinfo = caml_alloc_tuple(9);
> +       Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
> +       Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
> +       Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
> +       Store_field(physinfo, 3, Val_int(c_physinfo.max_node_id));
> +       Store_field(physinfo, 4, Val_int(c_physinfo.cpu_khz));
> +       Store_field(physinfo, 5, caml_copy_nativeint(c_physinfo.total_pages));
> +       Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
> +       Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
> +       Store_field(physinfo, 8, cap_list);
> +
> +       CAMLreturn(physinfo);
> +}
> +
> +CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus)
> +{
> +       CAMLparam2(xch, nr_cpus);
> +       CAMLlocal2(pcpus, v);
> +       xc_cpuinfo_t *info;
> +       int r, size;
> +
> +       if (Int_val(nr_cpus) < 1)
> +               caml_invalid_argument("nr_cpus");
> +
> +       info = calloc(Int_val(nr_cpus) + 1, sizeof(*info));
> +       if (!info)
> +               caml_raise_out_of_memory();
> +
> +       // caml_enter_blocking_section();
> +       r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
> +       // caml_leave_blocking_section();
> +
> +       if (r) {
> +               free(info);
> +               failwith_xc(_H(xch));
> +       }
> +
> +       if (size > 0) {
> +               int i;
> +               pcpus = caml_alloc(size, 0);
> +               for (i = 0; i < size; i++) {
> +                       v = caml_copy_int64(info[i].idletime);
> +                       caml_modify(&Field(pcpus, i), v);
> +               }
> +       } else
> +               pcpus = Atom(0);
> +       free(info);
> +       CAMLreturn(pcpus);
> +}
> +
> +CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid,
> +                                        value max_memkb)
> +{
> +       CAMLparam3(xch, domid, max_memkb);
> +
> +       uint32_t c_domid = _D(domid);
> +       unsigned int c_max_memkb = Int64_val(max_memkb);
> +       // caml_enter_blocking_section();
> +       int retval = xc_domain_setmaxmem(_H(xch), c_domid,
> +                                        c_max_memkb);
> +       // caml_leave_blocking_section();
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid,
> +                                               value map_limitkb)
> +{
> +       CAMLparam3(xch, domid, map_limitkb);
> +       unsigned long v;
> +       int retval;
> +
> +       v = Int64_val(map_limitkb);
> +       retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v);
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_memory_increase_reservation(value xch,
> +                                                          value domid,
> +                                                          value mem_kb)
> +{
> +       CAMLparam3(xch, domid, mem_kb);
> +
> +       unsigned long nr_extents = ((unsigned long)(Int64_val(mem_kb))) >> 
> (PAGE_SHIFT - 10);
> +
> +       uint32_t c_domid = _D(domid);
> +       // caml_enter_blocking_section();
> +       int retval = xc_domain_increase_reservation_exact(_H(xch), c_domid,
> +                                                         nr_extents, 0, 0, 
> NULL);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_set_machine_address_size(value xch,
> +                                                      value domid,
> +                                                      value width)
> +{
> +       CAMLparam3(xch, domid, width);
> +       uint32_t c_domid = _D(domid);
> +       int c_width = Int_val(width);
> +
> +       int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, 
> c_width);
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_get_machine_address_size(value xch,
> +                                                       value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       int retval;
> +
> +       retval = xc_domain_get_machine_address_size(_H(xch), _D(domid));
> +       if (retval < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_int(retval));
> +}
> +
> +CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid,
> +                                        value input,
> +                                        value config)
> +{
> +       CAMLparam4(xch, domid, input, config);
> +       CAMLlocal2(array, tmp);
> +       int r;
> +       unsigned int c_input[2];
> +       char *c_config[4], *out_config[4];
> +
> +       c_config[0] = string_of_option_array(config, 0);
> +       c_config[1] = string_of_option_array(config, 1);
> +       c_config[2] = string_of_option_array(config, 2);
> +       c_config[3] = string_of_option_array(config, 3);
> +
> +       cpuid_input_of_val(c_input[0], c_input[1], input);
> +
> +       array = caml_alloc(4, 0);
> +       for (r = 0; r < 4; r++) {
> +               tmp = Val_none;
> +               if (c_config[r]) {
> +                       tmp = caml_alloc_small(1, 0);
> +                       Field(tmp, 0) = caml_alloc_string(32);
> +               }
> +               Store_field(array, r, tmp);
> +       }
> +
> +       for (r = 0; r < 4; r++)
> +               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, 
> r), 0)) : NULL;
> +
> +       r = xc_cpuid_set(_H(xch), _D(domid),
> +                        c_input, (const char **)c_config, out_config);
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(array);
> +}
> +
> +CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       int r;
> +
> +       r = xc_cpuid_apply_policy(_H(xch), _D(domid));
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_cpuid_check(value xch, value input, value config)
> +{
> +       CAMLparam3(xch, input, config);
> +       CAMLlocal3(ret, array, tmp);
> +       int r;
> +       unsigned int c_input[2];
> +       char *c_config[4], *out_config[4];
> +
> +       c_config[0] = string_of_option_array(config, 0);
> +       c_config[1] = string_of_option_array(config, 1);
> +       c_config[2] = string_of_option_array(config, 2);
> +       c_config[3] = string_of_option_array(config, 3);
> +
> +       cpuid_input_of_val(c_input[0], c_input[1], input);
> +
> +       array = caml_alloc(4, 0);
> +       for (r = 0; r < 4; r++) {
> +               tmp = Val_none;
> +               if (c_config[r]) {
> +                       tmp = caml_alloc_small(1, 0);
> +                       Field(tmp, 0) = caml_alloc_string(32);
> +               }
> +               Store_field(array, r, tmp);
> +       }
> +
> +       for (r = 0; r < 4; r++)
> +               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, 
> r), 0)) : NULL;
> +
> +       r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, 
> out_config);
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +
> +       ret = caml_alloc_tuple(2);
> +       Store_field(ret, 0, Val_bool(r));
> +       Store_field(ret, 1, array);
> +
> +       CAMLreturn(ret);
> +}
> +
> +CAMLprim value stub_xc_version_version(value xch)
> +{
> +       CAMLparam1(xch);
> +       CAMLlocal1(result);
> +       xen_extraversion_t extra;
> +       long packed;
> +       int retval;
> +
> +       // caml_enter_blocking_section();
> +       packed = xc_version(_H(xch), XENVER_version, NULL);
> +       retval = xc_version(_H(xch), XENVER_extraversion, &extra);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       result = caml_alloc_tuple(3);
> +
> +       Store_field(result, 0, Val_int(packed >> 16));
> +       Store_field(result, 1, Val_int(packed & 0xffff));
> +       Store_field(result, 2, caml_copy_string(extra));
> +
> +       CAMLreturn(result);
> +}
> +
> +
> +CAMLprim value stub_xc_version_compile_info(value xch)
> +{
> +       CAMLparam1(xch);
> +       CAMLlocal1(result);
> +       xen_compile_info_t ci;
> +       int retval;
> +
> +       // caml_enter_blocking_section();
> +       retval = xc_version(_H(xch), XENVER_compile_info, &ci);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       result = caml_alloc_tuple(4);
> +
> +       Store_field(result, 0, caml_copy_string(ci.compiler));
> +       Store_field(result, 1, caml_copy_string(ci.compile_by));
> +       Store_field(result, 2, caml_copy_string(ci.compile_domain));
> +       Store_field(result, 3, caml_copy_string(ci.compile_date));
> +
> +       CAMLreturn(result);
> +}
> +
> +
> +static value xc_version_single_string(value xch, int code, void *info)
> +{
> +       CAMLparam1(xch);
> +       int retval;
> +
> +       // caml_enter_blocking_section();
> +       retval = xc_version(_H(xch), code, info);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(caml_copy_string((char *)info));
> +}
> +
> +
> +CAMLprim value stub_xc_version_changeset(value xch)
> +{
> +       xen_changeset_info_t ci;
> +
> +       return xc_version_single_string(xch, XENVER_changeset, &ci);
> +}
> +
> +
> +CAMLprim value stub_xc_version_capabilities(value xch)
> +{
> +       xen_capabilities_info_t ci;
> +
> +       return xc_version_single_string(xch, XENVER_capabilities, &ci);
> +}
> +
> +
> +CAMLprim value stub_pages_to_kib(value pages)
> +{
> +       CAMLparam1(pages);
> +
> +       CAMLreturn(caml_copy_int64(Int64_val(pages) << (PAGE_SHIFT - 10)));
> +}
> +
> +
> +CAMLprim value stub_map_foreign_range(value xch, value dom,
> +                                      value size, value mfn)
> +{
> +       CAMLparam4(xch, dom, size, mfn);
> +       CAMLlocal1(result);
> +       struct mmap_interface *intf;
> +       uint32_t c_dom;
> +       unsigned long c_mfn;
> +
> +       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> +       intf = (struct mmap_interface *) result;
> +
> +       intf->len = Int_val(size);
> +
> +       c_dom = _D(dom);
> +       c_mfn = Nativeint_val(mfn);
> +       // caml_enter_blocking_section();
> +       intf->addr = xc_map_foreign_range(_H(xch), c_dom,
> +                                         intf->len, PROT_READ|PROT_WRITE,
> +                                         c_mfn);
> +       // caml_leave_blocking_section();
> +       if (!intf->addr)
> +               caml_failwith("xc_map_foreign_range error");
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_sched_credit_domain_get(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       CAMLlocal1(sdom);
> +       struct xen_domctl_sched_credit c_sdom;
> +       int ret;
> +
> +       // caml_enter_blocking_section();
> +       ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
> +       // caml_leave_blocking_section();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       sdom = caml_alloc_tuple(2);
> +       Store_field(sdom, 0, Val_int(c_sdom.weight));
> +       Store_field(sdom, 1, Val_int(c_sdom.cap));
> +
> +       CAMLreturn(sdom);
> +}
> +
> +CAMLprim value stub_sched_credit_domain_set(value xch, value domid,
> +                                            value sdom)
> +{
> +       CAMLparam3(xch, domid, sdom);
> +       struct xen_domctl_sched_credit c_sdom;
> +       int ret;
> +
> +       c_sdom.weight = Int_val(Field(sdom, 0));
> +       c_sdom.cap = Int_val(Field(sdom, 1));
> +       // caml_enter_blocking_section();
> +       ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
> +       // caml_leave_blocking_section();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_shadow_allocation_get(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       CAMLlocal1(mb);
> +       unsigned long 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);
> +       // caml_leave_blocking_section();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       mb = Val_int(c_mb);
> +       CAMLreturn(mb);
> +}
> +
> +CAMLprim value stub_shadow_allocation_set(value xch, value domid,
> +                                         value mb)
> +{
> +       CAMLparam3(xch, domid, mb);
> +       unsigned long 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);
> +       // caml_leave_blocking_section();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
> +                                           value nr_pfns)
> +{
> +       CAMLparam3(xch, domid, nr_pfns);
> +       CAMLlocal2(array, v);
> +       unsigned long c_nr_pfns;
> +       long ret, i;
> +       uint64_t *c_array;
> +
> +       c_nr_pfns = Nativeint_val(nr_pfns);
> +
> +       c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
> +       if (!c_array)
> +               caml_raise_out_of_memory();
> +
> +       ret = xc_get_pfn_list(_H(xch), _D(domid),
> +                             c_array, c_nr_pfns);
> +       if (ret < 0) {
> +               free(c_array);
> +               failwith_xc(_H(xch));
> +       }
> +
> +       array = caml_alloc(ret, 0);
> +       for (i = 0; i < ret; i++) {
> +               v = caml_copy_nativeint(c_array[i]);
> +               Store_field(array, i, v);
> +       }
> +       free(c_array);
> +
> +       CAMLreturn(array);
> +}
> +
> +CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
> +                                              value start_port, value 
> nr_ports,
> +                                              value allow)
> +{
> +       CAMLparam5(xch, domid, start_port, nr_ports, allow);
> +       uint32_t c_start_port, c_nr_ports;
> +       uint8_t c_allow;
> +       int ret;
> +
> +       c_start_port = Int_val(start_port);
> +       c_nr_ports = Int_val(nr_ports);
> +       c_allow = Bool_val(allow);
> +
> +       ret = xc_domain_ioport_permission(_H(xch), _D(domid),
> +                                        c_start_port, c_nr_ports, c_allow);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid,
> +                                              value start_pfn, value nr_pfns,
> +                                              value allow)
> +{
> +       CAMLparam5(xch, domid, start_pfn, nr_pfns, allow);
> +       unsigned long c_start_pfn, c_nr_pfns;
> +       uint8_t c_allow;
> +       int ret;
> +
> +       c_start_pfn = Nativeint_val(start_pfn);
> +       c_nr_pfns = Nativeint_val(nr_pfns);
> +       c_allow = Bool_val(allow);
> +
> +       ret = xc_domain_iomem_permission(_H(xch), _D(domid),
> +                                        c_start_pfn, c_nr_pfns, c_allow);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_irq_permission(value xch, value domid,
> +                                            value pirq, value allow)
> +{
> +       CAMLparam4(xch, domid, pirq, allow);
> +       uint8_t c_pirq;
> +       uint8_t c_allow;
> +       int ret;
> +
> +       c_pirq = Int_val(pirq);
> +       c_allow = Bool_val(allow);
> +
> +       ret = xc_domain_irq_permission(_H(xch), _D(domid),
> +                                      c_pirq, c_allow);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func)
> +{
> +       uint32_t bdf = 0;
> +       bdf |= (bus & 0xff) << 16;
> +       bdf |= (slot & 0x1f) << 11;
> +       bdf |= (func & 0x7) << 8;
> +       return bdf;
> +}
> +
> +CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, 
> value desc)
> +{
> +       CAMLparam3(xch, domid, desc);
> +       int ret;
> +       int domain, bus, slot, func;
> +       uint32_t bdf;
> +
> +       domain = Int_val(Field(desc, 0));
> +       bus = Int_val(Field(desc, 1));
> +       slot = Int_val(Field(desc, 2));
> +       func = Int_val(Field(desc, 3));
> +       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> +
> +       ret = xc_test_assign_device(_H(xch), _D(domid), bdf);
> +
> +       CAMLreturn(Val_bool(ret == 0));
> +}
> +
> +CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value 
> desc)
> +{
> +       CAMLparam3(xch, domid, desc);
> +       int ret;
> +       int domain, bus, slot, func;
> +       uint32_t bdf;
> +
> +       domain = Int_val(Field(desc, 0));
> +       bus = Int_val(Field(desc, 1));
> +       slot = Int_val(Field(desc, 2));
> +       func = Int_val(Field(desc, 3));
> +       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> +
> +       ret = xc_assign_device(_H(xch), _D(domid), bdf);
> +
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value 
> desc)
> +{
> +       CAMLparam3(xch, domid, desc);
> +       int ret;
> +       int domain, bus, slot, func;
> +       uint32_t bdf;
> +
> +       domain = Int_val(Field(desc, 0));
> +       bus = Int_val(Field(desc, 1));
> +       slot = Int_val(Field(desc, 2));
> +       func = Int_val(Field(desc, 3));
> +       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> +
> +       ret = xc_deassign_device(_H(xch), _D(domid), bdf);
> +
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_watchdog(value xch, value domid, value timeout)
> +{
> +       CAMLparam3(xch, domid, timeout);
> +       int ret;
> +       unsigned int c_timeout = Int32_val(timeout);
> +
> +       ret = xc_watchdog(_H(xch), _D(domid), c_timeout);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_int(ret));
> +}
> +
> +/*
> + * Local variables:
> + *  indent-tabs-mode: t
> + *  c-basic-offset: 8
> + *  tab-width: 8
> + * End:
> + */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/Makefile
> --- a/tools/ocaml/libs/xl/Makefile
> +++ b/tools/ocaml/libs/xl/Makefile
> @@ -6,44 +6,44 @@
>  CFLAGS += -Wno-unused
>  CFLAGS += $(CFLAGS_libxenlight)
> 
> -OBJS = xl
> -INTF = xl.cmi
> -LIBS = xl.cma xl.cmxa
> +OBJS = xenlight
> +INTF = xenlight.cmi
> +LIBS = xenlight.cma xenlight.cmxa
> 
> -LIBS_xl = $(LDLIBS_libxenlight)
> +LIBS_xenlight = $(LDLIBS_libxenlight)
> 
> -xl_OBJS = $(OBJS)
> -xl_C_OBJS = xl_stubs
> +xenlight_OBJS = $(OBJS)
> +xenlight_C_OBJS = xenlight_stubs
> 
> -OCAML_LIBRARY = xl
> +OCAML_LIBRARY = xenlight
> 
> -GENERATED_FILES += xl.ml xl.ml.tmp xl.mli xl.mli.tmp
> +GENERATED_FILES += xenlight.ml xenlight.ml.tmp xenlight.mli xenlight.mli.tmp
>  GENERATED_FILES += _libxl_types.ml.in _libxl_types.mli.in
>  GENERATED_FILES += _libxl_types.inc
> 
>  all: $(INTF) $(LIBS)
> 
> -xl.ml: xl.ml.in _libxl_types.ml.in
> +xenlight.ml: xenlight.ml.in _libxl_types.ml.in
>         $(Q)sed -e '1i\
>  (*\
>   * AUTO-GENERATED FILE DO NOT EDIT\
> - * Generated from xl.ml.in and _libxl_types.ml.in\
> + * Generated from xenlight.ml.in and _libxl_types.ml.in\
>   *)\
>  ' \
>             -e '/^(\* @@LIBXL_TYPES@@ \*)$$/r_libxl_types.ml.in' \
> -         < xl.ml.in > xl.ml.tmp
> -       $(Q)mv xl.ml.tmp xl.ml
> +         < xenlight.ml.in > xenlight.ml.tmp
> +       $(Q)mv xenlight.ml.tmp xenlight.ml
> 
> -xl.mli: xl.mli.in _libxl_types.mli.in
> +xenlight.mli: xenlight.mli.in _libxl_types.mli.in
>         $(Q)sed -e '1i\
>  (*\
>   * AUTO-GENERATED FILE DO NOT EDIT\
> - * Generated from xl.mli.in and _libxl_types.mli.in\
> + * Generated from xenlight.mli.in and _libxl_types.mli.in\
>   *)\
>  ' \
>             -e '/^(\* @@LIBXL_TYPES@@ \*)$$/r_libxl_types.mli.in' \
> -         < xl.mli.in > xl.mli.tmp
> -       $(Q)mv xl.mli.tmp xl.mli
> +         < xenlight.mli.in > xenlight.mli.tmp
> +       $(Q)mv xenlight.mli.tmp xenlight.mli
> 
>  _libxl_types.ml.in _libxl_types.mli.in _libxl_types.inc: genwrap.py 
> $(XEN_ROOT)/tools/libxl/libxl_types.idl \
>                  $(XEN_ROOT)/tools/libxl/libxltypes.py
> @@ -56,11 +56,11 @@
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xl
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xl META 
> $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenlight 
> META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xl
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
> 
>  include $(TOPLEVEL)/Makefile.rules
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight.ml.in
> --- /dev/null
> +++ b/tools/ocaml/libs/xl/xenlight.ml.in
> @@ -0,0 +1,39 @@
> +(*
> + * Copyright (C) 2009-2011 Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +exception Error of string
> +
> +type domid = int
> +
> +(* @@LIBXL_TYPES@@ *)
> +
> +module Topologyinfo = struct
> +       type t =
> +       {
> +               core : int;
> +               socket : int;
> +               node : int;
> +       }
> +       external get : unit -> t = "stub_xl_topologyinfo"
> +end
> +
> +external button_press : domid -> button -> unit = "stub_xl_button_press"
> +
> +
> +external send_trigger : domid -> string -> int -> unit = 
> "stub_xl_send_trigger"
> +external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> +external send_debug_keys : domid -> string -> unit = 
> "stub_xl_send_debug_keys"
> +
> +let _ = Callback.register_exception "xl.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight.mli.in
> --- /dev/null
> +++ b/tools/ocaml/libs/xl/xenlight.mli.in
> @@ -0,0 +1,36 @@
> +(*
> + * Copyright (C) 2009-2011 Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *)
> +
> +exception Error of string
> +
> +type domid = int
> +
> +(* @@LIBXL_TYPES@@ *)
> +
> +module Topologyinfo : sig
> +       type t =
> +       {
> +               core : int;
> +               socket : int;
> +               node : int;
> +       }
> +       external get : unit -> t = "stub_xl_topologyinfo"
> +end
> +
> +external button_press : domid -> button -> unit = "stub_xl_button_press"
> +
> +external send_trigger : domid -> string -> int -> unit = 
> "stub_xl_send_trigger"
> +external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> +external send_debug_keys : domid -> string -> unit = 
> "stub_xl_send_debug_keys"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/xl/xenlight_stubs.c
> @@ -0,0 +1,596 @@
> +/*
> + * Copyright (C) 2009-2011 Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + */
> +
> +#include <stdlib.h>
> +
> +#define CAML_NAME_SPACE
> +#include <caml/alloc.h>
> +#include <caml/memory.h>
> +#include <caml/signals.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#include <sys/mman.h>
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include <libxl.h>
> +
> +struct caml_logger {
> +       struct xentoollog_logger logger;
> +       int log_offset;
> +       char log_buf[2048];
> +};
> +
> +typedef struct caml_gc {
> +       int offset;
> +       void *ptrs[64];
> +} caml_gc;
> +
> +static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level 
> level,
> +                  int errnoval, const char *context, const char *format, 
> va_list al)
> +{
> +       struct caml_logger *ologger = (struct caml_logger *) logger;
> +
> +       ologger->log_offset += vsnprintf(ologger->log_buf + 
> ologger->log_offset,
> +                                        2048 - ologger->log_offset, format, 
> al);
> +}
> +
> +static void log_destroy(struct xentoollog_logger *logger)
> +{
> +}
> +
> +#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc 
> gc; gc.offset = 0;
> +
> +#define INIT_CTX()  \
> +       lg.logger.vmessage = log_vmessage; \
> +       lg.logger.destroy = log_destroy; \
> +       lg.logger.progress = NULL; \
> +       caml_enter_blocking_section(); \
> +       ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger 
> *) &lg); \
> +       if (ret != 0) \
> +               failwith_xl("cannot init context", &lg);
> +
> +#define FREE_CTX()  \
> +       gc_free(&gc); \
> +       caml_leave_blocking_section(); \
> +       libxl_ctx_free(ctx)
> +
> +static char * dup_String_val(caml_gc *gc, value s)
> +{
> +       int len;
> +       char *c;
> +       len = caml_string_length(s);
> +       c = calloc(len + 1, sizeof(char));
> +       if (!c)
> +               caml_raise_out_of_memory();
> +       gc->ptrs[gc->offset++] = c;
> +       memcpy(c, String_val(s), len);
> +       return c;
> +}
> +
> +static void gc_free(caml_gc *gc)
> +{
> +       int i;
> +       for (i = 0; i < gc->offset; i++) {
> +               free(gc->ptrs[i]);
> +       }
> +}
> +
> +static void failwith_xl(char *fname, struct caml_logger *lg)
> +{
> +       char *s;
> +       s = (lg) ? lg->log_buf : fname;
> +       caml_raise_with_string(*caml_named_value("xl.error"), s);
> +}
> +
> +#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed 
> then */
> +static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
> +{
> +       void *ptr;
> +       ptr = calloc(nmemb, size);
> +       if (!ptr)
> +               caml_raise_out_of_memory();
> +       gc->ptrs[gc->offset++] = ptr;
> +       return ptr;
> +}
> +
> +static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value 
> v)
> +{
> +       CAMLparam1(v);
> +       CAMLlocal1(a);
> +       int i;
> +       char **array;
> +
> +       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { 
> i++; }
> +
> +       array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
> +       if (!array)
> +               return 1;
> +       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), 
> i++) {
> +               value b = Field(a, 0);
> +               array[i * 2] = dup_String_val(gc, Field(b, 0));
> +               array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
> +       }
> +       *c_val = array;
> +       CAMLreturn(0);
> +}
> +
> +#endif
> +
> +static value Val_mac (libxl_mac *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(v);
> +       int i;
> +
> +       v = caml_alloc_tuple(6);
> +
> +       for(i=0; i<6; i++)
> +               Store_field(v, i, Val_int((*c_val)[i]));
> +
> +       CAMLreturn(v);
> +}
> +
> +static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, 
> value v)
> +{
> +       CAMLparam1(v);
> +       int i;
> +
> +       for(i=0; i<6; i++)
> +               (*c_val)[i] = Int_val(Field(v, i));
> +
> +       CAMLreturn(0);
> +}
> +
> +static value Val_uuid (libxl_uuid *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(v);
> +       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> +       int i;
> +
> +       v = caml_alloc_tuple(16);
> +
> +       for(i=0; i<16; i++)
> +               Store_field(v, i, Val_int(uuid[i]));
> +
> +       CAMLreturn(v);
> +}
> +
> +static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, 
> value v)
> +{
> +       CAMLparam1(v);
> +       int i;
> +       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> +
> +       for(i=0; i<16; i++)
> +               uuid[i] = Int_val(Field(v, i));
> +
> +       CAMLreturn(0);
> +}
> +
> +static value Val_hwcap(libxl_hwcap *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(hwcap);
> +       int i;
> +
> +       hwcap = caml_alloc_tuple(8);
> +       for (i = 0; i < 8; i++)
> +               Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
> +
> +       CAMLreturn(hwcap);
> +}
> +
> +#include "_libxl_types.inc"
> +
> +static value Val_topologyinfo(libxl_topologyinfo *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal3(v, topology, topologyinfo);
> +       int i;
> +
> +       topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
> +       for (i = 0; i < c_val->coremap.entries; i++) {
> +               v = Val_int(0); /* None */
> +               if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
> +                       topology = caml_alloc_tuple(3);
> +                       Store_field(topology, 0, 
> Val_int(c_val->coremap.array[i]));
> +                       Store_field(topology, 1, 
> Val_int(c_val->socketmap.array[i]));
> +                       Store_field(topology, 2, 
> Val_int(c_val->nodemap.array[i]));
> +                       v = caml_alloc(1, 0); /* Some */
> +                       Store_field(v, 0, topology);
> +               }
> +               Store_field(topologyinfo, i, v);
> +       }
> +
> +       CAMLreturn(topologyinfo);
> +}
> +
> +value stub_xl_device_disk_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_disk c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_disk_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("disk_add", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_disk_del(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_disk c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_disk_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
> +       if (ret != 0)
> +               failwith_xl("disk_del", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_nic_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_nic c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_nic_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("nic_add", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_nic_del(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_nic c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_nic_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
> +       if (ret != 0)
> +               failwith_xl("nic_del", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_console_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_console c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_console_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("console_add", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vkb_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_vkb c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_vkb_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("vkb_add", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vkb_clean_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vkb_clean_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vkb_hard_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vkb_hard_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vfb_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_vfb c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_vfb_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("vfb_add", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vfb_clean_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vfb_clean_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vfb_hard_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vfb_hard_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_pci_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_pci c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_pci_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("pci_add", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_pci_remove(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_pci c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_pci_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
> +       if (ret != 0)
> +               failwith_xl("pci_remove", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_pci_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("pci_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_button_press(value domid, value button)
> +{
> +       CAMLparam2(domid, button);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + 
> LIBXL_BUTTON_POWER);
> +       if (ret != 0)
> +               failwith_xl("button_press", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_physinfo_get(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLlocal1(physinfo);
> +       libxl_physinfo c_physinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_get_physinfo(ctx, &c_physinfo);
> +       if (ret != 0)
> +               failwith_xl("physinfo", &lg);
> +       FREE_CTX();
> +
> +       physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
> +       CAMLreturn(physinfo);
> +}
> +
> +value stub_xl_topologyinfo(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLlocal1(topologyinfo);
> +       libxl_topologyinfo c_topologyinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
> +       if (ret != 0)
> +               failwith_xl("topologyinfo", &lg);
> +       FREE_CTX();
> +
> +       topologyinfo = Val_topologyinfo(&c_topologyinfo);
> +       CAMLreturn(topologyinfo);
> +}
> +
> +value stub_xl_sched_credit_domain_get(value domid)
> +{
> +       CAMLparam1(domid);
> +       CAMLlocal1(scinfo);
> +       libxl_sched_credit c_scinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
> +       if (ret != 0)
> +               failwith_xl("sched_credit_domain_get", &lg);
> +       FREE_CTX();
> +
> +       scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
> +       CAMLreturn(scinfo);
> +}
> +
> +value stub_xl_sched_credit_domain_set(value domid, value scinfo)
> +{
> +       CAMLparam2(domid, scinfo);
> +       libxl_sched_credit c_scinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
> +
> +       INIT_CTX();
> +       ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
> +       if (ret != 0)
> +               failwith_xl("sched_credit_domain_set", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
> +{
> +       CAMLparam3(domid, trigger, vcpuid);
> +       int ret;
> +       char *c_trigger;
> +       INIT_STRUCT();
> +
> +       c_trigger = dup_String_val(&gc, trigger);
> +
> +       INIT_CTX();
> +       ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, 
> Int_val(vcpuid));
> +       if (ret != 0)
> +               failwith_xl("send_trigger", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_send_sysrq(value domid, value sysrq)
> +{
> +       CAMLparam2(domid, sysrq);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
> +       if (ret != 0)
> +               failwith_xl("send_sysrq", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_send_debug_keys(value keys)
> +{
> +       CAMLparam1(keys);
> +       int ret;
> +       char *c_keys;
> +       INIT_STRUCT();
> +
> +       c_keys = dup_String_val(&gc, keys);
> +
> +       INIT_CTX();
> +       ret = libxl_send_debug_keys(ctx, c_keys);
> +       if (ret != 0)
> +               failwith_xl("send_debug_keys", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +/*
> + * Local variables:
> + *  indent-tabs-mode: t
> + *  c-basic-offset: 8
> + *  tab-width: 8
> + * End:
> + */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl.ml.in
> --- a/tools/ocaml/libs/xl/xl.ml.in
> +++ /dev/null
> @@ -1,39 +0,0 @@
> -(*
> - * Copyright (C) 2009-2011 Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -exception Error of string
> -
> -type domid = int
> -
> -(* @@LIBXL_TYPES@@ *)
> -
> -module Topologyinfo = struct
> -       type t =
> -       {
> -               core : int;
> -               socket : int;
> -               node : int;
> -       }
> -       external get : unit -> t = "stub_xl_topologyinfo"
> -end
> -
> -external button_press : domid -> button -> unit = "stub_xl_button_press"
> -
> -
> -external send_trigger : domid -> string -> int -> unit = 
> "stub_xl_send_trigger"
> -external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> -external send_debug_keys : domid -> string -> unit = 
> "stub_xl_send_debug_keys"
> -
> -let _ = Callback.register_exception "xl.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl.mli.in
> --- a/tools/ocaml/libs/xl/xl.mli.in
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -(*
> - * Copyright (C) 2009-2011 Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - *)
> -
> -exception Error of string
> -
> -type domid = int
> -
> -(* @@LIBXL_TYPES@@ *)
> -
> -module Topologyinfo : sig
> -       type t =
> -       {
> -               core : int;
> -               socket : int;
> -               node : int;
> -       }
> -       external get : unit -> t = "stub_xl_topologyinfo"
> -end
> -
> -external button_press : domid -> button -> unit = "stub_xl_button_press"
> -
> -external send_trigger : domid -> string -> int -> unit = 
> "stub_xl_send_trigger"
> -external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> -external send_debug_keys : domid -> string -> unit = 
> "stub_xl_send_debug_keys"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl_stubs.c
> --- a/tools/ocaml/libs/xl/xl_stubs.c
> +++ /dev/null
> @@ -1,596 +0,0 @@
> -/*
> - * Copyright (C) 2009-2011 Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@xxxxxxxxxxxxx>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - */
> -
> -#include <stdlib.h>
> -
> -#define CAML_NAME_SPACE
> -#include <caml/alloc.h>
> -#include <caml/memory.h>
> -#include <caml/signals.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#include <sys/mman.h>
> -#include <stdint.h>
> -#include <string.h>
> -
> -#include <libxl.h>
> -
> -struct caml_logger {
> -       struct xentoollog_logger logger;
> -       int log_offset;
> -       char log_buf[2048];
> -};
> -
> -typedef struct caml_gc {
> -       int offset;
> -       void *ptrs[64];
> -} caml_gc;
> -
> -static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level 
> level,
> -                  int errnoval, const char *context, const char *format, 
> va_list al)
> -{
> -       struct caml_logger *ologger = (struct caml_logger *) logger;
> -
> -       ologger->log_offset += vsnprintf(ologger->log_buf + 
> ologger->log_offset,
> -                                        2048 - ologger->log_offset, format, 
> al);
> -}
> -
> -static void log_destroy(struct xentoollog_logger *logger)
> -{
> -}
> -
> -#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc 
> gc; gc.offset = 0;
> -
> -#define INIT_CTX()  \
> -       lg.logger.vmessage = log_vmessage; \
> -       lg.logger.destroy = log_destroy; \
> -       lg.logger.progress = NULL; \
> -       caml_enter_blocking_section(); \
> -       ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger 
> *) &lg); \
> -       if (ret != 0) \
> -               failwith_xl("cannot init context", &lg);
> -
> -#define FREE_CTX()  \
> -       gc_free(&gc); \
> -       caml_leave_blocking_section(); \
> -       libxl_ctx_free(ctx)
> -
> -static char * dup_String_val(caml_gc *gc, value s)
> -{
> -       int len;
> -       char *c;
> -       len = caml_string_length(s);
> -       c = calloc(len + 1, sizeof(char));
> -       if (!c)
> -               caml_raise_out_of_memory();
> -       gc->ptrs[gc->offset++] = c;
> -       memcpy(c, String_val(s), len);
> -       return c;
> -}
> -
> -static void gc_free(caml_gc *gc)
> -{
> -       int i;
> -       for (i = 0; i < gc->offset; i++) {
> -               free(gc->ptrs[i]);
> -       }
> -}
> -
> -static void failwith_xl(char *fname, struct caml_logger *lg)
> -{
> -       char *s;
> -       s = (lg) ? lg->log_buf : fname;
> -       caml_raise_with_string(*caml_named_value("xl.error"), s);
> -}
> -
> -#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed 
> then */
> -static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
> -{
> -       void *ptr;
> -       ptr = calloc(nmemb, size);
> -       if (!ptr)
> -               caml_raise_out_of_memory();
> -       gc->ptrs[gc->offset++] = ptr;
> -       return ptr;
> -}
> -
> -static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value 
> v)
> -{
> -       CAMLparam1(v);
> -       CAMLlocal1(a);
> -       int i;
> -       char **array;
> -
> -       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { 
> i++; }
> -
> -       array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
> -       if (!array)
> -               return 1;
> -       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), 
> i++) {
> -               value b = Field(a, 0);
> -               array[i * 2] = dup_String_val(gc, Field(b, 0));
> -               array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
> -       }
> -       *c_val = array;
> -       CAMLreturn(0);
> -}
> -
> -#endif
> -
> -static value Val_mac (libxl_mac *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(v);
> -       int i;
> -
> -       v = caml_alloc_tuple(6);
> -
> -       for(i=0; i<6; i++)
> -               Store_field(v, i, Val_int((*c_val)[i]));
> -
> -       CAMLreturn(v);
> -}
> -
> -static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, 
> value v)
> -{
> -       CAMLparam1(v);
> -       int i;
> -
> -       for(i=0; i<6; i++)
> -               (*c_val)[i] = Int_val(Field(v, i));
> -
> -       CAMLreturn(0);
> -}
> -
> -static value Val_uuid (libxl_uuid *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(v);
> -       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> -       int i;
> -
> -       v = caml_alloc_tuple(16);
> -
> -       for(i=0; i<16; i++)
> -               Store_field(v, i, Val_int(uuid[i]));
> -
> -       CAMLreturn(v);
> -}
> -
> -static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, 
> value v)
> -{
> -       CAMLparam1(v);
> -       int i;
> -       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> -
> -       for(i=0; i<16; i++)
> -               uuid[i] = Int_val(Field(v, i));
> -
> -       CAMLreturn(0);
> -}
> -
> -static value Val_hwcap(libxl_hwcap *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(hwcap);
> -       int i;
> -
> -       hwcap = caml_alloc_tuple(8);
> -       for (i = 0; i < 8; i++)
> -               Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
> -
> -       CAMLreturn(hwcap);
> -}
> -
> -#include "_libxl_types.inc"
> -
> -static value Val_topologyinfo(libxl_topologyinfo *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal3(v, topology, topologyinfo);
> -       int i;
> -
> -       topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
> -       for (i = 0; i < c_val->coremap.entries; i++) {
> -               v = Val_int(0); /* None */
> -               if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
> -                       topology = caml_alloc_tuple(3);
> -                       Store_field(topology, 0, 
> Val_int(c_val->coremap.array[i]));
> -                       Store_field(topology, 1, 
> Val_int(c_val->socketmap.array[i]));
> -                       Store_field(topology, 2, 
> Val_int(c_val->nodemap.array[i]));
> -                       v = caml_alloc(1, 0); /* Some */
> -                       Store_field(v, 0, topology);
> -               }
> -               Store_field(topologyinfo, i, v);
> -       }
> -
> -       CAMLreturn(topologyinfo);
> -}
> -
> -value stub_xl_device_disk_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_disk c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_disk_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("disk_add", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_disk_del(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_disk c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_disk_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
> -       if (ret != 0)
> -               failwith_xl("disk_del", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_nic_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_nic c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_nic_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("nic_add", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_nic_del(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_nic c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_nic_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
> -       if (ret != 0)
> -               failwith_xl("nic_del", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_console_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_console c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_console_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("console_add", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vkb_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_vkb c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_vkb_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("vkb_add", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vkb_clean_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vkb_clean_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vkb_hard_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vkb_hard_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vfb_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_vfb c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_vfb_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("vfb_add", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vfb_clean_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vfb_clean_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vfb_hard_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vfb_hard_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_pci_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_pci c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_pci_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("pci_add", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_pci_remove(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_pci c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_pci_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
> -       if (ret != 0)
> -               failwith_xl("pci_remove", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_pci_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("pci_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_button_press(value domid, value button)
> -{
> -       CAMLparam2(domid, button);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + 
> LIBXL_BUTTON_POWER);
> -       if (ret != 0)
> -               failwith_xl("button_press", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_physinfo_get(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLlocal1(physinfo);
> -       libxl_physinfo c_physinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_get_physinfo(ctx, &c_physinfo);
> -       if (ret != 0)
> -               failwith_xl("physinfo", &lg);
> -       FREE_CTX();
> -
> -       physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
> -       CAMLreturn(physinfo);
> -}
> -
> -value stub_xl_topologyinfo(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLlocal1(topologyinfo);
> -       libxl_topologyinfo c_topologyinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
> -       if (ret != 0)
> -               failwith_xl("topologyinfo", &lg);
> -       FREE_CTX();
> -
> -       topologyinfo = Val_topologyinfo(&c_topologyinfo);
> -       CAMLreturn(topologyinfo);
> -}
> -
> -value stub_xl_sched_credit_domain_get(value domid)
> -{
> -       CAMLparam1(domid);
> -       CAMLlocal1(scinfo);
> -       libxl_sched_credit c_scinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
> -       if (ret != 0)
> -               failwith_xl("sched_credit_domain_get", &lg);
> -       FREE_CTX();
> -
> -       scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
> -       CAMLreturn(scinfo);
> -}
> -
> -value stub_xl_sched_credit_domain_set(value domid, value scinfo)
> -{
> -       CAMLparam2(domid, scinfo);
> -       libxl_sched_credit c_scinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
> -
> -       INIT_CTX();
> -       ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
> -       if (ret != 0)
> -               failwith_xl("sched_credit_domain_set", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
> -{
> -       CAMLparam3(domid, trigger, vcpuid);
> -       int ret;
> -       char *c_trigger;
> -       INIT_STRUCT();
> -
> -       c_trigger = dup_String_val(&gc, trigger);
> -
> -       INIT_CTX();
> -       ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, 
> Int_val(vcpuid));
> -       if (ret != 0)
> -               failwith_xl("send_trigger", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_send_sysrq(value domid, value sysrq)
> -{
> -       CAMLparam2(domid, sysrq);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
> -       if (ret != 0)
> -               failwith_xl("send_sysrq", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_send_debug_keys(value keys)
> -{
> -       CAMLparam1(keys);
> -       int ret;
> -       char *c_keys;
> -       INIT_STRUCT();
> -
> -       c_keys = dup_String_val(&gc, keys);
> -
> -       INIT_CTX();
> -       ret = libxl_send_debug_keys(ctx, c_keys);
> -       if (ret != 0)
> -               failwith_xl("send_debug_keys", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -/*
> - * Local variables:
> - *  indent-tabs-mode: t
> - *  c-basic-offset: 8
> - *  tab-width: 8
> - * End:
> - */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/META.in
> --- a/tools/ocaml/libs/xs/META.in
> +++ b/tools/ocaml/libs/xs/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "XenStore Interface"
> -requires = "unix,xb"
> -archive(byte) = "xs.cma"
> -archive(native) = "xs.cmxa"
> +requires = "unix,xenbus"
> +archive(byte) = "xenstore.cma"
> +archive(native) = "xenstore.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/Makefile
> --- a/tools/ocaml/libs/xs/Makefile
> +++ b/tools/ocaml/libs/xs/Makefile
> @@ -3,6 +3,7 @@
>  include $(TOPLEVEL)/common.make
> 
>  OCAMLINCLUDE += -I ../xb/
> +OCAMLOPTFLAGS += -for-pack Xenstore
> 
>  .NOTPARALLEL:
>  # Ocaml is such a PITA!
> @@ -12,7 +13,7 @@
>  PRELIBS = $(foreach obj, $(PREOBJS),$(obj).cmo) $(foreach 
> obj,$(PREOJBS),$(obj).cmx)
>  OBJS = queueop xsraw xst xs
>  INTF = xsraw.cmi xst.cmi xs.cmi
> -LIBS = xs.cma xs.cmxa
> +LIBS = xenstore.cma xenstore.cmxa
> 
>  all: $(PREINTF) $(PRELIBS) $(INTF) $(LIBS) $(PROGRAMS)
> 
> @@ -20,18 +21,27 @@
> 
>  libs: $(LIBS)
> 
> -xs_OBJS = $(OBJS)
> -OCAML_NOC_LIBRARY = xs
> +xenstore_OBJS = xenstore
> +OCAML_NOC_LIBRARY = xenstore
> +
> +xenstore.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> +       $(E) " CMX      $@"
> +       $(Q)$(OCAMLOPT) -pack -o $@ $^
> +
> +xenstore.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> +       $(E) " CMO      $@"
> +       $(Q)$(OCAMLC) -pack -o $@ $^
> +
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xs
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xs META 
> $(INTF) xs.mli xst.mli xsraw.mli $(LIBS) *.a *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenstore 
> META $(LIBS) xenstore.cmo xenstore.cmi xenstore.cmx *.a
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xs
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
> 
>  include $(TOPLEVEL)/Makefile.rules
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/queueop.ml
> --- a/tools/ocaml/libs/xs/queueop.ml
> +++ b/tools/ocaml/libs/xs/queueop.ml
> @@ -13,6 +13,7 @@
>   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>   * GNU Lesser General Public License for more details.
>   *)
> +open Xenbus
> 
>  let data_concat ls = (String.concat "\000" ls) ^ "\000"
>  let queue_path ty (tid: int) (path: string) con =
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xs.ml
> --- a/tools/ocaml/libs/xs/xs.ml
> +++ b/tools/ocaml/libs/xs/xs.ml
> @@ -69,7 +69,7 @@
>  let read_watchevent xsh = Xsraw.read_watchevent xsh.con
> 
>  let make fd = get_operations (Xsraw.open_fd fd)
> -let get_fd xsh = Xb.get_fd xsh.con.Xsraw.xb
> +let get_fd xsh = Xenbus.Xb.get_fd xsh.con.Xsraw.xb
> 
>  exception Timeout
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xsraw.ml
> --- a/tools/ocaml/libs/xs/xsraw.ml
> +++ b/tools/ocaml/libs/xs/xsraw.ml
> @@ -14,6 +14,8 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> +open Xenbus
> +
>  exception Partial_not_empty
>  exception Unexpected_packet of string
> 
> @@ -27,7 +29,7 @@
>         raise (Unexpected_packet s)
> 
>  type con = {
> -       xb: Xb.t;
> +       xb: Xenbus.Xb.t;
>         watchevents: (string * string) Queue.t;
>  }
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xsraw.mli
> --- a/tools/ocaml/libs/xs/xsraw.mli
> +++ b/tools/ocaml/libs/xs/xsraw.mli
> @@ -16,8 +16,8 @@
>  exception Partial_not_empty
>  exception Unexpected_packet of string
>  exception Invalid_path of string
> -val unexpected_packet : Xb.Op.operation -> Xb.Op.operation -> 'a
> -type con = { xb : Xb.t; watchevents : (string * string) Queue.t; }
> +val unexpected_packet : Xenbus.Xb.Op.operation -> Xenbus.Xb.Op.operation -> 
> 'a
> +type con = { xb : Xenbus.Xb.t; watchevents : (string * string) Queue.t; }
>  val close : con -> unit
>  val open_fd : Unix.file_descr -> con
>  val split_string : ?limit:int -> char -> string -> string list
> @@ -26,14 +26,14 @@
>  val string_of_perms : int * perm * (int * perm) list -> string
>  val perms_of_string : string -> int * perm * (int * perm) list
>  val pkt_send : con -> unit
> -val pkt_recv : con -> Xb.Packet.t
> -val pkt_recv_timeout : con -> float -> bool * Xb.Packet.t option
> +val pkt_recv : con -> Xenbus.Xb.Packet.t
> +val pkt_recv_timeout : con -> float -> bool * Xenbus.Xb.Packet.t option
>  val queue_watchevent : con -> string -> unit
>  val has_watchevents : con -> bool
>  val get_watchevent : con -> string * string
>  val read_watchevent : con -> string * string
> -val sync_recv : Xb.Op.operation -> con -> string
> -val sync : (Xb.t -> 'a) -> con -> string
> +val sync_recv : Xenbus.Xb.Op.operation -> con -> string
> +val sync : (Xenbus.Xb.t -> 'a) -> con -> string
>  val ack : string -> unit
>  val validate_path : string -> unit
>  val validate_watch_path : string -> unit
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/Makefile
> --- a/tools/ocaml/xenstored/Makefile
> +++ b/tools/ocaml/xenstored/Makefile
> @@ -35,11 +35,11 @@
>  XENSTOREDLIBS = \
>         unix.cmxa \
>         $(OCAML_TOPLEVEL)/libs/uuid/uuid.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap 
> $(OCAML_TOPLEVEL)/libs/mmap/mmap.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap 
> $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log 
> $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn 
> $(OCAML_TOPLEVEL)/libs/eventchn/eventchn.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc 
> $(OCAML_TOPLEVEL)/libs/xc/xc.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb 
> $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn 
> $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc 
> $(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb 
> $(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \
>         -ccopt -L -ccopt $(XEN_ROOT)/tools/libxc
> 
>  PROGRAMS = oxenstored
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/connection.ml
> --- a/tools/ocaml/xenstored/connection.ml
> +++ b/tools/ocaml/xenstored/connection.ml
> @@ -27,7 +27,7 @@
>  }
> 
>  and t = {
> -       xb: Xb.t;
> +       xb: Xenbus.Xb.t;
>         dom: Domain.t option;
>         transactions: (int, Transaction.t) Hashtbl.t;
>         mutable next_tid: int;
> @@ -93,10 +93,10 @@
>         Logging.new_connection ~tid:Transaction.none ~con:(get_domstr con);
>         con
> 
> -let get_fd con = Xb.get_fd con.xb
> +let get_fd con = Xenbus.Xb.get_fd con.xb
>  let close con =
>         Logging.end_connection ~tid:Transaction.none ~con:(get_domstr con);
> -       Xb.close con.xb
> +       Xenbus.Xb.close con.xb
> 
>  let get_perm con =
>         con.perm
> @@ -108,9 +108,9 @@
>         con.perm <- Perms.Connection.set_target (get_perm con) 
> ~perms:[Perms.READ; Perms.WRITE] target_domid
> 
>  let send_reply con tid rid ty data =
> -       Xb.queue con.xb (Xb.Packet.create tid rid ty data)
> +       Xenbus.Xb.queue con.xb (Xenbus.Xb.Packet.create tid rid ty data)
> 
> -let send_error con tid rid err = send_reply con tid rid Xb.Op.Error (err ^ 
> "\000")
> +let send_error con tid rid err = send_reply con tid rid Xenbus.Xb.Op.Error 
> (err ^ "\000")
>  let send_ack con tid rid ty = send_reply con tid rid ty "OK\000"
> 
>  let get_watch_path con path =
> @@ -166,7 +166,7 @@
> 
>  let fire_single_watch watch =
>         let data = Utils.join_by_null [watch.path; watch.token; ""] in
> -       send_reply watch.con Transaction.none 0 Xb.Op.Watchevent data
> +       send_reply watch.con Transaction.none 0 Xenbus.Xb.Op.Watchevent data
> 
>  let fire_watch watch path =
>         let new_path =
> @@ -179,7 +179,7 @@
>                         path
>         in
>         let data = Utils.join_by_null [ new_path; watch.token; "" ] in
> -       send_reply watch.con Transaction.none 0 Xb.Op.Watchevent data
> +       send_reply watch.con Transaction.none 0 Xenbus.Xb.Op.Watchevent data
> 
>  let find_next_tid con =
>         let ret = con.next_tid in con.next_tid <- con.next_tid + 1; ret
> @@ -203,15 +203,15 @@
>  let get_transaction con tid =
>         Hashtbl.find con.transactions tid
> 
> -let do_input con = Xb.input con.xb
> -let has_input con = Xb.has_in_packet con.xb
> -let pop_in con = Xb.get_in_packet con.xb
> -let has_more_input con = Xb.has_more_input con.xb
> +let do_input con = Xenbus.Xb.input con.xb
> +let has_input con = Xenbus.Xb.has_in_packet con.xb
> +let pop_in con = Xenbus.Xb.get_in_packet con.xb
> +let has_more_input con = Xenbus.Xb.has_more_input con.xb
> 
> -let has_output con = Xb.has_output con.xb
> -let has_new_output con = Xb.has_new_output con.xb
> -let peek_output con = Xb.peek_output con.xb
> -let do_output con = Xb.output con.xb
> +let has_output con = Xenbus.Xb.has_output con.xb
> +let has_new_output con = Xenbus.Xb.has_new_output con.xb
> +let peek_output con = Xenbus.Xb.peek_output con.xb
> +let do_output con = Xenbus.Xb.output con.xb
> 
>  let incr_ops con = con.stat_nb_ops <- con.stat_nb_ops + 1
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/connections.ml
> --- a/tools/ocaml/xenstored/connections.ml
> +++ b/tools/ocaml/xenstored/connections.ml
> @@ -26,12 +26,12 @@
>  let create () = { anonymous = []; domains = Hashtbl.create 8; watches = 
> Trie.create () }
> 
>  let add_anonymous cons fd can_write =
> -       let xbcon = Xb.open_fd fd in
> +       let xbcon = Xenbus.Xb.open_fd fd in
>         let con = Connection.create xbcon None in
>         cons.anonymous <- con :: cons.anonymous
> 
>  let add_domain cons dom =
> -       let xbcon = Xb.open_mmap (Domain.get_interface dom) (fun () -> 
> Domain.notify dom) in
> +       let xbcon = Xenbus.Xb.open_mmap (Domain.get_interface dom) (fun () -> 
> Domain.notify dom) in
>         let con = Connection.create xbcon (Some dom) in
>         Hashtbl.add cons.domains (Domain.get_id dom) con
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/domain.ml
> --- a/tools/ocaml/xenstored/domain.ml
> +++ b/tools/ocaml/xenstored/domain.ml
> @@ -20,10 +20,10 @@
> 
>  type t =
>  {
> -       id: Xc.domid;
> +       id: Xenctrl.domid;
>         mfn: nativeint;
>         remote_port: int;
> -       interface: Mmap.mmap_interface;
> +       interface: Xenmmap.mmap_interface;
>         eventchn: Event.t;
>         mutable port: int;
>  }
> @@ -47,7 +47,7 @@
>  let close dom =
>         debug "domain %d unbound port %d" dom.id dom.port;
>         Event.unbind dom.eventchn dom.port;
> -       Mmap.unmap dom.interface;
> +       Xenmmap.unmap dom.interface;
>         ()
> 
>  let make id mfn remote_port interface eventchn = {
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/domains.ml
> --- a/tools/ocaml/xenstored/domains.ml
> +++ b/tools/ocaml/xenstored/domains.ml
> @@ -16,7 +16,7 @@
> 
>  type domains = {
>         eventchn: Event.t;
> -       table: (Xc.domid, Domain.t) Hashtbl.t;
> +       table: (Xenctrl.domid, Domain.t) Hashtbl.t;
>  }
> 
>  let init eventchn =
> @@ -33,16 +33,16 @@
> 
>         Hashtbl.iter (fun id _ -> if id <> 0 then
>                 try
> -                       let info = Xc.domain_getinfo xc id in
> -                       if info.Xc.shutdown || info.Xc.dying then (
> +                       let info = Xenctrl.domain_getinfo xc id in
> +                       if info.Xenctrl.shutdown || info.Xenctrl.dying then (
>                                 Logs.debug "general" "Domain %u died 
> (dying=%b, shutdown %b -- code %d)"
> -                                                   id info.Xc.dying 
> info.Xc.shutdown info.Xc.shutdown_code;
> -                               if info.Xc.dying then
> +                                                   id info.Xenctrl.dying 
> info.Xenctrl.shutdown info.Xenctrl.shutdown_code;
> +                               if info.Xenctrl.dying then
>                                         dead_dom := id :: !dead_dom
>                                 else
>                                         notify := true;
>                         )
> -               with Xc.Error _ ->
> +               with Xenctrl.Error _ ->
>                         Logs.debug "general" "Domain %u died -- no domain 
> info" id;
>                         dead_dom := id :: !dead_dom;
>                 ) doms.table;
> @@ -57,7 +57,7 @@
>         ()
> 
>  let create xc doms domid mfn port =
> -       let interface = Xc.map_foreign_range xc domid (Mmap.getpagesize()) 
> mfn in
> +       let interface = Xenctrl.map_foreign_range xc domid 
> (Xenmmap.getpagesize()) mfn in
>         let dom = Domain.make domid mfn port interface doms.eventchn in
>         Hashtbl.add doms.table domid dom;
>         Domain.bind_interdomain dom;
> @@ -66,13 +66,13 @@
>  let create0 fake doms =
>         let port, interface =
>                 if fake then (
> -                       0, Xc.with_intf (fun xc -> Xc.map_foreign_range xc 0 
> (Mmap.getpagesize()) 0n)
> +                       0, Xenctrl.with_intf (fun xc -> 
> Xenctrl.map_foreign_range xc 0 (Xenmmap.getpagesize()) 0n)
>                 ) else (
>                         let port = Utils.read_file_single_integer 
> Define.xenstored_proc_port
>                         and fd = Unix.openfile Define.xenstored_proc_kva
>                                                [ Unix.O_RDWR ] 0o600 in
> -                       let interface = Mmap.mmap fd Mmap.RDWR Mmap.SHARED
> -                                                 (Mmap.getpagesize()) 0 in
> +                       let interface = Xenmmap.mmap fd Xenmmap.RDWR 
> Xenmmap.SHARED
> +                                                 (Xenmmap.getpagesize()) 0 in
>                         Unix.close fd;
>                         port, interface
>                 )
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/event.ml
> --- a/tools/ocaml/xenstored/event.ml
> +++ b/tools/ocaml/xenstored/event.ml
> @@ -16,15 +16,15 @@
> 
>  (**************** high level binding ****************)
>  type t = {
> -       handle: Eventchn.handle;
> +       handle: Xeneventchn.handle;
>         mutable virq_port: int;
>  }
> 
> -let init () = { handle = Eventchn.init (); virq_port = -1; }
> -let fd eventchn = Eventchn.fd eventchn.handle
> -let bind_dom_exc_virq eventchn = eventchn.virq_port <- 
> Eventchn.bind_dom_exc_virq eventchn.handle
> -let bind_interdomain eventchn domid port = Eventchn.bind_interdomain 
> eventchn.handle domid port
> -let unbind eventchn port = Eventchn.unbind eventchn.handle port
> -let notify eventchn port = Eventchn.notify eventchn.handle port
> -let pending eventchn = Eventchn.pending eventchn.handle
> -let unmask eventchn port = Eventchn.unmask eventchn.handle port
> +let init () = { handle = Xeneventchn.init (); virq_port = -1; }
> +let fd eventchn = Xeneventchn.fd eventchn.handle
> +let bind_dom_exc_virq eventchn = eventchn.virq_port <- 
> Xeneventchn.bind_dom_exc_virq eventchn.handle
> +let bind_interdomain eventchn domid port = Xeneventchn.bind_interdomain 
> eventchn.handle domid port
> +let unbind eventchn port = Xeneventchn.unbind eventchn.handle port
> +let notify eventchn port = Xeneventchn.notify eventchn.handle port
> +let pending eventchn = Xeneventchn.pending eventchn.handle
> +let unmask eventchn port = Xeneventchn.unmask eventchn.handle port
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/logging.ml
> --- a/tools/ocaml/xenstored/logging.ml
> +++ b/tools/ocaml/xenstored/logging.ml
> @@ -39,7 +39,7 @@
>         | Commit
>         | Newconn
>         | Endconn
> -       | XbOp of Xb.Op.operation
> +       | XbOp of Xenbus.Xb.Op.operation
> 
>  type access =
>         {
> @@ -82,35 +82,35 @@
>         | Endconn                 -> "endconn  "
> 
>         | XbOp op -> match op with
> -       | Xb.Op.Debug             -> "debug    "
> +       | Xenbus.Xb.Op.Debug             -> "debug    "
> 
> -       | Xb.Op.Directory         -> "directory"
> -       | Xb.Op.Read              -> "read     "
> -       | Xb.Op.Getperms          -> "getperms "
> +       | Xenbus.Xb.Op.Directory         -> "directory"
> +       | Xenbus.Xb.Op.Read              -> "read     "
> +       | Xenbus.Xb.Op.Getperms          -> "getperms "
> 
> -       | Xb.Op.Watch             -> "watch    "
> -       | Xb.Op.Unwatch           -> "unwatch  "
> +       | Xenbus.Xb.Op.Watch             -> "watch    "
> +       | Xenbus.Xb.Op.Unwatch           -> "unwatch  "
> 
> -       | Xb.Op.Transaction_start -> "t start  "
> -       | Xb.Op.Transaction_end   -> "t end    "
> +       | Xenbus.Xb.Op.Transaction_start -> "t start  "
> +       | Xenbus.Xb.Op.Transaction_end   -> "t end    "
> 
> -       | Xb.Op.Introduce         -> "introduce"
> -       | Xb.Op.Release           -> "release  "
> -       | Xb.Op.Getdomainpath     -> "getdomain"
> -       | Xb.Op.Isintroduced      -> "is introduced"
> -       | Xb.Op.Resume            -> "resume   "
> +       | Xenbus.Xb.Op.Introduce         -> "introduce"
> +       | Xenbus.Xb.Op.Release           -> "release  "
> +       | Xenbus.Xb.Op.Getdomainpath     -> "getdomain"
> +       | Xenbus.Xb.Op.Isintroduced      -> "is introduced"
> +       | Xenbus.Xb.Op.Resume            -> "resume   "
> 
> -       | Xb.Op.Write             -> "write    "
> -       | Xb.Op.Mkdir             -> "mkdir    "
> -       | Xb.Op.Rm                -> "rm       "
> -       | Xb.Op.Setperms          -> "setperms "
> -       | Xb.Op.Restrict          -> "restrict "
> -       | Xb.Op.Set_target        -> "settarget"
> +       | Xenbus.Xb.Op.Write             -> "write    "
> +       | Xenbus.Xb.Op.Mkdir             -> "mkdir    "
> +       | Xenbus.Xb.Op.Rm                -> "rm       "
> +       | Xenbus.Xb.Op.Setperms          -> "setperms "
> +       | Xenbus.Xb.Op.Restrict          -> "restrict "
> +       | Xenbus.Xb.Op.Set_target        -> "settarget"
> 
> -       | Xb.Op.Error             -> "error    "
> -       | Xb.Op.Watchevent        -> "w event  "
> +       | Xenbus.Xb.Op.Error             -> "error    "
> +       | Xenbus.Xb.Op.Watchevent        -> "w event  "
> 
> -       | x                       -> Xb.Op.to_string x
> +       | x                       -> Xenbus.Xb.Op.to_string x
> 
>  let file_exists file =
>         try
> @@ -210,10 +210,10 @@
>  let xb_op ~tid ~con ~ty data =
>         let print =
>         match ty with
> -               | Xb.Op.Read | Xb.Op.Directory | Xb.Op.Getperms -> 
> !log_read_ops
> -               | Xb.Op.Transaction_start | Xb.Op.Transaction_end ->
> +               | Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | 
> Xenbus.Xb.Op.Getperms -> !log_read_ops
> +               | Xenbus.Xb.Op.Transaction_start | 
> Xenbus.Xb.Op.Transaction_end ->
>                         false (* transactions are managed below *)
> -               | Xb.Op.Introduce | Xb.Op.Release | Xb.Op.Getdomainpath | 
> Xb.Op.Isintroduced | Xb.Op.Resume ->
> +               | Xenbus.Xb.Op.Introduce | Xenbus.Xb.Op.Release | 
> Xenbus.Xb.Op.Getdomainpath | Xenbus.Xb.Op.Isintroduced | Xenbus.Xb.Op.Resume 
> ->
>                         !log_special_ops
>                 | _ -> true
>         in
> @@ -222,17 +222,17 @@
> 
>  let start_transaction ~tid ~con =
>         if !log_transaction_ops && tid <> 0
> -       then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_start)
> +       then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
> 
>  let end_transaction ~tid ~con =
>         if !log_transaction_ops && tid <> 0
> -       then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_end)
> +       then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
> 
>  let xb_answer ~tid ~con ~ty data =
>         let print = match ty with
> -               | Xb.Op.Error when data="ENOENT " -> !log_read_ops
> -               | Xb.Op.Error -> !log_special_ops
> -               | Xb.Op.Watchevent -> true
> +               | Xenbus.Xb.Op.Error when data="ENOENT " -> !log_read_ops
> +               | Xenbus.Xb.Op.Error -> !log_special_ops
> +               | Xenbus.Xb.Op.Watchevent -> true
>                 | _ -> false
>         in
>                 if print
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/perms.ml
> --- a/tools/ocaml/xenstored/perms.ml
> +++ b/tools/ocaml/xenstored/perms.ml
> @@ -43,9 +43,9 @@
> 
>  type t =
>  {
> -       owner: Xc.domid;
> +       owner: Xenctrl.domid;
>         other: permty;
> -       acl: (Xc.domid * permty) list;
> +       acl: (Xenctrl.domid * permty) list;
>  }
> 
>  let create owner other acl =
> @@ -88,7 +88,7 @@
>  module Connection =
>  struct
> 
> -type elt = Xc.domid * (permty list)
> +type elt = Xenctrl.domid * (permty list)
>  type t =
>         { main: elt;
>           target: elt option; }
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/process.ml
> --- a/tools/ocaml/xenstored/process.ml
> +++ b/tools/ocaml/xenstored/process.ml
> @@ -54,10 +54,10 @@
>  let process_watch ops cons =
>         let do_op_watch op cons =
>                 let recurse = match (fst op) with
> -               | Xb.Op.Write    -> false
> -               | Xb.Op.Mkdir    -> false
> -               | Xb.Op.Rm       -> true
> -               | Xb.Op.Setperms -> false
> +               | Xenbus.Xb.Op.Write    -> false
> +               | Xenbus.Xb.Op.Mkdir    -> false
> +               | Xenbus.Xb.Op.Rm       -> true
> +               | Xenbus.Xb.Op.Setperms -> false
>                 | _              -> raise (Failure "huh ?") in
>                 Connections.fire_watches cons (snd op) recurse in
>         List.iter (fun op -> do_op_watch op cons) ops
> @@ -83,7 +83,7 @@
>         then None
>         else try match split None '\000' data with
>         | "print" :: msg :: _ ->
> -               Logging.xb_op ~tid:0 ~ty:Xb.Op.Debug ~con:"=======>" msg;
> +               Logging.xb_op ~tid:0 ~ty:Xenbus.Xb.Op.Debug ~con:"=======>" 
> msg;
>                 None
>         | "quota" :: domid :: _ ->
>                 let domid = int_of_string domid in
> @@ -120,7 +120,7 @@
>                 | _                   -> raise Invalid_Cmd_Args
>                 in
>         let watch = Connections.add_watch cons con node token in
> -       Connection.send_ack con (Transaction.get_id t) rid Xb.Op.Watch;
> +       Connection.send_ack con (Transaction.get_id t) rid Xenbus.Xb.Op.Watch;
>         Connection.fire_single_watch watch
> 
>  let do_unwatch con t domains cons data =
> @@ -165,7 +165,7 @@
>                 if Domains.exist domains domid then
>                         Domains.find domains domid
>                 else try
> -                       let ndom = Xc.with_intf (fun xc ->
> +                       let ndom = Xenctrl.with_intf (fun xc ->
>                                 Domains.create xc domains domid mfn port) in
>                         Connections.add_domain cons ndom;
>                         Connections.fire_spec_watches cons "@introduceDomain";
> @@ -299,25 +299,25 @@
> 
>  let function_of_type ty =
>         match ty with
> -       | Xb.Op.Debug             -> reply_data_or_ack do_debug
> -       | Xb.Op.Directory         -> reply_data do_directory
> -       | Xb.Op.Read              -> reply_data do_read
> -       | Xb.Op.Getperms          -> reply_data do_getperms
> -       | Xb.Op.Watch             -> reply_none do_watch
> -       | Xb.Op.Unwatch           -> reply_ack do_unwatch
> -       | Xb.Op.Transaction_start -> reply_data do_transaction_start
> -       | Xb.Op.Transaction_end   -> reply_ack do_transaction_end
> -       | Xb.Op.Introduce         -> reply_ack do_introduce
> -       | Xb.Op.Release           -> reply_ack do_release
> -       | Xb.Op.Getdomainpath     -> reply_data do_getdomainpath
> -       | Xb.Op.Write             -> reply_ack do_write
> -       | Xb.Op.Mkdir             -> reply_ack do_mkdir
> -       | Xb.Op.Rm                -> reply_ack do_rm
> -       | Xb.Op.Setperms          -> reply_ack do_setperms
> -       | Xb.Op.Isintroduced      -> reply_data do_isintroduced
> -       | Xb.Op.Resume            -> reply_ack do_resume
> -       | Xb.Op.Set_target        -> reply_ack do_set_target
> -       | Xb.Op.Restrict          -> reply_ack do_restrict
> +       | Xenbus.Xb.Op.Debug             -> reply_data_or_ack do_debug
> +       | Xenbus.Xb.Op.Directory         -> reply_data do_directory
> +       | Xenbus.Xb.Op.Read              -> reply_data do_read
> +       | Xenbus.Xb.Op.Getperms          -> reply_data do_getperms
> +       | Xenbus.Xb.Op.Watch             -> reply_none do_watch
> +       | Xenbus.Xb.Op.Unwatch           -> reply_ack do_unwatch
> +       | Xenbus.Xb.Op.Transaction_start -> reply_data do_transaction_start
> +       | Xenbus.Xb.Op.Transaction_end   -> reply_ack do_transaction_end
> +       | Xenbus.Xb.Op.Introduce         -> reply_ack do_introduce
> +       | Xenbus.Xb.Op.Release           -> reply_ack do_release
> +       | Xenbus.Xb.Op.Getdomainpath     -> reply_data do_getdomainpath
> +       | Xenbus.Xb.Op.Write             -> reply_ack do_write
> +       | Xenbus.Xb.Op.Mkdir             -> reply_ack do_mkdir
> +       | Xenbus.Xb.Op.Rm                -> reply_ack do_rm
> +       | Xenbus.Xb.Op.Setperms          -> reply_ack do_setperms
> +       | Xenbus.Xb.Op.Isintroduced      -> reply_data do_isintroduced
> +       | Xenbus.Xb.Op.Resume            -> reply_ack do_resume
> +       | Xenbus.Xb.Op.Set_target        -> reply_ack do_set_target
> +       | Xenbus.Xb.Op.Restrict          -> reply_ack do_restrict
>         | _                       -> reply_ack do_error
> 
>  let input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data =
> @@ -370,11 +370,11 @@
>  let do_input store cons doms con =
>         if Connection.do_input con then (
>                 let packet = Connection.pop_in con in
> -               let tid, rid, ty, data = Xb.Packet.unpack packet in
> +               let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
>                 (* As we don't log IO, do not call an unnecessary 
> sanitize_data
>                    Logs.info "io" "[%s] -> [%d] %s \"%s\""
>                          (Connection.get_domstr con) tid
> -                        (Xb.Op.to_string ty) (sanitize_data data); *)
> +                        (Xenbus.Xb.Op.to_string ty) (sanitize_data data); *)
>                 process_packet ~store ~cons ~doms ~con ~tid ~rid ~ty ~data;
>                 write_access_log ~ty ~tid ~con ~data;
>                 Connection.incr_ops con;
> @@ -384,11 +384,11 @@
>         if Connection.has_output con then (
>                 if Connection.has_new_output con then (
>                         let packet = Connection.peek_output con in
> -                       let tid, rid, ty, data = Xb.Packet.unpack packet in
> +                       let tid, rid, ty, data = Xenbus.Xb.Packet.unpack 
> packet in
>                         (* As we don't log IO, do not call an unnecessary 
> sanitize_data
>                            Logs.info "io" "[%s] <- %s \"%s\""
>                                  (Connection.get_domstr con)
> -                                (Xb.Op.to_string ty) (sanitize_data data);*)
> +                                (Xenbus.Xb.Op.to_string ty) (sanitize_data 
> data);*)
>                         write_answer_log ~ty ~tid ~con ~data;
>                 );
>                 ignore (Connection.do_output con)
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/quota.ml
> --- a/tools/ocaml/xenstored/quota.ml
> +++ b/tools/ocaml/xenstored/quota.ml
> @@ -26,7 +26,7 @@
>  type t = {
>         maxent: int;               (* max entities per domU *)
>         maxsize: int;              (* max size of data store in one node *)
> -       cur: (Xc.domid, int) Hashtbl.t; (* current domains quota *)
> +       cur: (Xenctrl.domid, int) Hashtbl.t; (* current domains quota *)
>  }
> 
>  let to_string quota domid =
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/transaction.ml
> --- a/tools/ocaml/xenstored/transaction.ml
> +++ b/tools/ocaml/xenstored/transaction.ml
> @@ -74,7 +74,7 @@
>  type t = {
>         ty: ty;
>         store: Store.t;
> -       mutable ops: (Xb.Op.operation * Store.Path.t) list;
> +       mutable ops: (Xenbus.Xb.Op.operation * Store.Path.t) list;
>         mutable read_lowpath: Store.Path.t option;
>         mutable write_lowpath: Store.Path.t option;
>  }
> @@ -105,23 +105,23 @@
>         if path_exists
>         then set_write_lowpath t path
>         else set_write_lowpath t (Store.Path.get_parent path);
> -       add_wop t Xb.Op.Write path
> +       add_wop t Xenbus.Xb.Op.Write path
> 
>  let mkdir ?(with_watch=true) t perm path =
>         Store.mkdir t.store perm path;
>         set_write_lowpath t path;
>         if with_watch then
> -               add_wop t Xb.Op.Mkdir path
> +               add_wop t Xenbus.Xb.Op.Mkdir path
> 
>  let setperms t perm path perms =
>         Store.setperms t.store perm path perms;
>         set_write_lowpath t path;
> -       add_wop t Xb.Op.Setperms path
> +       add_wop t Xenbus.Xb.Op.Setperms path
> 
>  let rm t perm path =
>         Store.rm t.store perm path;
>         set_write_lowpath t (Store.Path.get_parent path);
> -       add_wop t Xb.Op.Rm path
> +       add_wop t Xenbus.Xb.Op.Rm path
> 
>  let ls t perm path =
>         let r = Store.ls t.store perm path in
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/xenstored.ml
> --- a/tools/ocaml/xenstored/xenstored.ml
> +++ b/tools/ocaml/xenstored/xenstored.ml
> @@ -35,7 +35,7 @@
>                         if err <> Unix.ECONNRESET then
>                         error "closing socket connection: read error: %s"
>                               (Unix.error_message err)
> -               | Xb.End_of_file ->
> +               | Xenbus.Xb.End_of_file ->
>                         Connections.del_anonymous cons c;
>                         debug "closing socket connection"
>                 in
> @@ -170,7 +170,7 @@
>  let from_channel store cons doms chan =
>         (* don't let the permission get on our way, full perm ! *)
>         let op = Store.get_ops store Perms.Connection.full_rights in
> -       let xc = Xc.interface_open () in
> +       let xc = Xenctrl.interface_open () in
> 
>         let domain_f domid mfn port =
>                 let ndom =
> @@ -190,7 +190,7 @@
>                 op.Store.setperms path perms
>                 in
>         finally (fun () -> from_channel_f chan domain_f watch_f store_f)
> -               (fun () -> Xc.interface_close xc)
> +               (fun () -> Xenctrl.interface_close xc)
> 
>  let from_file store cons doms file =
>         let channel = open_in file in
> @@ -282,7 +282,7 @@
>                         Store.mkdir store (Perms.Connection.create 0) 
> localpath;
> 
>                 if cf.domain_init then (
> -                       let usingxiu = Xc.is_fake () in
> +                       let usingxiu = Xenctrl.is_fake () in
>                         Connections.add_domain cons (Domains.create0 usingxiu 
> domains);
>                         Event.bind_dom_exc_virq eventchn
>                 );
> @@ -301,7 +301,7 @@
>                 (if cf.domain_init then [ Event.fd eventchn ] else [])
>                 in
> 
> -       let xc = Xc.interface_open () in
> +       let xc = Xenctrl.interface_open () in
> 
>         let process_special_fds rset =
>                 let accept_connection can_write fd =
> 
> _______________________________________________
> 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.