[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] 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@xxxxxxxxxx> > # 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@xxxxxxxxxx> > Cc: Vincent Hanquez <Vincent.Hanquez@xxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxx> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU Lesser General Public License as published > - * by the Free Software Foundation; version 2.1 only. with the special > - * exception on linking described in file LICENSE. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU Lesser General Public License for more details. > - */ > - > -#include <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@xxxxxxxxxxxxx> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU Lesser General Public License as published > - * by the Free Software Foundation; version 2.1 only. with the special > - * exception on linking described in file LICENSE. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU Lesser General Public License for more details. > - */ > - > -#include <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@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |