From 7b7736cd62dae3b94e9d8020dd6924556fda6820 Mon Sep 17 00:00:00 2001 From: Jonathan Ludlam Date: Thu, 8 Oct 2009 18:17:00 +0100 Subject: [PATCH] [XENOPS]: add xc bindings for setting hpet, timer_mode, acpi_s_state etc Signed-off-by: Jonathan Ludlam Acked-by: David Scott --- xc/xc.h | 8 ++++++-- xc/xc.ml | 10 +++++++++- xc/xc.mli | 8 +++++++- xc/xc_lib.c | 30 +++++++++++++++++++++++++++- xc/xc_stubs.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 101 insertions(+), 10 deletions(-) diff --git a/xc/xc.h b/xc/xc.h index bc355bd..19c4557 100644 --- 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 diff --git a/xc/xc.ml b/xc/xc.ml index 8660e9d..71310f2 100644 --- 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 diff --git a/xc/xc.mli b/xc/xc.mli index cd0209e..360b4b0 100644 --- 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" diff --git a/xc/xc_lib.c b/xc/xc_lib.c index c69b58d..aa13247 100644 --- a/xc/xc_lib.c +++ b/xc/xc_lib.c @@ -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; diff --git a/xc/xc_stubs.c b/xc/xc_stubs.c index f5d7991..531dd5a 100644 --- a/xc/xc_stubs.c +++ b/xc/xc_stubs.c @@ -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 -- 2.39.5