Ian Campbell
2010-Sep-10 10:10 UTC
[Xen-devel] [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1284113402 -3600 # Node ID c2610f86abfb2c34a5a653dea29d5518fb355628 # Parent 8a710e0eb0881cad6156500bd4cedcebc7824a18 ocaml: xc bindings: use libxenctrl and libxenguest Now that tools/libxc is licensed under LGPL I don''t think there is any need for an LGPL reimplementation under tools/ocaml. For the most part the conversion to the up-to-date libxc API (xc_lib.c essentially implemented the same interface as an older libxc) was pretty automatic. There are some functions which appear to no longer exist in libxc which I therefore simply removed the bindings for and a small number of interfaces which had changed. Many of the functions bound by the stubs have no in-tree users (which I think is fine for a language binding) so I have no way to confirm correctness other than by eye. I was however able to confirm that oxenstored still worked. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Cc: Vincent Hanquez <Vincent.Hanquez@eu.citrix.com> diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/Makefile.rules --- a/tools/ocaml/Makefile.rules Fri Sep 10 11:10:00 2010 +0100 +++ b/tools/ocaml/Makefile.rules Fri Sep 10 11:10:02 2010 +0100 @@ -54,18 +54,18 @@ mk-caml-lib-bytecode = $(call quiet-comm mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1) mk-caml-lib-stubs = \ - $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e ''s/^lib//''` $2,MKLIB,$1) + $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e ''s/^lib//''` $3 $2,MKLIB,$1) # define a library target <name>.cmxa and <name>.cma define OCAML_LIBRARY_template $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx) - $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs, $(foreach obj,$($(1)_OBJS),$(obj).cmx)) + $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx)) $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) $(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+) $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o) $(call mk-caml-stubs,$$@, $$+) lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o) - $(call mk-caml-lib-stubs,$$@, $$+) + $(call mk-caml-lib-stubs,$$@, $$+, $(LIBS_$(1))) endef define OCAML_NOC_LIBRARY_template diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/Makefile --- a/tools/ocaml/libs/xc/Makefile Fri Sep 10 11:10:00 2010 +0100 +++ b/tools/ocaml/libs/xc/Makefile Fri Sep 10 11:10:02 2010 +0100 @@ -2,15 +2,17 @@ XEN_ROOT=$(TOPLEVEL)/../.. XEN_ROOT=$(TOPLEVEL)/../.. include $(TOPLEVEL)/common.make -CFLAGS += -I../mmap -I./ -OCAMLINCLUDE += -I ../mmap -I ../uuid +CFLAGS += -I../mmap -I./ -I$(XEN_ROOT)/tools/libxc +OCAMLINCLUDE += -I ../mmap -I ../uuid -I $(XEN_ROOT)/tools/libxc OBJS = xc INTF = xc.cmi LIBS = xc.cma xc.cmxa +LIBS_xc = -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest + xc_OBJS = $(OBJS) -xc_C_OBJS = xc_lib xc_stubs +xc_C_OBJS = xc_stubs OCAML_LIBRARY = xc diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.h --- a/tools/ocaml/libs/xc/xc.h Fri Sep 10 11:10:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2006-2007 XenSource Ltd. - * Copyright (C) 2008 Citrix Ltd. - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com> - * - * 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 <xen/xen.h> -#include <xen/memory.h> -#include <xen/sysctl.h> -#include <xen/domctl.h> -#include <xen/sched.h> -#include <xen/sysctl.h> -#include <xen/sys/privcmd.h> -#include <xen/version.h> -#include <xen/foreign/x86_32.h> -#include <xen/foreign/x86_64.h> -#include <xen/hvm/params.h> -#include "xc_e820.h" - -typedef xen_domctl_getdomaininfo_t xc_domaininfo_t; -typedef xen_domctl_getvcpuinfo_t xc_vcpuinfo_t; -typedef xen_sysctl_physinfo_t xc_physinfo_t; - -struct xc_core_header { - unsigned int xch_magic; - unsigned int xch_nr_vcpus; - unsigned int xch_nr_pages; - unsigned int xch_ctxt_offset; - unsigned int xch_index_offset; - unsigned int xch_pages_offset; -}; - -typedef union { -#if defined(__i386__) || defined(__x86_64__) - vcpu_guest_context_x86_64_t x64; - vcpu_guest_context_x86_32_t x32; -#endif - vcpu_guest_context_t c; -} vcpu_guest_context_any_t; - -char * xc_error_get(void); -void xc_error_clear(void); - -int xc_using_injection(void); - -int xc_interface_open(void); -int xc_interface_close(int handle); - -int xc_domain_create(int handle, unsigned int ssidref, - xen_domain_handle_t dhandle, - unsigned int flags, unsigned int *pdomid); -int xc_domain_pause(int handle, unsigned int domid); -int xc_domain_unpause(int handle, unsigned int domid); -int xc_domain_resume_fast(int handle, unsigned int domid); -int xc_domain_destroy(int handle, unsigned int domid); -int xc_domain_shutdown(int handle, int domid, int reason); - -int xc_vcpu_setaffinity(int handle, unsigned int domid, int vcpu, - uint64_t cpumap); -int xc_vcpu_getaffinity(int handle, unsigned int domid, int vcpu, - uint64_t *cpumap); - -int xc_domain_getinfolist(int handle, unsigned int first_domain, - unsigned int max_domains, xc_domaininfo_t *info); -int xc_domain_getinfo(int handle, unsigned int first_domain, - xc_domaininfo_t *info); - -int xc_domain_setmaxmem(int handle, unsigned int domid, unsigned int max_memkb); -int xc_domain_set_memmap_limit(int handle, unsigned int domid, - unsigned long map_limitkb); - -int xc_domain_set_time_offset(int handle, unsigned int domid, int time_offset); - -int xc_domain_memory_increase_reservation(int handle, unsigned int domid, - unsigned long nr_extents, - unsigned int extent_order, - unsigned int address_bits, - xen_pfn_t *extent_start); -int xc_domain_memory_decrease_reservation(int handle, unsigned int domid, - unsigned long nr_extents, - unsigned int extent_order, - unsigned int address_bits, - xen_pfn_t *extent_start); -int xc_domain_memory_populate_physmap(int handle, unsigned int domid, - unsigned long nr_extents, - unsigned int extent_order, - unsigned int address_bits, - xen_pfn_t *extent_start); -int xc_domain_setvmxassist(int handle, unsigned int domid, int use_vmxassist); -int xc_domain_max_vcpus(int handle, unsigned int domid, unsigned int max); -int xc_domain_sethandle(int handle, unsigned int domid, - xen_domain_handle_t dhandle); -int xc_vcpu_getinfo(int handle, unsigned int domid, unsigned int vcpu, - xc_vcpuinfo_t *info); -int xc_domain_ioport_permission(int handle, unsigned int domid, - unsigned int first_port, unsigned int nr_ports, - unsigned int allow_access); -int xc_vcpu_setcontext(int handle, unsigned int domid, - unsigned int vcpu, vcpu_guest_context_any_t *ctxt); -int xc_vcpu_getcontext(int handle, unsigned int domid, - unsigned int vcpu, vcpu_guest_context_any_t *ctxt); -int xc_domain_irq_permission(int handle, unsigned int domid, - unsigned char pirq, unsigned char allow_access); -int xc_domain_iomem_permission(int handle, unsigned int domid, - unsigned long first_mfn, unsigned long nr_mfns, - unsigned char allow_access); -long long xc_domain_get_cpu_usage(int handle, unsigned int domid, - unsigned int vcpu); -void *xc_map_foreign_range(int handle, unsigned int domid, - int size, int prot, unsigned long mfn); -int xc_map_foreign_ranges(int handle, unsigned int domid, - privcmd_mmap_entry_t *entries, int nr); -int xc_readconsolering(int handle, char **pbuffer, - unsigned int *pnr_chars, int clear); -int xc_send_debug_keys(int handle, char *keys); -int xc_physinfo(int handle, xc_physinfo_t *put_info); -int xc_pcpu_info( - int handle, int max_cpus, xen_sysctl_cpuinfo_t *info, int *nr_cpus); -int xc_sched_id(int handle, int *sched_id); -int xc_version(int handle, int cmd, void *arg); -int xc_evtchn_alloc_unbound(int handle, unsigned int domid, - unsigned int remote_domid); -int xc_evtchn_reset(int handle, unsigned int domid); - -int xc_sched_credit_domain_set(int handle, unsigned int domid, - struct xen_domctl_sched_credit *sdom); -int xc_sched_credit_domain_get(int handle, unsigned int domid, - struct xen_domctl_sched_credit *sdom); -int xc_shadow_allocation_get(int handle, unsigned int domid, - uint32_t *mb); -int xc_shadow_allocation_set(int handle, unsigned int domid, - uint32_t mb); -int xc_domain_get_pfn_list(int handle, unsigned int domid, - uint64_t *pfn_array, unsigned long max_pfns); -int xc_hvm_check_pvdriver(int handle, unsigned int domid); - -int xc_domain_assign_device(int handle, unsigned int domid, - int domain, int bus, int slot, int func); -int xc_domain_deassign_device(int handle, unsigned int domid, - int domain, int bus, int slot, int func); -int xc_domain_test_assign_device(int handle, unsigned int domid, - int domain, int bus, int slot, int func); -int xc_domain_watchdog(int handle, int id, uint32_t timeout); -int xc_domain_set_machine_address_size(int xc, uint32_t domid, unsigned int width); -int xc_domain_get_machine_address_size(int xc, uint32_t domid); - -int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm, - uint32_t input, uint32_t oinput, - char *config[4], char *config_out[4]); -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_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 -#define COMPAT_FIELD_physinfo_get_sockets_per_node(p) \ - SAFEDIV((p).nr_cpus, ((p).threads_per_core * (p).cores_per_socket * (p).nr_nodes)) -#else -#define COMPAT_FIELD_physinfo_get_nr_cpus(p) \ - ((p).threads_per_core * (p).sockets_per_node * \ - (p).cores_per_socket * (p).threads_per_core) -#define COMPAT_FIELD_physinfo_get_sockets_per_node(p) (p).sockets_per_node -#endif - -#if __XEN_LATEST_INTERFACE_VERSION__ >= 0x00030209 -#define COMPAT_FIELD_ADDRESS_BITS mem_flags -#else -#define COMPAT_FIELD_ADDRESS_BITS address_bits -#endif diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.ml --- a/tools/ocaml/libs/xc/xc.ml Fri Sep 10 11:10:00 2010 +0100 +++ b/tools/ocaml/libs/xc/xc.ml Fri Sep 10 11:10:02 2010 +0100 @@ -127,9 +127,6 @@ let domain_sethandle handle n uuid let domain_sethandle handle n uuid _domain_sethandle handle n (Uuid.int_array_of_uuid uuid) -external domain_setvmxassist: handle -> domid -> bool -> unit - = "stub_xc_domain_setvmxassist" - external domain_max_vcpus: handle -> domid -> int -> unit = "stub_xc_domain_max_vcpus" @@ -207,13 +204,13 @@ external domain_get_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 -> bool -> (int64 * (int64 option)) +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option)) -> string option array -> string option array = "stub_xc_domain_cpuid_set" -external domain_cpuid_apply: handle -> domid -> bool -> unit - = "stub_xc_domain_cpuid_apply" -external cpuid_check: (int64 * (int64 option)) -> string option array -> (bool * string option array) +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 @@ -229,17 +226,6 @@ external domain_deassign_device: handle = "stub_xc_domain_deassign_device" external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool = "stub_xc_domain_test_assign_device" - -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 - = "stub_xc_hvm_check_pvdriver" external version: handle -> version = "stub_xc_version_version" external version_compile_info: handle -> compile_info diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.mli --- a/tools/ocaml/libs/xc/xc.mli Fri Sep 10 11:10:00 2010 +0100 +++ b/tools/ocaml/libs/xc/xc.mli Fri Sep 10 11:10:02 2010 +0100 @@ -80,8 +80,6 @@ external _domain_sethandle : handle -> d external _domain_sethandle : handle -> domid -> int array -> unit = "stub_xc_domain_sethandle" val domain_sethandle : handle -> domid -> ''a Uuid.t -> unit -external domain_setvmxassist: handle -> domid -> bool -> unit - = "stub_xc_domain_setvmxassist" external domain_max_vcpus : handle -> domid -> int -> unit = "stub_xc_domain_max_vcpus" external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause" @@ -147,16 +145,6 @@ external domain_test_assign_device: hand external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool = "stub_xc_domain_test_assign_device" -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" external version : handle -> version = "stub_xc_version_version" external version_compile_info : handle -> compile_info = "stub_xc_version_compile_info" @@ -185,12 +173,12 @@ external domain_get_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 -> bool -> (int64 * (int64 option)) +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option)) -> string option array -> string option array = "stub_xc_domain_cpuid_set" -external domain_cpuid_apply: handle -> domid -> bool -> unit - = "stub_xc_domain_cpuid_apply" -external cpuid_check: (int64 * (int64 option)) -> string option array -> (bool * string option array) +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 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_cpufeature.h --- a/tools/ocaml/libs/xc/xc_cpufeature.h Fri Sep 10 11:10:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -#ifndef __LIBXC_CPUFEATURE_H -#define __LIBXC_CPUFEATURE_H - -/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */ -#define X86_FEATURE_FPU (0*32+ 0) /* Onboard FPU */ -#define X86_FEATURE_VME (0*32+ 1) /* Virtual Mode Extensions */ -#define X86_FEATURE_DE (0*32+ 2) /* Debugging Extensions */ -#define X86_FEATURE_PSE (0*32+ 3) /* Page Size Extensions */ -#define X86_FEATURE_TSC (0*32+ 4) /* Time Stamp Counter */ -#define X86_FEATURE_MSR (0*32+ 5) /* Model-Specific Registers, RDMSR, WRMSR */ -#define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */ -#define X86_FEATURE_MCE (0*32+ 7) /* Machine Check Architecture */ -#define X86_FEATURE_CX8 (0*32+ 8) /* CMPXCHG8 instruction */ -#define X86_FEATURE_APIC (0*32+ 9) /* Onboard APIC */ -#define X86_FEATURE_SEP (0*32+11) /* SYSENTER/SYSEXIT */ -#define X86_FEATURE_MTRR (0*32+12) /* Memory Type Range Registers */ -#define X86_FEATURE_PGE (0*32+13) /* Page Global Enable */ -#define X86_FEATURE_MCA (0*32+14) /* Machine Check Architecture */ -#define X86_FEATURE_CMOV (0*32+15) /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ -#define X86_FEATURE_PAT (0*32+16) /* Page Attribute Table */ -#define X86_FEATURE_PSE36 (0*32+17) /* 36-bit PSEs */ -#define X86_FEATURE_PN (0*32+18) /* Processor serial number */ -#define X86_FEATURE_CLFLSH (0*32+19) /* Supports the CLFLUSH instruction */ -#define X86_FEATURE_DS (0*32+21) /* Debug Store */ -#define X86_FEATURE_ACPI (0*32+22) /* ACPI via MSR */ -#define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ -#define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */ - /* of FPU context), and CR4.OSFXSR available */ -#define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ -#define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ -#define X86_FEATURE_SELFSNOOP (0*32+27) /* CPU self snoop */ -#define X86_FEATURE_HT (0*32+28) /* Hyper-Threading */ -#define X86_FEATURE_ACC (0*32+29) /* Automatic clock control */ -#define X86_FEATURE_IA64 (0*32+30) /* IA-64 processor */ -#define X86_FEATURE_PBE (0*32+31) /* Pending Break Enable */ - -/* AMD-defined CPU features, CPUID level 0x80000001, word 1 */ -/* Don''t duplicate feature flags which are redundant with Intel! */ -#define X86_FEATURE_SYSCALL (1*32+11) /* SYSCALL/SYSRET */ -#define X86_FEATURE_MP (1*32+19) /* MP Capable. */ -#define X86_FEATURE_NX (1*32+20) /* Execute Disable */ -#define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ -#define X86_FEATURE_FFXSR (1*32+25) /* FFXSR instruction optimizations */ -#define X86_FEATURE_PAGE1GB (1*32+26) /* 1Gb large page support */ -#define X86_FEATURE_RDTSCP (1*32+27) /* RDTSCP */ -#define X86_FEATURE_LM (1*32+29) /* Long Mode (x86-64) */ -#define X86_FEATURE_3DNOWEXT (1*32+30) /* AMD 3DNow! extensions */ -#define X86_FEATURE_3DNOW (1*32+31) /* 3DNow! */ - -/* Transmeta-defined CPU features, CPUID level 0x80860001, word 2 */ -#define X86_FEATURE_RECOVERY (2*32+ 0) /* CPU in recovery mode */ -#define X86_FEATURE_LONGRUN (2*32+ 1) /* Longrun power control */ -#define X86_FEATURE_LRTI (2*32+ 3) /* LongRun table interface */ - -/* Other features, Linux-defined mapping, word 3 */ -/* This range is used for feature bits which conflict or are synthesized */ -#define X86_FEATURE_CXMMX (3*32+ 0) /* Cyrix MMX extensions */ -#define X86_FEATURE_K6_MTRR (3*32+ 1) /* AMD K6 nonstandard MTRRs */ -#define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */ -#define X86_FEATURE_CENTAUR_MCR (3*32+ 3) /* Centaur MCRs (= MTRRs) */ -/* cpu types for specific tunings: */ -#define X86_FEATURE_K8 (3*32+ 4) /* Opteron, Athlon64 */ -#define X86_FEATURE_K7 (3*32+ 5) /* Athlon */ -#define X86_FEATURE_P3 (3*32+ 6) /* P3 */ -#define X86_FEATURE_P4 (3*32+ 7) /* P4 */ -#define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ - -/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ -#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ -#define X86_FEATURE_DTES64 (4*32+ 2) /* 64-bit Debug Store */ -#define X86_FEATURE_MWAIT (4*32+ 3) /* Monitor/Mwait support */ -#define X86_FEATURE_DSCPL (4*32+ 4) /* CPL Qualified Debug Store */ -#define X86_FEATURE_VMXE (4*32+ 5) /* Virtual Machine Extensions */ -#define X86_FEATURE_SMXE (4*32+ 6) /* Safer Mode Extensions */ -#define X86_FEATURE_EST (4*32+ 7) /* Enhanced SpeedStep */ -#define X86_FEATURE_TM2 (4*32+ 8) /* Thermal Monitor 2 */ -#define X86_FEATURE_SSSE3 (4*32+ 9) /* Supplemental Streaming SIMD Extensions-3 */ -#define X86_FEATURE_CID (4*32+10) /* Context ID */ -#define X86_FEATURE_CX16 (4*32+13) /* CMPXCHG16B */ -#define X86_FEATURE_XTPR (4*32+14) /* Send Task Priority Messages */ -#define X86_FEATURE_PDCM (4*32+15) /* Perf/Debug Capability MSR */ -#define X86_FEATURE_DCA (4*32+18) /* Direct Cache Access */ -#define X86_FEATURE_SSE4_1 (4*32+19) /* Streaming SIMD Extensions 4.1 */ -#define X86_FEATURE_SSE4_2 (4*32+20) /* Streaming SIMD Extensions 4.2 */ -#define X86_FEATURE_POPCNT (4*32+23) /* POPCNT instruction */ -#define X86_FEATURE_HYPERVISOR (4*32+31) /* Running under some hypervisor */ - -/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ -#define X86_FEATURE_XSTORE (5*32+ 2) /* on-CPU RNG present (xstore insn) */ -#define X86_FEATURE_XSTORE_EN (5*32+ 3) /* on-CPU RNG enabled */ -#define X86_FEATURE_XCRYPT (5*32+ 6) /* on-CPU crypto (xcrypt insn) */ -#define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* on-CPU crypto enabled */ -#define X86_FEATURE_ACE2 (5*32+ 8) /* Advanced Cryptography Engine v2 */ -#define X86_FEATURE_ACE2_EN (5*32+ 9) /* ACE v2 enabled */ -#define X86_FEATURE_PHE (5*32+ 10) /* PadLock Hash Engine */ -#define X86_FEATURE_PHE_EN (5*32+ 11) /* PHE enabled */ -#define X86_FEATURE_PMM (5*32+ 12) /* PadLock Montgomery Multiplier */ -#define X86_FEATURE_PMM_EN (5*32+ 13) /* PMM enabled */ - -/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ -#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */ -#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */ -#define X86_FEATURE_SVME (6*32+ 2) /* Secure Virtual Machine */ -#define X86_FEATURE_EXTAPICSPACE (6*32+ 3) /* Extended APIC space */ -#define X86_FEATURE_ALTMOVCR (6*32+ 4) /* LOCK MOV CR accesses CR+8 */ -#define X86_FEATURE_ABM (6*32+ 5) /* Advanced Bit Manipulation */ -#define X86_FEATURE_SSE4A (6*32+ 6) /* AMD Streaming SIMD Extensions-4a */ -#define X86_FEATURE_MISALIGNSSE (6*32+ 7) /* Misaligned SSE Access */ -#define X86_FEATURE_3DNOWPF (6*32+ 8) /* 3DNow! Prefetch */ -#define X86_FEATURE_OSVW (6*32+ 9) /* OS Visible Workaround */ -#define X86_FEATURE_IBS (6*32+ 10) /* Instruction Based Sampling */ -#define X86_FEATURE_SSE5 (6*32+ 11) /* AMD Streaming SIMD Extensions-5 */ -#define X86_FEATURE_SKINIT (6*32+ 12) /* SKINIT, STGI/CLGI, DEV */ -#define X86_FEATURE_WDT (6*32+ 13) /* Watchdog Timer */ - -#endif /* __LIBXC_CPUFEATURE_H */ diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_cpuid.h --- a/tools/ocaml/libs/xc/xc_cpuid.h Fri Sep 10 11:10:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,285 +0,0 @@ -#ifndef XC_CPUID_H -#define XC_CPUID_H - -#ifdef XEN_DOMCTL_set_cpuid - -#include "xc_cpufeature.h" - -#define bitmaskof(idx) (1u << ((idx) & 31)) -#define clear_bit(idx, dst) ((dst) &= ~(1u << ((idx) & 31))) -#define set_bit(idx, dst) ((dst) |= (1u << ((idx) & 31))) - -#define DEF_MAX_BASE 0x00000004u -#define DEF_MAX_EXT 0x80000008u - -static void xc_cpuid(uint32_t eax, uint32_t ecx, uint32_t regs[4]) -{ - unsigned int realecx = (ecx == XEN_CPUID_INPUT_UNUSED) ? 0 : ecx; - asm ( -#ifdef __i386__ - "push %%ebx; cpuid; mov %%ebx,%1; pop %%ebx" -#else - "push %%rbx; cpuid; mov %%ebx,%1; pop %%rbx" -#endif - : "=a" (regs[0]), "=r" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) - : "0" (eax), "2" (realecx)); -} - -enum { CPU_BRAND_INTEL, CPU_BRAND_AMD, CPU_BRAND_UNKNOWN }; - -static int xc_cpuid_brand_get(void) -{ - uint32_t regs[4]; - char str[13]; - uint32_t *istr = (uint32_t *) str; - - xc_cpuid(0, 0, regs); - istr[0] = regs[1]; - istr[1] = regs[3]; - istr[2] = regs[2]; - str[12] = ''\0''; - if (strcmp(str, "AuthenticAMD") == 0) { - return CPU_BRAND_AMD; - } else if (strcmp(str, "GenuineIntel") == 0) { - return CPU_BRAND_INTEL; - } else - return CPU_BRAND_UNKNOWN; -} - -static int hypervisor_is_64bit(int xc) -{ - xen_capabilities_info_t xen_caps; - return ((xc_version(xc, XENVER_capabilities, &xen_caps) == 0) && - (strstr(xen_caps, "x86_64") != NULL)); -} - -static void do_hvm_cpuid_policy(int xc, int domid, uint32_t input, uint32_t regs[4]) -{ - unsigned long is_pae; - int brand; - - /* pae ? */ - xc_get_hvm_param(xc, domid, HVM_PARAM_PAE_ENABLED, &is_pae); - is_pae = !!is_pae; - - switch (input) { - case 0x00000000: - if (regs[0] > DEF_MAX_BASE) - regs[0] = DEF_MAX_BASE; - break; - case 0x00000001: - regs[2] &= (bitmaskof(X86_FEATURE_XMM3) | - bitmaskof(X86_FEATURE_SSSE3) | - bitmaskof(X86_FEATURE_CX16) | - bitmaskof(X86_FEATURE_SSE4_1) | - bitmaskof(X86_FEATURE_SSE4_2) | - bitmaskof(X86_FEATURE_POPCNT)); - - regs[2] |= bitmaskof(X86_FEATURE_HYPERVISOR); - - regs[3] &= (bitmaskof(X86_FEATURE_FPU) | - bitmaskof(X86_FEATURE_VME) | - bitmaskof(X86_FEATURE_DE) | - bitmaskof(X86_FEATURE_PSE) | - bitmaskof(X86_FEATURE_TSC) | - bitmaskof(X86_FEATURE_MSR) | - bitmaskof(X86_FEATURE_PAE) | - bitmaskof(X86_FEATURE_MCE) | - bitmaskof(X86_FEATURE_CX8) | - bitmaskof(X86_FEATURE_APIC) | - bitmaskof(X86_FEATURE_SEP) | - bitmaskof(X86_FEATURE_MTRR) | - bitmaskof(X86_FEATURE_PGE) | - bitmaskof(X86_FEATURE_MCA) | - bitmaskof(X86_FEATURE_CMOV) | - bitmaskof(X86_FEATURE_PAT) | - bitmaskof(X86_FEATURE_CLFLSH) | - bitmaskof(X86_FEATURE_MMX) | - bitmaskof(X86_FEATURE_FXSR) | - bitmaskof(X86_FEATURE_XMM) | - bitmaskof(X86_FEATURE_XMM2)); - /* We always support MTRR MSRs. */ - regs[3] |= bitmaskof(X86_FEATURE_MTRR); - - if (!is_pae) - clear_bit(X86_FEATURE_PAE, regs[3]); - break; - case 0x80000000: - if (regs[0] > DEF_MAX_EXT) - regs[0] = DEF_MAX_EXT; - break; - case 0x80000001: - if (!is_pae) - clear_bit(X86_FEATURE_NX, regs[3]); - break; - case 0x80000008: - regs[0] &= 0x0000ffffu; - regs[1] = regs[2] = regs[3] = 0; - break; - case 0x00000002: /* Intel cache info (dumped by AMD policy) */ - case 0x00000004: /* Intel cache info (dumped by AMD policy) */ - case 0x80000002: /* Processor name string */ - case 0x80000003: /* ... continued */ - case 0x80000004: /* ... continued */ - case 0x80000005: /* AMD L1 cache/TLB info (dumped by Intel policy) */ - case 0x80000006: /* AMD L2/3 cache/TLB info ; Intel L2 cache features */ - break; - default: - regs[0] = regs[1] = regs[2] = regs[3] = 0; - break; - } - - brand = xc_cpuid_brand_get(); - if (brand == CPU_BRAND_AMD) { - switch (input) { - case 0x00000001: - /* Mask Intel-only features. */ - regs[2] &= ~(bitmaskof(X86_FEATURE_SSSE3) | - bitmaskof(X86_FEATURE_SSE4_1) | - bitmaskof(X86_FEATURE_SSE4_2)); - break; - - case 0x00000002: - case 0x00000004: - regs[0] = regs[1] = regs[2] = 0; - break; - - case 0x80000001: { - int is_64bit = hypervisor_is_64bit(xc) && is_pae; - - if (!is_pae) - clear_bit(X86_FEATURE_PAE, regs[3]); - clear_bit(X86_FEATURE_PSE36, regs[3]); - - /* Filter all other features according to a whitelist. */ - regs[2] &= ((is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0) | - bitmaskof(X86_FEATURE_ALTMOVCR) | - bitmaskof(X86_FEATURE_ABM) | - bitmaskof(X86_FEATURE_SSE4A) | - bitmaskof(X86_FEATURE_MISALIGNSSE) | - bitmaskof(X86_FEATURE_3DNOWPF)); - regs[3] &= (0x0183f3ff | /* features shared with 0x00000001:EDX */ - (is_pae ? bitmaskof(X86_FEATURE_NX) : 0) | - (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) | - bitmaskof(X86_FEATURE_SYSCALL) | - bitmaskof(X86_FEATURE_MP) | - bitmaskof(X86_FEATURE_MMXEXT) | - bitmaskof(X86_FEATURE_FFXSR) | - bitmaskof(X86_FEATURE_3DNOW) | - bitmaskof(X86_FEATURE_3DNOWEXT)); - break; - } - } - } else if (brand == CPU_BRAND_INTEL) { - switch (input) { - case 0x00000001: - /* Mask AMD-only features. */ - regs[2] &= ~(bitmaskof(X86_FEATURE_POPCNT)); - break; - - case 0x00000004: - regs[0] &= 0x3FF; - regs[3] &= 0x3FF; - break; - - case 0x80000001: - { - int is_64bit = hypervisor_is_64bit(xc) && is_pae; - - /* Only a few features are advertised in Intel''s 0x80000001. */ - regs[2] &= (is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0); - regs[3] &= ((is_pae ? bitmaskof(X86_FEATURE_NX) : 0) | - (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) | - (is_64bit ? bitmaskof(X86_FEATURE_SYSCALL) : 0)); - break; - } - case 0x80000005: - { - regs[0] = regs[1] = regs[2] = 0; - break; - } - } - } -} - -static void do_pv_cpuid_policy(int xc, int domid, uint32_t input, uint32_t regs[4]) -{ - int brand; - int guest_64_bits, xen_64_bits; - int ret; - - ret = xc_domain_get_machine_address_size(xc, domid); - if (ret < 0) - return; - guest_64_bits = (ret == 64); - xen_64_bits = hypervisor_is_64bit(xc); - brand = xc_cpuid_brand_get(); - - if ((input & 0x7fffffff) == 1) { - clear_bit(X86_FEATURE_VME, regs[3]); - clear_bit(X86_FEATURE_PSE, regs[3]); - clear_bit(X86_FEATURE_PGE, regs[3]); - clear_bit(X86_FEATURE_MCE, regs[3]); - clear_bit(X86_FEATURE_MCA, regs[3]); - clear_bit(X86_FEATURE_MTRR, regs[3]); - clear_bit(X86_FEATURE_PSE36, regs[3]); - } - - switch (input) { - case 1: - if (!xen_64_bits || brand == CPU_BRAND_AMD) - clear_bit(X86_FEATURE_SEP, regs[3]); - clear_bit(X86_FEATURE_DS, regs[3]); - clear_bit(X86_FEATURE_ACC, regs[3]); - clear_bit(X86_FEATURE_PBE, regs[3]); - - clear_bit(X86_FEATURE_DTES64, regs[2]); - clear_bit(X86_FEATURE_MWAIT, regs[2]); - clear_bit(X86_FEATURE_DSCPL, regs[2]); - clear_bit(X86_FEATURE_VMXE, regs[2]); - clear_bit(X86_FEATURE_SMXE, regs[2]); - clear_bit(X86_FEATURE_EST, regs[2]); - clear_bit(X86_FEATURE_TM2, regs[2]); - if (!guest_64_bits) - clear_bit(X86_FEATURE_CX16, regs[2]); - clear_bit(X86_FEATURE_XTPR, regs[2]); - clear_bit(X86_FEATURE_PDCM, regs[2]); - clear_bit(X86_FEATURE_DCA, regs[2]); - break; - case 0x80000001: - if (!guest_64_bits) { - clear_bit(X86_FEATURE_LM, regs[3]); - clear_bit(X86_FEATURE_LAHF_LM, regs[2]); - if (brand != CPU_BRAND_AMD) - clear_bit(X86_FEATURE_SYSCALL, regs[3]); - } else - set_bit(X86_FEATURE_SYSCALL, regs[3]); - clear_bit(X86_FEATURE_PAGE1GB, regs[3]); - clear_bit(X86_FEATURE_RDTSCP, regs[3]); - - clear_bit(X86_FEATURE_SVME, regs[2]); - clear_bit(X86_FEATURE_OSVW, regs[2]); - clear_bit(X86_FEATURE_IBS, regs[2]); - clear_bit(X86_FEATURE_SKINIT, regs[2]); - clear_bit(X86_FEATURE_WDT, regs[2]); - break; - case 5: /* MONITOR/MWAIT */ - case 0xa: /* Architectural Performance Monitor Features */ - case 0x8000000a: /* SVM revision and features */ - case 0x8000001b: /* Instruction Based Sampling */ - regs[0] = regs[1] = regs[2] = regs[3] = 0; - break; - } -} - -static void do_cpuid_policy(int xc, int domid, int hvm, uint32_t input, uint32_t regs[4]) -{ - if (hvm) - do_hvm_cpuid_policy(xc, domid, input, regs); - else - do_pv_cpuid_policy(xc, domid, input, regs); -} - -#endif - -#endif diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_e820.h --- a/tools/ocaml/libs/xc/xc_e820.h Fri Sep 10 11:10:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#ifndef __XC_E820_H__ -#define __XC_E820_H__ - -#include <xen/hvm/e820.h> - -/* - * PC BIOS standard E820 types and structure. - */ -#define E820_RAM 1 -#define E820_RESERVED 2 -#define E820_ACPI 3 -#define E820_NVS 4 - -struct e820entry { - uint64_t addr; - uint64_t size; - uint32_t type; -} __attribute__((packed)); - -#endif /* __XC_E820_H__ */ diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_lib.c --- a/tools/ocaml/libs/xc/xc_lib.c Fri Sep 10 11:10:00 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1537 +0,0 @@ -/* - * Copyright (C) 2006-2007 XenSource Ltd. - * Copyright (C) 2008 Citrix Ltd. - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com> - * - * 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 <stdint.h> -#include <unistd.h> -#include <string.h> -#include <fcntl.h> -#include <stdio.h> -#include <errno.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <stdlib.h> -#include <stdarg.h> - -#include "xc.h" - -#define PAGE_SHIFT 12 -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#define DECLARE_DOMCTL(_cmd, _domain) \ - struct xen_domctl domctl = { \ - .cmd = _cmd, \ - .domain = _domain, \ - .interface_version = XEN_DOMCTL_INTERFACE_VERSION, \ - } - -#define DECLARE_SYSCTL(_cmd) \ - struct xen_sysctl sysctl = { \ - .cmd = _cmd, \ - .interface_version = XEN_SYSCTL_INTERFACE_VERSION, \ - } - -#define DECLARE_HYPERCALL2(_cmd, _arg0, _arg1) \ - privcmd_hypercall_t hypercall = { \ - .op = _cmd, \ - .arg[0] = (unsigned long) _arg0,\ - .arg[1] = (unsigned long) _arg1,\ - } -#define DECLARE_HYPERCALL0(_cmd) DECLARE_HYPERCALL2(_cmd, 0, 0); -#define DECLARE_HYPERCALL1(_cmd, _arg0) DECLARE_HYPERCALL2(_cmd, _arg0, 0); - -/*---- Errors handlings ----*/ -#ifndef WITHOUT_GOOD_ERROR -#define ERROR_STRLEN 256 - -static char __error_str[ERROR_STRLEN]; - -char * xc_error_get(void) -{ - return __error_str; -} - -static void xc_error_set(const char *fmt, ...) -{ - va_list ap; - char __errordup[ERROR_STRLEN]; - - va_start(ap, fmt); - vsnprintf(__errordup, ERROR_STRLEN, fmt, ap); - va_end(ap); - memcpy(__error_str, __errordup, ERROR_STRLEN); -} - -static void xc_error_dom_set(unsigned int domid, const char *fmt, ...) -{ - va_list ap; - char __errordup[ERROR_STRLEN]; - int i; - - i = snprintf(__errordup, ERROR_STRLEN, "domain %u - ", domid); - va_start(ap, fmt); - i += vsnprintf(__errordup + i, ERROR_STRLEN - i, fmt, ap); - va_end(ap); - snprintf(__errordup + i, ERROR_STRLEN - i, - " failed: %s", xc_error_get()); - memcpy(__error_str, __errordup, ERROR_STRLEN); -} - -void xc_error_clear(void) -{ - memset(__error_str, ''\0'', ERROR_STRLEN); -} -#else -char * xc_error_get(void) -{ - return ""; -} -#define xc_error_set(fmt, ...) do {} while (0) -#define xc_error_dom_set(id, fmt, ...) do {} while (0) -#define xc_error_clear() do {} while (0) -#endif - -#define xc_error_hypercall(_h, _r) \ - xc_error_set("hypercall %lld fail: %d: %s (ret %d)", _h.op, errno, errno ? strerror(errno) : strerror(-_r), _r) - -int xc_using_injection(void) -{ - return 0; -} - -/*---- Trivia ----*/ -int xc_interface_open(void) -{ - int fd, ret; - - fd = open("/proc/xen/privcmd", O_RDWR); - if (fd == -1) { - xc_error_set("open /proc/xen/privcmd failed: %s", - strerror(errno)); - return -1; - } - - ret = fcntl(fd, F_GETFD); - if (ret < 0) { - xc_error_set("cannot get handle flags: %s", - strerror(errno)); - goto out; - } - - ret = fcntl(fd, F_SETFD, ret | FD_CLOEXEC); - if (ret < 0) { - xc_error_set("cannot set handle flags: %s", - strerror(errno)); - goto out; - } - - return fd; -out: - close(fd); - return -1; -} - -int xc_interface_close(int handle) -{ - int ret; - - ret = close(handle); - if (ret != 0) - xc_error_set("close xc failed: %s", strerror(errno)); - return ret; -} - -/*---- Low private operations ----*/ -static int do_xen_hypercall(int handle, privcmd_hypercall_t *hypercall) -{ - return ioctl(handle, IOCTL_PRIVCMD_HYPERCALL, (unsigned long) hypercall); -} - -static int do_domctl(int handle, struct xen_domctl *domctl) -{ - int ret; - DECLARE_HYPERCALL1(__HYPERVISOR_domctl, domctl); - - if (mlock(domctl, sizeof(*domctl)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret < 0) - xc_error_hypercall(hypercall, ret); - - munlock(domctl, sizeof(*domctl)); - return ret; -} - -static int do_sysctl(int handle, struct xen_sysctl *sysctl) -{ - int ret; - DECLARE_HYPERCALL1(__HYPERVISOR_sysctl, sysctl); - - if (mlock(sysctl, sizeof(*sysctl)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret < 0) - xc_error_hypercall(hypercall, ret); - - munlock(sysctl, sizeof(*sysctl)); - return ret; -} - -static int do_evtchnctl(int handle, int cmd, void *arg, size_t arg_size) -{ - DECLARE_HYPERCALL2(__HYPERVISOR_event_channel_op, cmd, arg); - int ret; - - if (mlock(arg, arg_size) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret < 0) - xc_error_hypercall(hypercall, ret); - munlock(arg, arg_size); - return ret; -} - -static int do_memctl_reservation(int handle, int cmd, - struct xen_memory_reservation *reservation) -{ - int ret; - DECLARE_HYPERCALL2(__HYPERVISOR_memory_op, cmd, reservation); - xen_pfn_t *extent_start; - - if (cmd != XENMEM_increase_reservation && - cmd != XENMEM_decrease_reservation && - cmd != XENMEM_populate_physmap) { - xc_error_set("do_memctl_reservation: unknown cmd %d", cmd); - return -EINVAL; - } - - if (mlock(reservation, sizeof(*reservation)) == -1) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -ENOMEM; - } - get_xen_guest_handle(extent_start, reservation->extent_start); - if (extent_start && mlock(extent_start, reservation->nr_extents - * sizeof(xen_pfn_t)) == -1) { - xc_error_set("mlock failed: %s", strerror(errno)); - munlock(reservation, sizeof(*reservation)); - return -3; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret) - xc_error_hypercall(hypercall, ret); - munlock(extent_start, reservation->nr_extents * sizeof(xen_pfn_t)); - get_xen_guest_handle(extent_start, reservation->extent_start); - munlock(reservation, sizeof(*reservation)); - return ret; -} - -static int do_ioctl(int handle, int cmd, void *arg) -{ - return ioctl(handle, cmd, arg); -} - -static void * do_mmap(void *start, size_t length, int prot, int flags, - int fd, off_t offset) -{ - return mmap(start, length, prot, flags, fd, offset); -} - -int xc_get_hvm_param(int handle, unsigned int domid, - int param, unsigned long *value) -{ - struct xen_hvm_param arg = { - .domid = domid, - .index = param, - }; - DECLARE_HYPERCALL2(__HYPERVISOR_hvm_op, HVMOP_get_param, - (unsigned long) &arg); - int ret; - - if (mlock(&arg, sizeof(arg)) == -1) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret) - xc_error_hypercall(hypercall, ret); - *value = arg.value; - munlock(&arg, sizeof(arg)); - return ret; -} - -static int xc_set_hvm_param(int handle, unsigned int domid, - int param, unsigned long value) -{ - struct xen_hvm_param arg = { - .domid = domid, - .index = param, - .value = value, - }; - 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; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret) - xc_error_hypercall(hypercall, ret); - munlock(&arg, sizeof(arg)); - return ret; -} - - -/*---- XC API ----*/ -int xc_domain_create(int handle, unsigned int ssidref, - xen_domain_handle_t dhandle, - unsigned int flags, unsigned int *pdomid) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_createdomain, *pdomid); - domctl.u.createdomain.ssidref = ssidref; - domctl.u.createdomain.flags = flags; - memcpy(domctl.u.createdomain.handle, dhandle, sizeof(xen_domain_handle_t)); - - ret = do_domctl(handle, &domctl); - if (ret != 0) { - xc_error_set("creating domain failed: %s", xc_error_get()); - return ret; - } - *pdomid = domctl.domain; - return 0; -} - -int xc_domain_pause(int handle, unsigned int domid) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_pausedomain, domid); - - ret = do_domctl(handle, &domctl); - if (ret != 0) - xc_error_dom_set(domid, "pause"); - return ret; -} - -int xc_domain_unpause(int handle, unsigned int domid) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_unpausedomain, domid); - - ret = do_domctl(handle, &domctl); - if (ret != 0) - xc_error_dom_set(domid, "unpause"); - return ret; -} - -/* return 1 if hvm domain got pv driver, 0 if not. -1 is error occurs */ -int xc_hvm_check_pvdriver(int handle, unsigned int domid) -{ - int ret; - unsigned long irq = 0; - xc_domaininfo_t info; - - ret = xc_domain_getinfolist(handle, domid, 1, &info); - if (ret != 1) { - xc_error_set("domain getinfo failed: %s", strerror(errno)); - xc_error_dom_set(domid, "hvm_check_pvdriver"); - return -1; - } - - if (!(info.flags & XEN_DOMINF_hvm_guest)) { - xc_error_set("domain is not hvm"); - xc_error_dom_set(domid, "hvm_check_pvdriver"); - return -1; - } - xc_get_hvm_param(handle, domid, HVM_PARAM_CALLBACK_IRQ, &irq); - return irq; -} - -static int modify_returncode_register(int handle, unsigned int domid) -{ - int ret; - xc_domaininfo_t info; - xen_capabilities_info_t caps; - vcpu_guest_context_any_t context; - - ret = xc_domain_getinfolist(handle, domid, 1, &info); - if (ret != 1) { - xc_error_set("domain getinfo failed: %s", strerror(errno)); - return -1; - } - - /* HVM guests without PV drivers do not have a return code to modify */ - if (info.flags & XEN_DOMINF_hvm_guest) { - unsigned long irq = 0; - xc_get_hvm_param(handle, domid, HVM_PARAM_CALLBACK_IRQ, &irq); - if (!irq) - return 0; - } - - ret = xc_version(handle, XENVER_capabilities, &caps); - if (ret) { - xc_error_set("could not get Xen capabilities"); - return ret; - } - - ret = xc_vcpu_getcontext(handle, domid, 0, &context); - if (ret) { - xc_error_set("could not get vcpu 0 context"); - return ret; - } - - if (!(info.flags & XEN_DOMINF_hvm_guest)) - context.c.user_regs.eax = 1; - else if (strstr(caps, "x86_64")) - context.x64.user_regs.eax = 1; - else - context.x32.user_regs.eax = 1; - - ret = xc_vcpu_setcontext(handle, domid, 0, &context); - if (ret) { - xc_error_set("could not set vcpu 0 context"); - return ret; - } - return 0; -} - -int xc_domain_resume_fast(int handle, unsigned int domid) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_resumedomain, domid); - - ret = modify_returncode_register(handle, domid); - if (ret != 0) { - xc_error_dom_set(domid, "resume_fast"); - return ret; - } - - ret = do_domctl(handle, &domctl); - if (ret != 0) - xc_error_dom_set(domid, "resume_fast"); - return ret; -} - -int xc_domain_destroy(int handle, unsigned int domid) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_destroydomain, domid); - - do { - ret = do_domctl(handle, &domctl); - } while (ret && (errno == EAGAIN)); - if (ret != 0) - xc_error_dom_set(domid, "destroy"); - return ret; -} - -int xc_domain_shutdown(int handle, int domid, int reason) -{ - sched_remote_shutdown_t arg = { - .domain_id = domid, - .reason = reason, - }; - DECLARE_HYPERCALL2(__HYPERVISOR_sched_op, SCHEDOP_remote_shutdown, &arg); - int ret; - - if (mlock(&arg, sizeof(arg)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - xc_error_dom_set(domid, "shutdown %d", reason); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret < 0) { - xc_error_hypercall(hypercall, ret); - xc_error_dom_set(domid, "shutdown %d", reason); - } - munlock(&arg, sizeof(arg)); - return ret; -} - -static void bitmap_64_to_byte(uint8_t *bp, const uint64_t *lp, int nbits) -{ - uint64_t l; - int i, j, b; - - for (i = 0, b = 0; nbits > 0; i++, b += sizeof(l)) { - l = lp[i]; - for (j = 0; (j < sizeof(l)) && (nbits > 0); j++) { - bp[b+j] = l; - l >>= 8; - nbits -= 8; - } - } -} - -static void bitmap_byte_to_64(uint64_t *lp, const uint8_t *bp, int nbits) -{ - uint64_t l; - int i, j, b; - - for (i = 0, b = 0; nbits > 0; i++, b += sizeof(l)) { - l = 0; - for (j = 0; (j < sizeof(l)) && (nbits > 0); j++) { - l |= (uint64_t)bp[b+j] << (j*8); - nbits -= 8; - } - lp[i] = l; - } -} - -int xc_vcpu_setaffinity(int handle, unsigned int domid, int vcpu, - uint64_t cpumap) -{ - int ret; - uint8_t local[sizeof(cpumap)]; - DECLARE_DOMCTL(XEN_DOMCTL_setvcpuaffinity, domid); - domctl.u.vcpuaffinity.vcpu = vcpu; - domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8; - - bitmap_64_to_byte(local, &cpumap, sizeof(cpumap)*8); - set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); - - if (mlock(&cpumap, sizeof(cpumap)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - xc_error_dom_set(domid, "vcpu %d set affinity", vcpu); - return -1; - } - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "vcpu %d set affinity", vcpu); - munlock(&cpumap, sizeof(cpumap)); - return ret; -} - -int xc_vcpu_getaffinity(int handle, unsigned int domid, int vcpu, - uint64_t *cpumap) -{ - int ret; - uint8_t local[sizeof(*cpumap)]; - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuaffinity, domid); - domctl.u.vcpuaffinity.vcpu = vcpu; - domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(*cpumap) * 8; - - set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); - - if (mlock(cpumap, sizeof(*cpumap)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - xc_error_dom_set(domid, "vcpu %d get affinity", vcpu); - return -1; - } - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "vcpu %d get affinity", vcpu); - munlock(cpumap, sizeof(*cpumap)); - bitmap_byte_to_64(cpumap, local, sizeof(*cpumap) * 8); - return ret; -} - -int xc_vcpu_context_get(int handle, unsigned int domid, unsigned short vcpu, - struct vcpu_guest_context *ctxt) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_getvcpucontext, domid); - domctl.u.vcpucontext.vcpu = vcpu; - - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt); - - if (mlock(ctxt, sizeof(struct vcpu_guest_context)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - xc_error_dom_set(domid, "vcpu %d get context", vcpu); - return -1; - } - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "vcpu %d get context", vcpu); - munlock(ctxt, sizeof(struct vcpu_guest_context)); - - return ret; -} - -int xc_domain_getinfolist(int handle, unsigned int first_domain, - unsigned int max_domains, xc_domaininfo_t *info) -{ - int ret; - DECLARE_SYSCTL(XEN_SYSCTL_getdomaininfolist); - sysctl.u.getdomaininfolist.first_domain = first_domain; - sysctl.u.getdomaininfolist.max_domains = max_domains; - set_xen_guest_handle(sysctl.u.getdomaininfolist.buffer, info); - - if (mlock(info, max_domains * sizeof(xc_domaininfo_t)) != 0) { - xc_error_set("getinfolist(%d, %u, %u, %x (%d)) failed: mlock failed: %s", - handle, first_domain, max_domains, info, sizeof(xc_domaininfo_t), - strerror(errno)); - return -1; - } - - ret = do_sysctl(handle, &sysctl); - if (ret < 0) - xc_error_set("getinfolist(%d, %u, %u, %x (%d)) failed: %s", - handle, first_domain, max_domains, info, sizeof(xc_domaininfo_t), - xc_error_get()); - else - ret = sysctl.u.getdomaininfolist.num_domains; - - munlock(info, max_domains * sizeof(xc_domaininfo_t)); - return ret; -} - -int xc_domain_getinfo(int handle, unsigned int domid, xc_domaininfo_t *info) -{ - int ret; - ret = xc_domain_getinfolist(handle, domid, 1, info); - if (ret != 1) { - xc_error_set("getinfo failed: domain %d: %s", domid, xc_error_get()); - return -1; - } - - /* If the requested domain didn''t exist but there exists one with a - higher domain ID, this will be returned. We consider this an error since - we only wanted info about a specific domain. */ - if (info->domain != domid) { - xc_error_set("getinfo failed: domain %d nolonger exists", domid); - return -1; - } - - return 0; -} - -int xc_domain_setmaxmem(int handle, unsigned int domid, unsigned int max_memkb) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_max_mem, domid); - domctl.u.max_mem.max_memkb = max_memkb; - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "set max memory to %u", max_memkb); - return ret; -} - -int xc_domain_set_memmap_limit(int handle, unsigned int domid, - unsigned long map_limitkb) -{ - int ret; - struct xen_foreign_memory_map fmap = { - .domid = domid, - .map = { .nr_entries = 1 } - }; - struct e820entry e820 = { - .addr = 0, - .size = (uint64_t)map_limitkb << 10, - .type = E820_RAM - }; - DECLARE_HYPERCALL2(__HYPERVISOR_memory_op, XENMEM_set_memory_map, &fmap); - - set_xen_guest_handle(fmap.map.buffer, &e820); - - if (mlock(&fmap, sizeof(fmap)) != 0) { - xc_error_set("set_memmap_limit failed: mlock failed: %s", - strerror(errno)); - return -1; - } - - if (mlock(&e820, sizeof(e820)) != 0) { - xc_error_set("set_memmap_limit failed: mlock failed: %s", - strerror(errno)); - munlock(&fmap, sizeof(fmap)); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret) - xc_error_hypercall(hypercall, ret); - - munlock(&e820, sizeof(e820)); - munlock(&fmap, sizeof(fmap)); - return ret; -} - -int xc_domain_set_time_offset(int handle, unsigned int domid, int time_offset) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_settimeoffset, domid); - domctl.u.settimeoffset.time_offset_seconds = time_offset; - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "set time offset %d", time_offset); - return ret; -} - -int xc_domain_memory_increase_reservation(int handle, unsigned int domid, - unsigned long nr_extents, - unsigned int extent_order, - unsigned int address_bits, - xen_pfn_t *extent_start) -{ - int ret; - struct xen_memory_reservation reservation = { - .nr_extents = nr_extents, - .extent_order = extent_order, - .COMPAT_FIELD_ADDRESS_BITS = address_bits, - .domid = domid - }; - - set_xen_guest_handle(reservation.extent_start, extent_start); - - ret = do_memctl_reservation(handle, XENMEM_increase_reservation, - &reservation); - if (ret != nr_extents) { - xc_error_dom_set(domid, "increase reservation to %lu", - nr_extents); - return (ret >= 0) ? -1 : ret; - } - return 0; -} - -int xc_domain_memory_decrease_reservation(int handle, unsigned int domid, - unsigned long nr_extents, - unsigned int extent_order, - unsigned int address_bits, - xen_pfn_t *extent_start) -{ - int ret; - struct xen_memory_reservation reservation = { - .nr_extents = nr_extents, - .extent_order = extent_order, - .COMPAT_FIELD_ADDRESS_BITS = 0, - .domid = domid - }; - - set_xen_guest_handle(reservation.extent_start, extent_start); - if (!extent_start) { - xc_error_set("decrease reservation: extent start is NULL"); - return -EINVAL; - } - - ret = do_memctl_reservation(handle, XENMEM_decrease_reservation, - &reservation); - if (ret < nr_extents) { - xc_error_dom_set(domid, "decrease reservation to %lu", - nr_extents); - return (ret >= 0) ? -1 : ret; - } - return 0; -} - -int xc_domain_memory_populate_physmap(int handle, unsigned int domid, - unsigned long nr_extents, - unsigned int extent_order, - unsigned int address_bits, - xen_pfn_t *extent_start) -{ - int ret; - struct xen_memory_reservation reservation = { - .nr_extents = nr_extents, - .extent_order = extent_order, - .COMPAT_FIELD_ADDRESS_BITS = address_bits, - .domid = domid - }; - - set_xen_guest_handle(reservation.extent_start, extent_start); - ret = do_memctl_reservation(handle, XENMEM_populate_physmap, - &reservation); - if (ret < nr_extents) { - xc_error_dom_set(domid, "populate physmap"); - return (ret >= 0) ? -1 : ret; - } - return 0; -} - -int xc_domain_setvmxassist(int handle, unsigned int domid, int use_vmxassist) -{ - int ret = 0; -#ifdef XEN_DOMCTL_setvmxassist - DECLARE_DOMCTL(XEN_DOMCTL_setvmxassist, domid); - domctl.u.setvmxassist.use_vmxassist = use_vmxassist; - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "setting vmxassist to %d", - use_vmxassist); -#endif - return ret; -} - -int xc_domain_max_vcpus(int handle, unsigned int domid, unsigned int max) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_max_vcpus, domid); - domctl.u.max_vcpus.max = max; - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "setting max vcpus to %d", max); - return ret; -} - -int xc_domain_sethandle(int handle, unsigned int domid, - xen_domain_handle_t dhandle) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_setdomainhandle, domid); - memcpy(domctl.u.setdomainhandle.handle, dhandle, sizeof(xen_domain_handle_t)); - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "set handle"); - return ret; -} - -int xc_vcpu_getinfo(int handle, unsigned int domid, unsigned int vcpu, - xc_vcpuinfo_t *info) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuinfo, domid); - domctl.u.getvcpuinfo.vcpu = vcpu; - - ret = do_domctl(handle, &domctl); - if (ret < 0) { - xc_error_dom_set(domid, "vcpu %u getinfo", vcpu); - return ret; - } - memcpy(info, &domctl.u.getvcpuinfo, sizeof(*info)); - return ret; -} - -int xc_domain_ioport_permission(int handle, unsigned int domid, - unsigned int first_port, unsigned int nr_ports, - unsigned int allow_access) -{ - DECLARE_DOMCTL(XEN_DOMCTL_ioport_permission, domid); - domctl.u.ioport_permission.first_port = first_port; - domctl.u.ioport_permission.nr_ports = nr_ports; - domctl.u.ioport_permission.allow_access = allow_access; - - return do_domctl(handle, &domctl); -} - -int xc_vcpu_getcontext(int handle, unsigned int domid, - unsigned int vcpu, vcpu_guest_context_any_t *ctxt) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_getvcpucontext, domid); - domctl.u.vcpucontext.vcpu = vcpu; - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt->c); - - if (mlock(ctxt, sizeof(*ctxt)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "vcpu %u getcontext", vcpu); - munlock(ctxt, sizeof(*ctxt)); - return ret; -} - -int xc_vcpu_setcontext(int handle, unsigned int domid, - unsigned int vcpu, vcpu_guest_context_any_t *ctxt) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_setvcpucontext, domid); - domctl.u.vcpucontext.vcpu = vcpu; - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt->c); - - if (mlock(ctxt, sizeof(*ctxt)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "vcpu %u setcontext", vcpu); - - munlock(ctxt, sizeof(*ctxt)); - return ret; -} - -int xc_domain_irq_permission(int handle, unsigned int domid, - unsigned char pirq, unsigned char allow_access) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_irq_permission, domid); - domctl.u.irq_permission.pirq = pirq; - domctl.u.irq_permission.allow_access = allow_access; - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "irq permission %u to %u", - pirq, allow_access); - return ret; -} - -int xc_domain_iomem_permission(int handle, unsigned int domid, - unsigned long first_mfn, unsigned long nr_mfns, - unsigned char allow_access) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_iomem_permission, domid); - domctl.u.iomem_permission.first_mfn = first_mfn; - domctl.u.iomem_permission.nr_mfns = nr_mfns; - domctl.u.iomem_permission.allow_access = allow_access; - - ret = do_domctl(handle, &domctl); - if (ret) - xc_error_dom_set(domid, "iomem permission [%lu, %lu] to %u", - first_mfn, first_mfn + nr_mfns, allow_access); - return ret; -} - -long long xc_domain_get_cpu_usage(int handle, unsigned int domid, - unsigned int vcpu) -{ - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuinfo, domid); - domctl.u.getvcpuinfo.vcpu = vcpu; - - if (do_domctl(handle, &domctl) < 0) { - xc_error_dom_set(domid, "get cpu %d usage", vcpu); - return -1; - } - return domctl.u.getvcpuinfo.cpu_time; -} - -void *xc_map_foreign_range(int handle, unsigned int domid, - int size, int prot, unsigned long mfn) -{ - privcmd_mmap_entry_t entry = { - .mfn = mfn, - .npages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT, - }; - privcmd_mmap_t ioctlx = { - .num = 1, - .dom = domid, - .entry = &entry, - }; - void *addr; - - addr = do_mmap(NULL, size, prot, MAP_SHARED, handle, 0); - if (addr == MAP_FAILED) { - xc_error_set("mmap failed: %s", strerror(errno)); - xc_error_dom_set(domid, "map foreign range [%lx,%lx] prot %u", - mfn, mfn + size, prot); - return NULL; - } - entry.va = (unsigned long) addr; - if (do_ioctl(handle, IOCTL_PRIVCMD_MMAP, &ioctlx) < 0) { - xc_error_set("ioctl failed: %s", strerror(errno)); - xc_error_dom_set(domid, "map foreign range [%lx,%lx] prot %u", - mfn, mfn + size, prot); - munmap(addr, size); - return NULL; - } - return addr; -} - -int xc_map_foreign_ranges(int handle, unsigned int domid, - privcmd_mmap_entry_t *entries, int nr) -{ - privcmd_mmap_t ioctlx = { - .num = nr, - .dom = domid, - .entry = entries, - }; - int ret; - - ret = do_ioctl(handle, IOCTL_PRIVCMD_MMAP, &ioctlx); - if (ret < 0) { - xc_error_set("ioctl failed: %s", strerror(errno)); - xc_error_dom_set(domid, "map foreign ranges"); - return -1; - } - return ret; -} - -int xc_readconsolering(int handle, char **pbuffer, - unsigned int *pnr_chars, int clear) -{ - int ret; - DECLARE_SYSCTL(XEN_SYSCTL_readconsole); - char *buffer = *pbuffer; - unsigned int nr_chars = *pnr_chars; - - set_xen_guest_handle(sysctl.u.readconsole.buffer, buffer); - sysctl.u.readconsole.count = nr_chars; - sysctl.u.readconsole.clear = clear; - - if (mlock(buffer, nr_chars) != 0) { - xc_error_set("read console ring: mlock failed: %s", - strerror(errno)); - return -1; - } - - ret = do_sysctl(handle, &sysctl); - if (ret != 0) - xc_error_set("read console ring failed: %s", xc_error_get()); - else - *pnr_chars = sysctl.u.readconsole.count; - - munlock(buffer, nr_chars); - return ret; -} - -int xc_send_debug_keys(int handle, char *keys) -{ - int ret; - DECLARE_SYSCTL(XEN_SYSCTL_debug_keys); - - set_xen_guest_handle(sysctl.u.debug_keys.keys, keys); - sysctl.u.debug_keys.nr_keys = strlen(keys); - - if (mlock(keys, sysctl.u.debug_keys.nr_keys) != 0) { - xc_error_set("send debug keys: mlock failed: %s", - strerror(errno)); - return -1; - } - - ret = do_sysctl(handle, &sysctl); - if (ret != 0) - xc_error_set("send debug keys: %s", xc_error_get()); - - munlock(keys, sysctl.u.debug_keys.nr_keys); - return ret; -} - -int xc_physinfo(int handle, xc_physinfo_t *put_info) -{ - DECLARE_SYSCTL(XEN_SYSCTL_physinfo); - int ret; - - ret = do_sysctl(handle, &sysctl); - if (ret) { - xc_error_set("physinfo failed: %s", xc_error_get()); - return ret; - } - memcpy(put_info, &sysctl.u.physinfo, sizeof(*put_info)); - return 0; -} - -int xc_pcpu_info( - int handle, int max_cpus, xen_sysctl_cpuinfo_t *info, int *nr_cpus) -{ - DECLARE_SYSCTL(XEN_SYSCTL_getcpuinfo); - int ret; - - sysctl.u.getcpuinfo.max_cpus = max_cpus; - set_xen_guest_handle(sysctl.u.getcpuinfo.info, info); - - if (mlock(info, sizeof(*info) * max_cpus) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_sysctl(handle, &sysctl); - if (ret) - xc_error_set("pcpu info failed: %s", xc_error_get()); - else if (ret == 0 && nr_cpus) - *nr_cpus = sysctl.u.getcpuinfo.nr_cpus; - munlock(info, sizeof(*info) * max_cpus); - return ret; -} - -int xc_sched_id(int handle, int *sched_id) -{ - DECLARE_SYSCTL(XEN_SYSCTL_sched_id); - int ret; - - ret = do_sysctl(handle, &sysctl); - if (ret) { - xc_error_set("sched id failed: %s", xc_error_get()); - return ret; - } - *sched_id = sysctl.u.sched_id.sched_id; - return 0; -} - -int xc_version(int handle, int cmd, void *arg) -{ - int argsize; - int ret; - DECLARE_HYPERCALL2(__HYPERVISOR_xen_version, cmd, arg); - - switch (cmd) { - case XENVER_extraversion: - argsize = sizeof(xen_extraversion_t); break; - case XENVER_compile_info: - argsize = sizeof(xen_compile_info_t); break; - case XENVER_capabilities: - argsize = sizeof(xen_capabilities_info_t); break; - case XENVER_changeset: - argsize = sizeof(xen_changeset_info_t); break; - case XENVER_platform_parameters: - argsize = sizeof(xen_platform_parameters_t); break; - case XENVER_version: - argsize = 0; break; - default: - xc_error_set("version: unknown command"); - return -1; - } - if (argsize && mlock(arg, argsize) == -1) { - xc_error_set("version: mlock failed: %s", strerror(errno)); - return -ENOMEM; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret) - xc_error_hypercall(hypercall, ret); - - if (argsize) - munlock(arg, argsize); - return ret; -} - -int xc_evtchn_alloc_unbound(int handle, unsigned int domid, - unsigned int remote_domid) -{ - struct evtchn_alloc_unbound arg = { - .dom = domid, - .remote_dom = remote_domid, - }; - int ret; - - ret = do_evtchnctl(handle, EVTCHNOP_alloc_unbound, &arg, sizeof(arg)); - if (ret) { - xc_error_dom_set(domid, "alloc unbound evtchn to %d", - remote_domid); - return ret; - } - return arg.port; -} - -int xc_evtchn_reset(int handle, unsigned int domid) -{ - struct evtchn_reset arg = { - .dom = domid, - }; - int ret; - - ret = do_evtchnctl(handle, EVTCHNOP_reset, &arg, sizeof(arg)); - if (ret) - xc_error_dom_set(domid, "reset evtchn of %d", domid); - return ret; -} - -int xc_sched_credit_domain_set(int handle, unsigned int domid, - struct xen_domctl_sched_credit *sdom) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_scheduler_op, domid); - domctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT; - domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_putinfo; - domctl.u.scheduler_op.u.credit = *sdom; - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "credit scheduler domain set"); - return ret; -} - -int xc_sched_credit_domain_get(int handle, unsigned int domid, - struct xen_domctl_sched_credit *sdom) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_scheduler_op, domid); - - domctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT; - domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_getinfo; - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "credit scheduler domain get"); - else - *sdom = domctl.u.scheduler_op.u.credit; - return ret; -} - -int xc_shadow_allocation_get(int handle, unsigned int domid, uint32_t *mb) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_shadow_op, domid); - - domctl.u.shadow_op.op = XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION; - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "shadow allocation get"); - else - *mb = domctl.u.shadow_op.mb; - return ret; -} - -int xc_shadow_allocation_set(int handle, unsigned int domid, uint32_t mb) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_shadow_op, domid); - - domctl.u.shadow_op.op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION; - domctl.u.shadow_op.mb = mb; - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "shadow allocation set"); - return ret; -} - -int xc_domain_get_pfn_list(int handle, unsigned int domid, - uint64_t *pfn_array, unsigned long max_pfns) -{ - int ret; - DECLARE_DOMCTL(XEN_DOMCTL_getmemlist, domid); - - domctl.u.getmemlist.max_pfns = max_pfns; - set_xen_guest_handle(domctl.u.getmemlist.buffer, pfn_array); - - if (mlock(pfn_array, max_pfns * sizeof(xen_pfn_t)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "get pfn list"); - - munlock(pfn_array, max_pfns * sizeof(xen_pfn_t)); - return (ret < 0) ? ret : domctl.u.getmemlist.num_pfns; -} - -#define MARSHALL_BDF(d,b,s,f) \ - (((b) & 0xff) << 16 | ((s) & 0x1f) << 11 | ((f) & 0x7) << 8) - -int xc_domain_assign_device(int handle, unsigned int domid, - int domain, int bus, int slot, int func) -{ - int ret = -EBADF; -#ifdef XEN_DOMCTL_assign_device - DECLARE_DOMCTL(XEN_DOMCTL_assign_device, domid); - - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "assign device"); -#endif - return ret; -} - -int xc_domain_deassign_device(int handle, unsigned int domid, - int domain, int bus, int slot, int func) -{ - int ret = -EBADF; -#ifdef XEN_DOMCTL_deassign_device - DECLARE_DOMCTL(XEN_DOMCTL_deassign_device, domid); - - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "deassign device"); -#endif - return ret; -} - -int xc_domain_test_assign_device(int handle, unsigned int domid, - int domain, int bus, int slot, int func) -{ - int ret = -EBADF; -#ifdef XEN_DOMCTL_test_assign_device - DECLARE_DOMCTL(XEN_DOMCTL_test_assign_device, domid); - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); - - ret = do_domctl(handle, &domctl); - if (ret < 0) - xc_error_dom_set(domid, "test assign device"); -#endif - return ret; -} - -int xc_domain_watchdog(int handle, int id, uint32_t timeout) -{ - int ret = -EBADF; -#ifdef SCHEDOP_watchdog - sched_watchdog_t arg = { - .id = (uint32_t) id, - .timeout = timeout, - }; - DECLARE_HYPERCALL2(__HYPERVISOR_sched_op, SCHEDOP_watchdog, &arg); - - if (mlock(&arg, sizeof(arg)) != 0) { - xc_error_set("mlock failed: %s", strerror(errno)); - return -1; - } - - ret = do_xen_hypercall(handle, &hypercall); - if (ret < 0) { - xc_error_hypercall(hypercall, ret); - } - munlock(&arg, sizeof(arg)); -#endif - return ret; -} - -int xc_domain_set_machine_address_size(int xc, uint32_t domid, unsigned int width) -{ - DECLARE_DOMCTL(XEN_DOMCTL_set_machine_address_size, domid); - int rc; - - domctl.u.address_size.size = width; - rc = do_domctl(xc, &domctl); - if (rc != 0) - xc_error_dom_set(domid, "set machine address size"); - - return rc; -} - -int xc_domain_get_machine_address_size(int xc, uint32_t domid) -{ - DECLARE_DOMCTL(XEN_DOMCTL_get_machine_address_size, domid); - int rc; - - rc = do_domctl(xc, &domctl); - if (rc != 0) - xc_error_dom_set(domid, "get machine address size"); - return rc == 0 ? domctl.u.address_size.size : rc; -} - -#include "xc_cpuid.h" -int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm, - uint32_t input, uint32_t oinput, - char *config[4], char *config_out[4]) -{ - int ret = -EBADF; -#ifdef XEN_DOMCTL_set_cpuid - DECLARE_DOMCTL(XEN_DOMCTL_set_cpuid, domid); - uint32_t regs[4], polregs[4]; - int i, j; - - xc_cpuid(input, oinput, regs); - memcpy(polregs, regs, sizeof(regs)); - do_cpuid_policy(xc, domid, hvm, input, polregs); - - for (i = 0; i < 4; i++) { - if (!config[i]) { - regs[i] = polregs[i]; - continue; - } - - for (j = 0; j < 32; j++) { - unsigned char val, polval; - - val = !!((regs[i] & (1U << (31 - j)))); - polval = !!((regs[i] & (1U << (31 - j)))); - - switch (config[i][j]) { - case ''1'': val = 1; break; /* force to true */ - case ''0'': val = 0; break; /* force to false */ - case ''x'': val = polval; break; - case ''k'': case ''s'': break; - default: - xc_error_dom_set(domid, "domain cpuid set: invalid config"); - ret = -EINVAL; - goto out; - } - - if (val) - set_bit(31 - j, regs[i]); - else - clear_bit(31 - j, regs[i]); - - if (config_out && config_out[i]) { - config_out[i][j] = (config[i][j] == ''s'') - ? ''0'' + val - : config[i][j]; - } - } - } - - domctl.u.cpuid.input[0] = input; - domctl.u.cpuid.input[1] = oinput; - domctl.u.cpuid.eax = regs[0]; - domctl.u.cpuid.ebx = regs[1]; - domctl.u.cpuid.ecx = regs[2]; - domctl.u.cpuid.edx = regs[3]; - ret = do_domctl(xc, &domctl); - if (ret) { - xc_error_dom_set(domid, "cpuid set"); - goto out; - } -out: -#endif - return ret; -} - -int xc_domain_cpuid_apply(int xc, unsigned int domid, int hvm) -{ - int ret = -EBADF; -#ifdef XEN_DOMCTL_set_cpuid - uint32_t regs[4], base_max, ext_max, eax, ecx; - - /* determinate cpuid range */ - xc_cpuid(0, 0, regs); - base_max = MIN(regs[0], DEF_MAX_BASE); - xc_cpuid(0x80000000, 0, regs); - ext_max = MIN(regs[0], DEF_MAX_EXT); - - eax = ecx = 0; - while (!(eax & 0x80000000) || (eax <= ext_max)) { - xc_cpuid(eax, ecx, regs); - - do_cpuid_policy(xc, domid, hvm, eax, regs); - - if (regs[0] || regs[1] || regs[2] || regs[3]) { - DECLARE_DOMCTL(XEN_DOMCTL_set_cpuid, domid); - - domctl.u.cpuid.input[0] = eax; - domctl.u.cpuid.input[1] = (eax == 4) ? ecx : XEN_CPUID_INPUT_UNUSED; - domctl.u.cpuid.eax = regs[0]; - domctl.u.cpuid.ebx = regs[1]; - domctl.u.cpuid.ecx = regs[2]; - domctl.u.cpuid.edx = regs[3]; - - ret = do_domctl(xc, &domctl); - if (ret) { - xc_error_dom_set(domid, "cpuid apply"); - goto out; - } - - /* we repeat when doing node 4 (cache descriptor leaves) increasing ecx - * until the cpuid eax value masked is 0 */ - if (eax == 4) { - ecx++; - if ((regs[0] & 0x1f) != 0) - continue; - ecx = 0; - } - } - - eax++; - if (!(eax & 0x80000000) && (eax > base_max)) - eax = 0x80000000; - } - ret = 0; -out: -#endif - return ret; -} - -/* - * return 1 on checking success - * 0 on checking failure - * -EINVAL if the config contains unknown character - */ -int xc_cpuid_check(uint32_t input, uint32_t optsubinput, - char *config[4], char *config_out[4]) -{ - int ret = -EBADF; -#ifdef XEN_DOMCTL_set_cpuid - uint32_t regs[4]; - int i, j; - - xc_cpuid(input, optsubinput, regs); - - ret = 1; - for (i = 0; i < 4; i++) { - if (!config[i]) - continue; - for (j = 0; j < 32; j++) { - unsigned char val; - - val = !!((regs[i] & (1U << (31 - j)))); - - switch (config[i][j]) { - case ''1'': if (!val) { ret = 0; goto out; }; break; - case ''0'': if (val) { ret = 0; goto out; }; break; - case ''x'': case ''s'': break; - default: - xc_error_set("cpuid check: invalid config"); - ret = -EINVAL; - goto out; - } - - if (config_out && config_out[i]) { - config_out[i][j] = (config[i][j] == ''s'') - ? ''0'' + val - : config[i][j]; - } - } - } -out: -#endif - 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) -{ - 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; - unsigned long value; - - ret = xc_get_hvm_param(handle, domid, HVM_PARAM_ACPI_S_STATE, &value); - if (ret != 0) - xc_error_dom_set(domid, "get acpi s-state"); - return value; -} diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_stubs.c --- a/tools/ocaml/libs/xc/xc_stubs.c Fri Sep 10 11:10:00 2010 +0100 +++ b/tools/ocaml/libs/xc/xc_stubs.c Fri Sep 10 11:10:02 2010 +0100 @@ -16,6 +16,7 @@ #define _XOPEN_SOURCE 600 #include <stdlib.h> +#include <errno.h> #define CAML_NAME_SPACE #include <caml/alloc.h> @@ -28,7 +29,7 @@ #include <stdint.h> #include <string.h> -#include "xc.h" +#include <xenctrl.h> #include "mmap_stubs.h" @@ -36,7 +37,7 @@ #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) -#define _H(__h) (Int_val(__h)) +#define _H(__h) ((xc_interface *)(__h)) #define _D(__d) ((uint32_t)Int_val(__d)) #define Val_none (Val_int(0)) @@ -50,12 +51,12 @@ i1 = (uint32_t) Int64_val(Field(input, 0)); \ i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0))); -/** - * Convert the given number of pages to an amount in MiB, rounded up. - */ +#define ERROR_STRLEN 256 void failwith_xc(void) { - caml_raise_with_string(*caml_named_value("xc.error"), xc_error_get()); + static char error_str[ERROR_STRLEN]; + snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno)); + caml_raise_with_string(*caml_named_value("xc.error"), error_str); } CAMLprim value stub_sizeof_core_header(value unit) @@ -101,11 +102,11 @@ CAMLprim value stub_marshall_core_header CAMLprim value stub_xc_interface_open(void) { - int handle; - handle = xc_interface_open(); - if (handle == -1) + xc_interface *xch; + xch = xc_interface_open(NULL, NULL, 0); + if (xch == NULL) failwith_xc(); - return Val_int(handle); + return (value)xch; } @@ -116,20 +117,15 @@ CAMLprim value stub_xc_interface_open_fa CAMLprim value stub_xc_using_injection(void) { - if (xc_using_injection ()){ - return Val_int(1); - } else { - return Val_int(0); - } + return Val_int(0); } -CAMLprim value stub_xc_interface_close(value xc_handle) +CAMLprim value stub_xc_interface_close(value xch) { - CAMLparam1(xc_handle); + CAMLparam1(xch); - int handle = _H(xc_handle); // caml_enter_blocking_section(); - xc_interface_close(handle); + xc_interface_close(_H(xch)); // caml_leave_blocking_section(); CAMLreturn(Val_unit); @@ -140,16 +136,15 @@ static int domain_create_flag_table[] = XEN_DOMCTL_CDF_hap, }; -CAMLprim value stub_xc_domain_create(value xc_handle, value ssidref, +CAMLprim value stub_xc_domain_create(value xch, value ssidref, value flags, value handle) { - CAMLparam4(xc_handle, ssidref, flags, handle); + CAMLparam4(xch, ssidref, flags, handle); uint32_t domid = 0; xen_domain_handle_t h = { 0 }; int result; int i; - int c_xc_handle = _H(xc_handle); uint32_t c_ssidref = Int32_val(ssidref); unsigned int c_flags = 0; value l; @@ -167,7 +162,7 @@ CAMLprim value stub_xc_domain_create(val } // caml_enter_blocking_section(); - result = xc_domain_create(c_xc_handle, c_ssidref, h, c_flags, &domid); + result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid); // caml_leave_blocking_section(); if (result < 0) @@ -176,37 +171,23 @@ CAMLprim value stub_xc_domain_create(val CAMLreturn(Val_int(domid)); } -CAMLprim value stub_xc_domain_setvmxassist(value xc_handle, value domid, - value use_vmxassist) +CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid, + value max_vcpus) { - CAMLparam3(xc_handle, domid, use_vmxassist); + CAMLparam3(xch, domid, max_vcpus); int r; - r = xc_domain_setvmxassist(_H(xc_handle), _D(domid), - Bool_val(use_vmxassist)); + r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus)); if (r) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_max_vcpus(value xc_handle, value domid, - value max_vcpus) + +value stub_xc_domain_sethandle(value xch, value domid, value handle) { - CAMLparam3(xc_handle, domid, max_vcpus); - int r; - - r = xc_domain_max_vcpus(_H(xc_handle), _D(domid), Int_val(max_vcpus)); - if (r) - failwith_xc(); - - CAMLreturn(Val_unit); -} - - -value stub_xc_domain_sethandle(value xc_handle, value domid, value handle) -{ - CAMLparam3(xc_handle, domid, handle); + CAMLparam3(xch, domid, handle); xen_domain_handle_t h = { 0 }; int i; @@ -217,55 +198,63 @@ value stub_xc_domain_sethandle(value xc_ h[i] = Int_val(Field(handle, i)) & 0xff; } - i = xc_domain_sethandle(_H(xc_handle), _D(domid), h); + i = xc_domain_sethandle(_H(xch), _D(domid), h); if (i) failwith_xc(); CAMLreturn(Val_unit); } -static value dom_op(value xc_handle, value domid, int (*fn)(int, uint32_t)) +static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t)) { - CAMLparam2(xc_handle, domid); + CAMLparam2(xch, domid); - int c_xc_handle = _H(xc_handle); uint32_t c_domid = _D(domid); // caml_enter_blocking_section(); - int result = fn(c_xc_handle, c_domid); + int result = fn(_H(xch), c_domid); // caml_leave_blocking_section(); if (result) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_pause(value xc_handle, value domid) +CAMLprim value stub_xc_domain_pause(value xch, value domid) { - return dom_op(xc_handle, domid, xc_domain_pause); + return dom_op(xch, domid, xc_domain_pause); } -CAMLprim value stub_xc_domain_unpause(value xc_handle, value domid) +CAMLprim value stub_xc_domain_unpause(value xch, value domid) { - return dom_op(xc_handle, domid, xc_domain_unpause); + return dom_op(xch, domid, xc_domain_unpause); } -CAMLprim value stub_xc_domain_destroy(value xc_handle, value domid) +CAMLprim value stub_xc_domain_destroy(value xch, value domid) { - return dom_op(xc_handle, domid, xc_domain_destroy); + return dom_op(xch, domid, xc_domain_destroy); } -CAMLprim value stub_xc_domain_resume_fast(value xc_handle, value domid) +CAMLprim value stub_xc_domain_resume_fast(value xch, value domid) { - return dom_op(xc_handle, domid, xc_domain_resume_fast); + 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(); + CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_shutdown(value handle, value domid, value reason) +CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason) { - CAMLparam3(handle, domid, reason); + CAMLparam3(xch, domid, reason); int ret; - ret = xc_domain_shutdown(_H(handle), _D(domid), Int_val(reason)); + ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason)); if (ret < 0) failwith_xc(); @@ -307,12 +296,12 @@ static value alloc_domaininfo(xc_domaini CAMLreturn(result); } -CAMLprim value stub_xc_domain_getinfolist(value xc_handle, value first_domain, value nb) +CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb) { - CAMLparam3(xc_handle, first_domain, nb); + CAMLparam3(xch, first_domain, nb); CAMLlocal2(result, temp); xc_domaininfo_t * info; - int i, ret, toalloc, c_xc_handle, retval; + int i, ret, toalloc, retval; unsigned int c_max_domains; uint32_t c_first_domain; @@ -324,11 +313,10 @@ CAMLprim value stub_xc_domain_getinfolis result = temp = Val_emptylist; - c_xc_handle = _H(xc_handle); c_first_domain = _D(first_domain); c_max_domains = Int_val(nb); // caml_enter_blocking_section(); - retval = xc_domain_getinfolist(c_xc_handle, c_first_domain, + retval = xc_domain_getinfolist(_H(xch), c_first_domain, c_max_domains, info); // caml_leave_blocking_section(); @@ -349,33 +337,34 @@ CAMLprim value stub_xc_domain_getinfolis CAMLreturn(result); } -CAMLprim value stub_xc_domain_getinfo(value xc_handle, value domid) +CAMLprim value stub_xc_domain_getinfo(value xch, value domid) { - CAMLparam2(xc_handle, domid); + CAMLparam2(xch, domid); CAMLlocal1(result); xc_domaininfo_t info; int ret; - ret = xc_domain_getinfo(_H(xc_handle), _D(domid), &info); + ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info); if (ret != 0) + failwith_xc(); + if (info.domain != _D(domid)) failwith_xc(); result = alloc_domaininfo(&info); CAMLreturn(result); } -CAMLprim value stub_xc_vcpu_getinfo(value xc_handle, value domid, value vcpu) +CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu) { - CAMLparam3(xc_handle, domid, vcpu); + CAMLparam3(xch, domid, vcpu); CAMLlocal1(result); xc_vcpuinfo_t info; int retval; - int c_xc_handle = _H(xc_handle); uint32_t c_domid = _D(domid); uint32_t c_vcpu = Int_val(vcpu); // caml_enter_blocking_section(); - retval = xc_vcpu_getinfo(c_xc_handle, c_domid, + retval = xc_vcpu_getinfo(_H(xch), c_domid, c_vcpu, &info); // caml_leave_blocking_section(); if (retval < 0) @@ -391,15 +380,15 @@ CAMLprim value stub_xc_vcpu_getinfo(valu CAMLreturn(result); } -CAMLprim value stub_xc_vcpu_context_get(value xc_handle, value domid, +CAMLprim value stub_xc_vcpu_context_get(value xch, value domid, value cpu) { - CAMLparam3(xc_handle, domid, cpu); + CAMLparam3(xch, domid, cpu); CAMLlocal1(context); int ret; vcpu_guest_context_any_t ctxt; - ret = xc_vcpu_getcontext(_H(xc_handle), _D(domid), Int_val(cpu), &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)); @@ -407,59 +396,60 @@ CAMLprim value stub_xc_vcpu_context_get( CAMLreturn(context); } -CAMLprim value stub_xc_vcpu_setaffinity(value xc_handle, value domid, +CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid, value vcpu, value cpumap) { - CAMLparam4(xc_handle, domid, vcpu, cpumap); + CAMLparam4(xch, domid, vcpu, cpumap); uint64_t c_cpumap; int retval; c_cpumap = Int64_val(cpumap); - retval = xc_vcpu_setaffinity(_H(xc_handle), _D(domid), - Int_val(vcpu), c_cpumap); + retval = xc_vcpu_setaffinity(_H(xch), _D(domid), + Int_val(vcpu), + &c_cpumap, sizeof(c_cpumap)); if (retval < 0) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_vcpu_getaffinity(value xc_handle, value domid, +CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid, value vcpu) { - CAMLparam3(xc_handle, domid, vcpu); + CAMLparam3(xch, domid, vcpu); CAMLlocal1(ret); uint64_t cpumap; int retval; - retval = xc_vcpu_getaffinity(_H(xc_handle), _D(domid), - Int_val(vcpu), &cpumap); + retval = xc_vcpu_getaffinity(_H(xch), _D(domid), + Int_val(vcpu), + &cpumap, sizeof(cpumap)); if (retval < 0) failwith_xc(); ret = caml_copy_int64(cpumap); CAMLreturn(ret); } -CAMLprim value stub_xc_sched_id(value xc_handle) +CAMLprim value stub_xc_sched_id(value xch) { - CAMLparam1(xc_handle); + CAMLparam1(xch); int sched_id; - if (xc_sched_id(_H(xc_handle), &sched_id)) + if (xc_sched_id(_H(xch), &sched_id)) failwith_xc(); CAMLreturn(Val_int(sched_id)); } -CAMLprim value stub_xc_evtchn_alloc_unbound(value xc_handle, +CAMLprim value stub_xc_evtchn_alloc_unbound(value xch, value local_domid, value remote_domid) { - CAMLparam3(xc_handle, local_domid, remote_domid); + CAMLparam3(xch, local_domid, remote_domid); - int c_xc_handle = _H(xc_handle); 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(c_xc_handle, c_local_domid, + int result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid, c_remote_domid); // caml_leave_blocking_section(); @@ -483,16 +473,15 @@ CAMLprim value stub_xc_evtchn_reset(valu #define RING_SIZE 32768 static char ring[RING_SIZE]; -CAMLprim value stub_xc_readconsolering(value xc_handle) +CAMLprim value stub_xc_readconsolering(value xch) { unsigned int size = RING_SIZE; char *ring_ptr = ring; - CAMLparam1(xc_handle); - int c_xc_handle = _H(xc_handle); + CAMLparam1(xch); // caml_enter_blocking_section(); - int retval = xc_readconsolering(c_xc_handle, &ring_ptr, &size, 0); + int retval = xc_readconsolering(_H(xch), &ring_ptr, &size, 0, 0, NULL); // caml_leave_blocking_section(); if (retval) @@ -501,26 +490,26 @@ CAMLprim value stub_xc_readconsolering(v CAMLreturn(caml_copy_string(ring)); } -CAMLprim value stub_xc_send_debug_keys(value xc_handle, value keys) +CAMLprim value stub_xc_send_debug_keys(value xch, value keys) { - CAMLparam2(xc_handle, keys); + CAMLparam2(xch, keys); int r; - r = xc_send_debug_keys(_H(xc_handle), String_val(keys)); + r = xc_send_debug_keys(_H(xch), String_val(keys)); if (r) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_physinfo(value xc_handle) +CAMLprim value stub_xc_physinfo(value xch) { - CAMLparam1(xc_handle); + CAMLparam1(xch); CAMLlocal3(physinfo, cap_list, tmp); xc_physinfo_t c_physinfo; int r; // caml_enter_blocking_section(); - r = xc_physinfo(_H(xc_handle), &c_physinfo); + r = xc_physinfo(_H(xch), &c_physinfo); // caml_leave_blocking_section(); if (r) @@ -550,11 +539,11 @@ CAMLprim value stub_xc_physinfo(value xc CAMLreturn(physinfo); } -CAMLprim value stub_xc_pcpu_info(value xc_handle, value nr_cpus) +CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus) { - CAMLparam2(xc_handle, nr_cpus); + CAMLparam2(xch, nr_cpus); CAMLlocal2(pcpus, v); - xen_sysctl_cpuinfo_t *info; + xc_cpuinfo_t *info; int r, size; if (Int_val(nr_cpus) < 1) @@ -565,7 +554,7 @@ CAMLprim value stub_xc_pcpu_info(value x caml_raise_out_of_memory(); // caml_enter_blocking_section(); - r = xc_pcpu_info(_H(xc_handle), Int_val(nr_cpus), info, &size); + r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size); // caml_leave_blocking_section(); if (r) { @@ -586,16 +575,15 @@ CAMLprim value stub_xc_pcpu_info(value x CAMLreturn(pcpus); } -CAMLprim value stub_xc_domain_setmaxmem(value xc_handle, value domid, +CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid, value max_memkb) { - CAMLparam3(xc_handle, domid, max_memkb); + CAMLparam3(xch, domid, max_memkb); - int c_xc_handle = _H(xc_handle); uint32_t c_domid = _D(domid); unsigned int c_max_memkb = Int64_val(max_memkb); // caml_enter_blocking_section(); - int retval = xc_domain_setmaxmem(c_xc_handle, c_domid, + int retval = xc_domain_setmaxmem(_H(xch), c_domid, c_max_memkb); // caml_leave_blocking_section(); if (retval) @@ -603,33 +591,32 @@ CAMLprim value stub_xc_domain_setmaxmem( CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_set_memmap_limit(value xc_handle, value domid, +CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid, value map_limitkb) { - CAMLparam3(xc_handle, domid, map_limitkb); + CAMLparam3(xch, domid, map_limitkb); unsigned long v; int retval; v = Int64_val(map_limitkb); - retval = xc_domain_set_memmap_limit(_H(xc_handle), _D(domid), v); + retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v); if (retval) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_memory_increase_reservation(value xc_handle, +CAMLprim value stub_xc_domain_memory_increase_reservation(value xch, value domid, value mem_kb) { - CAMLparam3(xc_handle, domid, mem_kb); + CAMLparam3(xch, domid, mem_kb); unsigned long nr_extents = ((unsigned long)(Int64_val(mem_kb))) >> (PAGE_SHIFT - 10); - int c_xc_handle = _H(xc_handle); uint32_t c_domid = _D(domid); // caml_enter_blocking_section(); - int retval = xc_domain_memory_increase_reservation(c_xc_handle, c_domid, + int retval = xc_domain_memory_increase_reservation(_H(xch), c_domid, nr_extents, 0, 0, NULL); // caml_leave_blocking_section(); @@ -638,49 +625,48 @@ CAMLprim value stub_xc_domain_memory_inc CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_set_machine_address_size(value xc_handle, +CAMLprim value stub_xc_domain_set_machine_address_size(value xch, value domid, value width) { - CAMLparam3(xc_handle, domid, width); - int c_xc_handle = _H(xc_handle); + CAMLparam3(xch, domid, width); uint32_t c_domid = _D(domid); int c_width = Int_val(width); - int retval = xc_domain_set_machine_address_size(c_xc_handle, c_domid, c_width); + int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width); if (retval) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_get_machine_address_size(value xc_handle, +CAMLprim value stub_xc_domain_get_machine_address_size(value xch, value domid) { - CAMLparam2(xc_handle, domid); + CAMLparam2(xch, domid); int retval; - retval = xc_domain_get_machine_address_size(_H(xc_handle), _D(domid)); + retval = xc_domain_get_machine_address_size(_H(xch), _D(domid)); if (retval < 0) failwith_xc(); CAMLreturn(Val_int(retval)); } -CAMLprim value stub_xc_domain_cpuid_set(value xc_handle, value domid, - value is_hvm, value input, +CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid, + value input, value config) { - CAMLparam5(xc_handle, domid, is_hvm, input, config); + CAMLparam4(xch, domid, input, config); CAMLlocal2(array, tmp); int r; + unsigned int c_input[2]; char *c_config[4], *out_config[4]; - uint32_t c_input, c_oinput; 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, c_oinput, input); + cpuid_input_of_val(c_input[0], c_input[1], input); array = caml_alloc(4, 0); for (r = 0; r < 4; r++) { @@ -695,29 +681,30 @@ CAMLprim value stub_xc_domain_cpuid_set( for (r = 0; r < 4; r++) out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL; - r = xc_domain_cpuid_set(_H(xc_handle), _D(domid), Bool_val(is_hvm), - c_input, c_oinput, c_config, out_config); + r = xc_cpuid_set(_H(xch), _D(domid), + c_input, (const char **)c_config, out_config); if (r < 0) failwith_xc(); CAMLreturn(array); } -CAMLprim value stub_xc_domain_cpuid_apply(value xc_handle, value domid, value is_hvm) +CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid) { - CAMLparam3(xc_handle, domid, is_hvm); + CAMLparam2(xch, domid); int r; - r = xc_domain_cpuid_apply(_H(xc_handle), _D(domid), Bool_val(is_hvm)); + + r = xc_cpuid_apply_policy(_H(xch), _D(domid)); if (r < 0) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_cpuid_check(value input, value config) +CAMLprim value stub_xc_cpuid_check(value xch, value input, value config) { - CAMLparam2(input, config); + CAMLparam3(xch, input, config); CAMLlocal3(ret, array, tmp); int r; - uint32_t c_input, c_oinput; + unsigned int c_input[2]; char *c_config[4], *out_config[4]; c_config[0] = string_of_option_array(config, 0); @@ -725,7 +712,7 @@ CAMLprim value stub_xc_cpuid_check(value c_config[2] = string_of_option_array(config, 2); c_config[3] = string_of_option_array(config, 3); - cpuid_input_of_val(c_input, c_oinput, input); + cpuid_input_of_val(c_input[0], c_input[1], input); array = caml_alloc(4, 0); for (r = 0; r < 4; r++) { @@ -740,7 +727,7 @@ CAMLprim value stub_xc_cpuid_check(value for (r = 0; r < 4; r++) out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL; - r = xc_cpuid_check(c_input, c_oinput, c_config, out_config); + r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config); if (r < 0) failwith_xc(); @@ -751,18 +738,17 @@ CAMLprim value stub_xc_cpuid_check(value CAMLreturn(ret); } -CAMLprim value stub_xc_version_version(value xc_handle) +CAMLprim value stub_xc_version_version(value xch) { - CAMLparam1(xc_handle); + CAMLparam1(xch); CAMLlocal1(result); xen_extraversion_t extra; long packed; int retval; - int c_xc_handle = _H(xc_handle); // caml_enter_blocking_section(); - packed = xc_version(c_xc_handle, XENVER_version, NULL); - retval = xc_version(c_xc_handle, XENVER_extraversion, &extra); + packed = xc_version(_H(xch), XENVER_version, NULL); + retval = xc_version(_H(xch), XENVER_extraversion, &extra); // caml_leave_blocking_section(); if (retval) @@ -778,16 +764,15 @@ CAMLprim value stub_xc_version_version(v } -CAMLprim value stub_xc_version_compile_info(value xc_handle) +CAMLprim value stub_xc_version_compile_info(value xch) { - CAMLparam1(xc_handle); + CAMLparam1(xch); CAMLlocal1(result); xen_compile_info_t ci; int retval; - int c_xc_handle = _H(xc_handle); // caml_enter_blocking_section(); - retval = xc_version(c_xc_handle, XENVER_compile_info, &ci); + retval = xc_version(_H(xch), XENVER_compile_info, &ci); // caml_leave_blocking_section(); if (retval) @@ -804,14 +789,13 @@ CAMLprim value stub_xc_version_compile_i } -static value xc_version_single_string(value xc_handle, int code, void *info) +static value xc_version_single_string(value xch, int code, void *info) { - CAMLparam1(xc_handle); + CAMLparam1(xch); int retval; - int c_xc_handle = _H(xc_handle); // caml_enter_blocking_section(); - retval = xc_version(c_xc_handle, code, info); + retval = xc_version(_H(xch), code, info); // caml_leave_blocking_section(); if (retval) @@ -821,19 +805,19 @@ static value xc_version_single_string(va } -CAMLprim value stub_xc_version_changeset(value xc_handle) +CAMLprim value stub_xc_version_changeset(value xch) { xen_changeset_info_t ci; - return xc_version_single_string(xc_handle, XENVER_changeset, &ci); + return xc_version_single_string(xch, XENVER_changeset, &ci); } -CAMLprim value stub_xc_version_capabilities(value xc_handle) +CAMLprim value stub_xc_version_capabilities(value xch) { xen_capabilities_info_t ci; - return xc_version_single_string(xc_handle, XENVER_capabilities, &ci); + return xc_version_single_string(xch, XENVER_capabilities, &ci); } @@ -845,13 +829,12 @@ CAMLprim value stub_pages_to_kib(value p } -CAMLprim value stub_map_foreign_range(value xc_handle, value dom, +CAMLprim value stub_map_foreign_range(value xch, value dom, value size, value mfn) { - CAMLparam4(xc_handle, dom, size, mfn); + CAMLparam4(xch, dom, size, mfn); CAMLlocal1(result); struct mmap_interface *intf; - int c_xc_handle; uint32_t c_dom; unsigned long c_mfn; @@ -860,11 +843,10 @@ CAMLprim value stub_map_foreign_range(va intf->len = Int_val(size); - c_xc_handle = _H(xc_handle); c_dom = _D(dom); c_mfn = Nativeint_val(mfn); // caml_enter_blocking_section(); - intf->addr = xc_map_foreign_range(c_xc_handle, c_dom, + intf->addr = xc_map_foreign_range(_H(xch), c_dom, intf->len, PROT_READ|PROT_WRITE, c_mfn); // caml_leave_blocking_section(); @@ -873,15 +855,15 @@ CAMLprim value stub_map_foreign_range(va CAMLreturn(result); } -CAMLprim value stub_sched_credit_domain_get(value xc_handle, value domid) +CAMLprim value stub_sched_credit_domain_get(value xch, value domid) { - CAMLparam2(xc_handle, 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(xc_handle), _D(domid), &c_sdom); + ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom); // caml_leave_blocking_section(); if (ret != 0) failwith_xc(); @@ -893,17 +875,17 @@ CAMLprim value stub_sched_credit_domain_ CAMLreturn(sdom); } -CAMLprim value stub_sched_credit_domain_set(value xc_handle, value domid, +CAMLprim value stub_sched_credit_domain_set(value xch, value domid, value sdom) { - CAMLparam3(xc_handle, domid, 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(xc_handle), _D(domid), &c_sdom); + ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom); // caml_leave_blocking_section(); if (ret != 0) failwith_xc(); @@ -911,15 +893,17 @@ CAMLprim value stub_sched_credit_domain_ CAMLreturn(Val_unit); } -CAMLprim value stub_shadow_allocation_get(value xc_handle, value domid) +CAMLprim value stub_shadow_allocation_get(value xch, value domid) { - CAMLparam2(xc_handle, domid); + CAMLparam2(xch, domid); CAMLlocal1(mb); - uint32_t c_mb; + unsigned long c_mb; int ret; // caml_enter_blocking_section(); - ret = xc_shadow_allocation_get(_H(xc_handle), _D(domid), &c_mb); + 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(); @@ -928,16 +912,18 @@ CAMLprim value stub_shadow_allocation_ge CAMLreturn(mb); } -CAMLprim value stub_shadow_allocation_set(value xc_handle, value domid, +CAMLprim value stub_shadow_allocation_set(value xch, value domid, value mb) { - CAMLparam3(xc_handle, domid, mb); - uint32_t c_mb; + CAMLparam3(xch, domid, mb); + unsigned long c_mb; int ret; c_mb = Int_val(mb); // caml_enter_blocking_section(); - ret = xc_shadow_allocation_set(_H(xc_handle), _D(domid), c_mb); + 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(); @@ -945,10 +931,10 @@ CAMLprim value stub_shadow_allocation_se CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_get_pfn_list(value xc_handle, value domid, +CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid, value nr_pfns) { - CAMLparam3(xc_handle, domid, nr_pfns); + CAMLparam3(xch, domid, nr_pfns); CAMLlocal2(array, v); unsigned long c_nr_pfns; long ret, i; @@ -960,8 +946,8 @@ CAMLprim value stub_xc_domain_get_pfn_li if (!c_array) caml_raise_out_of_memory(); - ret = xc_domain_get_pfn_list(_H(xc_handle), _D(domid), - c_array, c_nr_pfns); + ret = xc_get_pfn_list(_H(xch), _D(domid), + c_array, c_nr_pfns); if (ret < 0) { free(c_array); failwith_xc(); @@ -977,11 +963,11 @@ CAMLprim value stub_xc_domain_get_pfn_li CAMLreturn(array); } -CAMLprim value stub_xc_domain_ioport_permission(value xc_handle, value domid, +CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid, value start_port, value nr_ports, value allow) { - CAMLparam5(xc_handle, domid, start_port, nr_ports, allow); + CAMLparam5(xch, domid, start_port, nr_ports, allow); uint32_t c_start_port, c_nr_ports; uint8_t c_allow; int ret; @@ -990,7 +976,7 @@ CAMLprim value stub_xc_domain_ioport_per c_nr_ports = Int_val(nr_ports); c_allow = Bool_val(allow); - ret = xc_domain_ioport_permission(_H(xc_handle), _D(domid), + ret = xc_domain_ioport_permission(_H(xch), _D(domid), c_start_port, c_nr_ports, c_allow); if (ret < 0) failwith_xc(); @@ -998,11 +984,11 @@ CAMLprim value stub_xc_domain_ioport_per CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_iomem_permission(value xc_handle, value domid, +CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid, value start_pfn, value nr_pfns, value allow) { - CAMLparam5(xc_handle, domid, start_pfn, nr_pfns, allow); + CAMLparam5(xch, domid, start_pfn, nr_pfns, allow); unsigned long c_start_pfn, c_nr_pfns; uint8_t c_allow; int ret; @@ -1011,7 +997,7 @@ CAMLprim value stub_xc_domain_iomem_perm c_nr_pfns = Nativeint_val(nr_pfns); c_allow = Bool_val(allow); - ret = xc_domain_iomem_permission(_H(xc_handle), _D(domid), + ret = xc_domain_iomem_permission(_H(xch), _D(domid), c_start_pfn, c_nr_pfns, c_allow); if (ret < 0) failwith_xc(); @@ -1019,10 +1005,10 @@ CAMLprim value stub_xc_domain_iomem_perm CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_irq_permission(value xc_handle, value domid, +CAMLprim value stub_xc_domain_irq_permission(value xch, value domid, value pirq, value allow) { - CAMLparam4(xc_handle, domid, pirq, allow); + CAMLparam4(xch, domid, pirq, allow); uint8_t c_pirq; uint8_t c_allow; int ret; @@ -1030,7 +1016,7 @@ CAMLprim value stub_xc_domain_irq_permis c_pirq = Int_val(pirq); c_allow = Bool_val(allow); - ret = xc_domain_irq_permission(_H(xc_handle), _D(domid), + ret = xc_domain_irq_permission(_H(xch), _D(domid), c_pirq, c_allow); if (ret < 0) failwith_xc(); @@ -1038,97 +1024,68 @@ CAMLprim value stub_xc_domain_irq_permis CAMLreturn(Val_unit); } -CAMLprim value stub_xc_hvm_check_pvdriver(value xc_handle, value domid) +static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func) { - CAMLparam2(xc_handle, domid); - int ret; - - ret = xc_hvm_check_pvdriver(_H(xc_handle), _D(domid)); - if (ret < 0) - failwith_xc(); - CAMLreturn(Val_bool(ret)); + 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 xc_handle, value domid, value desc) +CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc) { - CAMLparam3(xc_handle, domid, 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_domain_test_assign_device(_H(xc_handle), _D(domid), - 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 xc_handle, value domid, value desc) +CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc) { - CAMLparam3(xc_handle, domid, 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_domain_assign_device(_H(xc_handle), _D(domid), - domain, bus, slot, func); + ret = xc_assign_device(_H(xch), _D(domid), bdf); + if (ret < 0) failwith_xc(); CAMLreturn(Val_unit); } -CAMLprim value stub_xc_domain_deassign_device(value xc_handle, value domid, value desc) +CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc) { - CAMLparam3(xc_handle, domid, 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_domain_deassign_device(_H(xc_handle), _D(domid), - domain, bus, slot, func); - if (ret < 0) - failwith_xc(); - CAMLreturn(Val_unit); -} + ret = xc_deassign_device(_H(xch), _D(domid), bdf); -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); @@ -1140,26 +1097,7 @@ CAMLprim value stub_xc_watchdog(value ha int ret; unsigned int c_timeout = Int32_val(timeout); - ret = xc_domain_watchdog(_H(handle), _D(domid), c_timeout); - if (ret < 0) - failwith_xc(); - - CAMLreturn(Val_int(ret)); -} - -CAMLprim value stub_xc_domain_send_s3resume(value handle, value domid) -{ - CAMLparam2(handle, domid); - xc_domain_send_s3resume(_H(handle), _D(domid)); - CAMLreturn(Val_unit); -} - -CAMLprim value stub_xc_domain_get_acpi_s_state(value handle, value domid) -{ - CAMLparam2(handle, domid); - int ret; - - ret = xc_domain_get_acpi_s_state(_H(handle), _D(domid)); + ret = xc_watchdog(_H(handle), _D(domid), c_timeout); if (ret < 0) failwith_xc(); diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/xenstored/Makefile --- a/tools/ocaml/xenstored/Makefile Fri Sep 10 11:10:00 2010 +0100 +++ b/tools/ocaml/xenstored/Makefile Fri Sep 10 11:10:02 2010 +0100 @@ -39,7 +39,8 @@ XENSTOREDLIBS = \ -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/xb $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \ + -ccopt -L -ccopt $(XEN_ROOT)/tools/libxc PROGRAMS = oxenstored _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2010-Sep-10 10:33 UTC
Re: [Xen-devel] [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
On Fri, 2010-09-10 at 11:10 +0100, Ian Campbell wrote:> I was however able to confirm that oxenstored still worked.I did need this small patch though, because xenstore-read / fails on an oxenstored with a fresh database. Doing xenstore-write / "" makes the xenstore-read work. I suspect this would be better solved on the oxenstored side, but I couldn''t figure out how or where. It wasn''t as simple as duplicating the fragment of ml which creates /local in an empty DB using / instead ;-) Ian. diff -r 635270fe858b -r 8a710e0eb088 tools/hotplug/Linux/init.d/xencommons --- a/tools/hotplug/Linux/init.d/xencommons Fri Sep 10 11:09:10 2010 +0100 +++ b/tools/hotplug/Linux/init.d/xencommons Fri Sep 10 11:10:00 2010 +0100 @@ -44,17 +44,22 @@ do_start () { [ ! -d $i ] || rmdir $i done - if ! `xenstore-read -s / >/dev/null 2>&1` + if ! `xenstore-read -s /local >/dev/null 2>&1` then test -z "$XENSTORED_ROOTDIR" || XENSTORED_ROOTDIR="/var/lib/xenstored" rm -f "$XENSTORED_ROOTDIR"/tdb* &>/dev/null test -z "$XENSTORED_TRACE" || XENSTORED_ARGS=" -T /var/log/xen/xenstored-trace.log" - echo -n Starting xenstored... - xenstored --pid-file=/var/run/xenstore.pid $XENSTORED_ARGS + if [ -e /usr/sbin/oxenstored ] ; then + echo -n Starting oxenstored... + oxenstored --pid-file /var/run/xenstore.pid $XENSTORED_ARGS + else + echo -n Starting xenstored... + xenstored --pid-file /var/run/xenstore.pid $XENSTORED_ARGS + fi # Wait for xenstored to actually come up, timing out after 30 seconds - while [ $time -lt $timeout ] && ! `xenstore-read -s / >/dev/null 2>&1` ; do + while [ $time -lt $timeout ] && ! `xenstore-read -s /local >/dev/null 2>&1` ; do echo -n . time=$(($time+1)) sleep 1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Vincent Hanquez
2010-Sep-10 15:23 UTC
[Xen-devel] Re: [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
On 10/09/10 11:10, Ian Campbell wrote:> # HG changeset patch > # User Ian Campbell<ian.campbell@citrix.com> > # Date 1284113402 -3600 > # Node ID c2610f86abfb2c34a5a653dea29d5518fb355628 > # Parent 8a710e0eb0881cad6156500bd4cedcebc7824a18 > ocaml: xc bindings: use libxenctrl and libxenguest > > Now that tools/libxc is licensed under LGPL I don''t think there is any > need for an LGPL reimplementation under tools/ocaml. > > For the most part the conversion to the up-to-date libxc API (xc_lib.c > essentially implemented the same interface as an older libxc) was > pretty automatic. There are some functions which appear to no longer > exist in libxc which I therefore simply removed the bindings for and a > small number of interfaces which had changed. > > Many of the functions bound by the stubs have no in-tree users (which > I think is fine for a language binding) so I have no way to confirm > correctness other than by eye. I was however able to confirm that > oxenstored still worked. >I can''t say, i''m particularly thrilled by this patch. on one hand, it renders oxenstored runnable on netbsd for example and merge libxc into one. on the other hand, it''s a pretty big change and done only "one-sidedly": - lose the logging improvement over libxenctrl version. - some bindings get lost, need to adapt all clients. - introduce pthread functions in the ocaml stack, which as discussed in the past, might be a dealkiller, but unfortunately very hard to test. - almost completely not tested patch. oxenstored won''t be affected much by all this, since it''s using only a tiny part of xc, but i suspect it might be a big deal for XCP and such, and thus i wonder if XCP is going to use this version of xc (which was the goal when merging those libraries alongside oxenstored). it would probably be easier to test this in XCP first, since there''s a comprehensive test suite there. -- Vincent _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Vincent Hanquez
2010-Sep-10 15:53 UTC
Re: [Xen-devel] [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
On 10/09/10 11:33, Ian Campbell wrote:> On Fri, 2010-09-10 at 11:10 +0100, Ian Campbell wrote: > >> I was however able to confirm that oxenstored still worked. >> > I did need this small patch though, because > xenstore-read / > fails on an oxenstored with a fresh database. Doing > xenstore-write / "" > makes the xenstore-read work. I suspect this would be better solved on > the oxenstored side, but I couldn''t figure out how or where. It wasn''t > as simple as duplicating the fragment of ml which creates /local in an > empty DB using / instead ;-) >looks like a bug in the read function. i''ll send a patch. -- Vincent _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2010-Sep-10 16:48 UTC
[Xen-devel] Re: [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
On Fri, 2010-09-10 at 16:23 +0100, Vincent Hanquez wrote:> On 10/09/10 11:10, Ian Campbell wrote: > > # HG changeset patch > > # User Ian Campbell<ian.campbell@citrix.com> > > # Date 1284113402 -3600 > > # Node ID c2610f86abfb2c34a5a653dea29d5518fb355628 > > # Parent 8a710e0eb0881cad6156500bd4cedcebc7824a18 > > ocaml: xc bindings: use libxenctrl and libxenguest > > > > Now that tools/libxc is licensed under LGPL I don''t think there is any > > need for an LGPL reimplementation under tools/ocaml. > > > > For the most part the conversion to the up-to-date libxc API (xc_lib.c > > essentially implemented the same interface as an older libxc) was > > pretty automatic. There are some functions which appear to no longer > > exist in libxc which I therefore simply removed the bindings for and a > > small number of interfaces which had changed. > > > > Many of the functions bound by the stubs have no in-tree users (which > > I think is fine for a language binding) so I have no way to confirm > > correctness other than by eye. I was however able to confirm that > > oxenstored still worked. > > > I can''t say, i''m particularly thrilled by this patch. > > on one hand, it renders oxenstored runnable on netbsd for example and > merge libxc into one. > on the other hand, it''s a pretty big change and done only "one-sidedly": > > - lose the logging improvement over libxenctrl version.libxenctrl has infrastructure to record and retrieve the last error -- it could perhaps with being more widely/consistently used. This would be a good project for someone. I don''t think maintaining a fork of a library just to improve logging is worthwhile though.> - some bindings get lost, need to adapt all clients.These looked to me like they should be replaced by libxl bindings anyway. e.g. the s3 event stuff, timer stuff etc. I don''t think the ocaml binding to libxc needs to have any more API stability guarantee than the underlying C library (which is very little). Also the version which is in the Xen source tree doesn''t need to maintain source compatibility with previous Xen releases (e.g. this patch removes an interface around XEN_DOMCTL_setvmxassist which no longer exists), we don''t do this for the C library either.> - introduce pthread functions in the ocaml stack, which as discussed in > the past, might be a dealkiller, but unfortunately very hard to test.The hypercall buffer patchset which I am working on removes one of the two uses of pthreads in libxc. The other case uses the pthread_key stuff to provide a threadsafe strerror for use by error logging (which perhaps ties into your first comment). I''ve no idea why this code doesn''t just use strerror_r. ... OK, so, reading the hg history it looks like using strerror_r was made difficult (in 2006) by an incompatible GNU version of strerror_r which didn''t have the same prototype nor semantics as the POSIX specified strerror_r. I''m not sure we need to care about that anymore, it seems to have been fixed in glibc 2.4 (For comparison Debian Lenny has 2.7) so I think we could consider switching back to just plain strerror_r at this point which would completely remove pthreads from libxc.> - almost completely not tested patch. > > oxenstored won''t be affected much by all this, since it''s using only a > tiny part of xc, but i suspect it might be a big deal for XCP and such, > and thus i wonder if XCP is going to use this version of xc (which was > the goal when merging those libraries alongside oxenstored). it would > probably be easier to test this in XCP first, since there''s a > comprehensive test suite there.Hmm. perhaps. I think we could switch xen-unstable over now and then whenever XCP updates to a new enough Xen and moves over to using this version of the bindings deal with any problems there (to be honest I expect that issues arising from this particular change will be a small fraction of the work required to make that transition). Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2010-Sep-10 17:22 UTC
[Xen-devel] Re: [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
Ian Campbell writes ("[Xen-devel] Re: [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest"):> libxenctrl has infrastructure to record and retrieve the last error -- > it could perhaps with being more widely/consistently used. This would be > a good project for someone.More, since the interface change, it has the facility to call back to the application for logging. There should no longer be any direct printfs to FILE*s etc. So you can do whatever you like.> I''m not sure we need to care about that anymore, it seems to have been > fixed in glibc 2.4 (For comparison Debian Lenny has 2.7) so I think we > could consider switching back to just plain strerror_r at this point > which would completely remove pthreads from libxc.Yes.> I think we could switch xen-unstable over now and then whenever XCP > updates to a new enough Xen and moves over to using this version of the > bindings deal with any problems there (to be honest I expect that issues > arising from this particular change will be a small fraction of the work > required to make that transition).Yes. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Vincent Hanquez
2010-Sep-14 10:26 UTC
[Xen-devel] Re: [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
On 10/09/10 17:48, Ian Campbell wrote:> I think we could switch xen-unstable over now and then whenever XCP > updates to a new enough Xen and moves over to using this version of the > bindings deal with any problems there (to be honest I expect that issues > arising from this particular change will be a small fraction of the work > required to make that transition).Actually, I realised now, that XCP will keep its xc module anyway since the xc version in xen-unstable didn''t have everything that XCP requires in the first place (simulation/injection layer). -- Vincent _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Stefano Stabellini
2010-Oct-01 16:26 UTC
Re: [Xen-devel] [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
this patch doesn''t apply anymore, could you please rebase and resend? On Fri, 10 Sep 2010, Ian Campbell wrote:> # HG changeset patch > # User Ian Campbell <ian.campbell@citrix.com> > # Date 1284113402 -3600 > # Node ID c2610f86abfb2c34a5a653dea29d5518fb355628 > # Parent 8a710e0eb0881cad6156500bd4cedcebc7824a18 > ocaml: xc bindings: use libxenctrl and libxenguest > > Now that tools/libxc is licensed under LGPL I don''t think there is any > need for an LGPL reimplementation under tools/ocaml. > > For the most part the conversion to the up-to-date libxc API (xc_lib.c > essentially implemented the same interface as an older libxc) was > pretty automatic. There are some functions which appear to no longer > exist in libxc which I therefore simply removed the bindings for and a > small number of interfaces which had changed. > > Many of the functions bound by the stubs have no in-tree users (which > I think is fine for a language binding) so I have no way to confirm > correctness other than by eye. I was however able to confirm that > oxenstored still worked. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > Cc: Vincent Hanquez <Vincent.Hanquez@eu.citrix.com> > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/Makefile.rules > --- a/tools/ocaml/Makefile.rules Fri Sep 10 11:10:00 2010 +0100 > +++ b/tools/ocaml/Makefile.rules Fri Sep 10 11:10:02 2010 +0100 > @@ -54,18 +54,18 @@ mk-caml-lib-bytecode = $(call quiet-comm > > mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1) > mk-caml-lib-stubs = \ > - $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e ''s/^lib//''` $2,MKLIB,$1) > + $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e ''s/^lib//''` $3 $2,MKLIB,$1) > > # define a library target <name>.cmxa and <name>.cma > define OCAML_LIBRARY_template > $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx) > - $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs, $(foreach obj,$($(1)_OBJS),$(obj).cmx)) > + $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx)) > $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) > $(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+) > $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o) > $(call mk-caml-stubs,$$@, $$+) > lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o) > - $(call mk-caml-lib-stubs,$$@, $$+) > + $(call mk-caml-lib-stubs,$$@, $$+, $(LIBS_$(1))) > endef > > define OCAML_NOC_LIBRARY_template > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/Makefile > --- a/tools/ocaml/libs/xc/Makefile Fri Sep 10 11:10:00 2010 +0100 > +++ b/tools/ocaml/libs/xc/Makefile Fri Sep 10 11:10:02 2010 +0100 > @@ -2,15 +2,17 @@ XEN_ROOT=$(TOPLEVEL)/../.. > XEN_ROOT=$(TOPLEVEL)/../.. > include $(TOPLEVEL)/common.make > > -CFLAGS += -I../mmap -I./ > -OCAMLINCLUDE += -I ../mmap -I ../uuid > +CFLAGS += -I../mmap -I./ -I$(XEN_ROOT)/tools/libxc > +OCAMLINCLUDE += -I ../mmap -I ../uuid -I $(XEN_ROOT)/tools/libxc > > OBJS = xc > INTF = xc.cmi > LIBS = xc.cma xc.cmxa > > +LIBS_xc = -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest > + > xc_OBJS = $(OBJS) > -xc_C_OBJS = xc_lib xc_stubs > +xc_C_OBJS = xc_stubs > > OCAML_LIBRARY = xc > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.h > --- a/tools/ocaml/libs/xc/xc.h Fri Sep 10 11:10:00 2010 +0100 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,186 +0,0 @@ > -/* > - * Copyright (C) 2006-2007 XenSource Ltd. > - * Copyright (C) 2008 Citrix Ltd. > - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com> > - * > - * 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 <xen/xen.h> > -#include <xen/memory.h> > -#include <xen/sysctl.h> > -#include <xen/domctl.h> > -#include <xen/sched.h> > -#include <xen/sysctl.h> > -#include <xen/sys/privcmd.h> > -#include <xen/version.h> > -#include <xen/foreign/x86_32.h> > -#include <xen/foreign/x86_64.h> > -#include <xen/hvm/params.h> > -#include "xc_e820.h" > - > -typedef xen_domctl_getdomaininfo_t xc_domaininfo_t; > -typedef xen_domctl_getvcpuinfo_t xc_vcpuinfo_t; > -typedef xen_sysctl_physinfo_t xc_physinfo_t; > - > -struct xc_core_header { > - unsigned int xch_magic; > - unsigned int xch_nr_vcpus; > - unsigned int xch_nr_pages; > - unsigned int xch_ctxt_offset; > - unsigned int xch_index_offset; > - unsigned int xch_pages_offset; > -}; > - > -typedef union { > -#if defined(__i386__) || defined(__x86_64__) > - vcpu_guest_context_x86_64_t x64; > - vcpu_guest_context_x86_32_t x32; > -#endif > - vcpu_guest_context_t c; > -} vcpu_guest_context_any_t; > - > -char * xc_error_get(void); > -void xc_error_clear(void); > - > -int xc_using_injection(void); > - > -int xc_interface_open(void); > -int xc_interface_close(int handle); > - > -int xc_domain_create(int handle, unsigned int ssidref, > - xen_domain_handle_t dhandle, > - unsigned int flags, unsigned int *pdomid); > -int xc_domain_pause(int handle, unsigned int domid); > -int xc_domain_unpause(int handle, unsigned int domid); > -int xc_domain_resume_fast(int handle, unsigned int domid); > -int xc_domain_destroy(int handle, unsigned int domid); > -int xc_domain_shutdown(int handle, int domid, int reason); > - > -int xc_vcpu_setaffinity(int handle, unsigned int domid, int vcpu, > - uint64_t cpumap); > -int xc_vcpu_getaffinity(int handle, unsigned int domid, int vcpu, > - uint64_t *cpumap); > - > -int xc_domain_getinfolist(int handle, unsigned int first_domain, > - unsigned int max_domains, xc_domaininfo_t *info); > -int xc_domain_getinfo(int handle, unsigned int first_domain, > - xc_domaininfo_t *info); > - > -int xc_domain_setmaxmem(int handle, unsigned int domid, unsigned int max_memkb); > -int xc_domain_set_memmap_limit(int handle, unsigned int domid, > - unsigned long map_limitkb); > - > -int xc_domain_set_time_offset(int handle, unsigned int domid, int time_offset); > - > -int xc_domain_memory_increase_reservation(int handle, unsigned int domid, > - unsigned long nr_extents, > - unsigned int extent_order, > - unsigned int address_bits, > - xen_pfn_t *extent_start); > -int xc_domain_memory_decrease_reservation(int handle, unsigned int domid, > - unsigned long nr_extents, > - unsigned int extent_order, > - unsigned int address_bits, > - xen_pfn_t *extent_start); > -int xc_domain_memory_populate_physmap(int handle, unsigned int domid, > - unsigned long nr_extents, > - unsigned int extent_order, > - unsigned int address_bits, > - xen_pfn_t *extent_start); > -int xc_domain_setvmxassist(int handle, unsigned int domid, int use_vmxassist); > -int xc_domain_max_vcpus(int handle, unsigned int domid, unsigned int max); > -int xc_domain_sethandle(int handle, unsigned int domid, > - xen_domain_handle_t dhandle); > -int xc_vcpu_getinfo(int handle, unsigned int domid, unsigned int vcpu, > - xc_vcpuinfo_t *info); > -int xc_domain_ioport_permission(int handle, unsigned int domid, > - unsigned int first_port, unsigned int nr_ports, > - unsigned int allow_access); > -int xc_vcpu_setcontext(int handle, unsigned int domid, > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt); > -int xc_vcpu_getcontext(int handle, unsigned int domid, > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt); > -int xc_domain_irq_permission(int handle, unsigned int domid, > - unsigned char pirq, unsigned char allow_access); > -int xc_domain_iomem_permission(int handle, unsigned int domid, > - unsigned long first_mfn, unsigned long nr_mfns, > - unsigned char allow_access); > -long long xc_domain_get_cpu_usage(int handle, unsigned int domid, > - unsigned int vcpu); > -void *xc_map_foreign_range(int handle, unsigned int domid, > - int size, int prot, unsigned long mfn); > -int xc_map_foreign_ranges(int handle, unsigned int domid, > - privcmd_mmap_entry_t *entries, int nr); > -int xc_readconsolering(int handle, char **pbuffer, > - unsigned int *pnr_chars, int clear); > -int xc_send_debug_keys(int handle, char *keys); > -int xc_physinfo(int handle, xc_physinfo_t *put_info); > -int xc_pcpu_info( > - int handle, int max_cpus, xen_sysctl_cpuinfo_t *info, int *nr_cpus); > -int xc_sched_id(int handle, int *sched_id); > -int xc_version(int handle, int cmd, void *arg); > -int xc_evtchn_alloc_unbound(int handle, unsigned int domid, > - unsigned int remote_domid); > -int xc_evtchn_reset(int handle, unsigned int domid); > - > -int xc_sched_credit_domain_set(int handle, unsigned int domid, > - struct xen_domctl_sched_credit *sdom); > -int xc_sched_credit_domain_get(int handle, unsigned int domid, > - struct xen_domctl_sched_credit *sdom); > -int xc_shadow_allocation_get(int handle, unsigned int domid, > - uint32_t *mb); > -int xc_shadow_allocation_set(int handle, unsigned int domid, > - uint32_t mb); > -int xc_domain_get_pfn_list(int handle, unsigned int domid, > - uint64_t *pfn_array, unsigned long max_pfns); > -int xc_hvm_check_pvdriver(int handle, unsigned int domid); > - > -int xc_domain_assign_device(int handle, unsigned int domid, > - int domain, int bus, int slot, int func); > -int xc_domain_deassign_device(int handle, unsigned int domid, > - int domain, int bus, int slot, int func); > -int xc_domain_test_assign_device(int handle, unsigned int domid, > - int domain, int bus, int slot, int func); > -int xc_domain_watchdog(int handle, int id, uint32_t timeout); > -int xc_domain_set_machine_address_size(int xc, uint32_t domid, unsigned int width); > -int xc_domain_get_machine_address_size(int xc, uint32_t domid); > - > -int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm, > - uint32_t input, uint32_t oinput, > - char *config[4], char *config_out[4]); > -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_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 > -#define COMPAT_FIELD_physinfo_get_sockets_per_node(p) \ > - SAFEDIV((p).nr_cpus, ((p).threads_per_core * (p).cores_per_socket * (p).nr_nodes)) > -#else > -#define COMPAT_FIELD_physinfo_get_nr_cpus(p) \ > - ((p).threads_per_core * (p).sockets_per_node * \ > - (p).cores_per_socket * (p).threads_per_core) > -#define COMPAT_FIELD_physinfo_get_sockets_per_node(p) (p).sockets_per_node > -#endif > - > -#if __XEN_LATEST_INTERFACE_VERSION__ >= 0x00030209 > -#define COMPAT_FIELD_ADDRESS_BITS mem_flags > -#else > -#define COMPAT_FIELD_ADDRESS_BITS address_bits > -#endif > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.ml > --- a/tools/ocaml/libs/xc/xc.ml Fri Sep 10 11:10:00 2010 +0100 > +++ b/tools/ocaml/libs/xc/xc.ml Fri Sep 10 11:10:02 2010 +0100 > @@ -127,9 +127,6 @@ let domain_sethandle handle n uuid > let domain_sethandle handle n uuid > _domain_sethandle handle n (Uuid.int_array_of_uuid uuid) > > -external domain_setvmxassist: handle -> domid -> bool -> unit > - = "stub_xc_domain_setvmxassist" > - > external domain_max_vcpus: handle -> domid -> int -> unit > = "stub_xc_domain_max_vcpus" > > @@ -207,13 +204,13 @@ external domain_get_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 -> bool -> (int64 * (int64 option)) > +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option)) > -> string option array > -> string option array > = "stub_xc_domain_cpuid_set" > -external domain_cpuid_apply: handle -> domid -> bool -> unit > - = "stub_xc_domain_cpuid_apply" > -external cpuid_check: (int64 * (int64 option)) -> string option array -> (bool * string option array) > +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 > @@ -229,17 +226,6 @@ external domain_deassign_device: handle > = "stub_xc_domain_deassign_device" > external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool > = "stub_xc_domain_test_assign_device" > - > -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 > - = "stub_xc_hvm_check_pvdriver" > > external version: handle -> version = "stub_xc_version_version" > external version_compile_info: handle -> compile_info > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.mli > --- a/tools/ocaml/libs/xc/xc.mli Fri Sep 10 11:10:00 2010 +0100 > +++ b/tools/ocaml/libs/xc/xc.mli Fri Sep 10 11:10:02 2010 +0100 > @@ -80,8 +80,6 @@ external _domain_sethandle : handle -> d > external _domain_sethandle : handle -> domid -> int array -> unit > = "stub_xc_domain_sethandle" > val domain_sethandle : handle -> domid -> ''a Uuid.t -> unit > -external domain_setvmxassist: handle -> domid -> bool -> unit > - = "stub_xc_domain_setvmxassist" > external domain_max_vcpus : handle -> domid -> int -> unit > = "stub_xc_domain_max_vcpus" > external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause" > @@ -147,16 +145,6 @@ external domain_test_assign_device: hand > external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool > = "stub_xc_domain_test_assign_device" > > -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" > external version : handle -> version = "stub_xc_version_version" > external version_compile_info : handle -> compile_info > = "stub_xc_version_compile_info" > @@ -185,12 +173,12 @@ external domain_get_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 -> bool -> (int64 * (int64 option)) > +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option)) > -> string option array > -> string option array > = "stub_xc_domain_cpuid_set" > -external domain_cpuid_apply: handle -> domid -> bool -> unit > - = "stub_xc_domain_cpuid_apply" > -external cpuid_check: (int64 * (int64 option)) -> string option array -> (bool * string option array) > +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 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_cpufeature.h > --- a/tools/ocaml/libs/xc/xc_cpufeature.h Fri Sep 10 11:10:00 2010 +0100 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,116 +0,0 @@ > -#ifndef __LIBXC_CPUFEATURE_H > -#define __LIBXC_CPUFEATURE_H > - > -/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */ > -#define X86_FEATURE_FPU (0*32+ 0) /* Onboard FPU */ > -#define X86_FEATURE_VME (0*32+ 1) /* Virtual Mode Extensions */ > -#define X86_FEATURE_DE (0*32+ 2) /* Debugging Extensions */ > -#define X86_FEATURE_PSE (0*32+ 3) /* Page Size Extensions */ > -#define X86_FEATURE_TSC (0*32+ 4) /* Time Stamp Counter */ > -#define X86_FEATURE_MSR (0*32+ 5) /* Model-Specific Registers, RDMSR, WRMSR */ > -#define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */ > -#define X86_FEATURE_MCE (0*32+ 7) /* Machine Check Architecture */ > -#define X86_FEATURE_CX8 (0*32+ 8) /* CMPXCHG8 instruction */ > -#define X86_FEATURE_APIC (0*32+ 9) /* Onboard APIC */ > -#define X86_FEATURE_SEP (0*32+11) /* SYSENTER/SYSEXIT */ > -#define X86_FEATURE_MTRR (0*32+12) /* Memory Type Range Registers */ > -#define X86_FEATURE_PGE (0*32+13) /* Page Global Enable */ > -#define X86_FEATURE_MCA (0*32+14) /* Machine Check Architecture */ > -#define X86_FEATURE_CMOV (0*32+15) /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ > -#define X86_FEATURE_PAT (0*32+16) /* Page Attribute Table */ > -#define X86_FEATURE_PSE36 (0*32+17) /* 36-bit PSEs */ > -#define X86_FEATURE_PN (0*32+18) /* Processor serial number */ > -#define X86_FEATURE_CLFLSH (0*32+19) /* Supports the CLFLUSH instruction */ > -#define X86_FEATURE_DS (0*32+21) /* Debug Store */ > -#define X86_FEATURE_ACPI (0*32+22) /* ACPI via MSR */ > -#define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ > -#define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */ > - /* of FPU context), and CR4.OSFXSR available */ > -#define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ > -#define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ > -#define X86_FEATURE_SELFSNOOP (0*32+27) /* CPU self snoop */ > -#define X86_FEATURE_HT (0*32+28) /* Hyper-Threading */ > -#define X86_FEATURE_ACC (0*32+29) /* Automatic clock control */ > -#define X86_FEATURE_IA64 (0*32+30) /* IA-64 processor */ > -#define X86_FEATURE_PBE (0*32+31) /* Pending Break Enable */ > - > -/* AMD-defined CPU features, CPUID level 0x80000001, word 1 */ > -/* Don''t duplicate feature flags which are redundant with Intel! */ > -#define X86_FEATURE_SYSCALL (1*32+11) /* SYSCALL/SYSRET */ > -#define X86_FEATURE_MP (1*32+19) /* MP Capable. */ > -#define X86_FEATURE_NX (1*32+20) /* Execute Disable */ > -#define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ > -#define X86_FEATURE_FFXSR (1*32+25) /* FFXSR instruction optimizations */ > -#define X86_FEATURE_PAGE1GB (1*32+26) /* 1Gb large page support */ > -#define X86_FEATURE_RDTSCP (1*32+27) /* RDTSCP */ > -#define X86_FEATURE_LM (1*32+29) /* Long Mode (x86-64) */ > -#define X86_FEATURE_3DNOWEXT (1*32+30) /* AMD 3DNow! extensions */ > -#define X86_FEATURE_3DNOW (1*32+31) /* 3DNow! */ > - > -/* Transmeta-defined CPU features, CPUID level 0x80860001, word 2 */ > -#define X86_FEATURE_RECOVERY (2*32+ 0) /* CPU in recovery mode */ > -#define X86_FEATURE_LONGRUN (2*32+ 1) /* Longrun power control */ > -#define X86_FEATURE_LRTI (2*32+ 3) /* LongRun table interface */ > - > -/* Other features, Linux-defined mapping, word 3 */ > -/* This range is used for feature bits which conflict or are synthesized */ > -#define X86_FEATURE_CXMMX (3*32+ 0) /* Cyrix MMX extensions */ > -#define X86_FEATURE_K6_MTRR (3*32+ 1) /* AMD K6 nonstandard MTRRs */ > -#define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */ > -#define X86_FEATURE_CENTAUR_MCR (3*32+ 3) /* Centaur MCRs (= MTRRs) */ > -/* cpu types for specific tunings: */ > -#define X86_FEATURE_K8 (3*32+ 4) /* Opteron, Athlon64 */ > -#define X86_FEATURE_K7 (3*32+ 5) /* Athlon */ > -#define X86_FEATURE_P3 (3*32+ 6) /* P3 */ > -#define X86_FEATURE_P4 (3*32+ 7) /* P4 */ > -#define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ > - > -/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ > -#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ > -#define X86_FEATURE_DTES64 (4*32+ 2) /* 64-bit Debug Store */ > -#define X86_FEATURE_MWAIT (4*32+ 3) /* Monitor/Mwait support */ > -#define X86_FEATURE_DSCPL (4*32+ 4) /* CPL Qualified Debug Store */ > -#define X86_FEATURE_VMXE (4*32+ 5) /* Virtual Machine Extensions */ > -#define X86_FEATURE_SMXE (4*32+ 6) /* Safer Mode Extensions */ > -#define X86_FEATURE_EST (4*32+ 7) /* Enhanced SpeedStep */ > -#define X86_FEATURE_TM2 (4*32+ 8) /* Thermal Monitor 2 */ > -#define X86_FEATURE_SSSE3 (4*32+ 9) /* Supplemental Streaming SIMD Extensions-3 */ > -#define X86_FEATURE_CID (4*32+10) /* Context ID */ > -#define X86_FEATURE_CX16 (4*32+13) /* CMPXCHG16B */ > -#define X86_FEATURE_XTPR (4*32+14) /* Send Task Priority Messages */ > -#define X86_FEATURE_PDCM (4*32+15) /* Perf/Debug Capability MSR */ > -#define X86_FEATURE_DCA (4*32+18) /* Direct Cache Access */ > -#define X86_FEATURE_SSE4_1 (4*32+19) /* Streaming SIMD Extensions 4.1 */ > -#define X86_FEATURE_SSE4_2 (4*32+20) /* Streaming SIMD Extensions 4.2 */ > -#define X86_FEATURE_POPCNT (4*32+23) /* POPCNT instruction */ > -#define X86_FEATURE_HYPERVISOR (4*32+31) /* Running under some hypervisor */ > - > -/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ > -#define X86_FEATURE_XSTORE (5*32+ 2) /* on-CPU RNG present (xstore insn) */ > -#define X86_FEATURE_XSTORE_EN (5*32+ 3) /* on-CPU RNG enabled */ > -#define X86_FEATURE_XCRYPT (5*32+ 6) /* on-CPU crypto (xcrypt insn) */ > -#define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* on-CPU crypto enabled */ > -#define X86_FEATURE_ACE2 (5*32+ 8) /* Advanced Cryptography Engine v2 */ > -#define X86_FEATURE_ACE2_EN (5*32+ 9) /* ACE v2 enabled */ > -#define X86_FEATURE_PHE (5*32+ 10) /* PadLock Hash Engine */ > -#define X86_FEATURE_PHE_EN (5*32+ 11) /* PHE enabled */ > -#define X86_FEATURE_PMM (5*32+ 12) /* PadLock Montgomery Multiplier */ > -#define X86_FEATURE_PMM_EN (5*32+ 13) /* PMM enabled */ > - > -/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ > -#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */ > -#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */ > -#define X86_FEATURE_SVME (6*32+ 2) /* Secure Virtual Machine */ > -#define X86_FEATURE_EXTAPICSPACE (6*32+ 3) /* Extended APIC space */ > -#define X86_FEATURE_ALTMOVCR (6*32+ 4) /* LOCK MOV CR accesses CR+8 */ > -#define X86_FEATURE_ABM (6*32+ 5) /* Advanced Bit Manipulation */ > -#define X86_FEATURE_SSE4A (6*32+ 6) /* AMD Streaming SIMD Extensions-4a */ > -#define X86_FEATURE_MISALIGNSSE (6*32+ 7) /* Misaligned SSE Access */ > -#define X86_FEATURE_3DNOWPF (6*32+ 8) /* 3DNow! Prefetch */ > -#define X86_FEATURE_OSVW (6*32+ 9) /* OS Visible Workaround */ > -#define X86_FEATURE_IBS (6*32+ 10) /* Instruction Based Sampling */ > -#define X86_FEATURE_SSE5 (6*32+ 11) /* AMD Streaming SIMD Extensions-5 */ > -#define X86_FEATURE_SKINIT (6*32+ 12) /* SKINIT, STGI/CLGI, DEV */ > -#define X86_FEATURE_WDT (6*32+ 13) /* Watchdog Timer */ > - > -#endif /* __LIBXC_CPUFEATURE_H */ > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_cpuid.h > --- a/tools/ocaml/libs/xc/xc_cpuid.h Fri Sep 10 11:10:00 2010 +0100 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,285 +0,0 @@ > -#ifndef XC_CPUID_H > -#define XC_CPUID_H > - > -#ifdef XEN_DOMCTL_set_cpuid > - > -#include "xc_cpufeature.h" > - > -#define bitmaskof(idx) (1u << ((idx) & 31)) > -#define clear_bit(idx, dst) ((dst) &= ~(1u << ((idx) & 31))) > -#define set_bit(idx, dst) ((dst) |= (1u << ((idx) & 31))) > - > -#define DEF_MAX_BASE 0x00000004u > -#define DEF_MAX_EXT 0x80000008u > - > -static void xc_cpuid(uint32_t eax, uint32_t ecx, uint32_t regs[4]) > -{ > - unsigned int realecx = (ecx == XEN_CPUID_INPUT_UNUSED) ? 0 : ecx; > - asm ( > -#ifdef __i386__ > - "push %%ebx; cpuid; mov %%ebx,%1; pop %%ebx" > -#else > - "push %%rbx; cpuid; mov %%ebx,%1; pop %%rbx" > -#endif > - : "=a" (regs[0]), "=r" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) > - : "0" (eax), "2" (realecx)); > -} > - > -enum { CPU_BRAND_INTEL, CPU_BRAND_AMD, CPU_BRAND_UNKNOWN }; > - > -static int xc_cpuid_brand_get(void) > -{ > - uint32_t regs[4]; > - char str[13]; > - uint32_t *istr = (uint32_t *) str; > - > - xc_cpuid(0, 0, regs); > - istr[0] = regs[1]; > - istr[1] = regs[3]; > - istr[2] = regs[2]; > - str[12] = ''\0''; > - if (strcmp(str, "AuthenticAMD") == 0) { > - return CPU_BRAND_AMD; > - } else if (strcmp(str, "GenuineIntel") == 0) { > - return CPU_BRAND_INTEL; > - } else > - return CPU_BRAND_UNKNOWN; > -} > - > -static int hypervisor_is_64bit(int xc) > -{ > - xen_capabilities_info_t xen_caps; > - return ((xc_version(xc, XENVER_capabilities, &xen_caps) == 0) && > - (strstr(xen_caps, "x86_64") != NULL)); > -} > - > -static void do_hvm_cpuid_policy(int xc, int domid, uint32_t input, uint32_t regs[4]) > -{ > - unsigned long is_pae; > - int brand; > - > - /* pae ? */ > - xc_get_hvm_param(xc, domid, HVM_PARAM_PAE_ENABLED, &is_pae); > - is_pae = !!is_pae; > - > - switch (input) { > - case 0x00000000: > - if (regs[0] > DEF_MAX_BASE) > - regs[0] = DEF_MAX_BASE; > - break; > - case 0x00000001: > - regs[2] &= (bitmaskof(X86_FEATURE_XMM3) | > - bitmaskof(X86_FEATURE_SSSE3) | > - bitmaskof(X86_FEATURE_CX16) | > - bitmaskof(X86_FEATURE_SSE4_1) | > - bitmaskof(X86_FEATURE_SSE4_2) | > - bitmaskof(X86_FEATURE_POPCNT)); > - > - regs[2] |= bitmaskof(X86_FEATURE_HYPERVISOR); > - > - regs[3] &= (bitmaskof(X86_FEATURE_FPU) | > - bitmaskof(X86_FEATURE_VME) | > - bitmaskof(X86_FEATURE_DE) | > - bitmaskof(X86_FEATURE_PSE) | > - bitmaskof(X86_FEATURE_TSC) | > - bitmaskof(X86_FEATURE_MSR) | > - bitmaskof(X86_FEATURE_PAE) | > - bitmaskof(X86_FEATURE_MCE) | > - bitmaskof(X86_FEATURE_CX8) | > - bitmaskof(X86_FEATURE_APIC) | > - bitmaskof(X86_FEATURE_SEP) | > - bitmaskof(X86_FEATURE_MTRR) | > - bitmaskof(X86_FEATURE_PGE) | > - bitmaskof(X86_FEATURE_MCA) | > - bitmaskof(X86_FEATURE_CMOV) | > - bitmaskof(X86_FEATURE_PAT) | > - bitmaskof(X86_FEATURE_CLFLSH) | > - bitmaskof(X86_FEATURE_MMX) | > - bitmaskof(X86_FEATURE_FXSR) | > - bitmaskof(X86_FEATURE_XMM) | > - bitmaskof(X86_FEATURE_XMM2)); > - /* We always support MTRR MSRs. */ > - regs[3] |= bitmaskof(X86_FEATURE_MTRR); > - > - if (!is_pae) > - clear_bit(X86_FEATURE_PAE, regs[3]); > - break; > - case 0x80000000: > - if (regs[0] > DEF_MAX_EXT) > - regs[0] = DEF_MAX_EXT; > - break; > - case 0x80000001: > - if (!is_pae) > - clear_bit(X86_FEATURE_NX, regs[3]); > - break; > - case 0x80000008: > - regs[0] &= 0x0000ffffu; > - regs[1] = regs[2] = regs[3] = 0; > - break; > - case 0x00000002: /* Intel cache info (dumped by AMD policy) */ > - case 0x00000004: /* Intel cache info (dumped by AMD policy) */ > - case 0x80000002: /* Processor name string */ > - case 0x80000003: /* ... continued */ > - case 0x80000004: /* ... continued */ > - case 0x80000005: /* AMD L1 cache/TLB info (dumped by Intel policy) */ > - case 0x80000006: /* AMD L2/3 cache/TLB info ; Intel L2 cache features */ > - break; > - default: > - regs[0] = regs[1] = regs[2] = regs[3] = 0; > - break; > - } > - > - brand = xc_cpuid_brand_get(); > - if (brand == CPU_BRAND_AMD) { > - switch (input) { > - case 0x00000001: > - /* Mask Intel-only features. */ > - regs[2] &= ~(bitmaskof(X86_FEATURE_SSSE3) | > - bitmaskof(X86_FEATURE_SSE4_1) | > - bitmaskof(X86_FEATURE_SSE4_2)); > - break; > - > - case 0x00000002: > - case 0x00000004: > - regs[0] = regs[1] = regs[2] = 0; > - break; > - > - case 0x80000001: { > - int is_64bit = hypervisor_is_64bit(xc) && is_pae; > - > - if (!is_pae) > - clear_bit(X86_FEATURE_PAE, regs[3]); > - clear_bit(X86_FEATURE_PSE36, regs[3]); > - > - /* Filter all other features according to a whitelist. */ > - regs[2] &= ((is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0) | > - bitmaskof(X86_FEATURE_ALTMOVCR) | > - bitmaskof(X86_FEATURE_ABM) | > - bitmaskof(X86_FEATURE_SSE4A) | > - bitmaskof(X86_FEATURE_MISALIGNSSE) | > - bitmaskof(X86_FEATURE_3DNOWPF)); > - regs[3] &= (0x0183f3ff | /* features shared with 0x00000001:EDX */ > - (is_pae ? bitmaskof(X86_FEATURE_NX) : 0) | > - (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) | > - bitmaskof(X86_FEATURE_SYSCALL) | > - bitmaskof(X86_FEATURE_MP) | > - bitmaskof(X86_FEATURE_MMXEXT) | > - bitmaskof(X86_FEATURE_FFXSR) | > - bitmaskof(X86_FEATURE_3DNOW) | > - bitmaskof(X86_FEATURE_3DNOWEXT)); > - break; > - } > - } > - } else if (brand == CPU_BRAND_INTEL) { > - switch (input) { > - case 0x00000001: > - /* Mask AMD-only features. */ > - regs[2] &= ~(bitmaskof(X86_FEATURE_POPCNT)); > - break; > - > - case 0x00000004: > - regs[0] &= 0x3FF; > - regs[3] &= 0x3FF; > - break; > - > - case 0x80000001: > - { > - int is_64bit = hypervisor_is_64bit(xc) && is_pae; > - > - /* Only a few features are advertised in Intel''s 0x80000001. */ > - regs[2] &= (is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0); > - regs[3] &= ((is_pae ? bitmaskof(X86_FEATURE_NX) : 0) | > - (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) | > - (is_64bit ? bitmaskof(X86_FEATURE_SYSCALL) : 0)); > - break; > - } > - case 0x80000005: > - { > - regs[0] = regs[1] = regs[2] = 0; > - break; > - } > - } > - } > -} > - > -static void do_pv_cpuid_policy(int xc, int domid, uint32_t input, uint32_t regs[4]) > -{ > - int brand; > - int guest_64_bits, xen_64_bits; > - int ret; > - > - ret = xc_domain_get_machine_address_size(xc, domid); > - if (ret < 0) > - return; > - guest_64_bits = (ret == 64); > - xen_64_bits = hypervisor_is_64bit(xc); > - brand = xc_cpuid_brand_get(); > - > - if ((input & 0x7fffffff) == 1) { > - clear_bit(X86_FEATURE_VME, regs[3]); > - clear_bit(X86_FEATURE_PSE, regs[3]); > - clear_bit(X86_FEATURE_PGE, regs[3]); > - clear_bit(X86_FEATURE_MCE, regs[3]); > - clear_bit(X86_FEATURE_MCA, regs[3]); > - clear_bit(X86_FEATURE_MTRR, regs[3]); > - clear_bit(X86_FEATURE_PSE36, regs[3]); > - } > - > - switch (input) { > - case 1: > - if (!xen_64_bits || brand == CPU_BRAND_AMD) > - clear_bit(X86_FEATURE_SEP, regs[3]); > - clear_bit(X86_FEATURE_DS, regs[3]); > - clear_bit(X86_FEATURE_ACC, regs[3]); > - clear_bit(X86_FEATURE_PBE, regs[3]); > - > - clear_bit(X86_FEATURE_DTES64, regs[2]); > - clear_bit(X86_FEATURE_MWAIT, regs[2]); > - clear_bit(X86_FEATURE_DSCPL, regs[2]); > - clear_bit(X86_FEATURE_VMXE, regs[2]); > - clear_bit(X86_FEATURE_SMXE, regs[2]); > - clear_bit(X86_FEATURE_EST, regs[2]); > - clear_bit(X86_FEATURE_TM2, regs[2]); > - if (!guest_64_bits) > - clear_bit(X86_FEATURE_CX16, regs[2]); > - clear_bit(X86_FEATURE_XTPR, regs[2]); > - clear_bit(X86_FEATURE_PDCM, regs[2]); > - clear_bit(X86_FEATURE_DCA, regs[2]); > - break; > - case 0x80000001: > - if (!guest_64_bits) { > - clear_bit(X86_FEATURE_LM, regs[3]); > - clear_bit(X86_FEATURE_LAHF_LM, regs[2]); > - if (brand != CPU_BRAND_AMD) > - clear_bit(X86_FEATURE_SYSCALL, regs[3]); > - } else > - set_bit(X86_FEATURE_SYSCALL, regs[3]); > - clear_bit(X86_FEATURE_PAGE1GB, regs[3]); > - clear_bit(X86_FEATURE_RDTSCP, regs[3]); > - > - clear_bit(X86_FEATURE_SVME, regs[2]); > - clear_bit(X86_FEATURE_OSVW, regs[2]); > - clear_bit(X86_FEATURE_IBS, regs[2]); > - clear_bit(X86_FEATURE_SKINIT, regs[2]); > - clear_bit(X86_FEATURE_WDT, regs[2]); > - break; > - case 5: /* MONITOR/MWAIT */ > - case 0xa: /* Architectural Performance Monitor Features */ > - case 0x8000000a: /* SVM revision and features */ > - case 0x8000001b: /* Instruction Based Sampling */ > - regs[0] = regs[1] = regs[2] = regs[3] = 0; > - break; > - } > -} > - > -static void do_cpuid_policy(int xc, int domid, int hvm, uint32_t input, uint32_t regs[4]) > -{ > - if (hvm) > - do_hvm_cpuid_policy(xc, domid, input, regs); > - else > - do_pv_cpuid_policy(xc, domid, input, regs); > -} > - > -#endif > - > -#endif > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_e820.h > --- a/tools/ocaml/libs/xc/xc_e820.h Fri Sep 10 11:10:00 2010 +0100 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,20 +0,0 @@ > -#ifndef __XC_E820_H__ > -#define __XC_E820_H__ > - > -#include <xen/hvm/e820.h> > - > -/* > - * PC BIOS standard E820 types and structure. > - */ > -#define E820_RAM 1 > -#define E820_RESERVED 2 > -#define E820_ACPI 3 > -#define E820_NVS 4 > - > -struct e820entry { > - uint64_t addr; > - uint64_t size; > - uint32_t type; > -} __attribute__((packed)); > - > -#endif /* __XC_E820_H__ */ > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_lib.c > --- a/tools/ocaml/libs/xc/xc_lib.c Fri Sep 10 11:10:00 2010 +0100 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,1537 +0,0 @@ > -/* > - * Copyright (C) 2006-2007 XenSource Ltd. > - * Copyright (C) 2008 Citrix Ltd. > - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com> > - * > - * 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 <stdint.h> > -#include <unistd.h> > -#include <string.h> > -#include <fcntl.h> > -#include <stdio.h> > -#include <errno.h> > -#include <sys/ioctl.h> > -#include <sys/mman.h> > -#include <sys/types.h> > -#include <sys/stat.h> > -#include <stdlib.h> > -#include <stdarg.h> > - > -#include "xc.h" > - > -#define PAGE_SHIFT 12 > -#define PAGE_SIZE (1UL << PAGE_SHIFT) > -#define PAGE_MASK (~(PAGE_SIZE-1)) > - > -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) > - > -#define DECLARE_DOMCTL(_cmd, _domain) \ > - struct xen_domctl domctl = { \ > - .cmd = _cmd, \ > - .domain = _domain, \ > - .interface_version = XEN_DOMCTL_INTERFACE_VERSION, \ > - } > - > -#define DECLARE_SYSCTL(_cmd) \ > - struct xen_sysctl sysctl = { \ > - .cmd = _cmd, \ > - .interface_version = XEN_SYSCTL_INTERFACE_VERSION, \ > - } > - > -#define DECLARE_HYPERCALL2(_cmd, _arg0, _arg1) \ > - privcmd_hypercall_t hypercall = { \ > - .op = _cmd, \ > - .arg[0] = (unsigned long) _arg0,\ > - .arg[1] = (unsigned long) _arg1,\ > - } > -#define DECLARE_HYPERCALL0(_cmd) DECLARE_HYPERCALL2(_cmd, 0, 0); > -#define DECLARE_HYPERCALL1(_cmd, _arg0) DECLARE_HYPERCALL2(_cmd, _arg0, 0); > - > -/*---- Errors handlings ----*/ > -#ifndef WITHOUT_GOOD_ERROR > -#define ERROR_STRLEN 256 > - > -static char __error_str[ERROR_STRLEN]; > - > -char * xc_error_get(void) > -{ > - return __error_str; > -} > - > -static void xc_error_set(const char *fmt, ...) > -{ > - va_list ap; > - char __errordup[ERROR_STRLEN]; > - > - va_start(ap, fmt); > - vsnprintf(__errordup, ERROR_STRLEN, fmt, ap); > - va_end(ap); > - memcpy(__error_str, __errordup, ERROR_STRLEN); > -} > - > -static void xc_error_dom_set(unsigned int domid, const char *fmt, ...) > -{ > - va_list ap; > - char __errordup[ERROR_STRLEN]; > - int i; > - > - i = snprintf(__errordup, ERROR_STRLEN, "domain %u - ", domid); > - va_start(ap, fmt); > - i += vsnprintf(__errordup + i, ERROR_STRLEN - i, fmt, ap); > - va_end(ap); > - snprintf(__errordup + i, ERROR_STRLEN - i, > - " failed: %s", xc_error_get()); > - memcpy(__error_str, __errordup, ERROR_STRLEN); > -} > - > -void xc_error_clear(void) > -{ > - memset(__error_str, ''\0'', ERROR_STRLEN); > -} > -#else > -char * xc_error_get(void) > -{ > - return ""; > -} > -#define xc_error_set(fmt, ...) do {} while (0) > -#define xc_error_dom_set(id, fmt, ...) do {} while (0) > -#define xc_error_clear() do {} while (0) > -#endif > - > -#define xc_error_hypercall(_h, _r) \ > - xc_error_set("hypercall %lld fail: %d: %s (ret %d)", _h.op, errno, errno ? strerror(errno) : strerror(-_r), _r) > - > -int xc_using_injection(void) > -{ > - return 0; > -} > - > -/*---- Trivia ----*/ > -int xc_interface_open(void) > -{ > - int fd, ret; > - > - fd = open("/proc/xen/privcmd", O_RDWR); > - if (fd == -1) { > - xc_error_set("open /proc/xen/privcmd failed: %s", > - strerror(errno)); > - return -1; > - } > - > - ret = fcntl(fd, F_GETFD); > - if (ret < 0) { > - xc_error_set("cannot get handle flags: %s", > - strerror(errno)); > - goto out; > - } > - > - ret = fcntl(fd, F_SETFD, ret | FD_CLOEXEC); > - if (ret < 0) { > - xc_error_set("cannot set handle flags: %s", > - strerror(errno)); > - goto out; > - } > - > - return fd; > -out: > - close(fd); > - return -1; > -} > - > -int xc_interface_close(int handle) > -{ > - int ret; > - > - ret = close(handle); > - if (ret != 0) > - xc_error_set("close xc failed: %s", strerror(errno)); > - return ret; > -} > - > -/*---- Low private operations ----*/ > -static int do_xen_hypercall(int handle, privcmd_hypercall_t *hypercall) > -{ > - return ioctl(handle, IOCTL_PRIVCMD_HYPERCALL, (unsigned long) hypercall); > -} > - > -static int do_domctl(int handle, struct xen_domctl *domctl) > -{ > - int ret; > - DECLARE_HYPERCALL1(__HYPERVISOR_domctl, domctl); > - > - if (mlock(domctl, sizeof(*domctl)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret < 0) > - xc_error_hypercall(hypercall, ret); > - > - munlock(domctl, sizeof(*domctl)); > - return ret; > -} > - > -static int do_sysctl(int handle, struct xen_sysctl *sysctl) > -{ > - int ret; > - DECLARE_HYPERCALL1(__HYPERVISOR_sysctl, sysctl); > - > - if (mlock(sysctl, sizeof(*sysctl)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret < 0) > - xc_error_hypercall(hypercall, ret); > - > - munlock(sysctl, sizeof(*sysctl)); > - return ret; > -} > - > -static int do_evtchnctl(int handle, int cmd, void *arg, size_t arg_size) > -{ > - DECLARE_HYPERCALL2(__HYPERVISOR_event_channel_op, cmd, arg); > - int ret; > - > - if (mlock(arg, arg_size) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret < 0) > - xc_error_hypercall(hypercall, ret); > - munlock(arg, arg_size); > - return ret; > -} > - > -static int do_memctl_reservation(int handle, int cmd, > - struct xen_memory_reservation *reservation) > -{ > - int ret; > - DECLARE_HYPERCALL2(__HYPERVISOR_memory_op, cmd, reservation); > - xen_pfn_t *extent_start; > - > - if (cmd != XENMEM_increase_reservation && > - cmd != XENMEM_decrease_reservation && > - cmd != XENMEM_populate_physmap) { > - xc_error_set("do_memctl_reservation: unknown cmd %d", cmd); > - return -EINVAL; > - } > - > - if (mlock(reservation, sizeof(*reservation)) == -1) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -ENOMEM; > - } > - get_xen_guest_handle(extent_start, reservation->extent_start); > - if (extent_start && mlock(extent_start, reservation->nr_extents > - * sizeof(xen_pfn_t)) == -1) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - munlock(reservation, sizeof(*reservation)); > - return -3; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret) > - xc_error_hypercall(hypercall, ret); > - munlock(extent_start, reservation->nr_extents * sizeof(xen_pfn_t)); > - get_xen_guest_handle(extent_start, reservation->extent_start); > - munlock(reservation, sizeof(*reservation)); > - return ret; > -} > - > -static int do_ioctl(int handle, int cmd, void *arg) > -{ > - return ioctl(handle, cmd, arg); > -} > - > -static void * do_mmap(void *start, size_t length, int prot, int flags, > - int fd, off_t offset) > -{ > - return mmap(start, length, prot, flags, fd, offset); > -} > - > -int xc_get_hvm_param(int handle, unsigned int domid, > - int param, unsigned long *value) > -{ > - struct xen_hvm_param arg = { > - .domid = domid, > - .index = param, > - }; > - DECLARE_HYPERCALL2(__HYPERVISOR_hvm_op, HVMOP_get_param, > - (unsigned long) &arg); > - int ret; > - > - if (mlock(&arg, sizeof(arg)) == -1) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret) > - xc_error_hypercall(hypercall, ret); > - *value = arg.value; > - munlock(&arg, sizeof(arg)); > - return ret; > -} > - > -static int xc_set_hvm_param(int handle, unsigned int domid, > - int param, unsigned long value) > -{ > - struct xen_hvm_param arg = { > - .domid = domid, > - .index = param, > - .value = value, > - }; > - 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; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret) > - xc_error_hypercall(hypercall, ret); > - munlock(&arg, sizeof(arg)); > - return ret; > -} > - > - > -/*---- XC API ----*/ > -int xc_domain_create(int handle, unsigned int ssidref, > - xen_domain_handle_t dhandle, > - unsigned int flags, unsigned int *pdomid) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_createdomain, *pdomid); > - domctl.u.createdomain.ssidref = ssidref; > - domctl.u.createdomain.flags = flags; > - memcpy(domctl.u.createdomain.handle, dhandle, sizeof(xen_domain_handle_t)); > - > - ret = do_domctl(handle, &domctl); > - if (ret != 0) { > - xc_error_set("creating domain failed: %s", xc_error_get()); > - return ret; > - } > - *pdomid = domctl.domain; > - return 0; > -} > - > -int xc_domain_pause(int handle, unsigned int domid) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_pausedomain, domid); > - > - ret = do_domctl(handle, &domctl); > - if (ret != 0) > - xc_error_dom_set(domid, "pause"); > - return ret; > -} > - > -int xc_domain_unpause(int handle, unsigned int domid) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_unpausedomain, domid); > - > - ret = do_domctl(handle, &domctl); > - if (ret != 0) > - xc_error_dom_set(domid, "unpause"); > - return ret; > -} > - > -/* return 1 if hvm domain got pv driver, 0 if not. -1 is error occurs */ > -int xc_hvm_check_pvdriver(int handle, unsigned int domid) > -{ > - int ret; > - unsigned long irq = 0; > - xc_domaininfo_t info; > - > - ret = xc_domain_getinfolist(handle, domid, 1, &info); > - if (ret != 1) { > - xc_error_set("domain getinfo failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "hvm_check_pvdriver"); > - return -1; > - } > - > - if (!(info.flags & XEN_DOMINF_hvm_guest)) { > - xc_error_set("domain is not hvm"); > - xc_error_dom_set(domid, "hvm_check_pvdriver"); > - return -1; > - } > - xc_get_hvm_param(handle, domid, HVM_PARAM_CALLBACK_IRQ, &irq); > - return irq; > -} > - > -static int modify_returncode_register(int handle, unsigned int domid) > -{ > - int ret; > - xc_domaininfo_t info; > - xen_capabilities_info_t caps; > - vcpu_guest_context_any_t context; > - > - ret = xc_domain_getinfolist(handle, domid, 1, &info); > - if (ret != 1) { > - xc_error_set("domain getinfo failed: %s", strerror(errno)); > - return -1; > - } > - > - /* HVM guests without PV drivers do not have a return code to modify */ > - if (info.flags & XEN_DOMINF_hvm_guest) { > - unsigned long irq = 0; > - xc_get_hvm_param(handle, domid, HVM_PARAM_CALLBACK_IRQ, &irq); > - if (!irq) > - return 0; > - } > - > - ret = xc_version(handle, XENVER_capabilities, &caps); > - if (ret) { > - xc_error_set("could not get Xen capabilities"); > - return ret; > - } > - > - ret = xc_vcpu_getcontext(handle, domid, 0, &context); > - if (ret) { > - xc_error_set("could not get vcpu 0 context"); > - return ret; > - } > - > - if (!(info.flags & XEN_DOMINF_hvm_guest)) > - context.c.user_regs.eax = 1; > - else if (strstr(caps, "x86_64")) > - context.x64.user_regs.eax = 1; > - else > - context.x32.user_regs.eax = 1; > - > - ret = xc_vcpu_setcontext(handle, domid, 0, &context); > - if (ret) { > - xc_error_set("could not set vcpu 0 context"); > - return ret; > - } > - return 0; > -} > - > -int xc_domain_resume_fast(int handle, unsigned int domid) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_resumedomain, domid); > - > - ret = modify_returncode_register(handle, domid); > - if (ret != 0) { > - xc_error_dom_set(domid, "resume_fast"); > - return ret; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret != 0) > - xc_error_dom_set(domid, "resume_fast"); > - return ret; > -} > - > -int xc_domain_destroy(int handle, unsigned int domid) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_destroydomain, domid); > - > - do { > - ret = do_domctl(handle, &domctl); > - } while (ret && (errno == EAGAIN)); > - if (ret != 0) > - xc_error_dom_set(domid, "destroy"); > - return ret; > -} > - > -int xc_domain_shutdown(int handle, int domid, int reason) > -{ > - sched_remote_shutdown_t arg = { > - .domain_id = domid, > - .reason = reason, > - }; > - DECLARE_HYPERCALL2(__HYPERVISOR_sched_op, SCHEDOP_remote_shutdown, &arg); > - int ret; > - > - if (mlock(&arg, sizeof(arg)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "shutdown %d", reason); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret < 0) { > - xc_error_hypercall(hypercall, ret); > - xc_error_dom_set(domid, "shutdown %d", reason); > - } > - munlock(&arg, sizeof(arg)); > - return ret; > -} > - > -static void bitmap_64_to_byte(uint8_t *bp, const uint64_t *lp, int nbits) > -{ > - uint64_t l; > - int i, j, b; > - > - for (i = 0, b = 0; nbits > 0; i++, b += sizeof(l)) { > - l = lp[i]; > - for (j = 0; (j < sizeof(l)) && (nbits > 0); j++) { > - bp[b+j] = l; > - l >>= 8; > - nbits -= 8; > - } > - } > -} > - > -static void bitmap_byte_to_64(uint64_t *lp, const uint8_t *bp, int nbits) > -{ > - uint64_t l; > - int i, j, b; > - > - for (i = 0, b = 0; nbits > 0; i++, b += sizeof(l)) { > - l = 0; > - for (j = 0; (j < sizeof(l)) && (nbits > 0); j++) { > - l |= (uint64_t)bp[b+j] << (j*8); > - nbits -= 8; > - } > - lp[i] = l; > - } > -} > - > -int xc_vcpu_setaffinity(int handle, unsigned int domid, int vcpu, > - uint64_t cpumap) > -{ > - int ret; > - uint8_t local[sizeof(cpumap)]; > - DECLARE_DOMCTL(XEN_DOMCTL_setvcpuaffinity, domid); > - domctl.u.vcpuaffinity.vcpu = vcpu; > - domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8; > - > - bitmap_64_to_byte(local, &cpumap, sizeof(cpumap)*8); > - set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); > - > - if (mlock(&cpumap, sizeof(cpumap)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "vcpu %d set affinity", vcpu); > - return -1; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "vcpu %d set affinity", vcpu); > - munlock(&cpumap, sizeof(cpumap)); > - return ret; > -} > - > -int xc_vcpu_getaffinity(int handle, unsigned int domid, int vcpu, > - uint64_t *cpumap) > -{ > - int ret; > - uint8_t local[sizeof(*cpumap)]; > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuaffinity, domid); > - domctl.u.vcpuaffinity.vcpu = vcpu; > - domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(*cpumap) * 8; > - > - set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); > - > - if (mlock(cpumap, sizeof(*cpumap)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "vcpu %d get affinity", vcpu); > - return -1; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "vcpu %d get affinity", vcpu); > - munlock(cpumap, sizeof(*cpumap)); > - bitmap_byte_to_64(cpumap, local, sizeof(*cpumap) * 8); > - return ret; > -} > - > -int xc_vcpu_context_get(int handle, unsigned int domid, unsigned short vcpu, > - struct vcpu_guest_context *ctxt) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpucontext, domid); > - domctl.u.vcpucontext.vcpu = vcpu; > - > - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt); > - > - if (mlock(ctxt, sizeof(struct vcpu_guest_context)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "vcpu %d get context", vcpu); > - return -1; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "vcpu %d get context", vcpu); > - munlock(ctxt, sizeof(struct vcpu_guest_context)); > - > - return ret; > -} > - > -int xc_domain_getinfolist(int handle, unsigned int first_domain, > - unsigned int max_domains, xc_domaininfo_t *info) > -{ > - int ret; > - DECLARE_SYSCTL(XEN_SYSCTL_getdomaininfolist); > - sysctl.u.getdomaininfolist.first_domain = first_domain; > - sysctl.u.getdomaininfolist.max_domains = max_domains; > - set_xen_guest_handle(sysctl.u.getdomaininfolist.buffer, info); > - > - if (mlock(info, max_domains * sizeof(xc_domaininfo_t)) != 0) { > - xc_error_set("getinfolist(%d, %u, %u, %x (%d)) failed: mlock failed: %s", > - handle, first_domain, max_domains, info, sizeof(xc_domaininfo_t), > - strerror(errno)); > - return -1; > - } > - > - ret = do_sysctl(handle, &sysctl); > - if (ret < 0) > - xc_error_set("getinfolist(%d, %u, %u, %x (%d)) failed: %s", > - handle, first_domain, max_domains, info, sizeof(xc_domaininfo_t), > - xc_error_get()); > - else > - ret = sysctl.u.getdomaininfolist.num_domains; > - > - munlock(info, max_domains * sizeof(xc_domaininfo_t)); > - return ret; > -} > - > -int xc_domain_getinfo(int handle, unsigned int domid, xc_domaininfo_t *info) > -{ > - int ret; > - ret = xc_domain_getinfolist(handle, domid, 1, info); > - if (ret != 1) { > - xc_error_set("getinfo failed: domain %d: %s", domid, xc_error_get()); > - return -1; > - } > - > - /* If the requested domain didn''t exist but there exists one with a > - higher domain ID, this will be returned. We consider this an error since > - we only wanted info about a specific domain. */ > - if (info->domain != domid) { > - xc_error_set("getinfo failed: domain %d nolonger exists", domid); > - return -1; > - } > - > - return 0; > -} > - > -int xc_domain_setmaxmem(int handle, unsigned int domid, unsigned int max_memkb) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_max_mem, domid); > - domctl.u.max_mem.max_memkb = max_memkb; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "set max memory to %u", max_memkb); > - return ret; > -} > - > -int xc_domain_set_memmap_limit(int handle, unsigned int domid, > - unsigned long map_limitkb) > -{ > - int ret; > - struct xen_foreign_memory_map fmap = { > - .domid = domid, > - .map = { .nr_entries = 1 } > - }; > - struct e820entry e820 = { > - .addr = 0, > - .size = (uint64_t)map_limitkb << 10, > - .type = E820_RAM > - }; > - DECLARE_HYPERCALL2(__HYPERVISOR_memory_op, XENMEM_set_memory_map, &fmap); > - > - set_xen_guest_handle(fmap.map.buffer, &e820); > - > - if (mlock(&fmap, sizeof(fmap)) != 0) { > - xc_error_set("set_memmap_limit failed: mlock failed: %s", > - strerror(errno)); > - return -1; > - } > - > - if (mlock(&e820, sizeof(e820)) != 0) { > - xc_error_set("set_memmap_limit failed: mlock failed: %s", > - strerror(errno)); > - munlock(&fmap, sizeof(fmap)); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret) > - xc_error_hypercall(hypercall, ret); > - > - munlock(&e820, sizeof(e820)); > - munlock(&fmap, sizeof(fmap)); > - return ret; > -} > - > -int xc_domain_set_time_offset(int handle, unsigned int domid, int time_offset) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_settimeoffset, domid); > - domctl.u.settimeoffset.time_offset_seconds = time_offset; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "set time offset %d", time_offset); > - return ret; > -} > - > -int xc_domain_memory_increase_reservation(int handle, unsigned int domid, > - unsigned long nr_extents, > - unsigned int extent_order, > - unsigned int address_bits, > - xen_pfn_t *extent_start) > -{ > - int ret; > - struct xen_memory_reservation reservation = { > - .nr_extents = nr_extents, > - .extent_order = extent_order, > - .COMPAT_FIELD_ADDRESS_BITS = address_bits, > - .domid = domid > - }; > - > - set_xen_guest_handle(reservation.extent_start, extent_start); > - > - ret = do_memctl_reservation(handle, XENMEM_increase_reservation, > - &reservation); > - if (ret != nr_extents) { > - xc_error_dom_set(domid, "increase reservation to %lu", > - nr_extents); > - return (ret >= 0) ? -1 : ret; > - } > - return 0; > -} > - > -int xc_domain_memory_decrease_reservation(int handle, unsigned int domid, > - unsigned long nr_extents, > - unsigned int extent_order, > - unsigned int address_bits, > - xen_pfn_t *extent_start) > -{ > - int ret; > - struct xen_memory_reservation reservation = { > - .nr_extents = nr_extents, > - .extent_order = extent_order, > - .COMPAT_FIELD_ADDRESS_BITS = 0, > - .domid = domid > - }; > - > - set_xen_guest_handle(reservation.extent_start, extent_start); > - if (!extent_start) { > - xc_error_set("decrease reservation: extent start is NULL"); > - return -EINVAL; > - } > - > - ret = do_memctl_reservation(handle, XENMEM_decrease_reservation, > - &reservation); > - if (ret < nr_extents) { > - xc_error_dom_set(domid, "decrease reservation to %lu", > - nr_extents); > - return (ret >= 0) ? -1 : ret; > - } > - return 0; > -} > - > -int xc_domain_memory_populate_physmap(int handle, unsigned int domid, > - unsigned long nr_extents, > - unsigned int extent_order, > - unsigned int address_bits, > - xen_pfn_t *extent_start) > -{ > - int ret; > - struct xen_memory_reservation reservation = { > - .nr_extents = nr_extents, > - .extent_order = extent_order, > - .COMPAT_FIELD_ADDRESS_BITS = address_bits, > - .domid = domid > - }; > - > - set_xen_guest_handle(reservation.extent_start, extent_start); > - ret = do_memctl_reservation(handle, XENMEM_populate_physmap, > - &reservation); > - if (ret < nr_extents) { > - xc_error_dom_set(domid, "populate physmap"); > - return (ret >= 0) ? -1 : ret; > - } > - return 0; > -} > - > -int xc_domain_setvmxassist(int handle, unsigned int domid, int use_vmxassist) > -{ > - int ret = 0; > -#ifdef XEN_DOMCTL_setvmxassist > - DECLARE_DOMCTL(XEN_DOMCTL_setvmxassist, domid); > - domctl.u.setvmxassist.use_vmxassist = use_vmxassist; > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "setting vmxassist to %d", > - use_vmxassist); > -#endif > - return ret; > -} > - > -int xc_domain_max_vcpus(int handle, unsigned int domid, unsigned int max) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_max_vcpus, domid); > - domctl.u.max_vcpus.max = max; > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "setting max vcpus to %d", max); > - return ret; > -} > - > -int xc_domain_sethandle(int handle, unsigned int domid, > - xen_domain_handle_t dhandle) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_setdomainhandle, domid); > - memcpy(domctl.u.setdomainhandle.handle, dhandle, sizeof(xen_domain_handle_t)); > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "set handle"); > - return ret; > -} > - > -int xc_vcpu_getinfo(int handle, unsigned int domid, unsigned int vcpu, > - xc_vcpuinfo_t *info) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuinfo, domid); > - domctl.u.getvcpuinfo.vcpu = vcpu; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) { > - xc_error_dom_set(domid, "vcpu %u getinfo", vcpu); > - return ret; > - } > - memcpy(info, &domctl.u.getvcpuinfo, sizeof(*info)); > - return ret; > -} > - > -int xc_domain_ioport_permission(int handle, unsigned int domid, > - unsigned int first_port, unsigned int nr_ports, > - unsigned int allow_access) > -{ > - DECLARE_DOMCTL(XEN_DOMCTL_ioport_permission, domid); > - domctl.u.ioport_permission.first_port = first_port; > - domctl.u.ioport_permission.nr_ports = nr_ports; > - domctl.u.ioport_permission.allow_access = allow_access; > - > - return do_domctl(handle, &domctl); > -} > - > -int xc_vcpu_getcontext(int handle, unsigned int domid, > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpucontext, domid); > - domctl.u.vcpucontext.vcpu = vcpu; > - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt->c); > - > - if (mlock(ctxt, sizeof(*ctxt)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "vcpu %u getcontext", vcpu); > - munlock(ctxt, sizeof(*ctxt)); > - return ret; > -} > - > -int xc_vcpu_setcontext(int handle, unsigned int domid, > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_setvcpucontext, domid); > - domctl.u.vcpucontext.vcpu = vcpu; > - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt->c); > - > - if (mlock(ctxt, sizeof(*ctxt)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "vcpu %u setcontext", vcpu); > - > - munlock(ctxt, sizeof(*ctxt)); > - return ret; > -} > - > -int xc_domain_irq_permission(int handle, unsigned int domid, > - unsigned char pirq, unsigned char allow_access) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_irq_permission, domid); > - domctl.u.irq_permission.pirq = pirq; > - domctl.u.irq_permission.allow_access = allow_access; > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "irq permission %u to %u", > - pirq, allow_access); > - return ret; > -} > - > -int xc_domain_iomem_permission(int handle, unsigned int domid, > - unsigned long first_mfn, unsigned long nr_mfns, > - unsigned char allow_access) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_iomem_permission, domid); > - domctl.u.iomem_permission.first_mfn = first_mfn; > - domctl.u.iomem_permission.nr_mfns = nr_mfns; > - domctl.u.iomem_permission.allow_access = allow_access; > - > - ret = do_domctl(handle, &domctl); > - if (ret) > - xc_error_dom_set(domid, "iomem permission [%lu, %lu] to %u", > - first_mfn, first_mfn + nr_mfns, allow_access); > - return ret; > -} > - > -long long xc_domain_get_cpu_usage(int handle, unsigned int domid, > - unsigned int vcpu) > -{ > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuinfo, domid); > - domctl.u.getvcpuinfo.vcpu = vcpu; > - > - if (do_domctl(handle, &domctl) < 0) { > - xc_error_dom_set(domid, "get cpu %d usage", vcpu); > - return -1; > - } > - return domctl.u.getvcpuinfo.cpu_time; > -} > - > -void *xc_map_foreign_range(int handle, unsigned int domid, > - int size, int prot, unsigned long mfn) > -{ > - privcmd_mmap_entry_t entry = { > - .mfn = mfn, > - .npages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT, > - }; > - privcmd_mmap_t ioctlx = { > - .num = 1, > - .dom = domid, > - .entry = &entry, > - }; > - void *addr; > - > - addr = do_mmap(NULL, size, prot, MAP_SHARED, handle, 0); > - if (addr == MAP_FAILED) { > - xc_error_set("mmap failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "map foreign range [%lx,%lx] prot %u", > - mfn, mfn + size, prot); > - return NULL; > - } > - entry.va = (unsigned long) addr; > - if (do_ioctl(handle, IOCTL_PRIVCMD_MMAP, &ioctlx) < 0) { > - xc_error_set("ioctl failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "map foreign range [%lx,%lx] prot %u", > - mfn, mfn + size, prot); > - munmap(addr, size); > - return NULL; > - } > - return addr; > -} > - > -int xc_map_foreign_ranges(int handle, unsigned int domid, > - privcmd_mmap_entry_t *entries, int nr) > -{ > - privcmd_mmap_t ioctlx = { > - .num = nr, > - .dom = domid, > - .entry = entries, > - }; > - int ret; > - > - ret = do_ioctl(handle, IOCTL_PRIVCMD_MMAP, &ioctlx); > - if (ret < 0) { > - xc_error_set("ioctl failed: %s", strerror(errno)); > - xc_error_dom_set(domid, "map foreign ranges"); > - return -1; > - } > - return ret; > -} > - > -int xc_readconsolering(int handle, char **pbuffer, > - unsigned int *pnr_chars, int clear) > -{ > - int ret; > - DECLARE_SYSCTL(XEN_SYSCTL_readconsole); > - char *buffer = *pbuffer; > - unsigned int nr_chars = *pnr_chars; > - > - set_xen_guest_handle(sysctl.u.readconsole.buffer, buffer); > - sysctl.u.readconsole.count = nr_chars; > - sysctl.u.readconsole.clear = clear; > - > - if (mlock(buffer, nr_chars) != 0) { > - xc_error_set("read console ring: mlock failed: %s", > - strerror(errno)); > - return -1; > - } > - > - ret = do_sysctl(handle, &sysctl); > - if (ret != 0) > - xc_error_set("read console ring failed: %s", xc_error_get()); > - else > - *pnr_chars = sysctl.u.readconsole.count; > - > - munlock(buffer, nr_chars); > - return ret; > -} > - > -int xc_send_debug_keys(int handle, char *keys) > -{ > - int ret; > - DECLARE_SYSCTL(XEN_SYSCTL_debug_keys); > - > - set_xen_guest_handle(sysctl.u.debug_keys.keys, keys); > - sysctl.u.debug_keys.nr_keys = strlen(keys); > - > - if (mlock(keys, sysctl.u.debug_keys.nr_keys) != 0) { > - xc_error_set("send debug keys: mlock failed: %s", > - strerror(errno)); > - return -1; > - } > - > - ret = do_sysctl(handle, &sysctl); > - if (ret != 0) > - xc_error_set("send debug keys: %s", xc_error_get()); > - > - munlock(keys, sysctl.u.debug_keys.nr_keys); > - return ret; > -} > - > -int xc_physinfo(int handle, xc_physinfo_t *put_info) > -{ > - DECLARE_SYSCTL(XEN_SYSCTL_physinfo); > - int ret; > - > - ret = do_sysctl(handle, &sysctl); > - if (ret) { > - xc_error_set("physinfo failed: %s", xc_error_get()); > - return ret; > - } > - memcpy(put_info, &sysctl.u.physinfo, sizeof(*put_info)); > - return 0; > -} > - > -int xc_pcpu_info( > - int handle, int max_cpus, xen_sysctl_cpuinfo_t *info, int *nr_cpus) > -{ > - DECLARE_SYSCTL(XEN_SYSCTL_getcpuinfo); > - int ret; > - > - sysctl.u.getcpuinfo.max_cpus = max_cpus; > - set_xen_guest_handle(sysctl.u.getcpuinfo.info, info); > - > - if (mlock(info, sizeof(*info) * max_cpus) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_sysctl(handle, &sysctl); > - if (ret) > - xc_error_set("pcpu info failed: %s", xc_error_get()); > - else if (ret == 0 && nr_cpus) > - *nr_cpus = sysctl.u.getcpuinfo.nr_cpus; > - munlock(info, sizeof(*info) * max_cpus); > - return ret; > -} > - > -int xc_sched_id(int handle, int *sched_id) > -{ > - DECLARE_SYSCTL(XEN_SYSCTL_sched_id); > - int ret; > - > - ret = do_sysctl(handle, &sysctl); > - if (ret) { > - xc_error_set("sched id failed: %s", xc_error_get()); > - return ret; > - } > - *sched_id = sysctl.u.sched_id.sched_id; > - return 0; > -} > - > -int xc_version(int handle, int cmd, void *arg) > -{ > - int argsize; > - int ret; > - DECLARE_HYPERCALL2(__HYPERVISOR_xen_version, cmd, arg); > - > - switch (cmd) { > - case XENVER_extraversion: > - argsize = sizeof(xen_extraversion_t); break; > - case XENVER_compile_info: > - argsize = sizeof(xen_compile_info_t); break; > - case XENVER_capabilities: > - argsize = sizeof(xen_capabilities_info_t); break; > - case XENVER_changeset: > - argsize = sizeof(xen_changeset_info_t); break; > - case XENVER_platform_parameters: > - argsize = sizeof(xen_platform_parameters_t); break; > - case XENVER_version: > - argsize = 0; break; > - default: > - xc_error_set("version: unknown command"); > - return -1; > - } > - if (argsize && mlock(arg, argsize) == -1) { > - xc_error_set("version: mlock failed: %s", strerror(errno)); > - return -ENOMEM; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret) > - xc_error_hypercall(hypercall, ret); > - > - if (argsize) > - munlock(arg, argsize); > - return ret; > -} > - > -int xc_evtchn_alloc_unbound(int handle, unsigned int domid, > - unsigned int remote_domid) > -{ > - struct evtchn_alloc_unbound arg = { > - .dom = domid, > - .remote_dom = remote_domid, > - }; > - int ret; > - > - ret = do_evtchnctl(handle, EVTCHNOP_alloc_unbound, &arg, sizeof(arg)); > - if (ret) { > - xc_error_dom_set(domid, "alloc unbound evtchn to %d", > - remote_domid); > - return ret; > - } > - return arg.port; > -} > - > -int xc_evtchn_reset(int handle, unsigned int domid) > -{ > - struct evtchn_reset arg = { > - .dom = domid, > - }; > - int ret; > - > - ret = do_evtchnctl(handle, EVTCHNOP_reset, &arg, sizeof(arg)); > - if (ret) > - xc_error_dom_set(domid, "reset evtchn of %d", domid); > - return ret; > -} > - > -int xc_sched_credit_domain_set(int handle, unsigned int domid, > - struct xen_domctl_sched_credit *sdom) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_scheduler_op, domid); > - domctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT; > - domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_putinfo; > - domctl.u.scheduler_op.u.credit = *sdom; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "credit scheduler domain set"); > - return ret; > -} > - > -int xc_sched_credit_domain_get(int handle, unsigned int domid, > - struct xen_domctl_sched_credit *sdom) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_scheduler_op, domid); > - > - domctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT; > - domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_getinfo; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "credit scheduler domain get"); > - else > - *sdom = domctl.u.scheduler_op.u.credit; > - return ret; > -} > - > -int xc_shadow_allocation_get(int handle, unsigned int domid, uint32_t *mb) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_shadow_op, domid); > - > - domctl.u.shadow_op.op = XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "shadow allocation get"); > - else > - *mb = domctl.u.shadow_op.mb; > - return ret; > -} > - > -int xc_shadow_allocation_set(int handle, unsigned int domid, uint32_t mb) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_shadow_op, domid); > - > - domctl.u.shadow_op.op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION; > - domctl.u.shadow_op.mb = mb; > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "shadow allocation set"); > - return ret; > -} > - > -int xc_domain_get_pfn_list(int handle, unsigned int domid, > - uint64_t *pfn_array, unsigned long max_pfns) > -{ > - int ret; > - DECLARE_DOMCTL(XEN_DOMCTL_getmemlist, domid); > - > - domctl.u.getmemlist.max_pfns = max_pfns; > - set_xen_guest_handle(domctl.u.getmemlist.buffer, pfn_array); > - > - if (mlock(pfn_array, max_pfns * sizeof(xen_pfn_t)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "get pfn list"); > - > - munlock(pfn_array, max_pfns * sizeof(xen_pfn_t)); > - return (ret < 0) ? ret : domctl.u.getmemlist.num_pfns; > -} > - > -#define MARSHALL_BDF(d,b,s,f) \ > - (((b) & 0xff) << 16 | ((s) & 0x1f) << 11 | ((f) & 0x7) << 8) > - > -int xc_domain_assign_device(int handle, unsigned int domid, > - int domain, int bus, int slot, int func) > -{ > - int ret = -EBADF; > -#ifdef XEN_DOMCTL_assign_device > - DECLARE_DOMCTL(XEN_DOMCTL_assign_device, domid); > - > - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "assign device"); > -#endif > - return ret; > -} > - > -int xc_domain_deassign_device(int handle, unsigned int domid, > - int domain, int bus, int slot, int func) > -{ > - int ret = -EBADF; > -#ifdef XEN_DOMCTL_deassign_device > - DECLARE_DOMCTL(XEN_DOMCTL_deassign_device, domid); > - > - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "deassign device"); > -#endif > - return ret; > -} > - > -int xc_domain_test_assign_device(int handle, unsigned int domid, > - int domain, int bus, int slot, int func) > -{ > - int ret = -EBADF; > -#ifdef XEN_DOMCTL_test_assign_device > - DECLARE_DOMCTL(XEN_DOMCTL_test_assign_device, domid); > - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); > - > - ret = do_domctl(handle, &domctl); > - if (ret < 0) > - xc_error_dom_set(domid, "test assign device"); > -#endif > - return ret; > -} > - > -int xc_domain_watchdog(int handle, int id, uint32_t timeout) > -{ > - int ret = -EBADF; > -#ifdef SCHEDOP_watchdog > - sched_watchdog_t arg = { > - .id = (uint32_t) id, > - .timeout = timeout, > - }; > - DECLARE_HYPERCALL2(__HYPERVISOR_sched_op, SCHEDOP_watchdog, &arg); > - > - if (mlock(&arg, sizeof(arg)) != 0) { > - xc_error_set("mlock failed: %s", strerror(errno)); > - return -1; > - } > - > - ret = do_xen_hypercall(handle, &hypercall); > - if (ret < 0) { > - xc_error_hypercall(hypercall, ret); > - } > - munlock(&arg, sizeof(arg)); > -#endif > - return ret; > -} > - > -int xc_domain_set_machine_address_size(int xc, uint32_t domid, unsigned int width) > -{ > - DECLARE_DOMCTL(XEN_DOMCTL_set_machine_address_size, domid); > - int rc; > - > - domctl.u.address_size.size = width; > - rc = do_domctl(xc, &domctl); > - if (rc != 0) > - xc_error_dom_set(domid, "set machine address size"); > - > - return rc; > -} > - > -int xc_domain_get_machine_address_size(int xc, uint32_t domid) > -{ > - DECLARE_DOMCTL(XEN_DOMCTL_get_machine_address_size, domid); > - int rc; > - > - rc = do_domctl(xc, &domctl); > - if (rc != 0) > - xc_error_dom_set(domid, "get machine address size"); > - return rc == 0 ? domctl.u.address_size.size : rc; > -} > - > -#include "xc_cpuid.h" > -int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm, > - uint32_t input, uint32_t oinput, > - char *config[4], char *config_out[4]) > -{ > - int ret = -EBADF; > -#ifdef XEN_DOMCTL_set_cpuid > - DECLARE_DOMCTL(XEN_DOMCTL_set_cpuid, domid); > - uint32_t regs[4], polregs[4]; > - int i, j; > - > - xc_cpuid(input, oinput, regs); > - memcpy(polregs, regs, sizeof(regs)); > - do_cpuid_policy(xc, domid, hvm, input, polregs); > - > - for (i = 0; i < 4; i++) { > - if (!config[i]) { > - regs[i] = polregs[i]; > - continue; > - } > - > - for (j = 0; j < 32; j++) { > - unsigned char val, polval; > - > - val = !!((regs[i] & (1U << (31 - j)))); > - polval = !!((regs[i] & (1U << (31 - j)))); > - > - switch (config[i][j]) { > - case ''1'': val = 1; break; /* force to true */ > - case ''0'': val = 0; break; /* force to false */ > - case ''x'': val = polval; break; > - case ''k'': case ''s'': break; > - default: > - xc_error_dom_set(domid, "domain cpuid set: invalid config"); > - ret = -EINVAL; > - goto out; > - } > - > - if (val) > - set_bit(31 - j, regs[i]); > - else > - clear_bit(31 - j, regs[i]); > - > - if (config_out && config_out[i]) { > - config_out[i][j] = (config[i][j] == ''s'') > - ? ''0'' + val > - : config[i][j]; > - } > - } > - } > - > - domctl.u.cpuid.input[0] = input; > - domctl.u.cpuid.input[1] = oinput; > - domctl.u.cpuid.eax = regs[0]; > - domctl.u.cpuid.ebx = regs[1]; > - domctl.u.cpuid.ecx = regs[2]; > - domctl.u.cpuid.edx = regs[3]; > - ret = do_domctl(xc, &domctl); > - if (ret) { > - xc_error_dom_set(domid, "cpuid set"); > - goto out; > - } > -out: > -#endif > - return ret; > -} > - > -int xc_domain_cpuid_apply(int xc, unsigned int domid, int hvm) > -{ > - int ret = -EBADF; > -#ifdef XEN_DOMCTL_set_cpuid > - uint32_t regs[4], base_max, ext_max, eax, ecx; > - > - /* determinate cpuid range */ > - xc_cpuid(0, 0, regs); > - base_max = MIN(regs[0], DEF_MAX_BASE); > - xc_cpuid(0x80000000, 0, regs); > - ext_max = MIN(regs[0], DEF_MAX_EXT); > - > - eax = ecx = 0; > - while (!(eax & 0x80000000) || (eax <= ext_max)) { > - xc_cpuid(eax, ecx, regs); > - > - do_cpuid_policy(xc, domid, hvm, eax, regs); > - > - if (regs[0] || regs[1] || regs[2] || regs[3]) { > - DECLARE_DOMCTL(XEN_DOMCTL_set_cpuid, domid); > - > - domctl.u.cpuid.input[0] = eax; > - domctl.u.cpuid.input[1] = (eax == 4) ? ecx : XEN_CPUID_INPUT_UNUSED; > - domctl.u.cpuid.eax = regs[0]; > - domctl.u.cpuid.ebx = regs[1]; > - domctl.u.cpuid.ecx = regs[2]; > - domctl.u.cpuid.edx = regs[3]; > - > - ret = do_domctl(xc, &domctl); > - if (ret) { > - xc_error_dom_set(domid, "cpuid apply"); > - goto out; > - } > - > - /* we repeat when doing node 4 (cache descriptor leaves) increasing ecx > - * until the cpuid eax value masked is 0 */ > - if (eax == 4) { > - ecx++; > - if ((regs[0] & 0x1f) != 0) > - continue; > - ecx = 0; > - } > - } > - > - eax++; > - if (!(eax & 0x80000000) && (eax > base_max)) > - eax = 0x80000000; > - } > - ret = 0; > -out: > -#endif > - return ret; > -} > - > -/* > - * return 1 on checking success > - * 0 on checking failure > - * -EINVAL if the config contains unknown character > - */ > -int xc_cpuid_check(uint32_t input, uint32_t optsubinput, > - char *config[4], char *config_out[4]) > -{ > - int ret = -EBADF; > -#ifdef XEN_DOMCTL_set_cpuid > - uint32_t regs[4]; > - int i, j; > - > - xc_cpuid(input, optsubinput, regs); > - > - ret = 1; > - for (i = 0; i < 4; i++) { > - if (!config[i]) > - continue; > - for (j = 0; j < 32; j++) { > - unsigned char val; > - > - val = !!((regs[i] & (1U << (31 - j)))); > - > - switch (config[i][j]) { > - case ''1'': if (!val) { ret = 0; goto out; }; break; > - case ''0'': if (val) { ret = 0; goto out; }; break; > - case ''x'': case ''s'': break; > - default: > - xc_error_set("cpuid check: invalid config"); > - ret = -EINVAL; > - goto out; > - } > - > - if (config_out && config_out[i]) { > - config_out[i][j] = (config[i][j] == ''s'') > - ? ''0'' + val > - : config[i][j]; > - } > - } > - } > -out: > -#endif > - 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) > -{ > - 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; > - unsigned long value; > - > - ret = xc_get_hvm_param(handle, domid, HVM_PARAM_ACPI_S_STATE, &value); > - if (ret != 0) > - xc_error_dom_set(domid, "get acpi s-state"); > - return value; > -} > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_stubs.c > --- a/tools/ocaml/libs/xc/xc_stubs.c Fri Sep 10 11:10:00 2010 +0100 > +++ b/tools/ocaml/libs/xc/xc_stubs.c Fri Sep 10 11:10:02 2010 +0100 > @@ -16,6 +16,7 @@ > > #define _XOPEN_SOURCE 600 > #include <stdlib.h> > +#include <errno.h> > > #define CAML_NAME_SPACE > #include <caml/alloc.h> > @@ -28,7 +29,7 @@ > #include <stdint.h> > #include <string.h> > > -#include "xc.h" > +#include <xenctrl.h> > > #include "mmap_stubs.h" > > @@ -36,7 +37,7 @@ > #define PAGE_SIZE (1UL << PAGE_SHIFT) > #define PAGE_MASK (~(PAGE_SIZE-1)) > > -#define _H(__h) (Int_val(__h)) > +#define _H(__h) ((xc_interface *)(__h)) > #define _D(__d) ((uint32_t)Int_val(__d)) > > #define Val_none (Val_int(0)) > @@ -50,12 +51,12 @@ > i1 = (uint32_t) Int64_val(Field(input, 0)); \ > i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0))); > > -/** > - * Convert the given number of pages to an amount in MiB, rounded up. > - */ > +#define ERROR_STRLEN 256 > void failwith_xc(void) > { > - caml_raise_with_string(*caml_named_value("xc.error"), xc_error_get()); > + static char error_str[ERROR_STRLEN]; > + snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno)); > + caml_raise_with_string(*caml_named_value("xc.error"), error_str); > } > > CAMLprim value stub_sizeof_core_header(value unit) > @@ -101,11 +102,11 @@ CAMLprim value stub_marshall_core_header > > CAMLprim value stub_xc_interface_open(void) > { > - int handle; > - handle = xc_interface_open(); > - if (handle == -1) > + xc_interface *xch; > + xch = xc_interface_open(NULL, NULL, 0); > + if (xch == NULL) > failwith_xc(); > - return Val_int(handle); > + return (value)xch; > } > > > @@ -116,20 +117,15 @@ CAMLprim value stub_xc_interface_open_fa > > CAMLprim value stub_xc_using_injection(void) > { > - if (xc_using_injection ()){ > - return Val_int(1); > - } else { > - return Val_int(0); > - } > + return Val_int(0); > } > > -CAMLprim value stub_xc_interface_close(value xc_handle) > +CAMLprim value stub_xc_interface_close(value xch) > { > - CAMLparam1(xc_handle); > + CAMLparam1(xch); > > - int handle = _H(xc_handle); > // caml_enter_blocking_section(); > - xc_interface_close(handle); > + xc_interface_close(_H(xch)); > // caml_leave_blocking_section(); > > CAMLreturn(Val_unit); > @@ -140,16 +136,15 @@ static int domain_create_flag_table[] > XEN_DOMCTL_CDF_hap, > }; > > -CAMLprim value stub_xc_domain_create(value xc_handle, value ssidref, > +CAMLprim value stub_xc_domain_create(value xch, value ssidref, > value flags, value handle) > { > - CAMLparam4(xc_handle, ssidref, flags, handle); > + CAMLparam4(xch, ssidref, flags, handle); > > uint32_t domid = 0; > xen_domain_handle_t h = { 0 }; > int result; > int i; > - int c_xc_handle = _H(xc_handle); > uint32_t c_ssidref = Int32_val(ssidref); > unsigned int c_flags = 0; > value l; > @@ -167,7 +162,7 @@ CAMLprim value stub_xc_domain_create(val > } > > // caml_enter_blocking_section(); > - result = xc_domain_create(c_xc_handle, c_ssidref, h, c_flags, &domid); > + result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid); > // caml_leave_blocking_section(); > > if (result < 0) > @@ -176,37 +171,23 @@ CAMLprim value stub_xc_domain_create(val > CAMLreturn(Val_int(domid)); > } > > -CAMLprim value stub_xc_domain_setvmxassist(value xc_handle, value domid, > - value use_vmxassist) > +CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid, > + value max_vcpus) > { > - CAMLparam3(xc_handle, domid, use_vmxassist); > + CAMLparam3(xch, domid, max_vcpus); > int r; > > - r = xc_domain_setvmxassist(_H(xc_handle), _D(domid), > - Bool_val(use_vmxassist)); > + r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus)); > if (r) > failwith_xc(); > > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_max_vcpus(value xc_handle, value domid, > - value max_vcpus) > + > +value stub_xc_domain_sethandle(value xch, value domid, value handle) > { > - CAMLparam3(xc_handle, domid, max_vcpus); > - int r; > - > - r = xc_domain_max_vcpus(_H(xc_handle), _D(domid), Int_val(max_vcpus)); > - if (r) > - failwith_xc(); > - > - CAMLreturn(Val_unit); > -} > - > - > -value stub_xc_domain_sethandle(value xc_handle, value domid, value handle) > -{ > - CAMLparam3(xc_handle, domid, handle); > + CAMLparam3(xch, domid, handle); > xen_domain_handle_t h = { 0 }; > int i; > > @@ -217,55 +198,63 @@ value stub_xc_domain_sethandle(value xc_ > h[i] = Int_val(Field(handle, i)) & 0xff; > } > > - i = xc_domain_sethandle(_H(xc_handle), _D(domid), h); > + i = xc_domain_sethandle(_H(xch), _D(domid), h); > if (i) > failwith_xc(); > > CAMLreturn(Val_unit); > } > > -static value dom_op(value xc_handle, value domid, int (*fn)(int, uint32_t)) > +static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t)) > { > - CAMLparam2(xc_handle, domid); > + CAMLparam2(xch, domid); > > - int c_xc_handle = _H(xc_handle); > uint32_t c_domid = _D(domid); > > // caml_enter_blocking_section(); > - int result = fn(c_xc_handle, c_domid); > + int result = fn(_H(xch), c_domid); > // caml_leave_blocking_section(); > if (result) > failwith_xc(); > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_pause(value xc_handle, value domid) > +CAMLprim value stub_xc_domain_pause(value xch, value domid) > { > - return dom_op(xc_handle, domid, xc_domain_pause); > + return dom_op(xch, domid, xc_domain_pause); > } > > > -CAMLprim value stub_xc_domain_unpause(value xc_handle, value domid) > +CAMLprim value stub_xc_domain_unpause(value xch, value domid) > { > - return dom_op(xc_handle, domid, xc_domain_unpause); > + return dom_op(xch, domid, xc_domain_unpause); > } > > -CAMLprim value stub_xc_domain_destroy(value xc_handle, value domid) > +CAMLprim value stub_xc_domain_destroy(value xch, value domid) > { > - return dom_op(xc_handle, domid, xc_domain_destroy); > + return dom_op(xch, domid, xc_domain_destroy); > } > > -CAMLprim value stub_xc_domain_resume_fast(value xc_handle, value domid) > +CAMLprim value stub_xc_domain_resume_fast(value xch, value domid) > { > - return dom_op(xc_handle, domid, xc_domain_resume_fast); > + 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(); > + CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_shutdown(value handle, value domid, value reason) > +CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason) > { > - CAMLparam3(handle, domid, reason); > + CAMLparam3(xch, domid, reason); > int ret; > > - ret = xc_domain_shutdown(_H(handle), _D(domid), Int_val(reason)); > + ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason)); > if (ret < 0) > failwith_xc(); > > @@ -307,12 +296,12 @@ static value alloc_domaininfo(xc_domaini > CAMLreturn(result); > } > > -CAMLprim value stub_xc_domain_getinfolist(value xc_handle, value first_domain, value nb) > +CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb) > { > - CAMLparam3(xc_handle, first_domain, nb); > + CAMLparam3(xch, first_domain, nb); > CAMLlocal2(result, temp); > xc_domaininfo_t * info; > - int i, ret, toalloc, c_xc_handle, retval; > + int i, ret, toalloc, retval; > unsigned int c_max_domains; > uint32_t c_first_domain; > > @@ -324,11 +313,10 @@ CAMLprim value stub_xc_domain_getinfolis > > result = temp = Val_emptylist; > > - c_xc_handle = _H(xc_handle); > c_first_domain = _D(first_domain); > c_max_domains = Int_val(nb); > // caml_enter_blocking_section(); > - retval = xc_domain_getinfolist(c_xc_handle, c_first_domain, > + retval = xc_domain_getinfolist(_H(xch), c_first_domain, > c_max_domains, info); > // caml_leave_blocking_section(); > > @@ -349,33 +337,34 @@ CAMLprim value stub_xc_domain_getinfolis > CAMLreturn(result); > } > > -CAMLprim value stub_xc_domain_getinfo(value xc_handle, value domid) > +CAMLprim value stub_xc_domain_getinfo(value xch, value domid) > { > - CAMLparam2(xc_handle, domid); > + CAMLparam2(xch, domid); > CAMLlocal1(result); > xc_domaininfo_t info; > int ret; > > - ret = xc_domain_getinfo(_H(xc_handle), _D(domid), &info); > + ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info); > if (ret != 0) > + failwith_xc(); > + if (info.domain != _D(domid)) > failwith_xc(); > > result = alloc_domaininfo(&info); > CAMLreturn(result); > } > > -CAMLprim value stub_xc_vcpu_getinfo(value xc_handle, value domid, value vcpu) > +CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu) > { > - CAMLparam3(xc_handle, domid, vcpu); > + CAMLparam3(xch, domid, vcpu); > CAMLlocal1(result); > xc_vcpuinfo_t info; > int retval; > > - int c_xc_handle = _H(xc_handle); > uint32_t c_domid = _D(domid); > uint32_t c_vcpu = Int_val(vcpu); > // caml_enter_blocking_section(); > - retval = xc_vcpu_getinfo(c_xc_handle, c_domid, > + retval = xc_vcpu_getinfo(_H(xch), c_domid, > c_vcpu, &info); > // caml_leave_blocking_section(); > if (retval < 0) > @@ -391,15 +380,15 @@ CAMLprim value stub_xc_vcpu_getinfo(valu > CAMLreturn(result); > } > > -CAMLprim value stub_xc_vcpu_context_get(value xc_handle, value domid, > +CAMLprim value stub_xc_vcpu_context_get(value xch, value domid, > value cpu) > { > - CAMLparam3(xc_handle, domid, cpu); > + CAMLparam3(xch, domid, cpu); > CAMLlocal1(context); > int ret; > vcpu_guest_context_any_t ctxt; > > - ret = xc_vcpu_getcontext(_H(xc_handle), _D(domid), Int_val(cpu), &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)); > @@ -407,59 +396,60 @@ CAMLprim value stub_xc_vcpu_context_get( > CAMLreturn(context); > } > > -CAMLprim value stub_xc_vcpu_setaffinity(value xc_handle, value domid, > +CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid, > value vcpu, value cpumap) > { > - CAMLparam4(xc_handle, domid, vcpu, cpumap); > + CAMLparam4(xch, domid, vcpu, cpumap); > uint64_t c_cpumap; > int retval; > > c_cpumap = Int64_val(cpumap); > - retval = xc_vcpu_setaffinity(_H(xc_handle), _D(domid), > - Int_val(vcpu), c_cpumap); > + retval = xc_vcpu_setaffinity(_H(xch), _D(domid), > + Int_val(vcpu), > + &c_cpumap, sizeof(c_cpumap)); > if (retval < 0) > failwith_xc(); > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_vcpu_getaffinity(value xc_handle, value domid, > +CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid, > value vcpu) > { > - CAMLparam3(xc_handle, domid, vcpu); > + CAMLparam3(xch, domid, vcpu); > CAMLlocal1(ret); > uint64_t cpumap; > int retval; > > - retval = xc_vcpu_getaffinity(_H(xc_handle), _D(domid), > - Int_val(vcpu), &cpumap); > + retval = xc_vcpu_getaffinity(_H(xch), _D(domid), > + Int_val(vcpu), > + &cpumap, sizeof(cpumap)); > if (retval < 0) > failwith_xc(); > ret = caml_copy_int64(cpumap); > CAMLreturn(ret); > } > > -CAMLprim value stub_xc_sched_id(value xc_handle) > +CAMLprim value stub_xc_sched_id(value xch) > { > - CAMLparam1(xc_handle); > + CAMLparam1(xch); > int sched_id; > > - if (xc_sched_id(_H(xc_handle), &sched_id)) > + if (xc_sched_id(_H(xch), &sched_id)) > failwith_xc(); > CAMLreturn(Val_int(sched_id)); > } > > -CAMLprim value stub_xc_evtchn_alloc_unbound(value xc_handle, > +CAMLprim value stub_xc_evtchn_alloc_unbound(value xch, > value local_domid, > value remote_domid) > { > - CAMLparam3(xc_handle, local_domid, remote_domid); > + CAMLparam3(xch, local_domid, remote_domid); > > - int c_xc_handle = _H(xc_handle); > 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(c_xc_handle, c_local_domid, > + int result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid, > c_remote_domid); > // caml_leave_blocking_section(); > > @@ -483,16 +473,15 @@ CAMLprim value stub_xc_evtchn_reset(valu > #define RING_SIZE 32768 > static char ring[RING_SIZE]; > > -CAMLprim value stub_xc_readconsolering(value xc_handle) > +CAMLprim value stub_xc_readconsolering(value xch) > { > unsigned int size = RING_SIZE; > char *ring_ptr = ring; > > - CAMLparam1(xc_handle); > - int c_xc_handle = _H(xc_handle); > + CAMLparam1(xch); > > // caml_enter_blocking_section(); > - int retval = xc_readconsolering(c_xc_handle, &ring_ptr, &size, 0); > + int retval = xc_readconsolering(_H(xch), &ring_ptr, &size, 0, 0, NULL); > // caml_leave_blocking_section(); > > if (retval) > @@ -501,26 +490,26 @@ CAMLprim value stub_xc_readconsolering(v > CAMLreturn(caml_copy_string(ring)); > } > > -CAMLprim value stub_xc_send_debug_keys(value xc_handle, value keys) > +CAMLprim value stub_xc_send_debug_keys(value xch, value keys) > { > - CAMLparam2(xc_handle, keys); > + CAMLparam2(xch, keys); > int r; > > - r = xc_send_debug_keys(_H(xc_handle), String_val(keys)); > + r = xc_send_debug_keys(_H(xch), String_val(keys)); > if (r) > failwith_xc(); > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_physinfo(value xc_handle) > +CAMLprim value stub_xc_physinfo(value xch) > { > - CAMLparam1(xc_handle); > + CAMLparam1(xch); > CAMLlocal3(physinfo, cap_list, tmp); > xc_physinfo_t c_physinfo; > int r; > > // caml_enter_blocking_section(); > - r = xc_physinfo(_H(xc_handle), &c_physinfo); > + r = xc_physinfo(_H(xch), &c_physinfo); > // caml_leave_blocking_section(); > > if (r) > @@ -550,11 +539,11 @@ CAMLprim value stub_xc_physinfo(value xc > CAMLreturn(physinfo); > } > > -CAMLprim value stub_xc_pcpu_info(value xc_handle, value nr_cpus) > +CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus) > { > - CAMLparam2(xc_handle, nr_cpus); > + CAMLparam2(xch, nr_cpus); > CAMLlocal2(pcpus, v); > - xen_sysctl_cpuinfo_t *info; > + xc_cpuinfo_t *info; > int r, size; > > if (Int_val(nr_cpus) < 1) > @@ -565,7 +554,7 @@ CAMLprim value stub_xc_pcpu_info(value x > caml_raise_out_of_memory(); > > // caml_enter_blocking_section(); > - r = xc_pcpu_info(_H(xc_handle), Int_val(nr_cpus), info, &size); > + r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size); > // caml_leave_blocking_section(); > > if (r) { > @@ -586,16 +575,15 @@ CAMLprim value stub_xc_pcpu_info(value x > CAMLreturn(pcpus); > } > > -CAMLprim value stub_xc_domain_setmaxmem(value xc_handle, value domid, > +CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid, > value max_memkb) > { > - CAMLparam3(xc_handle, domid, max_memkb); > + CAMLparam3(xch, domid, max_memkb); > > - int c_xc_handle = _H(xc_handle); > uint32_t c_domid = _D(domid); > unsigned int c_max_memkb = Int64_val(max_memkb); > // caml_enter_blocking_section(); > - int retval = xc_domain_setmaxmem(c_xc_handle, c_domid, > + int retval = xc_domain_setmaxmem(_H(xch), c_domid, > c_max_memkb); > // caml_leave_blocking_section(); > if (retval) > @@ -603,33 +591,32 @@ CAMLprim value stub_xc_domain_setmaxmem( > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_set_memmap_limit(value xc_handle, value domid, > +CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid, > value map_limitkb) > { > - CAMLparam3(xc_handle, domid, map_limitkb); > + CAMLparam3(xch, domid, map_limitkb); > unsigned long v; > int retval; > > v = Int64_val(map_limitkb); > - retval = xc_domain_set_memmap_limit(_H(xc_handle), _D(domid), v); > + retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v); > if (retval) > failwith_xc(); > > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_memory_increase_reservation(value xc_handle, > +CAMLprim value stub_xc_domain_memory_increase_reservation(value xch, > value domid, > value mem_kb) > { > - CAMLparam3(xc_handle, domid, mem_kb); > + CAMLparam3(xch, domid, mem_kb); > > unsigned long nr_extents = ((unsigned long)(Int64_val(mem_kb))) >> (PAGE_SHIFT - 10); > > - int c_xc_handle = _H(xc_handle); > uint32_t c_domid = _D(domid); > // caml_enter_blocking_section(); > - int retval = xc_domain_memory_increase_reservation(c_xc_handle, c_domid, > + int retval = xc_domain_memory_increase_reservation(_H(xch), c_domid, > nr_extents, 0, 0, NULL); > // caml_leave_blocking_section(); > > @@ -638,49 +625,48 @@ CAMLprim value stub_xc_domain_memory_inc > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_set_machine_address_size(value xc_handle, > +CAMLprim value stub_xc_domain_set_machine_address_size(value xch, > value domid, > value width) > { > - CAMLparam3(xc_handle, domid, width); > - int c_xc_handle = _H(xc_handle); > + CAMLparam3(xch, domid, width); > uint32_t c_domid = _D(domid); > int c_width = Int_val(width); > > - int retval = xc_domain_set_machine_address_size(c_xc_handle, c_domid, c_width); > + int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width); > if (retval) > failwith_xc(); > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_get_machine_address_size(value xc_handle, > +CAMLprim value stub_xc_domain_get_machine_address_size(value xch, > value domid) > { > - CAMLparam2(xc_handle, domid); > + CAMLparam2(xch, domid); > int retval; > > - retval = xc_domain_get_machine_address_size(_H(xc_handle), _D(domid)); > + retval = xc_domain_get_machine_address_size(_H(xch), _D(domid)); > if (retval < 0) > failwith_xc(); > CAMLreturn(Val_int(retval)); > } > > -CAMLprim value stub_xc_domain_cpuid_set(value xc_handle, value domid, > - value is_hvm, value input, > +CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid, > + value input, > value config) > { > - CAMLparam5(xc_handle, domid, is_hvm, input, config); > + CAMLparam4(xch, domid, input, config); > CAMLlocal2(array, tmp); > int r; > + unsigned int c_input[2]; > char *c_config[4], *out_config[4]; > - uint32_t c_input, c_oinput; > > 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, c_oinput, input); > + cpuid_input_of_val(c_input[0], c_input[1], input); > > array = caml_alloc(4, 0); > for (r = 0; r < 4; r++) { > @@ -695,29 +681,30 @@ CAMLprim value stub_xc_domain_cpuid_set( > for (r = 0; r < 4; r++) > out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL; > > - r = xc_domain_cpuid_set(_H(xc_handle), _D(domid), Bool_val(is_hvm), > - c_input, c_oinput, c_config, out_config); > + r = xc_cpuid_set(_H(xch), _D(domid), > + c_input, (const char **)c_config, out_config); > if (r < 0) > failwith_xc(); > CAMLreturn(array); > } > > -CAMLprim value stub_xc_domain_cpuid_apply(value xc_handle, value domid, value is_hvm) > +CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid) > { > - CAMLparam3(xc_handle, domid, is_hvm); > + CAMLparam2(xch, domid); > int r; > - r = xc_domain_cpuid_apply(_H(xc_handle), _D(domid), Bool_val(is_hvm)); > + > + r = xc_cpuid_apply_policy(_H(xch), _D(domid)); > if (r < 0) > failwith_xc(); > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_cpuid_check(value input, value config) > +CAMLprim value stub_xc_cpuid_check(value xch, value input, value config) > { > - CAMLparam2(input, config); > + CAMLparam3(xch, input, config); > CAMLlocal3(ret, array, tmp); > int r; > - uint32_t c_input, c_oinput; > + unsigned int c_input[2]; > char *c_config[4], *out_config[4]; > > c_config[0] = string_of_option_array(config, 0); > @@ -725,7 +712,7 @@ CAMLprim value stub_xc_cpuid_check(value > c_config[2] = string_of_option_array(config, 2); > c_config[3] = string_of_option_array(config, 3); > > - cpuid_input_of_val(c_input, c_oinput, input); > + cpuid_input_of_val(c_input[0], c_input[1], input); > > array = caml_alloc(4, 0); > for (r = 0; r < 4; r++) { > @@ -740,7 +727,7 @@ CAMLprim value stub_xc_cpuid_check(value > for (r = 0; r < 4; r++) > out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL; > > - r = xc_cpuid_check(c_input, c_oinput, c_config, out_config); > + r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config); > if (r < 0) > failwith_xc(); > > @@ -751,18 +738,17 @@ CAMLprim value stub_xc_cpuid_check(value > CAMLreturn(ret); > } > > -CAMLprim value stub_xc_version_version(value xc_handle) > +CAMLprim value stub_xc_version_version(value xch) > { > - CAMLparam1(xc_handle); > + CAMLparam1(xch); > CAMLlocal1(result); > xen_extraversion_t extra; > long packed; > int retval; > > - int c_xc_handle = _H(xc_handle); > // caml_enter_blocking_section(); > - packed = xc_version(c_xc_handle, XENVER_version, NULL); > - retval = xc_version(c_xc_handle, XENVER_extraversion, &extra); > + packed = xc_version(_H(xch), XENVER_version, NULL); > + retval = xc_version(_H(xch), XENVER_extraversion, &extra); > // caml_leave_blocking_section(); > > if (retval) > @@ -778,16 +764,15 @@ CAMLprim value stub_xc_version_version(v > } > > > -CAMLprim value stub_xc_version_compile_info(value xc_handle) > +CAMLprim value stub_xc_version_compile_info(value xch) > { > - CAMLparam1(xc_handle); > + CAMLparam1(xch); > CAMLlocal1(result); > xen_compile_info_t ci; > int retval; > > - int c_xc_handle = _H(xc_handle); > // caml_enter_blocking_section(); > - retval = xc_version(c_xc_handle, XENVER_compile_info, &ci); > + retval = xc_version(_H(xch), XENVER_compile_info, &ci); > // caml_leave_blocking_section(); > > if (retval) > @@ -804,14 +789,13 @@ CAMLprim value stub_xc_version_compile_i > } > > > -static value xc_version_single_string(value xc_handle, int code, void *info) > +static value xc_version_single_string(value xch, int code, void *info) > { > - CAMLparam1(xc_handle); > + CAMLparam1(xch); > int retval; > > - int c_xc_handle = _H(xc_handle); > // caml_enter_blocking_section(); > - retval = xc_version(c_xc_handle, code, info); > + retval = xc_version(_H(xch), code, info); > // caml_leave_blocking_section(); > > if (retval) > @@ -821,19 +805,19 @@ static value xc_version_single_string(va > } > > > -CAMLprim value stub_xc_version_changeset(value xc_handle) > +CAMLprim value stub_xc_version_changeset(value xch) > { > xen_changeset_info_t ci; > > - return xc_version_single_string(xc_handle, XENVER_changeset, &ci); > + return xc_version_single_string(xch, XENVER_changeset, &ci); > } > > > -CAMLprim value stub_xc_version_capabilities(value xc_handle) > +CAMLprim value stub_xc_version_capabilities(value xch) > { > xen_capabilities_info_t ci; > > - return xc_version_single_string(xc_handle, XENVER_capabilities, &ci); > + return xc_version_single_string(xch, XENVER_capabilities, &ci); > } > > > @@ -845,13 +829,12 @@ CAMLprim value stub_pages_to_kib(value p > } > > > -CAMLprim value stub_map_foreign_range(value xc_handle, value dom, > +CAMLprim value stub_map_foreign_range(value xch, value dom, > value size, value mfn) > { > - CAMLparam4(xc_handle, dom, size, mfn); > + CAMLparam4(xch, dom, size, mfn); > CAMLlocal1(result); > struct mmap_interface *intf; > - int c_xc_handle; > uint32_t c_dom; > unsigned long c_mfn; > > @@ -860,11 +843,10 @@ CAMLprim value stub_map_foreign_range(va > > intf->len = Int_val(size); > > - c_xc_handle = _H(xc_handle); > c_dom = _D(dom); > c_mfn = Nativeint_val(mfn); > // caml_enter_blocking_section(); > - intf->addr = xc_map_foreign_range(c_xc_handle, c_dom, > + intf->addr = xc_map_foreign_range(_H(xch), c_dom, > intf->len, PROT_READ|PROT_WRITE, > c_mfn); > // caml_leave_blocking_section(); > @@ -873,15 +855,15 @@ CAMLprim value stub_map_foreign_range(va > CAMLreturn(result); > } > > -CAMLprim value stub_sched_credit_domain_get(value xc_handle, value domid) > +CAMLprim value stub_sched_credit_domain_get(value xch, value domid) > { > - CAMLparam2(xc_handle, 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(xc_handle), _D(domid), &c_sdom); > + ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom); > // caml_leave_blocking_section(); > if (ret != 0) > failwith_xc(); > @@ -893,17 +875,17 @@ CAMLprim value stub_sched_credit_domain_ > CAMLreturn(sdom); > } > > -CAMLprim value stub_sched_credit_domain_set(value xc_handle, value domid, > +CAMLprim value stub_sched_credit_domain_set(value xch, value domid, > value sdom) > { > - CAMLparam3(xc_handle, domid, 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(xc_handle), _D(domid), &c_sdom); > + ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom); > // caml_leave_blocking_section(); > if (ret != 0) > failwith_xc(); > @@ -911,15 +893,17 @@ CAMLprim value stub_sched_credit_domain_ > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_shadow_allocation_get(value xc_handle, value domid) > +CAMLprim value stub_shadow_allocation_get(value xch, value domid) > { > - CAMLparam2(xc_handle, domid); > + CAMLparam2(xch, domid); > CAMLlocal1(mb); > - uint32_t c_mb; > + unsigned long c_mb; > int ret; > > // caml_enter_blocking_section(); > - ret = xc_shadow_allocation_get(_H(xc_handle), _D(domid), &c_mb); > + 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(); > @@ -928,16 +912,18 @@ CAMLprim value stub_shadow_allocation_ge > CAMLreturn(mb); > } > > -CAMLprim value stub_shadow_allocation_set(value xc_handle, value domid, > +CAMLprim value stub_shadow_allocation_set(value xch, value domid, > value mb) > { > - CAMLparam3(xc_handle, domid, mb); > - uint32_t c_mb; > + CAMLparam3(xch, domid, mb); > + unsigned long c_mb; > int ret; > > c_mb = Int_val(mb); > // caml_enter_blocking_section(); > - ret = xc_shadow_allocation_set(_H(xc_handle), _D(domid), c_mb); > + 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(); > @@ -945,10 +931,10 @@ CAMLprim value stub_shadow_allocation_se > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_get_pfn_list(value xc_handle, value domid, > +CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid, > value nr_pfns) > { > - CAMLparam3(xc_handle, domid, nr_pfns); > + CAMLparam3(xch, domid, nr_pfns); > CAMLlocal2(array, v); > unsigned long c_nr_pfns; > long ret, i; > @@ -960,8 +946,8 @@ CAMLprim value stub_xc_domain_get_pfn_li > if (!c_array) > caml_raise_out_of_memory(); > > - ret = xc_domain_get_pfn_list(_H(xc_handle), _D(domid), > - c_array, c_nr_pfns); > + ret = xc_get_pfn_list(_H(xch), _D(domid), > + c_array, c_nr_pfns); > if (ret < 0) { > free(c_array); > failwith_xc(); > @@ -977,11 +963,11 @@ CAMLprim value stub_xc_domain_get_pfn_li > CAMLreturn(array); > } > > -CAMLprim value stub_xc_domain_ioport_permission(value xc_handle, value domid, > +CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid, > value start_port, value nr_ports, > value allow) > { > - CAMLparam5(xc_handle, domid, start_port, nr_ports, allow); > + CAMLparam5(xch, domid, start_port, nr_ports, allow); > uint32_t c_start_port, c_nr_ports; > uint8_t c_allow; > int ret; > @@ -990,7 +976,7 @@ CAMLprim value stub_xc_domain_ioport_per > c_nr_ports = Int_val(nr_ports); > c_allow = Bool_val(allow); > > - ret = xc_domain_ioport_permission(_H(xc_handle), _D(domid), > + ret = xc_domain_ioport_permission(_H(xch), _D(domid), > c_start_port, c_nr_ports, c_allow); > if (ret < 0) > failwith_xc(); > @@ -998,11 +984,11 @@ CAMLprim value stub_xc_domain_ioport_per > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_iomem_permission(value xc_handle, value domid, > +CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid, > value start_pfn, value nr_pfns, > value allow) > { > - CAMLparam5(xc_handle, domid, start_pfn, nr_pfns, allow); > + CAMLparam5(xch, domid, start_pfn, nr_pfns, allow); > unsigned long c_start_pfn, c_nr_pfns; > uint8_t c_allow; > int ret; > @@ -1011,7 +997,7 @@ CAMLprim value stub_xc_domain_iomem_perm > c_nr_pfns = Nativeint_val(nr_pfns); > c_allow = Bool_val(allow); > > - ret = xc_domain_iomem_permission(_H(xc_handle), _D(domid), > + ret = xc_domain_iomem_permission(_H(xch), _D(domid), > c_start_pfn, c_nr_pfns, c_allow); > if (ret < 0) > failwith_xc(); > @@ -1019,10 +1005,10 @@ CAMLprim value stub_xc_domain_iomem_perm > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_irq_permission(value xc_handle, value domid, > +CAMLprim value stub_xc_domain_irq_permission(value xch, value domid, > value pirq, value allow) > { > - CAMLparam4(xc_handle, domid, pirq, allow); > + CAMLparam4(xch, domid, pirq, allow); > uint8_t c_pirq; > uint8_t c_allow; > int ret; > @@ -1030,7 +1016,7 @@ CAMLprim value stub_xc_domain_irq_permis > c_pirq = Int_val(pirq); > c_allow = Bool_val(allow); > > - ret = xc_domain_irq_permission(_H(xc_handle), _D(domid), > + ret = xc_domain_irq_permission(_H(xch), _D(domid), > c_pirq, c_allow); > if (ret < 0) > failwith_xc(); > @@ -1038,97 +1024,68 @@ CAMLprim value stub_xc_domain_irq_permis > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_hvm_check_pvdriver(value xc_handle, value domid) > +static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func) > { > - CAMLparam2(xc_handle, domid); > - int ret; > - > - ret = xc_hvm_check_pvdriver(_H(xc_handle), _D(domid)); > - if (ret < 0) > - failwith_xc(); > - CAMLreturn(Val_bool(ret)); > + 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 xc_handle, value domid, value desc) > +CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc) > { > - CAMLparam3(xc_handle, domid, 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_domain_test_assign_device(_H(xc_handle), _D(domid), > - 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 xc_handle, value domid, value desc) > +CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc) > { > - CAMLparam3(xc_handle, domid, 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_domain_assign_device(_H(xc_handle), _D(domid), > - domain, bus, slot, func); > + ret = xc_assign_device(_H(xch), _D(domid), bdf); > + > if (ret < 0) > failwith_xc(); > CAMLreturn(Val_unit); > } > > -CAMLprim value stub_xc_domain_deassign_device(value xc_handle, value domid, value desc) > +CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc) > { > - CAMLparam3(xc_handle, domid, 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_domain_deassign_device(_H(xc_handle), _D(domid), > - domain, bus, slot, func); > - if (ret < 0) > - failwith_xc(); > - CAMLreturn(Val_unit); > -} > + ret = xc_deassign_device(_H(xch), _D(domid), bdf); > > -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); > @@ -1140,26 +1097,7 @@ CAMLprim value stub_xc_watchdog(value ha > int ret; > unsigned int c_timeout = Int32_val(timeout); > > - ret = xc_domain_watchdog(_H(handle), _D(domid), c_timeout); > - if (ret < 0) > - failwith_xc(); > - > - CAMLreturn(Val_int(ret)); > -} > - > -CAMLprim value stub_xc_domain_send_s3resume(value handle, value domid) > -{ > - CAMLparam2(handle, domid); > - xc_domain_send_s3resume(_H(handle), _D(domid)); > - CAMLreturn(Val_unit); > -} > - > -CAMLprim value stub_xc_domain_get_acpi_s_state(value handle, value domid) > -{ > - CAMLparam2(handle, domid); > - int ret; > - > - ret = xc_domain_get_acpi_s_state(_H(handle), _D(domid)); > + ret = xc_watchdog(_H(handle), _D(domid), c_timeout); > if (ret < 0) > failwith_xc(); > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/xenstored/Makefile > --- a/tools/ocaml/xenstored/Makefile Fri Sep 10 11:10:00 2010 +0100 > +++ b/tools/ocaml/xenstored/Makefile Fri Sep 10 11:10:02 2010 +0100 > @@ -39,7 +39,8 @@ XENSTOREDLIBS = \ > -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/xb $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \ > + -ccopt -L -ccopt $(XEN_ROOT)/tools/libxc > > PROGRAMS = oxenstored > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2010-Oct-01 16:28 UTC
Re: [Xen-devel] [PATCH] ocaml: xc bindings: use libxenctrl and libxenguest
On Fri, 2010-10-01 at 17:26 +0100, Stefano Stabellini wrote:> this patch doesn''t apply anymore, could you please rebase and resend?It''s in my queue after the hypercall buffer stuff which is needed to remove pthreads from libxc for compatibility with the ocaml runtime. I''ll resurrect it once that has gone in. Ian.> > On Fri, 10 Sep 2010, Ian Campbell wrote: > > # HG changeset patch > > # User Ian Campbell <ian.campbell@citrix.com> > > # Date 1284113402 -3600 > > # Node ID c2610f86abfb2c34a5a653dea29d5518fb355628 > > # Parent 8a710e0eb0881cad6156500bd4cedcebc7824a18 > > ocaml: xc bindings: use libxenctrl and libxenguest > > > > Now that tools/libxc is licensed under LGPL I don''t think there is any > > need for an LGPL reimplementation under tools/ocaml. > > > > For the most part the conversion to the up-to-date libxc API (xc_lib.c > > essentially implemented the same interface as an older libxc) was > > pretty automatic. There are some functions which appear to no longer > > exist in libxc which I therefore simply removed the bindings for and a > > small number of interfaces which had changed. > > > > Many of the functions bound by the stubs have no in-tree users (which > > I think is fine for a language binding) so I have no way to confirm > > correctness other than by eye. I was however able to confirm that > > oxenstored still worked. > > > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > > Cc: Vincent Hanquez <Vincent.Hanquez@eu.citrix.com> > > > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/Makefile.rules > > --- a/tools/ocaml/Makefile.rules Fri Sep 10 11:10:00 2010 +0100 > > +++ b/tools/ocaml/Makefile.rules Fri Sep 10 11:10:02 2010 +0100 > > @@ -54,18 +54,18 @@ mk-caml-lib-bytecode = $(call quiet-comm > > > > mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1) > > mk-caml-lib-stubs = \ > > - $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e ''s/^lib//''` $2,MKLIB,$1) > > + $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e ''s/^lib//''` $3 $2,MKLIB,$1) > > > > # define a library target <name>.cmxa and <name>.cma > > define OCAML_LIBRARY_template > > $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx) > > - $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs, $(foreach obj,$($(1)_OBJS),$(obj).cmx)) > > + $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx)) > > $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) > > $(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+) > > $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o) > > $(call mk-caml-stubs,$$@, $$+) > > lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o) > > - $(call mk-caml-lib-stubs,$$@, $$+) > > + $(call mk-caml-lib-stubs,$$@, $$+, $(LIBS_$(1))) > > endef > > > > define OCAML_NOC_LIBRARY_template > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/Makefile > > --- a/tools/ocaml/libs/xc/Makefile Fri Sep 10 11:10:00 2010 +0100 > > +++ b/tools/ocaml/libs/xc/Makefile Fri Sep 10 11:10:02 2010 +0100 > > @@ -2,15 +2,17 @@ XEN_ROOT=$(TOPLEVEL)/../.. > > XEN_ROOT=$(TOPLEVEL)/../.. > > include $(TOPLEVEL)/common.make > > > > -CFLAGS += -I../mmap -I./ > > -OCAMLINCLUDE += -I ../mmap -I ../uuid > > +CFLAGS += -I../mmap -I./ -I$(XEN_ROOT)/tools/libxc > > +OCAMLINCLUDE += -I ../mmap -I ../uuid -I $(XEN_ROOT)/tools/libxc > > > > OBJS = xc > > INTF = xc.cmi > > LIBS = xc.cma xc.cmxa > > > > +LIBS_xc = -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest > > + > > xc_OBJS = $(OBJS) > > -xc_C_OBJS = xc_lib xc_stubs > > +xc_C_OBJS = xc_stubs > > > > OCAML_LIBRARY = xc > > > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.h > > --- a/tools/ocaml/libs/xc/xc.h Fri Sep 10 11:10:00 2010 +0100 > > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > > @@ -1,186 +0,0 @@ > > -/* > > - * Copyright (C) 2006-2007 XenSource Ltd. > > - * Copyright (C) 2008 Citrix Ltd. > > - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com> > > - * > > - * 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 <xen/xen.h> > > -#include <xen/memory.h> > > -#include <xen/sysctl.h> > > -#include <xen/domctl.h> > > -#include <xen/sched.h> > > -#include <xen/sysctl.h> > > -#include <xen/sys/privcmd.h> > > -#include <xen/version.h> > > -#include <xen/foreign/x86_32.h> > > -#include <xen/foreign/x86_64.h> > > -#include <xen/hvm/params.h> > > -#include "xc_e820.h" > > - > > -typedef xen_domctl_getdomaininfo_t xc_domaininfo_t; > > -typedef xen_domctl_getvcpuinfo_t xc_vcpuinfo_t; > > -typedef xen_sysctl_physinfo_t xc_physinfo_t; > > - > > -struct xc_core_header { > > - unsigned int xch_magic; > > - unsigned int xch_nr_vcpus; > > - unsigned int xch_nr_pages; > > - unsigned int xch_ctxt_offset; > > - unsigned int xch_index_offset; > > - unsigned int xch_pages_offset; > > -}; > > - > > -typedef union { > > -#if defined(__i386__) || defined(__x86_64__) > > - vcpu_guest_context_x86_64_t x64; > > - vcpu_guest_context_x86_32_t x32; > > -#endif > > - vcpu_guest_context_t c; > > -} vcpu_guest_context_any_t; > > - > > -char * xc_error_get(void); > > -void xc_error_clear(void); > > - > > -int xc_using_injection(void); > > - > > -int xc_interface_open(void); > > -int xc_interface_close(int handle); > > - > > -int xc_domain_create(int handle, unsigned int ssidref, > > - xen_domain_handle_t dhandle, > > - unsigned int flags, unsigned int *pdomid); > > -int xc_domain_pause(int handle, unsigned int domid); > > -int xc_domain_unpause(int handle, unsigned int domid); > > -int xc_domain_resume_fast(int handle, unsigned int domid); > > -int xc_domain_destroy(int handle, unsigned int domid); > > -int xc_domain_shutdown(int handle, int domid, int reason); > > - > > -int xc_vcpu_setaffinity(int handle, unsigned int domid, int vcpu, > > - uint64_t cpumap); > > -int xc_vcpu_getaffinity(int handle, unsigned int domid, int vcpu, > > - uint64_t *cpumap); > > - > > -int xc_domain_getinfolist(int handle, unsigned int first_domain, > > - unsigned int max_domains, xc_domaininfo_t *info); > > -int xc_domain_getinfo(int handle, unsigned int first_domain, > > - xc_domaininfo_t *info); > > - > > -int xc_domain_setmaxmem(int handle, unsigned int domid, unsigned int max_memkb); > > -int xc_domain_set_memmap_limit(int handle, unsigned int domid, > > - unsigned long map_limitkb); > > - > > -int xc_domain_set_time_offset(int handle, unsigned int domid, int time_offset); > > - > > -int xc_domain_memory_increase_reservation(int handle, unsigned int domid, > > - unsigned long nr_extents, > > - unsigned int extent_order, > > - unsigned int address_bits, > > - xen_pfn_t *extent_start); > > -int xc_domain_memory_decrease_reservation(int handle, unsigned int domid, > > - unsigned long nr_extents, > > - unsigned int extent_order, > > - unsigned int address_bits, > > - xen_pfn_t *extent_start); > > -int xc_domain_memory_populate_physmap(int handle, unsigned int domid, > > - unsigned long nr_extents, > > - unsigned int extent_order, > > - unsigned int address_bits, > > - xen_pfn_t *extent_start); > > -int xc_domain_setvmxassist(int handle, unsigned int domid, int use_vmxassist); > > -int xc_domain_max_vcpus(int handle, unsigned int domid, unsigned int max); > > -int xc_domain_sethandle(int handle, unsigned int domid, > > - xen_domain_handle_t dhandle); > > -int xc_vcpu_getinfo(int handle, unsigned int domid, unsigned int vcpu, > > - xc_vcpuinfo_t *info); > > -int xc_domain_ioport_permission(int handle, unsigned int domid, > > - unsigned int first_port, unsigned int nr_ports, > > - unsigned int allow_access); > > -int xc_vcpu_setcontext(int handle, unsigned int domid, > > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt); > > -int xc_vcpu_getcontext(int handle, unsigned int domid, > > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt); > > -int xc_domain_irq_permission(int handle, unsigned int domid, > > - unsigned char pirq, unsigned char allow_access); > > -int xc_domain_iomem_permission(int handle, unsigned int domid, > > - unsigned long first_mfn, unsigned long nr_mfns, > > - unsigned char allow_access); > > -long long xc_domain_get_cpu_usage(int handle, unsigned int domid, > > - unsigned int vcpu); > > -void *xc_map_foreign_range(int handle, unsigned int domid, > > - int size, int prot, unsigned long mfn); > > -int xc_map_foreign_ranges(int handle, unsigned int domid, > > - privcmd_mmap_entry_t *entries, int nr); > > -int xc_readconsolering(int handle, char **pbuffer, > > - unsigned int *pnr_chars, int clear); > > -int xc_send_debug_keys(int handle, char *keys); > > -int xc_physinfo(int handle, xc_physinfo_t *put_info); > > -int xc_pcpu_info( > > - int handle, int max_cpus, xen_sysctl_cpuinfo_t *info, int *nr_cpus); > > -int xc_sched_id(int handle, int *sched_id); > > -int xc_version(int handle, int cmd, void *arg); > > -int xc_evtchn_alloc_unbound(int handle, unsigned int domid, > > - unsigned int remote_domid); > > -int xc_evtchn_reset(int handle, unsigned int domid); > > - > > -int xc_sched_credit_domain_set(int handle, unsigned int domid, > > - struct xen_domctl_sched_credit *sdom); > > -int xc_sched_credit_domain_get(int handle, unsigned int domid, > > - struct xen_domctl_sched_credit *sdom); > > -int xc_shadow_allocation_get(int handle, unsigned int domid, > > - uint32_t *mb); > > -int xc_shadow_allocation_set(int handle, unsigned int domid, > > - uint32_t mb); > > -int xc_domain_get_pfn_list(int handle, unsigned int domid, > > - uint64_t *pfn_array, unsigned long max_pfns); > > -int xc_hvm_check_pvdriver(int handle, unsigned int domid); > > - > > -int xc_domain_assign_device(int handle, unsigned int domid, > > - int domain, int bus, int slot, int func); > > -int xc_domain_deassign_device(int handle, unsigned int domid, > > - int domain, int bus, int slot, int func); > > -int xc_domain_test_assign_device(int handle, unsigned int domid, > > - int domain, int bus, int slot, int func); > > -int xc_domain_watchdog(int handle, int id, uint32_t timeout); > > -int xc_domain_set_machine_address_size(int xc, uint32_t domid, unsigned int width); > > -int xc_domain_get_machine_address_size(int xc, uint32_t domid); > > - > > -int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm, > > - uint32_t input, uint32_t oinput, > > - char *config[4], char *config_out[4]); > > -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_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 > > -#define COMPAT_FIELD_physinfo_get_sockets_per_node(p) \ > > - SAFEDIV((p).nr_cpus, ((p).threads_per_core * (p).cores_per_socket * (p).nr_nodes)) > > -#else > > -#define COMPAT_FIELD_physinfo_get_nr_cpus(p) \ > > - ((p).threads_per_core * (p).sockets_per_node * \ > > - (p).cores_per_socket * (p).threads_per_core) > > -#define COMPAT_FIELD_physinfo_get_sockets_per_node(p) (p).sockets_per_node > > -#endif > > - > > -#if __XEN_LATEST_INTERFACE_VERSION__ >= 0x00030209 > > -#define COMPAT_FIELD_ADDRESS_BITS mem_flags > > -#else > > -#define COMPAT_FIELD_ADDRESS_BITS address_bits > > -#endif > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.ml > > --- a/tools/ocaml/libs/xc/xc.ml Fri Sep 10 11:10:00 2010 +0100 > > +++ b/tools/ocaml/libs/xc/xc.ml Fri Sep 10 11:10:02 2010 +0100 > > @@ -127,9 +127,6 @@ let domain_sethandle handle n uuid > > let domain_sethandle handle n uuid > > _domain_sethandle handle n (Uuid.int_array_of_uuid uuid) > > > > -external domain_setvmxassist: handle -> domid -> bool -> unit > > - = "stub_xc_domain_setvmxassist" > > - > > external domain_max_vcpus: handle -> domid -> int -> unit > > = "stub_xc_domain_max_vcpus" > > > > @@ -207,13 +204,13 @@ external domain_get_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 -> bool -> (int64 * (int64 option)) > > +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option)) > > -> string option array > > -> string option array > > = "stub_xc_domain_cpuid_set" > > -external domain_cpuid_apply: handle -> domid -> bool -> unit > > - = "stub_xc_domain_cpuid_apply" > > -external cpuid_check: (int64 * (int64 option)) -> string option array -> (bool * string option array) > > +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 > > @@ -229,17 +226,6 @@ external domain_deassign_device: handle > > = "stub_xc_domain_deassign_device" > > external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool > > = "stub_xc_domain_test_assign_device" > > - > > -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 > > - = "stub_xc_hvm_check_pvdriver" > > > > external version: handle -> version = "stub_xc_version_version" > > external version_compile_info: handle -> compile_info > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc.mli > > --- a/tools/ocaml/libs/xc/xc.mli Fri Sep 10 11:10:00 2010 +0100 > > +++ b/tools/ocaml/libs/xc/xc.mli Fri Sep 10 11:10:02 2010 +0100 > > @@ -80,8 +80,6 @@ external _domain_sethandle : handle -> d > > external _domain_sethandle : handle -> domid -> int array -> unit > > = "stub_xc_domain_sethandle" > > val domain_sethandle : handle -> domid -> ''a Uuid.t -> unit > > -external domain_setvmxassist: handle -> domid -> bool -> unit > > - = "stub_xc_domain_setvmxassist" > > external domain_max_vcpus : handle -> domid -> int -> unit > > = "stub_xc_domain_max_vcpus" > > external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause" > > @@ -147,16 +145,6 @@ external domain_test_assign_device: hand > > external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool > > = "stub_xc_domain_test_assign_device" > > > > -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" > > external version : handle -> version = "stub_xc_version_version" > > external version_compile_info : handle -> compile_info > > = "stub_xc_version_compile_info" > > @@ -185,12 +173,12 @@ external domain_get_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 -> bool -> (int64 * (int64 option)) > > +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option)) > > -> string option array > > -> string option array > > = "stub_xc_domain_cpuid_set" > > -external domain_cpuid_apply: handle -> domid -> bool -> unit > > - = "stub_xc_domain_cpuid_apply" > > -external cpuid_check: (int64 * (int64 option)) -> string option array -> (bool * string option array) > > +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 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_cpufeature.h > > --- a/tools/ocaml/libs/xc/xc_cpufeature.h Fri Sep 10 11:10:00 2010 +0100 > > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > > @@ -1,116 +0,0 @@ > > -#ifndef __LIBXC_CPUFEATURE_H > > -#define __LIBXC_CPUFEATURE_H > > - > > -/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */ > > -#define X86_FEATURE_FPU (0*32+ 0) /* Onboard FPU */ > > -#define X86_FEATURE_VME (0*32+ 1) /* Virtual Mode Extensions */ > > -#define X86_FEATURE_DE (0*32+ 2) /* Debugging Extensions */ > > -#define X86_FEATURE_PSE (0*32+ 3) /* Page Size Extensions */ > > -#define X86_FEATURE_TSC (0*32+ 4) /* Time Stamp Counter */ > > -#define X86_FEATURE_MSR (0*32+ 5) /* Model-Specific Registers, RDMSR, WRMSR */ > > -#define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */ > > -#define X86_FEATURE_MCE (0*32+ 7) /* Machine Check Architecture */ > > -#define X86_FEATURE_CX8 (0*32+ 8) /* CMPXCHG8 instruction */ > > -#define X86_FEATURE_APIC (0*32+ 9) /* Onboard APIC */ > > -#define X86_FEATURE_SEP (0*32+11) /* SYSENTER/SYSEXIT */ > > -#define X86_FEATURE_MTRR (0*32+12) /* Memory Type Range Registers */ > > -#define X86_FEATURE_PGE (0*32+13) /* Page Global Enable */ > > -#define X86_FEATURE_MCA (0*32+14) /* Machine Check Architecture */ > > -#define X86_FEATURE_CMOV (0*32+15) /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ > > -#define X86_FEATURE_PAT (0*32+16) /* Page Attribute Table */ > > -#define X86_FEATURE_PSE36 (0*32+17) /* 36-bit PSEs */ > > -#define X86_FEATURE_PN (0*32+18) /* Processor serial number */ > > -#define X86_FEATURE_CLFLSH (0*32+19) /* Supports the CLFLUSH instruction */ > > -#define X86_FEATURE_DS (0*32+21) /* Debug Store */ > > -#define X86_FEATURE_ACPI (0*32+22) /* ACPI via MSR */ > > -#define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ > > -#define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */ > > - /* of FPU context), and CR4.OSFXSR available */ > > -#define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ > > -#define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ > > -#define X86_FEATURE_SELFSNOOP (0*32+27) /* CPU self snoop */ > > -#define X86_FEATURE_HT (0*32+28) /* Hyper-Threading */ > > -#define X86_FEATURE_ACC (0*32+29) /* Automatic clock control */ > > -#define X86_FEATURE_IA64 (0*32+30) /* IA-64 processor */ > > -#define X86_FEATURE_PBE (0*32+31) /* Pending Break Enable */ > > - > > -/* AMD-defined CPU features, CPUID level 0x80000001, word 1 */ > > -/* Don''t duplicate feature flags which are redundant with Intel! */ > > -#define X86_FEATURE_SYSCALL (1*32+11) /* SYSCALL/SYSRET */ > > -#define X86_FEATURE_MP (1*32+19) /* MP Capable. */ > > -#define X86_FEATURE_NX (1*32+20) /* Execute Disable */ > > -#define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ > > -#define X86_FEATURE_FFXSR (1*32+25) /* FFXSR instruction optimizations */ > > -#define X86_FEATURE_PAGE1GB (1*32+26) /* 1Gb large page support */ > > -#define X86_FEATURE_RDTSCP (1*32+27) /* RDTSCP */ > > -#define X86_FEATURE_LM (1*32+29) /* Long Mode (x86-64) */ > > -#define X86_FEATURE_3DNOWEXT (1*32+30) /* AMD 3DNow! extensions */ > > -#define X86_FEATURE_3DNOW (1*32+31) /* 3DNow! */ > > - > > -/* Transmeta-defined CPU features, CPUID level 0x80860001, word 2 */ > > -#define X86_FEATURE_RECOVERY (2*32+ 0) /* CPU in recovery mode */ > > -#define X86_FEATURE_LONGRUN (2*32+ 1) /* Longrun power control */ > > -#define X86_FEATURE_LRTI (2*32+ 3) /* LongRun table interface */ > > - > > -/* Other features, Linux-defined mapping, word 3 */ > > -/* This range is used for feature bits which conflict or are synthesized */ > > -#define X86_FEATURE_CXMMX (3*32+ 0) /* Cyrix MMX extensions */ > > -#define X86_FEATURE_K6_MTRR (3*32+ 1) /* AMD K6 nonstandard MTRRs */ > > -#define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */ > > -#define X86_FEATURE_CENTAUR_MCR (3*32+ 3) /* Centaur MCRs (= MTRRs) */ > > -/* cpu types for specific tunings: */ > > -#define X86_FEATURE_K8 (3*32+ 4) /* Opteron, Athlon64 */ > > -#define X86_FEATURE_K7 (3*32+ 5) /* Athlon */ > > -#define X86_FEATURE_P3 (3*32+ 6) /* P3 */ > > -#define X86_FEATURE_P4 (3*32+ 7) /* P4 */ > > -#define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ > > - > > -/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ > > -#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ > > -#define X86_FEATURE_DTES64 (4*32+ 2) /* 64-bit Debug Store */ > > -#define X86_FEATURE_MWAIT (4*32+ 3) /* Monitor/Mwait support */ > > -#define X86_FEATURE_DSCPL (4*32+ 4) /* CPL Qualified Debug Store */ > > -#define X86_FEATURE_VMXE (4*32+ 5) /* Virtual Machine Extensions */ > > -#define X86_FEATURE_SMXE (4*32+ 6) /* Safer Mode Extensions */ > > -#define X86_FEATURE_EST (4*32+ 7) /* Enhanced SpeedStep */ > > -#define X86_FEATURE_TM2 (4*32+ 8) /* Thermal Monitor 2 */ > > -#define X86_FEATURE_SSSE3 (4*32+ 9) /* Supplemental Streaming SIMD Extensions-3 */ > > -#define X86_FEATURE_CID (4*32+10) /* Context ID */ > > -#define X86_FEATURE_CX16 (4*32+13) /* CMPXCHG16B */ > > -#define X86_FEATURE_XTPR (4*32+14) /* Send Task Priority Messages */ > > -#define X86_FEATURE_PDCM (4*32+15) /* Perf/Debug Capability MSR */ > > -#define X86_FEATURE_DCA (4*32+18) /* Direct Cache Access */ > > -#define X86_FEATURE_SSE4_1 (4*32+19) /* Streaming SIMD Extensions 4.1 */ > > -#define X86_FEATURE_SSE4_2 (4*32+20) /* Streaming SIMD Extensions 4.2 */ > > -#define X86_FEATURE_POPCNT (4*32+23) /* POPCNT instruction */ > > -#define X86_FEATURE_HYPERVISOR (4*32+31) /* Running under some hypervisor */ > > - > > -/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ > > -#define X86_FEATURE_XSTORE (5*32+ 2) /* on-CPU RNG present (xstore insn) */ > > -#define X86_FEATURE_XSTORE_EN (5*32+ 3) /* on-CPU RNG enabled */ > > -#define X86_FEATURE_XCRYPT (5*32+ 6) /* on-CPU crypto (xcrypt insn) */ > > -#define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* on-CPU crypto enabled */ > > -#define X86_FEATURE_ACE2 (5*32+ 8) /* Advanced Cryptography Engine v2 */ > > -#define X86_FEATURE_ACE2_EN (5*32+ 9) /* ACE v2 enabled */ > > -#define X86_FEATURE_PHE (5*32+ 10) /* PadLock Hash Engine */ > > -#define X86_FEATURE_PHE_EN (5*32+ 11) /* PHE enabled */ > > -#define X86_FEATURE_PMM (5*32+ 12) /* PadLock Montgomery Multiplier */ > > -#define X86_FEATURE_PMM_EN (5*32+ 13) /* PMM enabled */ > > - > > -/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ > > -#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */ > > -#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */ > > -#define X86_FEATURE_SVME (6*32+ 2) /* Secure Virtual Machine */ > > -#define X86_FEATURE_EXTAPICSPACE (6*32+ 3) /* Extended APIC space */ > > -#define X86_FEATURE_ALTMOVCR (6*32+ 4) /* LOCK MOV CR accesses CR+8 */ > > -#define X86_FEATURE_ABM (6*32+ 5) /* Advanced Bit Manipulation */ > > -#define X86_FEATURE_SSE4A (6*32+ 6) /* AMD Streaming SIMD Extensions-4a */ > > -#define X86_FEATURE_MISALIGNSSE (6*32+ 7) /* Misaligned SSE Access */ > > -#define X86_FEATURE_3DNOWPF (6*32+ 8) /* 3DNow! Prefetch */ > > -#define X86_FEATURE_OSVW (6*32+ 9) /* OS Visible Workaround */ > > -#define X86_FEATURE_IBS (6*32+ 10) /* Instruction Based Sampling */ > > -#define X86_FEATURE_SSE5 (6*32+ 11) /* AMD Streaming SIMD Extensions-5 */ > > -#define X86_FEATURE_SKINIT (6*32+ 12) /* SKINIT, STGI/CLGI, DEV */ > > -#define X86_FEATURE_WDT (6*32+ 13) /* Watchdog Timer */ > > - > > -#endif /* __LIBXC_CPUFEATURE_H */ > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_cpuid.h > > --- a/tools/ocaml/libs/xc/xc_cpuid.h Fri Sep 10 11:10:00 2010 +0100 > > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > > @@ -1,285 +0,0 @@ > > -#ifndef XC_CPUID_H > > -#define XC_CPUID_H > > - > > -#ifdef XEN_DOMCTL_set_cpuid > > - > > -#include "xc_cpufeature.h" > > - > > -#define bitmaskof(idx) (1u << ((idx) & 31)) > > -#define clear_bit(idx, dst) ((dst) &= ~(1u << ((idx) & 31))) > > -#define set_bit(idx, dst) ((dst) |= (1u << ((idx) & 31))) > > - > > -#define DEF_MAX_BASE 0x00000004u > > -#define DEF_MAX_EXT 0x80000008u > > - > > -static void xc_cpuid(uint32_t eax, uint32_t ecx, uint32_t regs[4]) > > -{ > > - unsigned int realecx = (ecx == XEN_CPUID_INPUT_UNUSED) ? 0 : ecx; > > - asm ( > > -#ifdef __i386__ > > - "push %%ebx; cpuid; mov %%ebx,%1; pop %%ebx" > > -#else > > - "push %%rbx; cpuid; mov %%ebx,%1; pop %%rbx" > > -#endif > > - : "=a" (regs[0]), "=r" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) > > - : "0" (eax), "2" (realecx)); > > -} > > - > > -enum { CPU_BRAND_INTEL, CPU_BRAND_AMD, CPU_BRAND_UNKNOWN }; > > - > > -static int xc_cpuid_brand_get(void) > > -{ > > - uint32_t regs[4]; > > - char str[13]; > > - uint32_t *istr = (uint32_t *) str; > > - > > - xc_cpuid(0, 0, regs); > > - istr[0] = regs[1]; > > - istr[1] = regs[3]; > > - istr[2] = regs[2]; > > - str[12] = ''\0''; > > - if (strcmp(str, "AuthenticAMD") == 0) { > > - return CPU_BRAND_AMD; > > - } else if (strcmp(str, "GenuineIntel") == 0) { > > - return CPU_BRAND_INTEL; > > - } else > > - return CPU_BRAND_UNKNOWN; > > -} > > - > > -static int hypervisor_is_64bit(int xc) > > -{ > > - xen_capabilities_info_t xen_caps; > > - return ((xc_version(xc, XENVER_capabilities, &xen_caps) == 0) && > > - (strstr(xen_caps, "x86_64") != NULL)); > > -} > > - > > -static void do_hvm_cpuid_policy(int xc, int domid, uint32_t input, uint32_t regs[4]) > > -{ > > - unsigned long is_pae; > > - int brand; > > - > > - /* pae ? */ > > - xc_get_hvm_param(xc, domid, HVM_PARAM_PAE_ENABLED, &is_pae); > > - is_pae = !!is_pae; > > - > > - switch (input) { > > - case 0x00000000: > > - if (regs[0] > DEF_MAX_BASE) > > - regs[0] = DEF_MAX_BASE; > > - break; > > - case 0x00000001: > > - regs[2] &= (bitmaskof(X86_FEATURE_XMM3) | > > - bitmaskof(X86_FEATURE_SSSE3) | > > - bitmaskof(X86_FEATURE_CX16) | > > - bitmaskof(X86_FEATURE_SSE4_1) | > > - bitmaskof(X86_FEATURE_SSE4_2) | > > - bitmaskof(X86_FEATURE_POPCNT)); > > - > > - regs[2] |= bitmaskof(X86_FEATURE_HYPERVISOR); > > - > > - regs[3] &= (bitmaskof(X86_FEATURE_FPU) | > > - bitmaskof(X86_FEATURE_VME) | > > - bitmaskof(X86_FEATURE_DE) | > > - bitmaskof(X86_FEATURE_PSE) | > > - bitmaskof(X86_FEATURE_TSC) | > > - bitmaskof(X86_FEATURE_MSR) | > > - bitmaskof(X86_FEATURE_PAE) | > > - bitmaskof(X86_FEATURE_MCE) | > > - bitmaskof(X86_FEATURE_CX8) | > > - bitmaskof(X86_FEATURE_APIC) | > > - bitmaskof(X86_FEATURE_SEP) | > > - bitmaskof(X86_FEATURE_MTRR) | > > - bitmaskof(X86_FEATURE_PGE) | > > - bitmaskof(X86_FEATURE_MCA) | > > - bitmaskof(X86_FEATURE_CMOV) | > > - bitmaskof(X86_FEATURE_PAT) | > > - bitmaskof(X86_FEATURE_CLFLSH) | > > - bitmaskof(X86_FEATURE_MMX) | > > - bitmaskof(X86_FEATURE_FXSR) | > > - bitmaskof(X86_FEATURE_XMM) | > > - bitmaskof(X86_FEATURE_XMM2)); > > - /* We always support MTRR MSRs. */ > > - regs[3] |= bitmaskof(X86_FEATURE_MTRR); > > - > > - if (!is_pae) > > - clear_bit(X86_FEATURE_PAE, regs[3]); > > - break; > > - case 0x80000000: > > - if (regs[0] > DEF_MAX_EXT) > > - regs[0] = DEF_MAX_EXT; > > - break; > > - case 0x80000001: > > - if (!is_pae) > > - clear_bit(X86_FEATURE_NX, regs[3]); > > - break; > > - case 0x80000008: > > - regs[0] &= 0x0000ffffu; > > - regs[1] = regs[2] = regs[3] = 0; > > - break; > > - case 0x00000002: /* Intel cache info (dumped by AMD policy) */ > > - case 0x00000004: /* Intel cache info (dumped by AMD policy) */ > > - case 0x80000002: /* Processor name string */ > > - case 0x80000003: /* ... continued */ > > - case 0x80000004: /* ... continued */ > > - case 0x80000005: /* AMD L1 cache/TLB info (dumped by Intel policy) */ > > - case 0x80000006: /* AMD L2/3 cache/TLB info ; Intel L2 cache features */ > > - break; > > - default: > > - regs[0] = regs[1] = regs[2] = regs[3] = 0; > > - break; > > - } > > - > > - brand = xc_cpuid_brand_get(); > > - if (brand == CPU_BRAND_AMD) { > > - switch (input) { > > - case 0x00000001: > > - /* Mask Intel-only features. */ > > - regs[2] &= ~(bitmaskof(X86_FEATURE_SSSE3) | > > - bitmaskof(X86_FEATURE_SSE4_1) | > > - bitmaskof(X86_FEATURE_SSE4_2)); > > - break; > > - > > - case 0x00000002: > > - case 0x00000004: > > - regs[0] = regs[1] = regs[2] = 0; > > - break; > > - > > - case 0x80000001: { > > - int is_64bit = hypervisor_is_64bit(xc) && is_pae; > > - > > - if (!is_pae) > > - clear_bit(X86_FEATURE_PAE, regs[3]); > > - clear_bit(X86_FEATURE_PSE36, regs[3]); > > - > > - /* Filter all other features according to a whitelist. */ > > - regs[2] &= ((is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0) | > > - bitmaskof(X86_FEATURE_ALTMOVCR) | > > - bitmaskof(X86_FEATURE_ABM) | > > - bitmaskof(X86_FEATURE_SSE4A) | > > - bitmaskof(X86_FEATURE_MISALIGNSSE) | > > - bitmaskof(X86_FEATURE_3DNOWPF)); > > - regs[3] &= (0x0183f3ff | /* features shared with 0x00000001:EDX */ > > - (is_pae ? bitmaskof(X86_FEATURE_NX) : 0) | > > - (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) | > > - bitmaskof(X86_FEATURE_SYSCALL) | > > - bitmaskof(X86_FEATURE_MP) | > > - bitmaskof(X86_FEATURE_MMXEXT) | > > - bitmaskof(X86_FEATURE_FFXSR) | > > - bitmaskof(X86_FEATURE_3DNOW) | > > - bitmaskof(X86_FEATURE_3DNOWEXT)); > > - break; > > - } > > - } > > - } else if (brand == CPU_BRAND_INTEL) { > > - switch (input) { > > - case 0x00000001: > > - /* Mask AMD-only features. */ > > - regs[2] &= ~(bitmaskof(X86_FEATURE_POPCNT)); > > - break; > > - > > - case 0x00000004: > > - regs[0] &= 0x3FF; > > - regs[3] &= 0x3FF; > > - break; > > - > > - case 0x80000001: > > - { > > - int is_64bit = hypervisor_is_64bit(xc) && is_pae; > > - > > - /* Only a few features are advertised in Intel''s 0x80000001. */ > > - regs[2] &= (is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0); > > - regs[3] &= ((is_pae ? bitmaskof(X86_FEATURE_NX) : 0) | > > - (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) | > > - (is_64bit ? bitmaskof(X86_FEATURE_SYSCALL) : 0)); > > - break; > > - } > > - case 0x80000005: > > - { > > - regs[0] = regs[1] = regs[2] = 0; > > - break; > > - } > > - } > > - } > > -} > > - > > -static void do_pv_cpuid_policy(int xc, int domid, uint32_t input, uint32_t regs[4]) > > -{ > > - int brand; > > - int guest_64_bits, xen_64_bits; > > - int ret; > > - > > - ret = xc_domain_get_machine_address_size(xc, domid); > > - if (ret < 0) > > - return; > > - guest_64_bits = (ret == 64); > > - xen_64_bits = hypervisor_is_64bit(xc); > > - brand = xc_cpuid_brand_get(); > > - > > - if ((input & 0x7fffffff) == 1) { > > - clear_bit(X86_FEATURE_VME, regs[3]); > > - clear_bit(X86_FEATURE_PSE, regs[3]); > > - clear_bit(X86_FEATURE_PGE, regs[3]); > > - clear_bit(X86_FEATURE_MCE, regs[3]); > > - clear_bit(X86_FEATURE_MCA, regs[3]); > > - clear_bit(X86_FEATURE_MTRR, regs[3]); > > - clear_bit(X86_FEATURE_PSE36, regs[3]); > > - } > > - > > - switch (input) { > > - case 1: > > - if (!xen_64_bits || brand == CPU_BRAND_AMD) > > - clear_bit(X86_FEATURE_SEP, regs[3]); > > - clear_bit(X86_FEATURE_DS, regs[3]); > > - clear_bit(X86_FEATURE_ACC, regs[3]); > > - clear_bit(X86_FEATURE_PBE, regs[3]); > > - > > - clear_bit(X86_FEATURE_DTES64, regs[2]); > > - clear_bit(X86_FEATURE_MWAIT, regs[2]); > > - clear_bit(X86_FEATURE_DSCPL, regs[2]); > > - clear_bit(X86_FEATURE_VMXE, regs[2]); > > - clear_bit(X86_FEATURE_SMXE, regs[2]); > > - clear_bit(X86_FEATURE_EST, regs[2]); > > - clear_bit(X86_FEATURE_TM2, regs[2]); > > - if (!guest_64_bits) > > - clear_bit(X86_FEATURE_CX16, regs[2]); > > - clear_bit(X86_FEATURE_XTPR, regs[2]); > > - clear_bit(X86_FEATURE_PDCM, regs[2]); > > - clear_bit(X86_FEATURE_DCA, regs[2]); > > - break; > > - case 0x80000001: > > - if (!guest_64_bits) { > > - clear_bit(X86_FEATURE_LM, regs[3]); > > - clear_bit(X86_FEATURE_LAHF_LM, regs[2]); > > - if (brand != CPU_BRAND_AMD) > > - clear_bit(X86_FEATURE_SYSCALL, regs[3]); > > - } else > > - set_bit(X86_FEATURE_SYSCALL, regs[3]); > > - clear_bit(X86_FEATURE_PAGE1GB, regs[3]); > > - clear_bit(X86_FEATURE_RDTSCP, regs[3]); > > - > > - clear_bit(X86_FEATURE_SVME, regs[2]); > > - clear_bit(X86_FEATURE_OSVW, regs[2]); > > - clear_bit(X86_FEATURE_IBS, regs[2]); > > - clear_bit(X86_FEATURE_SKINIT, regs[2]); > > - clear_bit(X86_FEATURE_WDT, regs[2]); > > - break; > > - case 5: /* MONITOR/MWAIT */ > > - case 0xa: /* Architectural Performance Monitor Features */ > > - case 0x8000000a: /* SVM revision and features */ > > - case 0x8000001b: /* Instruction Based Sampling */ > > - regs[0] = regs[1] = regs[2] = regs[3] = 0; > > - break; > > - } > > -} > > - > > -static void do_cpuid_policy(int xc, int domid, int hvm, uint32_t input, uint32_t regs[4]) > > -{ > > - if (hvm) > > - do_hvm_cpuid_policy(xc, domid, input, regs); > > - else > > - do_pv_cpuid_policy(xc, domid, input, regs); > > -} > > - > > -#endif > > - > > -#endif > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_e820.h > > --- a/tools/ocaml/libs/xc/xc_e820.h Fri Sep 10 11:10:00 2010 +0100 > > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > > @@ -1,20 +0,0 @@ > > -#ifndef __XC_E820_H__ > > -#define __XC_E820_H__ > > - > > -#include <xen/hvm/e820.h> > > - > > -/* > > - * PC BIOS standard E820 types and structure. > > - */ > > -#define E820_RAM 1 > > -#define E820_RESERVED 2 > > -#define E820_ACPI 3 > > -#define E820_NVS 4 > > - > > -struct e820entry { > > - uint64_t addr; > > - uint64_t size; > > - uint32_t type; > > -} __attribute__((packed)); > > - > > -#endif /* __XC_E820_H__ */ > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_lib.c > > --- a/tools/ocaml/libs/xc/xc_lib.c Fri Sep 10 11:10:00 2010 +0100 > > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > > @@ -1,1537 +0,0 @@ > > -/* > > - * Copyright (C) 2006-2007 XenSource Ltd. > > - * Copyright (C) 2008 Citrix Ltd. > > - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com> > > - * > > - * 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 <stdint.h> > > -#include <unistd.h> > > -#include <string.h> > > -#include <fcntl.h> > > -#include <stdio.h> > > -#include <errno.h> > > -#include <sys/ioctl.h> > > -#include <sys/mman.h> > > -#include <sys/types.h> > > -#include <sys/stat.h> > > -#include <stdlib.h> > > -#include <stdarg.h> > > - > > -#include "xc.h" > > - > > -#define PAGE_SHIFT 12 > > -#define PAGE_SIZE (1UL << PAGE_SHIFT) > > -#define PAGE_MASK (~(PAGE_SIZE-1)) > > - > > -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) > > - > > -#define DECLARE_DOMCTL(_cmd, _domain) \ > > - struct xen_domctl domctl = { \ > > - .cmd = _cmd, \ > > - .domain = _domain, \ > > - .interface_version = XEN_DOMCTL_INTERFACE_VERSION, \ > > - } > > - > > -#define DECLARE_SYSCTL(_cmd) \ > > - struct xen_sysctl sysctl = { \ > > - .cmd = _cmd, \ > > - .interface_version = XEN_SYSCTL_INTERFACE_VERSION, \ > > - } > > - > > -#define DECLARE_HYPERCALL2(_cmd, _arg0, _arg1) \ > > - privcmd_hypercall_t hypercall = { \ > > - .op = _cmd, \ > > - .arg[0] = (unsigned long) _arg0,\ > > - .arg[1] = (unsigned long) _arg1,\ > > - } > > -#define DECLARE_HYPERCALL0(_cmd) DECLARE_HYPERCALL2(_cmd, 0, 0); > > -#define DECLARE_HYPERCALL1(_cmd, _arg0) DECLARE_HYPERCALL2(_cmd, _arg0, 0); > > - > > -/*---- Errors handlings ----*/ > > -#ifndef WITHOUT_GOOD_ERROR > > -#define ERROR_STRLEN 256 > > - > > -static char __error_str[ERROR_STRLEN]; > > - > > -char * xc_error_get(void) > > -{ > > - return __error_str; > > -} > > - > > -static void xc_error_set(const char *fmt, ...) > > -{ > > - va_list ap; > > - char __errordup[ERROR_STRLEN]; > > - > > - va_start(ap, fmt); > > - vsnprintf(__errordup, ERROR_STRLEN, fmt, ap); > > - va_end(ap); > > - memcpy(__error_str, __errordup, ERROR_STRLEN); > > -} > > - > > -static void xc_error_dom_set(unsigned int domid, const char *fmt, ...) > > -{ > > - va_list ap; > > - char __errordup[ERROR_STRLEN]; > > - int i; > > - > > - i = snprintf(__errordup, ERROR_STRLEN, "domain %u - ", domid); > > - va_start(ap, fmt); > > - i += vsnprintf(__errordup + i, ERROR_STRLEN - i, fmt, ap); > > - va_end(ap); > > - snprintf(__errordup + i, ERROR_STRLEN - i, > > - " failed: %s", xc_error_get()); > > - memcpy(__error_str, __errordup, ERROR_STRLEN); > > -} > > - > > -void xc_error_clear(void) > > -{ > > - memset(__error_str, ''\0'', ERROR_STRLEN); > > -} > > -#else > > -char * xc_error_get(void) > > -{ > > - return ""; > > -} > > -#define xc_error_set(fmt, ...) do {} while (0) > > -#define xc_error_dom_set(id, fmt, ...) do {} while (0) > > -#define xc_error_clear() do {} while (0) > > -#endif > > - > > -#define xc_error_hypercall(_h, _r) \ > > - xc_error_set("hypercall %lld fail: %d: %s (ret %d)", _h.op, errno, errno ? strerror(errno) : strerror(-_r), _r) > > - > > -int xc_using_injection(void) > > -{ > > - return 0; > > -} > > - > > -/*---- Trivia ----*/ > > -int xc_interface_open(void) > > -{ > > - int fd, ret; > > - > > - fd = open("/proc/xen/privcmd", O_RDWR); > > - if (fd == -1) { > > - xc_error_set("open /proc/xen/privcmd failed: %s", > > - strerror(errno)); > > - return -1; > > - } > > - > > - ret = fcntl(fd, F_GETFD); > > - if (ret < 0) { > > - xc_error_set("cannot get handle flags: %s", > > - strerror(errno)); > > - goto out; > > - } > > - > > - ret = fcntl(fd, F_SETFD, ret | FD_CLOEXEC); > > - if (ret < 0) { > > - xc_error_set("cannot set handle flags: %s", > > - strerror(errno)); > > - goto out; > > - } > > - > > - return fd; > > -out: > > - close(fd); > > - return -1; > > -} > > - > > -int xc_interface_close(int handle) > > -{ > > - int ret; > > - > > - ret = close(handle); > > - if (ret != 0) > > - xc_error_set("close xc failed: %s", strerror(errno)); > > - return ret; > > -} > > - > > -/*---- Low private operations ----*/ > > -static int do_xen_hypercall(int handle, privcmd_hypercall_t *hypercall) > > -{ > > - return ioctl(handle, IOCTL_PRIVCMD_HYPERCALL, (unsigned long) hypercall); > > -} > > - > > -static int do_domctl(int handle, struct xen_domctl *domctl) > > -{ > > - int ret; > > - DECLARE_HYPERCALL1(__HYPERVISOR_domctl, domctl); > > - > > - if (mlock(domctl, sizeof(*domctl)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret < 0) > > - xc_error_hypercall(hypercall, ret); > > - > > - munlock(domctl, sizeof(*domctl)); > > - return ret; > > -} > > - > > -static int do_sysctl(int handle, struct xen_sysctl *sysctl) > > -{ > > - int ret; > > - DECLARE_HYPERCALL1(__HYPERVISOR_sysctl, sysctl); > > - > > - if (mlock(sysctl, sizeof(*sysctl)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret < 0) > > - xc_error_hypercall(hypercall, ret); > > - > > - munlock(sysctl, sizeof(*sysctl)); > > - return ret; > > -} > > - > > -static int do_evtchnctl(int handle, int cmd, void *arg, size_t arg_size) > > -{ > > - DECLARE_HYPERCALL2(__HYPERVISOR_event_channel_op, cmd, arg); > > - int ret; > > - > > - if (mlock(arg, arg_size) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret < 0) > > - xc_error_hypercall(hypercall, ret); > > - munlock(arg, arg_size); > > - return ret; > > -} > > - > > -static int do_memctl_reservation(int handle, int cmd, > > - struct xen_memory_reservation *reservation) > > -{ > > - int ret; > > - DECLARE_HYPERCALL2(__HYPERVISOR_memory_op, cmd, reservation); > > - xen_pfn_t *extent_start; > > - > > - if (cmd != XENMEM_increase_reservation && > > - cmd != XENMEM_decrease_reservation && > > - cmd != XENMEM_populate_physmap) { > > - xc_error_set("do_memctl_reservation: unknown cmd %d", cmd); > > - return -EINVAL; > > - } > > - > > - if (mlock(reservation, sizeof(*reservation)) == -1) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -ENOMEM; > > - } > > - get_xen_guest_handle(extent_start, reservation->extent_start); > > - if (extent_start && mlock(extent_start, reservation->nr_extents > > - * sizeof(xen_pfn_t)) == -1) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - munlock(reservation, sizeof(*reservation)); > > - return -3; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret) > > - xc_error_hypercall(hypercall, ret); > > - munlock(extent_start, reservation->nr_extents * sizeof(xen_pfn_t)); > > - get_xen_guest_handle(extent_start, reservation->extent_start); > > - munlock(reservation, sizeof(*reservation)); > > - return ret; > > -} > > - > > -static int do_ioctl(int handle, int cmd, void *arg) > > -{ > > - return ioctl(handle, cmd, arg); > > -} > > - > > -static void * do_mmap(void *start, size_t length, int prot, int flags, > > - int fd, off_t offset) > > -{ > > - return mmap(start, length, prot, flags, fd, offset); > > -} > > - > > -int xc_get_hvm_param(int handle, unsigned int domid, > > - int param, unsigned long *value) > > -{ > > - struct xen_hvm_param arg = { > > - .domid = domid, > > - .index = param, > > - }; > > - DECLARE_HYPERCALL2(__HYPERVISOR_hvm_op, HVMOP_get_param, > > - (unsigned long) &arg); > > - int ret; > > - > > - if (mlock(&arg, sizeof(arg)) == -1) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret) > > - xc_error_hypercall(hypercall, ret); > > - *value = arg.value; > > - munlock(&arg, sizeof(arg)); > > - return ret; > > -} > > - > > -static int xc_set_hvm_param(int handle, unsigned int domid, > > - int param, unsigned long value) > > -{ > > - struct xen_hvm_param arg = { > > - .domid = domid, > > - .index = param, > > - .value = value, > > - }; > > - 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; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret) > > - xc_error_hypercall(hypercall, ret); > > - munlock(&arg, sizeof(arg)); > > - return ret; > > -} > > - > > - > > -/*---- XC API ----*/ > > -int xc_domain_create(int handle, unsigned int ssidref, > > - xen_domain_handle_t dhandle, > > - unsigned int flags, unsigned int *pdomid) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_createdomain, *pdomid); > > - domctl.u.createdomain.ssidref = ssidref; > > - domctl.u.createdomain.flags = flags; > > - memcpy(domctl.u.createdomain.handle, dhandle, sizeof(xen_domain_handle_t)); > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret != 0) { > > - xc_error_set("creating domain failed: %s", xc_error_get()); > > - return ret; > > - } > > - *pdomid = domctl.domain; > > - return 0; > > -} > > - > > -int xc_domain_pause(int handle, unsigned int domid) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_pausedomain, domid); > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret != 0) > > - xc_error_dom_set(domid, "pause"); > > - return ret; > > -} > > - > > -int xc_domain_unpause(int handle, unsigned int domid) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_unpausedomain, domid); > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret != 0) > > - xc_error_dom_set(domid, "unpause"); > > - return ret; > > -} > > - > > -/* return 1 if hvm domain got pv driver, 0 if not. -1 is error occurs */ > > -int xc_hvm_check_pvdriver(int handle, unsigned int domid) > > -{ > > - int ret; > > - unsigned long irq = 0; > > - xc_domaininfo_t info; > > - > > - ret = xc_domain_getinfolist(handle, domid, 1, &info); > > - if (ret != 1) { > > - xc_error_set("domain getinfo failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "hvm_check_pvdriver"); > > - return -1; > > - } > > - > > - if (!(info.flags & XEN_DOMINF_hvm_guest)) { > > - xc_error_set("domain is not hvm"); > > - xc_error_dom_set(domid, "hvm_check_pvdriver"); > > - return -1; > > - } > > - xc_get_hvm_param(handle, domid, HVM_PARAM_CALLBACK_IRQ, &irq); > > - return irq; > > -} > > - > > -static int modify_returncode_register(int handle, unsigned int domid) > > -{ > > - int ret; > > - xc_domaininfo_t info; > > - xen_capabilities_info_t caps; > > - vcpu_guest_context_any_t context; > > - > > - ret = xc_domain_getinfolist(handle, domid, 1, &info); > > - if (ret != 1) { > > - xc_error_set("domain getinfo failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - /* HVM guests without PV drivers do not have a return code to modify */ > > - if (info.flags & XEN_DOMINF_hvm_guest) { > > - unsigned long irq = 0; > > - xc_get_hvm_param(handle, domid, HVM_PARAM_CALLBACK_IRQ, &irq); > > - if (!irq) > > - return 0; > > - } > > - > > - ret = xc_version(handle, XENVER_capabilities, &caps); > > - if (ret) { > > - xc_error_set("could not get Xen capabilities"); > > - return ret; > > - } > > - > > - ret = xc_vcpu_getcontext(handle, domid, 0, &context); > > - if (ret) { > > - xc_error_set("could not get vcpu 0 context"); > > - return ret; > > - } > > - > > - if (!(info.flags & XEN_DOMINF_hvm_guest)) > > - context.c.user_regs.eax = 1; > > - else if (strstr(caps, "x86_64")) > > - context.x64.user_regs.eax = 1; > > - else > > - context.x32.user_regs.eax = 1; > > - > > - ret = xc_vcpu_setcontext(handle, domid, 0, &context); > > - if (ret) { > > - xc_error_set("could not set vcpu 0 context"); > > - return ret; > > - } > > - return 0; > > -} > > - > > -int xc_domain_resume_fast(int handle, unsigned int domid) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_resumedomain, domid); > > - > > - ret = modify_returncode_register(handle, domid); > > - if (ret != 0) { > > - xc_error_dom_set(domid, "resume_fast"); > > - return ret; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret != 0) > > - xc_error_dom_set(domid, "resume_fast"); > > - return ret; > > -} > > - > > -int xc_domain_destroy(int handle, unsigned int domid) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_destroydomain, domid); > > - > > - do { > > - ret = do_domctl(handle, &domctl); > > - } while (ret && (errno == EAGAIN)); > > - if (ret != 0) > > - xc_error_dom_set(domid, "destroy"); > > - return ret; > > -} > > - > > -int xc_domain_shutdown(int handle, int domid, int reason) > > -{ > > - sched_remote_shutdown_t arg = { > > - .domain_id = domid, > > - .reason = reason, > > - }; > > - DECLARE_HYPERCALL2(__HYPERVISOR_sched_op, SCHEDOP_remote_shutdown, &arg); > > - int ret; > > - > > - if (mlock(&arg, sizeof(arg)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "shutdown %d", reason); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret < 0) { > > - xc_error_hypercall(hypercall, ret); > > - xc_error_dom_set(domid, "shutdown %d", reason); > > - } > > - munlock(&arg, sizeof(arg)); > > - return ret; > > -} > > - > > -static void bitmap_64_to_byte(uint8_t *bp, const uint64_t *lp, int nbits) > > -{ > > - uint64_t l; > > - int i, j, b; > > - > > - for (i = 0, b = 0; nbits > 0; i++, b += sizeof(l)) { > > - l = lp[i]; > > - for (j = 0; (j < sizeof(l)) && (nbits > 0); j++) { > > - bp[b+j] = l; > > - l >>= 8; > > - nbits -= 8; > > - } > > - } > > -} > > - > > -static void bitmap_byte_to_64(uint64_t *lp, const uint8_t *bp, int nbits) > > -{ > > - uint64_t l; > > - int i, j, b; > > - > > - for (i = 0, b = 0; nbits > 0; i++, b += sizeof(l)) { > > - l = 0; > > - for (j = 0; (j < sizeof(l)) && (nbits > 0); j++) { > > - l |= (uint64_t)bp[b+j] << (j*8); > > - nbits -= 8; > > - } > > - lp[i] = l; > > - } > > -} > > - > > -int xc_vcpu_setaffinity(int handle, unsigned int domid, int vcpu, > > - uint64_t cpumap) > > -{ > > - int ret; > > - uint8_t local[sizeof(cpumap)]; > > - DECLARE_DOMCTL(XEN_DOMCTL_setvcpuaffinity, domid); > > - domctl.u.vcpuaffinity.vcpu = vcpu; > > - domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8; > > - > > - bitmap_64_to_byte(local, &cpumap, sizeof(cpumap)*8); > > - set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); > > - > > - if (mlock(&cpumap, sizeof(cpumap)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "vcpu %d set affinity", vcpu); > > - return -1; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "vcpu %d set affinity", vcpu); > > - munlock(&cpumap, sizeof(cpumap)); > > - return ret; > > -} > > - > > -int xc_vcpu_getaffinity(int handle, unsigned int domid, int vcpu, > > - uint64_t *cpumap) > > -{ > > - int ret; > > - uint8_t local[sizeof(*cpumap)]; > > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuaffinity, domid); > > - domctl.u.vcpuaffinity.vcpu = vcpu; > > - domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(*cpumap) * 8; > > - > > - set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); > > - > > - if (mlock(cpumap, sizeof(*cpumap)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "vcpu %d get affinity", vcpu); > > - return -1; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "vcpu %d get affinity", vcpu); > > - munlock(cpumap, sizeof(*cpumap)); > > - bitmap_byte_to_64(cpumap, local, sizeof(*cpumap) * 8); > > - return ret; > > -} > > - > > -int xc_vcpu_context_get(int handle, unsigned int domid, unsigned short vcpu, > > - struct vcpu_guest_context *ctxt) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpucontext, domid); > > - domctl.u.vcpucontext.vcpu = vcpu; > > - > > - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt); > > - > > - if (mlock(ctxt, sizeof(struct vcpu_guest_context)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "vcpu %d get context", vcpu); > > - return -1; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "vcpu %d get context", vcpu); > > - munlock(ctxt, sizeof(struct vcpu_guest_context)); > > - > > - return ret; > > -} > > - > > -int xc_domain_getinfolist(int handle, unsigned int first_domain, > > - unsigned int max_domains, xc_domaininfo_t *info) > > -{ > > - int ret; > > - DECLARE_SYSCTL(XEN_SYSCTL_getdomaininfolist); > > - sysctl.u.getdomaininfolist.first_domain = first_domain; > > - sysctl.u.getdomaininfolist.max_domains = max_domains; > > - set_xen_guest_handle(sysctl.u.getdomaininfolist.buffer, info); > > - > > - if (mlock(info, max_domains * sizeof(xc_domaininfo_t)) != 0) { > > - xc_error_set("getinfolist(%d, %u, %u, %x (%d)) failed: mlock failed: %s", > > - handle, first_domain, max_domains, info, sizeof(xc_domaininfo_t), > > - strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_sysctl(handle, &sysctl); > > - if (ret < 0) > > - xc_error_set("getinfolist(%d, %u, %u, %x (%d)) failed: %s", > > - handle, first_domain, max_domains, info, sizeof(xc_domaininfo_t), > > - xc_error_get()); > > - else > > - ret = sysctl.u.getdomaininfolist.num_domains; > > - > > - munlock(info, max_domains * sizeof(xc_domaininfo_t)); > > - return ret; > > -} > > - > > -int xc_domain_getinfo(int handle, unsigned int domid, xc_domaininfo_t *info) > > -{ > > - int ret; > > - ret = xc_domain_getinfolist(handle, domid, 1, info); > > - if (ret != 1) { > > - xc_error_set("getinfo failed: domain %d: %s", domid, xc_error_get()); > > - return -1; > > - } > > - > > - /* If the requested domain didn''t exist but there exists one with a > > - higher domain ID, this will be returned. We consider this an error since > > - we only wanted info about a specific domain. */ > > - if (info->domain != domid) { > > - xc_error_set("getinfo failed: domain %d nolonger exists", domid); > > - return -1; > > - } > > - > > - return 0; > > -} > > - > > -int xc_domain_setmaxmem(int handle, unsigned int domid, unsigned int max_memkb) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_max_mem, domid); > > - domctl.u.max_mem.max_memkb = max_memkb; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "set max memory to %u", max_memkb); > > - return ret; > > -} > > - > > -int xc_domain_set_memmap_limit(int handle, unsigned int domid, > > - unsigned long map_limitkb) > > -{ > > - int ret; > > - struct xen_foreign_memory_map fmap = { > > - .domid = domid, > > - .map = { .nr_entries = 1 } > > - }; > > - struct e820entry e820 = { > > - .addr = 0, > > - .size = (uint64_t)map_limitkb << 10, > > - .type = E820_RAM > > - }; > > - DECLARE_HYPERCALL2(__HYPERVISOR_memory_op, XENMEM_set_memory_map, &fmap); > > - > > - set_xen_guest_handle(fmap.map.buffer, &e820); > > - > > - if (mlock(&fmap, sizeof(fmap)) != 0) { > > - xc_error_set("set_memmap_limit failed: mlock failed: %s", > > - strerror(errno)); > > - return -1; > > - } > > - > > - if (mlock(&e820, sizeof(e820)) != 0) { > > - xc_error_set("set_memmap_limit failed: mlock failed: %s", > > - strerror(errno)); > > - munlock(&fmap, sizeof(fmap)); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret) > > - xc_error_hypercall(hypercall, ret); > > - > > - munlock(&e820, sizeof(e820)); > > - munlock(&fmap, sizeof(fmap)); > > - return ret; > > -} > > - > > -int xc_domain_set_time_offset(int handle, unsigned int domid, int time_offset) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_settimeoffset, domid); > > - domctl.u.settimeoffset.time_offset_seconds = time_offset; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "set time offset %d", time_offset); > > - return ret; > > -} > > - > > -int xc_domain_memory_increase_reservation(int handle, unsigned int domid, > > - unsigned long nr_extents, > > - unsigned int extent_order, > > - unsigned int address_bits, > > - xen_pfn_t *extent_start) > > -{ > > - int ret; > > - struct xen_memory_reservation reservation = { > > - .nr_extents = nr_extents, > > - .extent_order = extent_order, > > - .COMPAT_FIELD_ADDRESS_BITS = address_bits, > > - .domid = domid > > - }; > > - > > - set_xen_guest_handle(reservation.extent_start, extent_start); > > - > > - ret = do_memctl_reservation(handle, XENMEM_increase_reservation, > > - &reservation); > > - if (ret != nr_extents) { > > - xc_error_dom_set(domid, "increase reservation to %lu", > > - nr_extents); > > - return (ret >= 0) ? -1 : ret; > > - } > > - return 0; > > -} > > - > > -int xc_domain_memory_decrease_reservation(int handle, unsigned int domid, > > - unsigned long nr_extents, > > - unsigned int extent_order, > > - unsigned int address_bits, > > - xen_pfn_t *extent_start) > > -{ > > - int ret; > > - struct xen_memory_reservation reservation = { > > - .nr_extents = nr_extents, > > - .extent_order = extent_order, > > - .COMPAT_FIELD_ADDRESS_BITS = 0, > > - .domid = domid > > - }; > > - > > - set_xen_guest_handle(reservation.extent_start, extent_start); > > - if (!extent_start) { > > - xc_error_set("decrease reservation: extent start is NULL"); > > - return -EINVAL; > > - } > > - > > - ret = do_memctl_reservation(handle, XENMEM_decrease_reservation, > > - &reservation); > > - if (ret < nr_extents) { > > - xc_error_dom_set(domid, "decrease reservation to %lu", > > - nr_extents); > > - return (ret >= 0) ? -1 : ret; > > - } > > - return 0; > > -} > > - > > -int xc_domain_memory_populate_physmap(int handle, unsigned int domid, > > - unsigned long nr_extents, > > - unsigned int extent_order, > > - unsigned int address_bits, > > - xen_pfn_t *extent_start) > > -{ > > - int ret; > > - struct xen_memory_reservation reservation = { > > - .nr_extents = nr_extents, > > - .extent_order = extent_order, > > - .COMPAT_FIELD_ADDRESS_BITS = address_bits, > > - .domid = domid > > - }; > > - > > - set_xen_guest_handle(reservation.extent_start, extent_start); > > - ret = do_memctl_reservation(handle, XENMEM_populate_physmap, > > - &reservation); > > - if (ret < nr_extents) { > > - xc_error_dom_set(domid, "populate physmap"); > > - return (ret >= 0) ? -1 : ret; > > - } > > - return 0; > > -} > > - > > -int xc_domain_setvmxassist(int handle, unsigned int domid, int use_vmxassist) > > -{ > > - int ret = 0; > > -#ifdef XEN_DOMCTL_setvmxassist > > - DECLARE_DOMCTL(XEN_DOMCTL_setvmxassist, domid); > > - domctl.u.setvmxassist.use_vmxassist = use_vmxassist; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "setting vmxassist to %d", > > - use_vmxassist); > > -#endif > > - return ret; > > -} > > - > > -int xc_domain_max_vcpus(int handle, unsigned int domid, unsigned int max) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_max_vcpus, domid); > > - domctl.u.max_vcpus.max = max; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "setting max vcpus to %d", max); > > - return ret; > > -} > > - > > -int xc_domain_sethandle(int handle, unsigned int domid, > > - xen_domain_handle_t dhandle) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_setdomainhandle, domid); > > - memcpy(domctl.u.setdomainhandle.handle, dhandle, sizeof(xen_domain_handle_t)); > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "set handle"); > > - return ret; > > -} > > - > > -int xc_vcpu_getinfo(int handle, unsigned int domid, unsigned int vcpu, > > - xc_vcpuinfo_t *info) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuinfo, domid); > > - domctl.u.getvcpuinfo.vcpu = vcpu; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) { > > - xc_error_dom_set(domid, "vcpu %u getinfo", vcpu); > > - return ret; > > - } > > - memcpy(info, &domctl.u.getvcpuinfo, sizeof(*info)); > > - return ret; > > -} > > - > > -int xc_domain_ioport_permission(int handle, unsigned int domid, > > - unsigned int first_port, unsigned int nr_ports, > > - unsigned int allow_access) > > -{ > > - DECLARE_DOMCTL(XEN_DOMCTL_ioport_permission, domid); > > - domctl.u.ioport_permission.first_port = first_port; > > - domctl.u.ioport_permission.nr_ports = nr_ports; > > - domctl.u.ioport_permission.allow_access = allow_access; > > - > > - return do_domctl(handle, &domctl); > > -} > > - > > -int xc_vcpu_getcontext(int handle, unsigned int domid, > > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpucontext, domid); > > - domctl.u.vcpucontext.vcpu = vcpu; > > - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt->c); > > - > > - if (mlock(ctxt, sizeof(*ctxt)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "vcpu %u getcontext", vcpu); > > - munlock(ctxt, sizeof(*ctxt)); > > - return ret; > > -} > > - > > -int xc_vcpu_setcontext(int handle, unsigned int domid, > > - unsigned int vcpu, vcpu_guest_context_any_t *ctxt) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_setvcpucontext, domid); > > - domctl.u.vcpucontext.vcpu = vcpu; > > - set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt->c); > > - > > - if (mlock(ctxt, sizeof(*ctxt)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "vcpu %u setcontext", vcpu); > > - > > - munlock(ctxt, sizeof(*ctxt)); > > - return ret; > > -} > > - > > -int xc_domain_irq_permission(int handle, unsigned int domid, > > - unsigned char pirq, unsigned char allow_access) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_irq_permission, domid); > > - domctl.u.irq_permission.pirq = pirq; > > - domctl.u.irq_permission.allow_access = allow_access; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "irq permission %u to %u", > > - pirq, allow_access); > > - return ret; > > -} > > - > > -int xc_domain_iomem_permission(int handle, unsigned int domid, > > - unsigned long first_mfn, unsigned long nr_mfns, > > - unsigned char allow_access) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_iomem_permission, domid); > > - domctl.u.iomem_permission.first_mfn = first_mfn; > > - domctl.u.iomem_permission.nr_mfns = nr_mfns; > > - domctl.u.iomem_permission.allow_access = allow_access; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret) > > - xc_error_dom_set(domid, "iomem permission [%lu, %lu] to %u", > > - first_mfn, first_mfn + nr_mfns, allow_access); > > - return ret; > > -} > > - > > -long long xc_domain_get_cpu_usage(int handle, unsigned int domid, > > - unsigned int vcpu) > > -{ > > - DECLARE_DOMCTL(XEN_DOMCTL_getvcpuinfo, domid); > > - domctl.u.getvcpuinfo.vcpu = vcpu; > > - > > - if (do_domctl(handle, &domctl) < 0) { > > - xc_error_dom_set(domid, "get cpu %d usage", vcpu); > > - return -1; > > - } > > - return domctl.u.getvcpuinfo.cpu_time; > > -} > > - > > -void *xc_map_foreign_range(int handle, unsigned int domid, > > - int size, int prot, unsigned long mfn) > > -{ > > - privcmd_mmap_entry_t entry = { > > - .mfn = mfn, > > - .npages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT, > > - }; > > - privcmd_mmap_t ioctlx = { > > - .num = 1, > > - .dom = domid, > > - .entry = &entry, > > - }; > > - void *addr; > > - > > - addr = do_mmap(NULL, size, prot, MAP_SHARED, handle, 0); > > - if (addr == MAP_FAILED) { > > - xc_error_set("mmap failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "map foreign range [%lx,%lx] prot %u", > > - mfn, mfn + size, prot); > > - return NULL; > > - } > > - entry.va = (unsigned long) addr; > > - if (do_ioctl(handle, IOCTL_PRIVCMD_MMAP, &ioctlx) < 0) { > > - xc_error_set("ioctl failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "map foreign range [%lx,%lx] prot %u", > > - mfn, mfn + size, prot); > > - munmap(addr, size); > > - return NULL; > > - } > > - return addr; > > -} > > - > > -int xc_map_foreign_ranges(int handle, unsigned int domid, > > - privcmd_mmap_entry_t *entries, int nr) > > -{ > > - privcmd_mmap_t ioctlx = { > > - .num = nr, > > - .dom = domid, > > - .entry = entries, > > - }; > > - int ret; > > - > > - ret = do_ioctl(handle, IOCTL_PRIVCMD_MMAP, &ioctlx); > > - if (ret < 0) { > > - xc_error_set("ioctl failed: %s", strerror(errno)); > > - xc_error_dom_set(domid, "map foreign ranges"); > > - return -1; > > - } > > - return ret; > > -} > > - > > -int xc_readconsolering(int handle, char **pbuffer, > > - unsigned int *pnr_chars, int clear) > > -{ > > - int ret; > > - DECLARE_SYSCTL(XEN_SYSCTL_readconsole); > > - char *buffer = *pbuffer; > > - unsigned int nr_chars = *pnr_chars; > > - > > - set_xen_guest_handle(sysctl.u.readconsole.buffer, buffer); > > - sysctl.u.readconsole.count = nr_chars; > > - sysctl.u.readconsole.clear = clear; > > - > > - if (mlock(buffer, nr_chars) != 0) { > > - xc_error_set("read console ring: mlock failed: %s", > > - strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_sysctl(handle, &sysctl); > > - if (ret != 0) > > - xc_error_set("read console ring failed: %s", xc_error_get()); > > - else > > - *pnr_chars = sysctl.u.readconsole.count; > > - > > - munlock(buffer, nr_chars); > > - return ret; > > -} > > - > > -int xc_send_debug_keys(int handle, char *keys) > > -{ > > - int ret; > > - DECLARE_SYSCTL(XEN_SYSCTL_debug_keys); > > - > > - set_xen_guest_handle(sysctl.u.debug_keys.keys, keys); > > - sysctl.u.debug_keys.nr_keys = strlen(keys); > > - > > - if (mlock(keys, sysctl.u.debug_keys.nr_keys) != 0) { > > - xc_error_set("send debug keys: mlock failed: %s", > > - strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_sysctl(handle, &sysctl); > > - if (ret != 0) > > - xc_error_set("send debug keys: %s", xc_error_get()); > > - > > - munlock(keys, sysctl.u.debug_keys.nr_keys); > > - return ret; > > -} > > - > > -int xc_physinfo(int handle, xc_physinfo_t *put_info) > > -{ > > - DECLARE_SYSCTL(XEN_SYSCTL_physinfo); > > - int ret; > > - > > - ret = do_sysctl(handle, &sysctl); > > - if (ret) { > > - xc_error_set("physinfo failed: %s", xc_error_get()); > > - return ret; > > - } > > - memcpy(put_info, &sysctl.u.physinfo, sizeof(*put_info)); > > - return 0; > > -} > > - > > -int xc_pcpu_info( > > - int handle, int max_cpus, xen_sysctl_cpuinfo_t *info, int *nr_cpus) > > -{ > > - DECLARE_SYSCTL(XEN_SYSCTL_getcpuinfo); > > - int ret; > > - > > - sysctl.u.getcpuinfo.max_cpus = max_cpus; > > - set_xen_guest_handle(sysctl.u.getcpuinfo.info, info); > > - > > - if (mlock(info, sizeof(*info) * max_cpus) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_sysctl(handle, &sysctl); > > - if (ret) > > - xc_error_set("pcpu info failed: %s", xc_error_get()); > > - else if (ret == 0 && nr_cpus) > > - *nr_cpus = sysctl.u.getcpuinfo.nr_cpus; > > - munlock(info, sizeof(*info) * max_cpus); > > - return ret; > > -} > > - > > -int xc_sched_id(int handle, int *sched_id) > > -{ > > - DECLARE_SYSCTL(XEN_SYSCTL_sched_id); > > - int ret; > > - > > - ret = do_sysctl(handle, &sysctl); > > - if (ret) { > > - xc_error_set("sched id failed: %s", xc_error_get()); > > - return ret; > > - } > > - *sched_id = sysctl.u.sched_id.sched_id; > > - return 0; > > -} > > - > > -int xc_version(int handle, int cmd, void *arg) > > -{ > > - int argsize; > > - int ret; > > - DECLARE_HYPERCALL2(__HYPERVISOR_xen_version, cmd, arg); > > - > > - switch (cmd) { > > - case XENVER_extraversion: > > - argsize = sizeof(xen_extraversion_t); break; > > - case XENVER_compile_info: > > - argsize = sizeof(xen_compile_info_t); break; > > - case XENVER_capabilities: > > - argsize = sizeof(xen_capabilities_info_t); break; > > - case XENVER_changeset: > > - argsize = sizeof(xen_changeset_info_t); break; > > - case XENVER_platform_parameters: > > - argsize = sizeof(xen_platform_parameters_t); break; > > - case XENVER_version: > > - argsize = 0; break; > > - default: > > - xc_error_set("version: unknown command"); > > - return -1; > > - } > > - if (argsize && mlock(arg, argsize) == -1) { > > - xc_error_set("version: mlock failed: %s", strerror(errno)); > > - return -ENOMEM; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret) > > - xc_error_hypercall(hypercall, ret); > > - > > - if (argsize) > > - munlock(arg, argsize); > > - return ret; > > -} > > - > > -int xc_evtchn_alloc_unbound(int handle, unsigned int domid, > > - unsigned int remote_domid) > > -{ > > - struct evtchn_alloc_unbound arg = { > > - .dom = domid, > > - .remote_dom = remote_domid, > > - }; > > - int ret; > > - > > - ret = do_evtchnctl(handle, EVTCHNOP_alloc_unbound, &arg, sizeof(arg)); > > - if (ret) { > > - xc_error_dom_set(domid, "alloc unbound evtchn to %d", > > - remote_domid); > > - return ret; > > - } > > - return arg.port; > > -} > > - > > -int xc_evtchn_reset(int handle, unsigned int domid) > > -{ > > - struct evtchn_reset arg = { > > - .dom = domid, > > - }; > > - int ret; > > - > > - ret = do_evtchnctl(handle, EVTCHNOP_reset, &arg, sizeof(arg)); > > - if (ret) > > - xc_error_dom_set(domid, "reset evtchn of %d", domid); > > - return ret; > > -} > > - > > -int xc_sched_credit_domain_set(int handle, unsigned int domid, > > - struct xen_domctl_sched_credit *sdom) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_scheduler_op, domid); > > - domctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT; > > - domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_putinfo; > > - domctl.u.scheduler_op.u.credit = *sdom; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "credit scheduler domain set"); > > - return ret; > > -} > > - > > -int xc_sched_credit_domain_get(int handle, unsigned int domid, > > - struct xen_domctl_sched_credit *sdom) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_scheduler_op, domid); > > - > > - domctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT; > > - domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_getinfo; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "credit scheduler domain get"); > > - else > > - *sdom = domctl.u.scheduler_op.u.credit; > > - return ret; > > -} > > - > > -int xc_shadow_allocation_get(int handle, unsigned int domid, uint32_t *mb) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_shadow_op, domid); > > - > > - domctl.u.shadow_op.op = XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "shadow allocation get"); > > - else > > - *mb = domctl.u.shadow_op.mb; > > - return ret; > > -} > > - > > -int xc_shadow_allocation_set(int handle, unsigned int domid, uint32_t mb) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_shadow_op, domid); > > - > > - domctl.u.shadow_op.op = XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION; > > - domctl.u.shadow_op.mb = mb; > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "shadow allocation set"); > > - return ret; > > -} > > - > > -int xc_domain_get_pfn_list(int handle, unsigned int domid, > > - uint64_t *pfn_array, unsigned long max_pfns) > > -{ > > - int ret; > > - DECLARE_DOMCTL(XEN_DOMCTL_getmemlist, domid); > > - > > - domctl.u.getmemlist.max_pfns = max_pfns; > > - set_xen_guest_handle(domctl.u.getmemlist.buffer, pfn_array); > > - > > - if (mlock(pfn_array, max_pfns * sizeof(xen_pfn_t)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "get pfn list"); > > - > > - munlock(pfn_array, max_pfns * sizeof(xen_pfn_t)); > > - return (ret < 0) ? ret : domctl.u.getmemlist.num_pfns; > > -} > > - > > -#define MARSHALL_BDF(d,b,s,f) \ > > - (((b) & 0xff) << 16 | ((s) & 0x1f) << 11 | ((f) & 0x7) << 8) > > - > > -int xc_domain_assign_device(int handle, unsigned int domid, > > - int domain, int bus, int slot, int func) > > -{ > > - int ret = -EBADF; > > -#ifdef XEN_DOMCTL_assign_device > > - DECLARE_DOMCTL(XEN_DOMCTL_assign_device, domid); > > - > > - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "assign device"); > > -#endif > > - return ret; > > -} > > - > > -int xc_domain_deassign_device(int handle, unsigned int domid, > > - int domain, int bus, int slot, int func) > > -{ > > - int ret = -EBADF; > > -#ifdef XEN_DOMCTL_deassign_device > > - DECLARE_DOMCTL(XEN_DOMCTL_deassign_device, domid); > > - > > - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "deassign device"); > > -#endif > > - return ret; > > -} > > - > > -int xc_domain_test_assign_device(int handle, unsigned int domid, > > - int domain, int bus, int slot, int func) > > -{ > > - int ret = -EBADF; > > -#ifdef XEN_DOMCTL_test_assign_device > > - DECLARE_DOMCTL(XEN_DOMCTL_test_assign_device, domid); > > - domctl.u.assign_device.machine_bdf = MARSHALL_BDF(domain, bus, slot, func); > > - > > - ret = do_domctl(handle, &domctl); > > - if (ret < 0) > > - xc_error_dom_set(domid, "test assign device"); > > -#endif > > - return ret; > > -} > > - > > -int xc_domain_watchdog(int handle, int id, uint32_t timeout) > > -{ > > - int ret = -EBADF; > > -#ifdef SCHEDOP_watchdog > > - sched_watchdog_t arg = { > > - .id = (uint32_t) id, > > - .timeout = timeout, > > - }; > > - DECLARE_HYPERCALL2(__HYPERVISOR_sched_op, SCHEDOP_watchdog, &arg); > > - > > - if (mlock(&arg, sizeof(arg)) != 0) { > > - xc_error_set("mlock failed: %s", strerror(errno)); > > - return -1; > > - } > > - > > - ret = do_xen_hypercall(handle, &hypercall); > > - if (ret < 0) { > > - xc_error_hypercall(hypercall, ret); > > - } > > - munlock(&arg, sizeof(arg)); > > -#endif > > - return ret; > > -} > > - > > -int xc_domain_set_machine_address_size(int xc, uint32_t domid, unsigned int width) > > -{ > > - DECLARE_DOMCTL(XEN_DOMCTL_set_machine_address_size, domid); > > - int rc; > > - > > - domctl.u.address_size.size = width; > > - rc = do_domctl(xc, &domctl); > > - if (rc != 0) > > - xc_error_dom_set(domid, "set machine address size"); > > - > > - return rc; > > -} > > - > > -int xc_domain_get_machine_address_size(int xc, uint32_t domid) > > -{ > > - DECLARE_DOMCTL(XEN_DOMCTL_get_machine_address_size, domid); > > - int rc; > > - > > - rc = do_domctl(xc, &domctl); > > - if (rc != 0) > > - xc_error_dom_set(domid, "get machine address size"); > > - return rc == 0 ? domctl.u.address_size.size : rc; > > -} > > - > > -#include "xc_cpuid.h" > > -int xc_domain_cpuid_set(int xc, unsigned int domid, int hvm, > > - uint32_t input, uint32_t oinput, > > - char *config[4], char *config_out[4]) > > -{ > > - int ret = -EBADF; > > -#ifdef XEN_DOMCTL_set_cpuid > > - DECLARE_DOMCTL(XEN_DOMCTL_set_cpuid, domid); > > - uint32_t regs[4], polregs[4]; > > - int i, j; > > - > > - xc_cpuid(input, oinput, regs); > > - memcpy(polregs, regs, sizeof(regs)); > > - do_cpuid_policy(xc, domid, hvm, input, polregs); > > - > > - for (i = 0; i < 4; i++) { > > - if (!config[i]) { > > - regs[i] = polregs[i]; > > - continue; > > - } > > - > > - for (j = 0; j < 32; j++) { > > - unsigned char val, polval; > > - > > - val = !!((regs[i] & (1U << (31 - j)))); > > - polval = !!((regs[i] & (1U << (31 - j)))); > > - > > - switch (config[i][j]) { > > - case ''1'': val = 1; break; /* force to true */ > > - case ''0'': val = 0; break; /* force to false */ > > - case ''x'': val = polval; break; > > - case ''k'': case ''s'': break; > > - default: > > - xc_error_dom_set(domid, "domain cpuid set: invalid config"); > > - ret = -EINVAL; > > - goto out; > > - } > > - > > - if (val) > > - set_bit(31 - j, regs[i]); > > - else > > - clear_bit(31 - j, regs[i]); > > - > > - if (config_out && config_out[i]) { > > - config_out[i][j] = (config[i][j] == ''s'') > > - ? ''0'' + val > > - : config[i][j]; > > - } > > - } > > - } > > - > > - domctl.u.cpuid.input[0] = input; > > - domctl.u.cpuid.input[1] = oinput; > > - domctl.u.cpuid.eax = regs[0]; > > - domctl.u.cpuid.ebx = regs[1]; > > - domctl.u.cpuid.ecx = regs[2]; > > - domctl.u.cpuid.edx = regs[3]; > > - ret = do_domctl(xc, &domctl); > > - if (ret) { > > - xc_error_dom_set(domid, "cpuid set"); > > - goto out; > > - } > > -out: > > -#endif > > - return ret; > > -} > > - > > -int xc_domain_cpuid_apply(int xc, unsigned int domid, int hvm) > > -{ > > - int ret = -EBADF; > > -#ifdef XEN_DOMCTL_set_cpuid > > - uint32_t regs[4], base_max, ext_max, eax, ecx; > > - > > - /* determinate cpuid range */ > > - xc_cpuid(0, 0, regs); > > - base_max = MIN(regs[0], DEF_MAX_BASE); > > - xc_cpuid(0x80000000, 0, regs); > > - ext_max = MIN(regs[0], DEF_MAX_EXT); > > - > > - eax = ecx = 0; > > - while (!(eax & 0x80000000) || (eax <= ext_max)) { > > - xc_cpuid(eax, ecx, regs); > > - > > - do_cpuid_policy(xc, domid, hvm, eax, regs); > > - > > - if (regs[0] || regs[1] || regs[2] || regs[3]) { > > - DECLARE_DOMCTL(XEN_DOMCTL_set_cpuid, domid); > > - > > - domctl.u.cpuid.input[0] = eax; > > - domctl.u.cpuid.input[1] = (eax == 4) ? ecx : XEN_CPUID_INPUT_UNUSED; > > - domctl.u.cpuid.eax = regs[0]; > > - domctl.u.cpuid.ebx = regs[1]; > > - domctl.u.cpuid.ecx = regs[2]; > > - domctl.u.cpuid.edx = regs[3]; > > - > > - ret = do_domctl(xc, &domctl); > > - if (ret) { > > - xc_error_dom_set(domid, "cpuid apply"); > > - goto out; > > - } > > - > > - /* we repeat when doing node 4 (cache descriptor leaves) increasing ecx > > - * until the cpuid eax value masked is 0 */ > > - if (eax == 4) { > > - ecx++; > > - if ((regs[0] & 0x1f) != 0) > > - continue; > > - ecx = 0; > > - } > > - } > > - > > - eax++; > > - if (!(eax & 0x80000000) && (eax > base_max)) > > - eax = 0x80000000; > > - } > > - ret = 0; > > -out: > > -#endif > > - return ret; > > -} > > - > > -/* > > - * return 1 on checking success > > - * 0 on checking failure > > - * -EINVAL if the config contains unknown character > > - */ > > -int xc_cpuid_check(uint32_t input, uint32_t optsubinput, > > - char *config[4], char *config_out[4]) > > -{ > > - int ret = -EBADF; > > -#ifdef XEN_DOMCTL_set_cpuid > > - uint32_t regs[4]; > > - int i, j; > > - > > - xc_cpuid(input, optsubinput, regs); > > - > > - ret = 1; > > - for (i = 0; i < 4; i++) { > > - if (!config[i]) > > - continue; > > - for (j = 0; j < 32; j++) { > > - unsigned char val; > > - > > - val = !!((regs[i] & (1U << (31 - j)))); > > - > > - switch (config[i][j]) { > > - case ''1'': if (!val) { ret = 0; goto out; }; break; > > - case ''0'': if (val) { ret = 0; goto out; }; break; > > - case ''x'': case ''s'': break; > > - default: > > - xc_error_set("cpuid check: invalid config"); > > - ret = -EINVAL; > > - goto out; > > - } > > - > > - if (config_out && config_out[i]) { > > - config_out[i][j] = (config[i][j] == ''s'') > > - ? ''0'' + val > > - : config[i][j]; > > - } > > - } > > - } > > -out: > > -#endif > > - 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) > > -{ > > - 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; > > - unsigned long value; > > - > > - ret = xc_get_hvm_param(handle, domid, HVM_PARAM_ACPI_S_STATE, &value); > > - if (ret != 0) > > - xc_error_dom_set(domid, "get acpi s-state"); > > - return value; > > -} > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/libs/xc/xc_stubs.c > > --- a/tools/ocaml/libs/xc/xc_stubs.c Fri Sep 10 11:10:00 2010 +0100 > > +++ b/tools/ocaml/libs/xc/xc_stubs.c Fri Sep 10 11:10:02 2010 +0100 > > @@ -16,6 +16,7 @@ > > > > #define _XOPEN_SOURCE 600 > > #include <stdlib.h> > > +#include <errno.h> > > > > #define CAML_NAME_SPACE > > #include <caml/alloc.h> > > @@ -28,7 +29,7 @@ > > #include <stdint.h> > > #include <string.h> > > > > -#include "xc.h" > > +#include <xenctrl.h> > > > > #include "mmap_stubs.h" > > > > @@ -36,7 +37,7 @@ > > #define PAGE_SIZE (1UL << PAGE_SHIFT) > > #define PAGE_MASK (~(PAGE_SIZE-1)) > > > > -#define _H(__h) (Int_val(__h)) > > +#define _H(__h) ((xc_interface *)(__h)) > > #define _D(__d) ((uint32_t)Int_val(__d)) > > > > #define Val_none (Val_int(0)) > > @@ -50,12 +51,12 @@ > > i1 = (uint32_t) Int64_val(Field(input, 0)); \ > > i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0))); > > > > -/** > > - * Convert the given number of pages to an amount in MiB, rounded up. > > - */ > > +#define ERROR_STRLEN 256 > > void failwith_xc(void) > > { > > - caml_raise_with_string(*caml_named_value("xc.error"), xc_error_get()); > > + static char error_str[ERROR_STRLEN]; > > + snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno)); > > + caml_raise_with_string(*caml_named_value("xc.error"), error_str); > > } > > > > CAMLprim value stub_sizeof_core_header(value unit) > > @@ -101,11 +102,11 @@ CAMLprim value stub_marshall_core_header > > > > CAMLprim value stub_xc_interface_open(void) > > { > > - int handle; > > - handle = xc_interface_open(); > > - if (handle == -1) > > + xc_interface *xch; > > + xch = xc_interface_open(NULL, NULL, 0); > > + if (xch == NULL) > > failwith_xc(); > > - return Val_int(handle); > > + return (value)xch; > > } > > > > > > @@ -116,20 +117,15 @@ CAMLprim value stub_xc_interface_open_fa > > > > CAMLprim value stub_xc_using_injection(void) > > { > > - if (xc_using_injection ()){ > > - return Val_int(1); > > - } else { > > - return Val_int(0); > > - } > > + return Val_int(0); > > } > > > > -CAMLprim value stub_xc_interface_close(value xc_handle) > > +CAMLprim value stub_xc_interface_close(value xch) > > { > > - CAMLparam1(xc_handle); > > + CAMLparam1(xch); > > > > - int handle = _H(xc_handle); > > // caml_enter_blocking_section(); > > - xc_interface_close(handle); > > + xc_interface_close(_H(xch)); > > // caml_leave_blocking_section(); > > > > CAMLreturn(Val_unit); > > @@ -140,16 +136,15 @@ static int domain_create_flag_table[] > > XEN_DOMCTL_CDF_hap, > > }; > > > > -CAMLprim value stub_xc_domain_create(value xc_handle, value ssidref, > > +CAMLprim value stub_xc_domain_create(value xch, value ssidref, > > value flags, value handle) > > { > > - CAMLparam4(xc_handle, ssidref, flags, handle); > > + CAMLparam4(xch, ssidref, flags, handle); > > > > uint32_t domid = 0; > > xen_domain_handle_t h = { 0 }; > > int result; > > int i; > > - int c_xc_handle = _H(xc_handle); > > uint32_t c_ssidref = Int32_val(ssidref); > > unsigned int c_flags = 0; > > value l; > > @@ -167,7 +162,7 @@ CAMLprim value stub_xc_domain_create(val > > } > > > > // caml_enter_blocking_section(); > > - result = xc_domain_create(c_xc_handle, c_ssidref, h, c_flags, &domid); > > + result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid); > > // caml_leave_blocking_section(); > > > > if (result < 0) > > @@ -176,37 +171,23 @@ CAMLprim value stub_xc_domain_create(val > > CAMLreturn(Val_int(domid)); > > } > > > > -CAMLprim value stub_xc_domain_setvmxassist(value xc_handle, value domid, > > - value use_vmxassist) > > +CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid, > > + value max_vcpus) > > { > > - CAMLparam3(xc_handle, domid, use_vmxassist); > > + CAMLparam3(xch, domid, max_vcpus); > > int r; > > > > - r = xc_domain_setvmxassist(_H(xc_handle), _D(domid), > > - Bool_val(use_vmxassist)); > > + r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus)); > > if (r) > > failwith_xc(); > > > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_max_vcpus(value xc_handle, value domid, > > - value max_vcpus) > > + > > +value stub_xc_domain_sethandle(value xch, value domid, value handle) > > { > > - CAMLparam3(xc_handle, domid, max_vcpus); > > - int r; > > - > > - r = xc_domain_max_vcpus(_H(xc_handle), _D(domid), Int_val(max_vcpus)); > > - if (r) > > - failwith_xc(); > > - > > - CAMLreturn(Val_unit); > > -} > > - > > - > > -value stub_xc_domain_sethandle(value xc_handle, value domid, value handle) > > -{ > > - CAMLparam3(xc_handle, domid, handle); > > + CAMLparam3(xch, domid, handle); > > xen_domain_handle_t h = { 0 }; > > int i; > > > > @@ -217,55 +198,63 @@ value stub_xc_domain_sethandle(value xc_ > > h[i] = Int_val(Field(handle, i)) & 0xff; > > } > > > > - i = xc_domain_sethandle(_H(xc_handle), _D(domid), h); > > + i = xc_domain_sethandle(_H(xch), _D(domid), h); > > if (i) > > failwith_xc(); > > > > CAMLreturn(Val_unit); > > } > > > > -static value dom_op(value xc_handle, value domid, int (*fn)(int, uint32_t)) > > +static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t)) > > { > > - CAMLparam2(xc_handle, domid); > > + CAMLparam2(xch, domid); > > > > - int c_xc_handle = _H(xc_handle); > > uint32_t c_domid = _D(domid); > > > > // caml_enter_blocking_section(); > > - int result = fn(c_xc_handle, c_domid); > > + int result = fn(_H(xch), c_domid); > > // caml_leave_blocking_section(); > > if (result) > > failwith_xc(); > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_pause(value xc_handle, value domid) > > +CAMLprim value stub_xc_domain_pause(value xch, value domid) > > { > > - return dom_op(xc_handle, domid, xc_domain_pause); > > + return dom_op(xch, domid, xc_domain_pause); > > } > > > > > > -CAMLprim value stub_xc_domain_unpause(value xc_handle, value domid) > > +CAMLprim value stub_xc_domain_unpause(value xch, value domid) > > { > > - return dom_op(xc_handle, domid, xc_domain_unpause); > > + return dom_op(xch, domid, xc_domain_unpause); > > } > > > > -CAMLprim value stub_xc_domain_destroy(value xc_handle, value domid) > > +CAMLprim value stub_xc_domain_destroy(value xch, value domid) > > { > > - return dom_op(xc_handle, domid, xc_domain_destroy); > > + return dom_op(xch, domid, xc_domain_destroy); > > } > > > > -CAMLprim value stub_xc_domain_resume_fast(value xc_handle, value domid) > > +CAMLprim value stub_xc_domain_resume_fast(value xch, value domid) > > { > > - return dom_op(xc_handle, domid, xc_domain_resume_fast); > > + 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(); > > + CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_shutdown(value handle, value domid, value reason) > > +CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason) > > { > > - CAMLparam3(handle, domid, reason); > > + CAMLparam3(xch, domid, reason); > > int ret; > > > > - ret = xc_domain_shutdown(_H(handle), _D(domid), Int_val(reason)); > > + ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason)); > > if (ret < 0) > > failwith_xc(); > > > > @@ -307,12 +296,12 @@ static value alloc_domaininfo(xc_domaini > > CAMLreturn(result); > > } > > > > -CAMLprim value stub_xc_domain_getinfolist(value xc_handle, value first_domain, value nb) > > +CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb) > > { > > - CAMLparam3(xc_handle, first_domain, nb); > > + CAMLparam3(xch, first_domain, nb); > > CAMLlocal2(result, temp); > > xc_domaininfo_t * info; > > - int i, ret, toalloc, c_xc_handle, retval; > > + int i, ret, toalloc, retval; > > unsigned int c_max_domains; > > uint32_t c_first_domain; > > > > @@ -324,11 +313,10 @@ CAMLprim value stub_xc_domain_getinfolis > > > > result = temp = Val_emptylist; > > > > - c_xc_handle = _H(xc_handle); > > c_first_domain = _D(first_domain); > > c_max_domains = Int_val(nb); > > // caml_enter_blocking_section(); > > - retval = xc_domain_getinfolist(c_xc_handle, c_first_domain, > > + retval = xc_domain_getinfolist(_H(xch), c_first_domain, > > c_max_domains, info); > > // caml_leave_blocking_section(); > > > > @@ -349,33 +337,34 @@ CAMLprim value stub_xc_domain_getinfolis > > CAMLreturn(result); > > } > > > > -CAMLprim value stub_xc_domain_getinfo(value xc_handle, value domid) > > +CAMLprim value stub_xc_domain_getinfo(value xch, value domid) > > { > > - CAMLparam2(xc_handle, domid); > > + CAMLparam2(xch, domid); > > CAMLlocal1(result); > > xc_domaininfo_t info; > > int ret; > > > > - ret = xc_domain_getinfo(_H(xc_handle), _D(domid), &info); > > + ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info); > > if (ret != 0) > > + failwith_xc(); > > + if (info.domain != _D(domid)) > > failwith_xc(); > > > > result = alloc_domaininfo(&info); > > CAMLreturn(result); > > } > > > > -CAMLprim value stub_xc_vcpu_getinfo(value xc_handle, value domid, value vcpu) > > +CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu) > > { > > - CAMLparam3(xc_handle, domid, vcpu); > > + CAMLparam3(xch, domid, vcpu); > > CAMLlocal1(result); > > xc_vcpuinfo_t info; > > int retval; > > > > - int c_xc_handle = _H(xc_handle); > > uint32_t c_domid = _D(domid); > > uint32_t c_vcpu = Int_val(vcpu); > > // caml_enter_blocking_section(); > > - retval = xc_vcpu_getinfo(c_xc_handle, c_domid, > > + retval = xc_vcpu_getinfo(_H(xch), c_domid, > > c_vcpu, &info); > > // caml_leave_blocking_section(); > > if (retval < 0) > > @@ -391,15 +380,15 @@ CAMLprim value stub_xc_vcpu_getinfo(valu > > CAMLreturn(result); > > } > > > > -CAMLprim value stub_xc_vcpu_context_get(value xc_handle, value domid, > > +CAMLprim value stub_xc_vcpu_context_get(value xch, value domid, > > value cpu) > > { > > - CAMLparam3(xc_handle, domid, cpu); > > + CAMLparam3(xch, domid, cpu); > > CAMLlocal1(context); > > int ret; > > vcpu_guest_context_any_t ctxt; > > > > - ret = xc_vcpu_getcontext(_H(xc_handle), _D(domid), Int_val(cpu), &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)); > > @@ -407,59 +396,60 @@ CAMLprim value stub_xc_vcpu_context_get( > > CAMLreturn(context); > > } > > > > -CAMLprim value stub_xc_vcpu_setaffinity(value xc_handle, value domid, > > +CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid, > > value vcpu, value cpumap) > > { > > - CAMLparam4(xc_handle, domid, vcpu, cpumap); > > + CAMLparam4(xch, domid, vcpu, cpumap); > > uint64_t c_cpumap; > > int retval; > > > > c_cpumap = Int64_val(cpumap); > > - retval = xc_vcpu_setaffinity(_H(xc_handle), _D(domid), > > - Int_val(vcpu), c_cpumap); > > + retval = xc_vcpu_setaffinity(_H(xch), _D(domid), > > + Int_val(vcpu), > > + &c_cpumap, sizeof(c_cpumap)); > > if (retval < 0) > > failwith_xc(); > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_vcpu_getaffinity(value xc_handle, value domid, > > +CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid, > > value vcpu) > > { > > - CAMLparam3(xc_handle, domid, vcpu); > > + CAMLparam3(xch, domid, vcpu); > > CAMLlocal1(ret); > > uint64_t cpumap; > > int retval; > > > > - retval = xc_vcpu_getaffinity(_H(xc_handle), _D(domid), > > - Int_val(vcpu), &cpumap); > > + retval = xc_vcpu_getaffinity(_H(xch), _D(domid), > > + Int_val(vcpu), > > + &cpumap, sizeof(cpumap)); > > if (retval < 0) > > failwith_xc(); > > ret = caml_copy_int64(cpumap); > > CAMLreturn(ret); > > } > > > > -CAMLprim value stub_xc_sched_id(value xc_handle) > > +CAMLprim value stub_xc_sched_id(value xch) > > { > > - CAMLparam1(xc_handle); > > + CAMLparam1(xch); > > int sched_id; > > > > - if (xc_sched_id(_H(xc_handle), &sched_id)) > > + if (xc_sched_id(_H(xch), &sched_id)) > > failwith_xc(); > > CAMLreturn(Val_int(sched_id)); > > } > > > > -CAMLprim value stub_xc_evtchn_alloc_unbound(value xc_handle, > > +CAMLprim value stub_xc_evtchn_alloc_unbound(value xch, > > value local_domid, > > value remote_domid) > > { > > - CAMLparam3(xc_handle, local_domid, remote_domid); > > + CAMLparam3(xch, local_domid, remote_domid); > > > > - int c_xc_handle = _H(xc_handle); > > 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(c_xc_handle, c_local_domid, > > + int result = xc_evtchn_alloc_unbound(_H(xch), c_local_domid, > > c_remote_domid); > > // caml_leave_blocking_section(); > > > > @@ -483,16 +473,15 @@ CAMLprim value stub_xc_evtchn_reset(valu > > #define RING_SIZE 32768 > > static char ring[RING_SIZE]; > > > > -CAMLprim value stub_xc_readconsolering(value xc_handle) > > +CAMLprim value stub_xc_readconsolering(value xch) > > { > > unsigned int size = RING_SIZE; > > char *ring_ptr = ring; > > > > - CAMLparam1(xc_handle); > > - int c_xc_handle = _H(xc_handle); > > + CAMLparam1(xch); > > > > // caml_enter_blocking_section(); > > - int retval = xc_readconsolering(c_xc_handle, &ring_ptr, &size, 0); > > + int retval = xc_readconsolering(_H(xch), &ring_ptr, &size, 0, 0, NULL); > > // caml_leave_blocking_section(); > > > > if (retval) > > @@ -501,26 +490,26 @@ CAMLprim value stub_xc_readconsolering(v > > CAMLreturn(caml_copy_string(ring)); > > } > > > > -CAMLprim value stub_xc_send_debug_keys(value xc_handle, value keys) > > +CAMLprim value stub_xc_send_debug_keys(value xch, value keys) > > { > > - CAMLparam2(xc_handle, keys); > > + CAMLparam2(xch, keys); > > int r; > > > > - r = xc_send_debug_keys(_H(xc_handle), String_val(keys)); > > + r = xc_send_debug_keys(_H(xch), String_val(keys)); > > if (r) > > failwith_xc(); > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_physinfo(value xc_handle) > > +CAMLprim value stub_xc_physinfo(value xch) > > { > > - CAMLparam1(xc_handle); > > + CAMLparam1(xch); > > CAMLlocal3(physinfo, cap_list, tmp); > > xc_physinfo_t c_physinfo; > > int r; > > > > // caml_enter_blocking_section(); > > - r = xc_physinfo(_H(xc_handle), &c_physinfo); > > + r = xc_physinfo(_H(xch), &c_physinfo); > > // caml_leave_blocking_section(); > > > > if (r) > > @@ -550,11 +539,11 @@ CAMLprim value stub_xc_physinfo(value xc > > CAMLreturn(physinfo); > > } > > > > -CAMLprim value stub_xc_pcpu_info(value xc_handle, value nr_cpus) > > +CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus) > > { > > - CAMLparam2(xc_handle, nr_cpus); > > + CAMLparam2(xch, nr_cpus); > > CAMLlocal2(pcpus, v); > > - xen_sysctl_cpuinfo_t *info; > > + xc_cpuinfo_t *info; > > int r, size; > > > > if (Int_val(nr_cpus) < 1) > > @@ -565,7 +554,7 @@ CAMLprim value stub_xc_pcpu_info(value x > > caml_raise_out_of_memory(); > > > > // caml_enter_blocking_section(); > > - r = xc_pcpu_info(_H(xc_handle), Int_val(nr_cpus), info, &size); > > + r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size); > > // caml_leave_blocking_section(); > > > > if (r) { > > @@ -586,16 +575,15 @@ CAMLprim value stub_xc_pcpu_info(value x > > CAMLreturn(pcpus); > > } > > > > -CAMLprim value stub_xc_domain_setmaxmem(value xc_handle, value domid, > > +CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid, > > value max_memkb) > > { > > - CAMLparam3(xc_handle, domid, max_memkb); > > + CAMLparam3(xch, domid, max_memkb); > > > > - int c_xc_handle = _H(xc_handle); > > uint32_t c_domid = _D(domid); > > unsigned int c_max_memkb = Int64_val(max_memkb); > > // caml_enter_blocking_section(); > > - int retval = xc_domain_setmaxmem(c_xc_handle, c_domid, > > + int retval = xc_domain_setmaxmem(_H(xch), c_domid, > > c_max_memkb); > > // caml_leave_blocking_section(); > > if (retval) > > @@ -603,33 +591,32 @@ CAMLprim value stub_xc_domain_setmaxmem( > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_set_memmap_limit(value xc_handle, value domid, > > +CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid, > > value map_limitkb) > > { > > - CAMLparam3(xc_handle, domid, map_limitkb); > > + CAMLparam3(xch, domid, map_limitkb); > > unsigned long v; > > int retval; > > > > v = Int64_val(map_limitkb); > > - retval = xc_domain_set_memmap_limit(_H(xc_handle), _D(domid), v); > > + retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v); > > if (retval) > > failwith_xc(); > > > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_memory_increase_reservation(value xc_handle, > > +CAMLprim value stub_xc_domain_memory_increase_reservation(value xch, > > value domid, > > value mem_kb) > > { > > - CAMLparam3(xc_handle, domid, mem_kb); > > + CAMLparam3(xch, domid, mem_kb); > > > > unsigned long nr_extents = ((unsigned long)(Int64_val(mem_kb))) >> (PAGE_SHIFT - 10); > > > > - int c_xc_handle = _H(xc_handle); > > uint32_t c_domid = _D(domid); > > // caml_enter_blocking_section(); > > - int retval = xc_domain_memory_increase_reservation(c_xc_handle, c_domid, > > + int retval = xc_domain_memory_increase_reservation(_H(xch), c_domid, > > nr_extents, 0, 0, NULL); > > // caml_leave_blocking_section(); > > > > @@ -638,49 +625,48 @@ CAMLprim value stub_xc_domain_memory_inc > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_set_machine_address_size(value xc_handle, > > +CAMLprim value stub_xc_domain_set_machine_address_size(value xch, > > value domid, > > value width) > > { > > - CAMLparam3(xc_handle, domid, width); > > - int c_xc_handle = _H(xc_handle); > > + CAMLparam3(xch, domid, width); > > uint32_t c_domid = _D(domid); > > int c_width = Int_val(width); > > > > - int retval = xc_domain_set_machine_address_size(c_xc_handle, c_domid, c_width); > > + int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width); > > if (retval) > > failwith_xc(); > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_get_machine_address_size(value xc_handle, > > +CAMLprim value stub_xc_domain_get_machine_address_size(value xch, > > value domid) > > { > > - CAMLparam2(xc_handle, domid); > > + CAMLparam2(xch, domid); > > int retval; > > > > - retval = xc_domain_get_machine_address_size(_H(xc_handle), _D(domid)); > > + retval = xc_domain_get_machine_address_size(_H(xch), _D(domid)); > > if (retval < 0) > > failwith_xc(); > > CAMLreturn(Val_int(retval)); > > } > > > > -CAMLprim value stub_xc_domain_cpuid_set(value xc_handle, value domid, > > - value is_hvm, value input, > > +CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid, > > + value input, > > value config) > > { > > - CAMLparam5(xc_handle, domid, is_hvm, input, config); > > + CAMLparam4(xch, domid, input, config); > > CAMLlocal2(array, tmp); > > int r; > > + unsigned int c_input[2]; > > char *c_config[4], *out_config[4]; > > - uint32_t c_input, c_oinput; > > > > 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, c_oinput, input); > > + cpuid_input_of_val(c_input[0], c_input[1], input); > > > > array = caml_alloc(4, 0); > > for (r = 0; r < 4; r++) { > > @@ -695,29 +681,30 @@ CAMLprim value stub_xc_domain_cpuid_set( > > for (r = 0; r < 4; r++) > > out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL; > > > > - r = xc_domain_cpuid_set(_H(xc_handle), _D(domid), Bool_val(is_hvm), > > - c_input, c_oinput, c_config, out_config); > > + r = xc_cpuid_set(_H(xch), _D(domid), > > + c_input, (const char **)c_config, out_config); > > if (r < 0) > > failwith_xc(); > > CAMLreturn(array); > > } > > > > -CAMLprim value stub_xc_domain_cpuid_apply(value xc_handle, value domid, value is_hvm) > > +CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid) > > { > > - CAMLparam3(xc_handle, domid, is_hvm); > > + CAMLparam2(xch, domid); > > int r; > > - r = xc_domain_cpuid_apply(_H(xc_handle), _D(domid), Bool_val(is_hvm)); > > + > > + r = xc_cpuid_apply_policy(_H(xch), _D(domid)); > > if (r < 0) > > failwith_xc(); > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_cpuid_check(value input, value config) > > +CAMLprim value stub_xc_cpuid_check(value xch, value input, value config) > > { > > - CAMLparam2(input, config); > > + CAMLparam3(xch, input, config); > > CAMLlocal3(ret, array, tmp); > > int r; > > - uint32_t c_input, c_oinput; > > + unsigned int c_input[2]; > > char *c_config[4], *out_config[4]; > > > > c_config[0] = string_of_option_array(config, 0); > > @@ -725,7 +712,7 @@ CAMLprim value stub_xc_cpuid_check(value > > c_config[2] = string_of_option_array(config, 2); > > c_config[3] = string_of_option_array(config, 3); > > > > - cpuid_input_of_val(c_input, c_oinput, input); > > + cpuid_input_of_val(c_input[0], c_input[1], input); > > > > array = caml_alloc(4, 0); > > for (r = 0; r < 4; r++) { > > @@ -740,7 +727,7 @@ CAMLprim value stub_xc_cpuid_check(value > > for (r = 0; r < 4; r++) > > out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL; > > > > - r = xc_cpuid_check(c_input, c_oinput, c_config, out_config); > > + r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config); > > if (r < 0) > > failwith_xc(); > > > > @@ -751,18 +738,17 @@ CAMLprim value stub_xc_cpuid_check(value > > CAMLreturn(ret); > > } > > > > -CAMLprim value stub_xc_version_version(value xc_handle) > > +CAMLprim value stub_xc_version_version(value xch) > > { > > - CAMLparam1(xc_handle); > > + CAMLparam1(xch); > > CAMLlocal1(result); > > xen_extraversion_t extra; > > long packed; > > int retval; > > > > - int c_xc_handle = _H(xc_handle); > > // caml_enter_blocking_section(); > > - packed = xc_version(c_xc_handle, XENVER_version, NULL); > > - retval = xc_version(c_xc_handle, XENVER_extraversion, &extra); > > + packed = xc_version(_H(xch), XENVER_version, NULL); > > + retval = xc_version(_H(xch), XENVER_extraversion, &extra); > > // caml_leave_blocking_section(); > > > > if (retval) > > @@ -778,16 +764,15 @@ CAMLprim value stub_xc_version_version(v > > } > > > > > > -CAMLprim value stub_xc_version_compile_info(value xc_handle) > > +CAMLprim value stub_xc_version_compile_info(value xch) > > { > > - CAMLparam1(xc_handle); > > + CAMLparam1(xch); > > CAMLlocal1(result); > > xen_compile_info_t ci; > > int retval; > > > > - int c_xc_handle = _H(xc_handle); > > // caml_enter_blocking_section(); > > - retval = xc_version(c_xc_handle, XENVER_compile_info, &ci); > > + retval = xc_version(_H(xch), XENVER_compile_info, &ci); > > // caml_leave_blocking_section(); > > > > if (retval) > > @@ -804,14 +789,13 @@ CAMLprim value stub_xc_version_compile_i > > } > > > > > > -static value xc_version_single_string(value xc_handle, int code, void *info) > > +static value xc_version_single_string(value xch, int code, void *info) > > { > > - CAMLparam1(xc_handle); > > + CAMLparam1(xch); > > int retval; > > > > - int c_xc_handle = _H(xc_handle); > > // caml_enter_blocking_section(); > > - retval = xc_version(c_xc_handle, code, info); > > + retval = xc_version(_H(xch), code, info); > > // caml_leave_blocking_section(); > > > > if (retval) > > @@ -821,19 +805,19 @@ static value xc_version_single_string(va > > } > > > > > > -CAMLprim value stub_xc_version_changeset(value xc_handle) > > +CAMLprim value stub_xc_version_changeset(value xch) > > { > > xen_changeset_info_t ci; > > > > - return xc_version_single_string(xc_handle, XENVER_changeset, &ci); > > + return xc_version_single_string(xch, XENVER_changeset, &ci); > > } > > > > > > -CAMLprim value stub_xc_version_capabilities(value xc_handle) > > +CAMLprim value stub_xc_version_capabilities(value xch) > > { > > xen_capabilities_info_t ci; > > > > - return xc_version_single_string(xc_handle, XENVER_capabilities, &ci); > > + return xc_version_single_string(xch, XENVER_capabilities, &ci); > > } > > > > > > @@ -845,13 +829,12 @@ CAMLprim value stub_pages_to_kib(value p > > } > > > > > > -CAMLprim value stub_map_foreign_range(value xc_handle, value dom, > > +CAMLprim value stub_map_foreign_range(value xch, value dom, > > value size, value mfn) > > { > > - CAMLparam4(xc_handle, dom, size, mfn); > > + CAMLparam4(xch, dom, size, mfn); > > CAMLlocal1(result); > > struct mmap_interface *intf; > > - int c_xc_handle; > > uint32_t c_dom; > > unsigned long c_mfn; > > > > @@ -860,11 +843,10 @@ CAMLprim value stub_map_foreign_range(va > > > > intf->len = Int_val(size); > > > > - c_xc_handle = _H(xc_handle); > > c_dom = _D(dom); > > c_mfn = Nativeint_val(mfn); > > // caml_enter_blocking_section(); > > - intf->addr = xc_map_foreign_range(c_xc_handle, c_dom, > > + intf->addr = xc_map_foreign_range(_H(xch), c_dom, > > intf->len, PROT_READ|PROT_WRITE, > > c_mfn); > > // caml_leave_blocking_section(); > > @@ -873,15 +855,15 @@ CAMLprim value stub_map_foreign_range(va > > CAMLreturn(result); > > } > > > > -CAMLprim value stub_sched_credit_domain_get(value xc_handle, value domid) > > +CAMLprim value stub_sched_credit_domain_get(value xch, value domid) > > { > > - CAMLparam2(xc_handle, 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(xc_handle), _D(domid), &c_sdom); > > + ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom); > > // caml_leave_blocking_section(); > > if (ret != 0) > > failwith_xc(); > > @@ -893,17 +875,17 @@ CAMLprim value stub_sched_credit_domain_ > > CAMLreturn(sdom); > > } > > > > -CAMLprim value stub_sched_credit_domain_set(value xc_handle, value domid, > > +CAMLprim value stub_sched_credit_domain_set(value xch, value domid, > > value sdom) > > { > > - CAMLparam3(xc_handle, domid, 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(xc_handle), _D(domid), &c_sdom); > > + ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom); > > // caml_leave_blocking_section(); > > if (ret != 0) > > failwith_xc(); > > @@ -911,15 +893,17 @@ CAMLprim value stub_sched_credit_domain_ > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_shadow_allocation_get(value xc_handle, value domid) > > +CAMLprim value stub_shadow_allocation_get(value xch, value domid) > > { > > - CAMLparam2(xc_handle, domid); > > + CAMLparam2(xch, domid); > > CAMLlocal1(mb); > > - uint32_t c_mb; > > + unsigned long c_mb; > > int ret; > > > > // caml_enter_blocking_section(); > > - ret = xc_shadow_allocation_get(_H(xc_handle), _D(domid), &c_mb); > > + 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(); > > @@ -928,16 +912,18 @@ CAMLprim value stub_shadow_allocation_ge > > CAMLreturn(mb); > > } > > > > -CAMLprim value stub_shadow_allocation_set(value xc_handle, value domid, > > +CAMLprim value stub_shadow_allocation_set(value xch, value domid, > > value mb) > > { > > - CAMLparam3(xc_handle, domid, mb); > > - uint32_t c_mb; > > + CAMLparam3(xch, domid, mb); > > + unsigned long c_mb; > > int ret; > > > > c_mb = Int_val(mb); > > // caml_enter_blocking_section(); > > - ret = xc_shadow_allocation_set(_H(xc_handle), _D(domid), c_mb); > > + 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(); > > @@ -945,10 +931,10 @@ CAMLprim value stub_shadow_allocation_se > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_get_pfn_list(value xc_handle, value domid, > > +CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid, > > value nr_pfns) > > { > > - CAMLparam3(xc_handle, domid, nr_pfns); > > + CAMLparam3(xch, domid, nr_pfns); > > CAMLlocal2(array, v); > > unsigned long c_nr_pfns; > > long ret, i; > > @@ -960,8 +946,8 @@ CAMLprim value stub_xc_domain_get_pfn_li > > if (!c_array) > > caml_raise_out_of_memory(); > > > > - ret = xc_domain_get_pfn_list(_H(xc_handle), _D(domid), > > - c_array, c_nr_pfns); > > + ret = xc_get_pfn_list(_H(xch), _D(domid), > > + c_array, c_nr_pfns); > > if (ret < 0) { > > free(c_array); > > failwith_xc(); > > @@ -977,11 +963,11 @@ CAMLprim value stub_xc_domain_get_pfn_li > > CAMLreturn(array); > > } > > > > -CAMLprim value stub_xc_domain_ioport_permission(value xc_handle, value domid, > > +CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid, > > value start_port, value nr_ports, > > value allow) > > { > > - CAMLparam5(xc_handle, domid, start_port, nr_ports, allow); > > + CAMLparam5(xch, domid, start_port, nr_ports, allow); > > uint32_t c_start_port, c_nr_ports; > > uint8_t c_allow; > > int ret; > > @@ -990,7 +976,7 @@ CAMLprim value stub_xc_domain_ioport_per > > c_nr_ports = Int_val(nr_ports); > > c_allow = Bool_val(allow); > > > > - ret = xc_domain_ioport_permission(_H(xc_handle), _D(domid), > > + ret = xc_domain_ioport_permission(_H(xch), _D(domid), > > c_start_port, c_nr_ports, c_allow); > > if (ret < 0) > > failwith_xc(); > > @@ -998,11 +984,11 @@ CAMLprim value stub_xc_domain_ioport_per > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_iomem_permission(value xc_handle, value domid, > > +CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid, > > value start_pfn, value nr_pfns, > > value allow) > > { > > - CAMLparam5(xc_handle, domid, start_pfn, nr_pfns, allow); > > + CAMLparam5(xch, domid, start_pfn, nr_pfns, allow); > > unsigned long c_start_pfn, c_nr_pfns; > > uint8_t c_allow; > > int ret; > > @@ -1011,7 +997,7 @@ CAMLprim value stub_xc_domain_iomem_perm > > c_nr_pfns = Nativeint_val(nr_pfns); > > c_allow = Bool_val(allow); > > > > - ret = xc_domain_iomem_permission(_H(xc_handle), _D(domid), > > + ret = xc_domain_iomem_permission(_H(xch), _D(domid), > > c_start_pfn, c_nr_pfns, c_allow); > > if (ret < 0) > > failwith_xc(); > > @@ -1019,10 +1005,10 @@ CAMLprim value stub_xc_domain_iomem_perm > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_irq_permission(value xc_handle, value domid, > > +CAMLprim value stub_xc_domain_irq_permission(value xch, value domid, > > value pirq, value allow) > > { > > - CAMLparam4(xc_handle, domid, pirq, allow); > > + CAMLparam4(xch, domid, pirq, allow); > > uint8_t c_pirq; > > uint8_t c_allow; > > int ret; > > @@ -1030,7 +1016,7 @@ CAMLprim value stub_xc_domain_irq_permis > > c_pirq = Int_val(pirq); > > c_allow = Bool_val(allow); > > > > - ret = xc_domain_irq_permission(_H(xc_handle), _D(domid), > > + ret = xc_domain_irq_permission(_H(xch), _D(domid), > > c_pirq, c_allow); > > if (ret < 0) > > failwith_xc(); > > @@ -1038,97 +1024,68 @@ CAMLprim value stub_xc_domain_irq_permis > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_hvm_check_pvdriver(value xc_handle, value domid) > > +static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func) > > { > > - CAMLparam2(xc_handle, domid); > > - int ret; > > - > > - ret = xc_hvm_check_pvdriver(_H(xc_handle), _D(domid)); > > - if (ret < 0) > > - failwith_xc(); > > - CAMLreturn(Val_bool(ret)); > > + 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 xc_handle, value domid, value desc) > > +CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc) > > { > > - CAMLparam3(xc_handle, domid, 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_domain_test_assign_device(_H(xc_handle), _D(domid), > > - 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 xc_handle, value domid, value desc) > > +CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc) > > { > > - CAMLparam3(xc_handle, domid, 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_domain_assign_device(_H(xc_handle), _D(domid), > > - domain, bus, slot, func); > > + ret = xc_assign_device(_H(xch), _D(domid), bdf); > > + > > if (ret < 0) > > failwith_xc(); > > CAMLreturn(Val_unit); > > } > > > > -CAMLprim value stub_xc_domain_deassign_device(value xc_handle, value domid, value desc) > > +CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc) > > { > > - CAMLparam3(xc_handle, domid, 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_domain_deassign_device(_H(xc_handle), _D(domid), > > - domain, bus, slot, func); > > - if (ret < 0) > > - failwith_xc(); > > - CAMLreturn(Val_unit); > > -} > > + ret = xc_deassign_device(_H(xch), _D(domid), bdf); > > > > -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); > > @@ -1140,26 +1097,7 @@ CAMLprim value stub_xc_watchdog(value ha > > int ret; > > unsigned int c_timeout = Int32_val(timeout); > > > > - ret = xc_domain_watchdog(_H(handle), _D(domid), c_timeout); > > - if (ret < 0) > > - failwith_xc(); > > - > > - CAMLreturn(Val_int(ret)); > > -} > > - > > -CAMLprim value stub_xc_domain_send_s3resume(value handle, value domid) > > -{ > > - CAMLparam2(handle, domid); > > - xc_domain_send_s3resume(_H(handle), _D(domid)); > > - CAMLreturn(Val_unit); > > -} > > - > > -CAMLprim value stub_xc_domain_get_acpi_s_state(value handle, value domid) > > -{ > > - CAMLparam2(handle, domid); > > - int ret; > > - > > - ret = xc_domain_get_acpi_s_state(_H(handle), _D(domid)); > > + ret = xc_watchdog(_H(handle), _D(domid), c_timeout); > > if (ret < 0) > > failwith_xc(); > > > > diff -r 8a710e0eb088 -r c2610f86abfb tools/ocaml/xenstored/Makefile > > --- a/tools/ocaml/xenstored/Makefile Fri Sep 10 11:10:00 2010 +0100 > > +++ b/tools/ocaml/xenstored/Makefile Fri Sep 10 11:10:02 2010 +0100 > > @@ -39,7 +39,8 @@ XENSTOREDLIBS = \ > > -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/xb $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \ > > + -ccopt -L -ccopt $(XEN_ROOT)/tools/libxc > > > > PROGRAMS = oxenstored > > > > > > _______________________________________________ > > Xen-devel mailing list > > Xen-devel@lists.xensource.com > > http://lists.xensource.com/xen-devel > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel