tools/ocaml: Add OCaml binding of virq bind
authorYang Qian <krizex@gmail.com>
Thu, 27 Sep 2018 07:53:04 +0000 (15:53 +0800)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 27 Sep 2018 10:19:48 +0000 (11:19 +0100)
1. Add a common bind virq function
2. Reduce the stub code of `bind_dom_exc_virq`

Signed-off-by: Yang Qian <yang.qian@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Christian Lindig <christian.lindig@citrix.com>
tools/ocaml/libs/eventchn/xeneventchn.ml
tools/ocaml/libs/eventchn/xeneventchn.mli
tools/ocaml/libs/eventchn/xeneventchn_stubs.c

index 89edb9295d122f3be184a89abafe616f20ac439e..dd00a1f0ead558209568df4d1205782359e41276 100644 (file)
@@ -21,9 +21,26 @@ external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
 
 type t = int
 
+type virq_t =
+  | Timer        (* #define VIRQ_TIMER      0 *)
+  | Debug        (* #define VIRQ_DEBUG      1 *)
+  | Console      (* #define VIRQ_CONSOLE    2 *)
+  | Dom_exc      (* #define VIRQ_DOM_EXC    3 *)
+  | Tbuf         (* #define VIRQ_TBUF       4 *)
+  | Reserved_5   (* Do not use this value as it's not defined *)
+  | Debugger     (* #define VIRQ_DEBUGGER   6 *)
+  | Xenoprof     (* #define VIRQ_XENOPROF   7 *)
+  | Con_ring     (* #define VIRQ_CON_RING   8 *)
+  | Pcpu_state   (* #define VIRQ_PCPU_STATE 9 *)
+  | Mem_event    (* #define VIRQ_MEM_EVENT  10 *)
+  | Xc_reserved  (* #define VIRQ_XC_RESERVED 11 *)
+  | Enomem       (* #define VIRQ_ENOMEM     12 *)
+  | Xenpmu       (* #define VIRQ_XENPMU     13 *)
+
 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 bind_virq: handle -> virq_t -> int = "stub_eventchn_bind_virq"
+let bind_dom_exc_virq handle = bind_virq handle Dom_exc
 external unbind: handle -> int -> unit = "stub_eventchn_unbind"
 external pending: handle -> int = "stub_eventchn_pending"
 external unmask: handle -> int -> unit = "stub_eventchn_unmask"
index e18014595bbe09712efabd0dedd22e115e41a9f4..08c73376438e37d3a993a460b8349fa2e8def4e6 100644 (file)
@@ -22,6 +22,23 @@ type handle
 type t
 (** A local event channel. *)
 
+type virq_t =
+  | Timer        (* #define VIRQ_TIMER      0 *)
+  | Debug        (* #define VIRQ_DEBUG      1 *)
+  | Console      (* #define VIRQ_CONSOLE    2 *)
+  | Dom_exc      (* #define VIRQ_DOM_EXC    3 *)
+  | Tbuf         (* #define VIRQ_TBUF       4 *)
+  | Reserved_5   (* Do not use this value as it's not defined *)
+  | Debugger     (* #define VIRQ_DEBUGGER   6 *)
+  | Xenoprof     (* #define VIRQ_XENOPROF   7 *)
+  | Con_ring     (* #define VIRQ_CON_RING   8 *)
+  | Pcpu_state   (* #define VIRQ_PCPU_STATE 9 *)
+  | Mem_event    (* #define VIRQ_MEM_EVENT  10 *)
+  | Xc_reserved  (* #define VIRQ_XC_RESERVED 11 *)
+  | Enomem       (* #define VIRQ_ENOMEM     12 *)
+  | Xenpmu       (* #define VIRQ_XENPMU     13 *)
+
+
 val to_int: t -> int
 
 val of_int: int -> t
@@ -49,6 +66,10 @@ val bind_dom_exc_virq : handle -> t
     (domain exception VIRQ). On error it will throw a Failure
     exception. *)
 
+val bind_virq: handle -> virq_t -> t
+(** Binds a local event channel to the specific VIRQ type.
+    On error it will throw a Failure exception. *)
+
 val unbind : handle -> t -> unit
 (** Unbinds the given event channel. On error it will throw a
     Failure exception. *)
index 45a385dedf2f7cc96f7e79841e271040c74c9329..2b7984fb0dcc1f3183bb13a6eaaa7bb8eb41ef39 100644 (file)
@@ -90,15 +90,15 @@ CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
        CAMLreturn(port);
 }
 
-CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
+CAMLprim value stub_eventchn_bind_virq(value xce, value virq_type)
 {
-       CAMLparam1(xce);
+       CAMLparam2(xce, virq_type);
        CAMLlocal1(port);
        xenevtchn_port_or_error_t rc;
 
-       rc = xenevtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
+       rc = xenevtchn_bind_virq(_H(xce), Int_val(virq_type));
        if (rc == -1)
-               caml_failwith("evtchn bind_dom_exc_virq failed");
+               caml_failwith("evtchn bind_virq failed");
        port = Val_int(rc);
 
        CAMLreturn(port);