]> xenbits.xensource.com Git - xcp/xen-api-libs.git/commitdiff
[XENOPS]: add xc bindings for setting hpet, timer_mode, acpi_s_state etc
authorJonathan Ludlam <jonathan.ludlam@eu.citrix.com>
Thu, 8 Oct 2009 17:17:00 +0000 (18:17 +0100)
committerJonathan Ludlam <jonathan.ludlam@eu.citrix.com>
Thu, 8 Oct 2009 17:17:00 +0000 (18:17 +0100)
Signed-off-by: Jonathan Ludlam <jonathan.ludlam@eu.citrix.com>
Acked-by: David Scott <dave.scott@eu.citrix.com>
xc/xc.h
xc/xc.ml
xc/xc.mli
xc/xc_lib.c
xc/xc_stubs.c

diff --git a/xc/xc.h b/xc/xc.h
index bc355bd98dcc65564da9eed83c50b09067c30de9..19c4557f7801646524f58b3aa8489d5051a1d984 100644 (file)
--- a/xc/xc.h
+++ b/xc/xc.h
@@ -177,10 +177,14 @@ int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm,
 int xc_domain_cpuid_apply(int xc, unsigned int domid, int hvm);
 int xc_cpuid_check(uint32_t input, uint32_t optsubinput,
                    char *config[4], char *config_out[4]);
-int xc_domain_send_s3resume(int handle, unsigned int domid);
-
 int xc_domain_suppress_spurious_page_faults(int xc, uint32_t domid);
 
+int xc_domain_send_s3resume(int handle, unsigned int domid);
+int xc_domain_set_vpt_align(int handle, unsigned int domid, int vpt_align);
+int xc_domain_set_hpet(int handle, unsigned int domid, int hpet);
+int xc_domain_set_timer_mode(int handle, unsigned int domid, int mode);
+int xc_domain_get_acpi_s_state(int handle, unsigned int domid);
+
 #if XEN_SYSCTL_INTERFACE_VERSION >= 6
 #define SAFEDIV(a, b)                                  (((b) >= 0) ? (a) / (b) : (a))
 #define COMPAT_FIELD_physinfo_get_nr_cpus(p)           (p).nr_cpus
index 8660e9d9fe34503d1677e54b005ee36ba654eaeb..71310f23836cfdf432c9f8c736691f7bc85e3fc1 100644 (file)
--- a/xc/xc.ml
+++ b/xc/xc.ml
@@ -64,6 +64,10 @@ type sched_control =
        cap    : int;
 }
 
+type physinfo_cap_flag =
+       | CAP_HVM
+       | CAP_DirectIO
+
 type physinfo =
 {
        nr_cpus          : int;
@@ -76,6 +80,7 @@ type physinfo =
        free_pages       : nativeint;
        scrub_pages      : nativeint;
        (* XXX hw_cap *)
+       capabilities     : physinfo_cap_flag list;
 }
 
 type version =
@@ -241,9 +246,12 @@ external domain_test_assign_device: handle -> domid -> (int * int * int * int) -
 external domain_suppress_spurious_page_faults: handle -> domid -> unit
        = "stub_xc_domain_suppress_spurious_page_faults"
 
-external domain_get_acpi_s_state: handle -> domid -> int = "stub_xc_domain_get_acpi_s_state"
+external domain_set_timer_mode: handle -> domid -> int -> unit = "stub_xc_domain_set_timer_mode"
+external domain_set_hpet: handle -> domid -> int -> unit = "stub_xc_domain_set_hpet"
+external domain_set_vpt_align: handle -> domid -> int -> unit = "stub_xc_domain_set_vpt_align"
 
 external domain_send_s3resume: handle -> domid -> unit = "stub_xc_domain_send_s3resume"
+external domain_get_acpi_s_state: handle -> domid -> int = "stub_xc_domain_get_acpi_s_state"
 
 (** check if some hvm domain got pv driver or not *)
 external hvm_check_pvdriver: handle -> domid -> bool
index cd0209e3fab2fb2edf717ee582dc30d9f5bc201f..360b4b096f891621b8115a4e6034a7e57a2156d5 100644 (file)
--- a/xc/xc.mli
+++ b/xc/xc.mli
@@ -49,6 +49,7 @@ type domaininfo = {
   handle : int array;
 }
 type sched_control = { weight : int; cap : int; }
+type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
 type physinfo = {
   nr_cpus : int;
   threads_per_core : int;
@@ -59,6 +60,7 @@ type physinfo = {
   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 = {
@@ -156,9 +158,13 @@ external domain_deassign_device: handle -> domid -> (int * int * int * int) -> u
 external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
        = "stub_xc_domain_test_assign_device"
 
-external domain_get_acpi_s_state: handle -> domid -> int = "stub_xc_domain_get_acpi_s_state"
+external domain_set_timer_mode: handle -> domid -> int -> unit = "stub_xc_domain_set_timer_mode"
+external domain_set_hpet: handle -> domid -> int -> unit = "stub_xc_domain_set_hpet"
+external domain_set_vpt_align: handle -> domid -> int -> unit = "stub_xc_domain_set_vpt_align"
+
 external domain_send_s3resume: handle -> domid -> unit
   = "stub_xc_domain_send_s3resume"
+external domain_get_acpi_s_state: handle -> domid -> int = "stub_xc_domain_get_acpi_s_state"
 
 external hvm_check_pvdriver : handle -> domid -> bool
   = "stub_xc_hvm_check_pvdriver"
index c69b58df3e6a603ef7e99935fddb7220b6af2ab3..aa13247ccff02772770e51a8036f782b40aa748c 100644 (file)
@@ -305,7 +305,7 @@ static int xc_set_hvm_param(int handle, unsigned int domid,
        };
        DECLARE_HYPERCALL2(__HYPERVISOR_hvm_op, HVMOP_set_param, (unsigned long) &arg);
        int ret;
-       
+
        if (mlock(&arg, sizeof(arg)) == -1) {
                xc_error_set("mlock failed: %s", strerror(errno));
                return -1;
@@ -1491,12 +1491,40 @@ out:
        return ret;
 }
 
+#ifndef HVM_PARAM_HPET_ENABLED
+#define HVM_PARAM_HPET_ENABLED 11
+#endif
+
+#ifndef HVM_PARAM_ACPI_S_STATE
+#define HVM_PARAM_ACPI_S_STATE 14
+#endif
+
+#ifndef HVM_PARAM_VPT_ALIGN
+#define HVM_PARAM_VPT_ALIGN 16
+#endif
+
 int xc_domain_send_s3resume(int handle, unsigned int domid)
 {
        #define HVM_PARAM_ACPI_S_STATE 14
        return xc_set_hvm_param(handle, domid, HVM_PARAM_ACPI_S_STATE, 0);
 }
 
+int xc_domain_set_timer_mode(int handle, unsigned int domid, int mode)
+{
+       return xc_set_hvm_param(handle, domid,
+                               HVM_PARAM_TIMER_MODE, (unsigned long) mode);
+}
+
+int xc_domain_set_hpet(int handle, unsigned int domid, int hpet)
+{
+       return xc_set_hvm_param(handle, domid, HVM_PARAM_HPET_ENABLED, (unsigned long) hpet);
+}
+
+int xc_domain_set_vpt_align(int handle, unsigned int domid, int vpt_align)
+{
+       return xc_set_hvm_param(handle, domid, HVM_PARAM_HPET_ENABLED, (unsigned long) vpt_align);
+}
+
 int xc_domain_get_acpi_s_state(int handle, unsigned int domid)
 {
        int ret;
index f5d79919228b162edcc8325f1073442f3b9e814a..531dd5a5e4789a072b3a8afba7df50c42d2195ab 100644 (file)
@@ -546,7 +546,7 @@ CAMLprim value stub_xc_send_debug_keys(value xc_handle, value keys)
 CAMLprim value stub_xc_physinfo(value xc_handle)
 {
        CAMLparam1(xc_handle);
-       CAMLlocal1(physinfo);
+       CAMLlocal3(physinfo, cap_list, tmp);
        xc_physinfo_t c_physinfo;
        int r;
 
@@ -557,7 +557,17 @@ CAMLprim value stub_xc_physinfo(value xc_handle)
        if (r)
                failwith_xc();
 
-       physinfo = caml_alloc_tuple(9);
+       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(10);
        Store_field(physinfo, 0, Val_int(COMPAT_FIELD_physinfo_get_nr_cpus(c_physinfo)));
        Store_field(physinfo, 1, Val_int(c_physinfo.threads_per_core));
        Store_field(physinfo, 2, Val_int(c_physinfo.cores_per_socket));
@@ -567,6 +577,7 @@ CAMLprim value stub_xc_physinfo(value xc_handle)
        Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.total_pages));
        Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.free_pages));
        Store_field(physinfo, 8, caml_copy_nativeint(c_physinfo.scrub_pages));
+       Store_field(physinfo, 9, cap_list);
 
        CAMLreturn(physinfo);
 }
@@ -1132,13 +1143,13 @@ CAMLprim value stub_xc_domain_deassign_device(value xc_handle, value domid, valu
        CAMLreturn(Val_unit);
 }
 
-CAMLprim value stub_xc_watchdog(value handle, value id, value timeout)
+CAMLprim value stub_xc_watchdog(value handle, value domid, value timeout)
 {
-       CAMLparam3(handle, id, timeout);
+       CAMLparam3(handle, domid, timeout);
        int ret;
        unsigned int c_timeout = Int32_val(timeout);
 
-       ret = xc_domain_watchdog(_H(handle), Int_val(id), c_timeout);
+       ret = xc_domain_watchdog(_H(handle), _D(domid), c_timeout);
        if (ret < 0)
                failwith_xc();
 
@@ -1164,6 +1175,40 @@ CAMLprim value stub_xc_domain_send_s3resume(value handle, value domid)
        CAMLreturn(Val_unit);
 }
 
+
+CAMLprim value stub_xc_domain_set_timer_mode(value handle, value id, value mode)
+{
+       CAMLparam3(handle, id, mode);
+       int ret;
+
+       ret = xc_domain_set_timer_mode(_H(handle), _D(id), Int_val(mode));
+       if (ret < 0)
+               failwith_xc();
+       CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_set_hpet(value handle, value id, value mode)
+{
+       CAMLparam3(handle, id, mode);
+       int ret;
+
+       ret = xc_domain_set_hpet(_H(handle), _D(id), Int_val(mode));
+       if (ret < 0)
+               failwith_xc();
+       CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_set_vpt_align(value handle, value id, value mode)
+{
+       CAMLparam3(handle, id, mode);
+       int ret;
+
+       ret = xc_domain_set_vpt_align(_H(handle), _D(id), Int_val(mode));
+       if (ret < 0)
+               failwith_xc();
+       CAMLreturn(Val_unit);
+}
+
 /*
  * Local variables:
  *  indent-tabs-mode: t