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
|