direct-io.hg

annotate tools/libxc/xenctrl.h @ 7223:c3d9b7013b14

EVTCHNOP_alloc_unbound can allocate a port in an arbitrary
domain (only if the caller is sufficiently privileged).

Signed-off-by: Keir Fraser <keir@xensource.com>
author kaf24@firebug.cl.cam.ac.uk
date Wed Oct 05 19:14:13 2005 +0100 (2005-10-05)
parents 540d17fe32ce
children 76a7a7aa27e4
rev   line source
mjw@1623 1 /******************************************************************************
cl349@6388 2 * xenctrl.h
mjw@1623 3 *
mjw@1623 4 * A library for low-level access to the Xen control interfaces.
mjw@1623 5 *
kaf24@2787 6 * Copyright (c) 2003-2004, K A Fraser.
mjw@1623 7 */
mjw@1623 8
cl349@6389 9 #ifndef XENCTRL_H
cl349@6389 10 #define XENCTRL_H
mjw@1623 11
kaf24@3266 12 #include <stdint.h>
iap10@3390 13
kaf24@3266 14 typedef uint8_t u8;
kaf24@3266 15 typedef uint16_t u16;
kaf24@3266 16 typedef uint32_t u32;
kaf24@3266 17 typedef uint64_t u64;
kaf24@3266 18 typedef int8_t s8;
kaf24@3266 19 typedef int16_t s16;
kaf24@3266 20 typedef int32_t s32;
kaf24@3266 21 typedef int64_t s64;
mjw@1623 22
kaf24@4719 23 #include <sys/ptrace.h>
kaf24@2821 24 #include <xen/xen.h>
kaf24@2821 25 #include <xen/dom0_ops.h>
vh249@6549 26 #include <xen/version.h>
kaf24@2821 27 #include <xen/event_channel.h>
kaf24@7196 28 #include <xen/sched.h>
kaf24@2821 29 #include <xen/sched_ctl.h>
kaf24@5541 30 #include <xen/acm.h>
kaf24@2787 31
kaf24@5914 32 #ifdef __ia64__
kaf24@5914 33 #define XC_PAGE_SHIFT 14
kaf24@5914 34 #else
kaf24@5914 35 #define XC_PAGE_SHIFT 12
kaf24@5914 36 #endif
kaf24@5914 37 #define XC_PAGE_SIZE (1UL << XC_PAGE_SHIFT)
kaf24@5914 38 #define XC_PAGE_MASK (~(XC_PAGE_SIZE-1))
kaf24@5914 39
kaf24@3961 40 /*
kaf24@3961 41 * DEFINITIONS FOR CPU BARRIERS
kaf24@3961 42 */
kaf24@3961 43
kaf24@3961 44 #if defined(__i386__)
kaf24@3966 45 #define mb() __asm__ __volatile__ ( "lock; addl $0,0(%%esp)" : : : "memory" )
kaf24@3966 46 #define rmb() __asm__ __volatile__ ( "lock; addl $0,0(%%esp)" : : : "memory" )
kaf24@3966 47 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
kaf24@3961 48 #elif defined(__x86_64__)
kaf24@3966 49 #define mb() __asm__ __volatile__ ( "mfence" : : : "memory")
kaf24@3966 50 #define rmb() __asm__ __volatile__ ( "lfence" : : : "memory")
kaf24@3966 51 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
kaf24@5914 52 #elif defined(__ia64__)
kaf24@5914 53 /* FIXME */
kaf24@5914 54 #define mb()
kaf24@5914 55 #define rmb()
kaf24@5914 56 #define wmb()
kaf24@3961 57 #else
kaf24@3961 58 #error "Define barriers"
kaf24@3961 59 #endif
kaf24@3961 60
kaf24@3961 61 /*
iap10@3443 62 * INITIALIZATION FUNCTIONS
kaf24@3961 63 */
iap10@3443 64
iap10@3443 65 /**
iap10@3443 66 * This function opens a handle to the hypervisor interface. This function can
iap10@3443 67 * be called multiple times within a single process. Multiple processes can
iap10@3443 68 * have an open hypervisor interface at the same time.
iap10@3443 69 *
iap10@3443 70 * Each call to this function should have a corresponding call to
iap10@3443 71 * xc_interface_close().
iap10@3443 72 *
iap10@3443 73 * This function can fail if the caller does not have superuser permission or
iap10@3443 74 * if a Xen-enabled kernel is not currently running.
iap10@3443 75 *
iap10@3443 76 * @return a handle to the hypervisor interface or -1 on failure
iap10@3443 77 */
mjw@1623 78 int xc_interface_open(void);
iap10@3443 79
iap10@3443 80 /**
iap10@3443 81 * This function closes an open hypervisor interface.
iap10@3443 82 *
iap10@3443 83 * This function can fail if the handle does not represent an open interface or
iap10@3443 84 * if there were problems closing the interface.
iap10@3443 85 *
iap10@3443 86 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 87 * @return 0 on success, -1 otherwise.
iap10@3443 88 */
mjw@1623 89 int xc_interface_close(int xc_handle);
mjw@1623 90
kaf24@3961 91 /*
kaf24@4719 92 * DOMAIN DEBUGGING FUNCTIONS
kaf24@4719 93 */
kaf24@4719 94
kaf24@4719 95 typedef struct xc_core_header {
kaf24@4719 96 unsigned int xch_magic;
kaf24@4719 97 unsigned int xch_nr_vcpus;
kaf24@4719 98 unsigned int xch_nr_pages;
kaf24@4719 99 unsigned int xch_ctxt_offset;
kaf24@4719 100 unsigned int xch_index_offset;
kaf24@4719 101 unsigned int xch_pages_offset;
kaf24@4719 102 } xc_core_header_t;
kaf24@4719 103
kaf24@4719 104
kaf24@6941 105 long xc_ptrace(
kaf24@6941 106 int xc_handle,
kaf24@6941 107 enum __ptrace_request request,
kaf24@6941 108 u32 domid,
kaf24@6941 109 long addr,
kaf24@6941 110 long data);
kaf24@4719 111
kaf24@6941 112 long xc_ptrace_core(
kaf24@6941 113 int xc_handle,
kaf24@6941 114 enum __ptrace_request request,
kaf24@6941 115 u32 domid,
kaf24@6941 116 long addr,
kaf24@6941 117 long data);
kaf24@4719 118
kaf24@6941 119 int xc_waitdomain(
kaf24@6941 120 int xc_handle,
kaf24@6941 121 int domain,
kaf24@6941 122 int *status,
kaf24@6941 123 int options);
kaf24@4719 124
kaf24@6941 125 int xc_waitdomain_core(
kaf24@6941 126 int xc_handle,
kaf24@6941 127 int domain,
kaf24@6941 128 int *status,
kaf24@6941 129 int options);
kaf24@4719 130
kaf24@4719 131 /*
iap10@3443 132 * DOMAIN MANAGEMENT FUNCTIONS
kaf24@3961 133 */
iap10@3443 134
mjw@1623 135 typedef struct {
mjw@1623 136 u32 domid;
smh22@5514 137 u32 ssidref;
mjw@1623 138 unsigned int dying:1, crashed:1, shutdown:1,
mjw@1623 139 paused:1, blocked:1, running:1;
mjw@1623 140 unsigned int shutdown_reason; /* only meaningful if shutdown==1 */
mjw@1623 141 unsigned long nr_pages;
mjw@1623 142 unsigned long shared_info_frame;
mjw@1623 143 u64 cpu_time;
mjw@1623 144 unsigned long max_memkb;
cl349@4853 145 unsigned int vcpus;
cl349@4847 146 s32 vcpu_to_cpu[MAX_VIRT_CPUS];
cl349@4845 147 cpumap_t cpumap[MAX_VIRT_CPUS];
mjw@1623 148 } xc_dominfo_t;
mjw@1623 149
kaf24@2787 150 typedef dom0_getdomaininfo_t xc_domaininfo_t;
mjw@1623 151 int xc_domain_create(int xc_handle,
smh22@5514 152 u32 ssidref,
mjw@1623 153 u32 *pdomid);
iap10@3443 154
kaf24@4719 155
kaf24@4719 156 int xc_domain_dumpcore(int xc_handle,
cl349@4853 157 u32 domid,
cl349@4853 158 const char *corename);
kaf24@4719 159
kaf24@4719 160
iap10@3443 161 /**
iap10@3443 162 * This function pauses a domain. A paused domain still exists in memory
iap10@3443 163 * however it does not receive any timeslices from the hypervisor.
iap10@3443 164 *
iap10@3443 165 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 166 * @parm domid the domain id to pause
iap10@3443 167 * @return 0 on success, -1 on failure.
iap10@3443 168 */
mjw@1623 169 int xc_domain_pause(int xc_handle,
mjw@1623 170 u32 domid);
iap10@3443 171 /**
iap10@3443 172 * This function unpauses a domain. The domain should have been previously
iap10@3443 173 * paused.
iap10@3443 174 *
iap10@3443 175 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 176 * @parm domid the domain id to unpause
iap10@3443 177 * return 0 on success, -1 on failure
iap10@3443 178 */
mjw@1623 179 int xc_domain_unpause(int xc_handle,
mjw@1623 180 u32 domid);
iap10@3443 181
iap10@3443 182 /**
iap10@3443 183 * This function will destroy a domain. Destroying a domain removes the domain
iap10@3443 184 * completely from memory. This function should be called after sending the
iap10@3443 185 * domain a SHUTDOWN control message to free up the domain resources.
iap10@3443 186 *
iap10@3443 187 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 188 * @parm domid the domain id to destroy
iap10@3443 189 * @return 0 on success, -1 on failure
iap10@3443 190 */
mjw@1623 191 int xc_domain_destroy(int xc_handle,
mjw@1623 192 u32 domid);
mjw@1623 193 int xc_domain_pincpu(int xc_handle,
mjw@1623 194 u32 domid,
cl349@4845 195 int vcpu,
cl349@4845 196 cpumap_t *cpumap);
iap10@3443 197 /**
dsteklof@5498 198 * This function will return information about one or more domains. It is
dsteklof@5498 199 * designed to iterate over the list of domains. If a single domain is
dsteklof@5498 200 * requested, this function will return the next domain in the list - if
dsteklof@5498 201 * one exists. It is, therefore, important in this case to make sure the
dsteklof@5498 202 * domain requested was the one returned.
iap10@3443 203 *
iap10@3443 204 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 205 * @parm first_domid the first domain to enumerate information from. Domains
iap10@3443 206 * are currently enumerate in order of creation.
iap10@3443 207 * @parm max_doms the number of elements in info
iap10@3443 208 * @parm info an array of max_doms size that will contain the information for
iap10@3443 209 * the enumerated domains.
iap10@3443 210 * @return the number of domains enumerated or -1 on error
iap10@3443 211 */
mjw@1623 212 int xc_domain_getinfo(int xc_handle,
mjw@1623 213 u32 first_domid,
mjw@1623 214 unsigned int max_doms,
mjw@1623 215 xc_dominfo_t *info);
iap10@3443 216
iap10@3443 217 /**
kaf24@5699 218 * This function will return information about one or more domains, using a
kaf24@5699 219 * single hypercall. The domain information will be stored into the supplied
kaf24@5699 220 * array of xc_domaininfo_t structures.
kaf24@5699 221 *
kaf24@5699 222 * @parm xc_handle a handle to an open hypervisor interface
kaf24@5699 223 * @parm first_domain the first domain to enumerate information from.
kaf24@5699 224 * Domains are currently enumerate in order of creation.
kaf24@5699 225 * @parm max_domains the number of elements in info
kaf24@5699 226 * @parm info an array of max_doms size that will contain the information for
kaf24@5699 227 * the enumerated domains.
kaf24@5699 228 * @return the number of domains enumerated or -1 on error
kaf24@5699 229 */
kaf24@5699 230 int xc_domain_getinfolist(int xc_handle,
kaf24@5699 231 u32 first_domain,
kaf24@5699 232 unsigned int max_domains,
kaf24@5699 233 xc_domaininfo_t *info);
kaf24@5699 234
kaf24@5699 235 /**
iap10@3443 236 * This function returns information about one domain. This information is
iap10@3443 237 * more detailed than the information from xc_domain_getinfo().
iap10@3443 238 *
iap10@3443 239 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 240 * @parm domid the domain to get information from
iap10@3443 241 * @parm info a pointer to an xc_domaininfo_t to store the domain information
iap10@3443 242 * @parm ctxt a pointer to a structure to store the execution context of the
iap10@3443 243 * domain
iap10@3443 244 * @return 0 on success, -1 on failure
iap10@3443 245 */
cl349@4849 246 int xc_domain_get_vcpu_context(int xc_handle,
cl349@4853 247 u32 domid,
cl349@4853 248 u32 vcpu,
cl349@4853 249 vcpu_guest_context_t *ctxt);
cl349@4849 250
gm281@2236 251 int xc_domain_setcpuweight(int xc_handle,
gm281@2236 252 u32 domid,
gm281@2236 253 float weight);
kaf24@2787 254 long long xc_domain_get_cpu_usage(int xc_handle,
mafetter@3435 255 domid_t domid,
mafetter@3435 256 int vcpu);
mjw@1623 257
kaf24@2787 258
kaf24@2787 259 typedef dom0_shadow_control_stats_t xc_shadow_control_stats_t;
mjw@1623 260 int xc_shadow_control(int xc_handle,
mjw@1623 261 u32 domid,
mjw@1623 262 unsigned int sop,
mjw@1623 263 unsigned long *dirty_bitmap,
mjw@1623 264 unsigned long pages,
mjw@1623 265 xc_shadow_control_stats_t *stats);
mjw@1623 266
mjw@1623 267 int xc_bvtsched_global_set(int xc_handle,
mjw@1623 268 unsigned long ctx_allow);
mjw@1623 269
mjw@1623 270 int xc_bvtsched_domain_set(int xc_handle,
mjw@1623 271 u32 domid,
gm281@2058 272 u32 mcuadv,
gm281@2058 273 int warpback,
gm281@2058 274 s32 warpvalue,
gm281@2058 275 long long warpl,
gm281@2058 276 long long warpu);
mjw@1623 277
mjw@1623 278 int xc_bvtsched_global_get(int xc_handle,
mjw@1623 279 unsigned long *ctx_allow);
mjw@1623 280
mjw@1623 281 int xc_bvtsched_domain_get(int xc_handle,
mjw@1623 282 u32 domid,
gm281@2058 283 u32 *mcuadv,
gm281@2058 284 int *warpback,
gm281@2058 285 s32 *warpvalue,
gm281@2058 286 long long *warpl,
gm281@2058 287 long long *warpu);
mjw@1623 288
sd386@3449 289 int xc_sedf_domain_set(int xc_handle,
sd386@3449 290 u32 domid,
sd386@3573 291 u64 period, u64 slice, u64 latency, u16 extratime, u16 weight);
sd386@3449 292
sd386@3449 293 int xc_sedf_domain_get(int xc_handle,
sd386@3449 294 u32 domid,
sd386@3573 295 u64* period, u64 *slice, u64 *latency, u16 *extratime, u16* weight);
sd386@3449 296
kaf24@2787 297 typedef evtchn_status_t xc_evtchn_status_t;
iap10@3443 298
kaf24@3961 299 /*
iap10@3443 300 * EVENT CHANNEL FUNCTIONS
kaf24@3961 301 */
iap10@3443 302
iap10@3443 303 /**
iap10@3443 304 * This function allocates an unbound port. Ports are named endpoints used for
iap10@3443 305 * interdomain communication. This function is most useful in opening a
iap10@3443 306 * well-known port within a domain to receive events on.
iap10@3443 307 *
iap10@3443 308 * @parm xc_handle a handle to an open hypervisor interface
kaf24@7223 309 * @parm remote_dom the ID of the domain who will later bind
kaf24@7223 310 * @parm dom the ID of the local domain (the 'allocatee')
iap10@3443 311 * @parm port a pointer to a port. This is an in/out parameter. If *port is
iap10@3443 312 * 0, then a new port will be assigned, if port is > 0 then that
iap10@3443 313 * port is allocated if the port is unallocated.
iap10@3443 314 * @return 0 on success, -1 on failure
iap10@3443 315 */
kaf24@2713 316 int xc_evtchn_alloc_unbound(int xc_handle,
kaf24@7223 317 u32 remote_dom,
kaf24@2713 318 u32 dom,
kaf24@2713 319 int *port);
iap10@3443 320
iap10@3443 321 /**
iap10@3443 322 * This function creates a pair of ports between two domains. A port can only
iap10@3443 323 * be bound once within a domain.
iap10@3443 324 *
iap10@3443 325 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 326 * @parm dom1 one of the two domains to connect. Can be DOMID_SELF.
iap10@3443 327 * @parm dom2 the other domain to connect. Can be DOMID_SELF.
iap10@3443 328 * @parm port1 an in/out parameter. If > 0, then try to connect *port. If
iap10@3443 329 * 0, then allocate a new port and store the port in *port.
iap10@3443 330 * @parm port2 the port connected on port2. This parameter behaves the same
iap10@3443 331 * way as port1.
iap10@3443 332 * @return 0 on success, -1 on error.
iap10@3443 333 */
mjw@1623 334 int xc_evtchn_bind_interdomain(int xc_handle,
iap10@3443 335 u32 dom1,
iap10@3443 336 u32 dom2,
mjw@1623 337 int *port1,
mjw@1623 338 int *port2);
mjw@1623 339 int xc_evtchn_bind_virq(int xc_handle,
mjw@1623 340 int virq,
mjw@1623 341 int *port);
iap10@3443 342
iap10@3443 343 /**
iap10@3443 344 * This function will close a single port on an event channel.
iap10@3443 345 *
iap10@3443 346 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 347 * @parm dom the domain that the port exists on. May be DOMID_SELF.
iap10@3443 348 * @parm port the port to close
iap10@3443 349 * @return 0 on success, -1 on error
iap10@3443 350 */
mjw@1623 351 int xc_evtchn_close(int xc_handle,
mjw@1623 352 u32 dom, /* may be DOMID_SELF */
mjw@1623 353 int port);
iap10@3443 354
iap10@3443 355 /**
iap10@3443 356 * This function generates a notify event on a bound port.
iap10@3443 357 *
iap10@3443 358 * Notifies can be read within Linux by opening /dev/xen/evtchn and reading
iap10@3443 359 * a 16 bit value. The result will be the port the event occurred on. When
iap10@3443 360 * events occur, the port is masked until the 16 bit port value is written back
iap10@3443 361 * to the file. When /dev/xen/evtchn is opened, it has to be bound via an
iap10@3443 362 * ioctl to each port to listen on. The ioctl for binding is _IO('E', 2). The
iap10@3443 363 * parameter is the port to listen on.
iap10@3443 364 *
iap10@3443 365 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 366 * @parm local_port the port to generate the notify on
iap10@3443 367 * @return 0 on success, -1 on error
iap10@3443 368 */
mjw@1623 369 int xc_evtchn_send(int xc_handle,
mjw@1623 370 int local_port);
mjw@1623 371 int xc_evtchn_status(int xc_handle,
mjw@1623 372 u32 dom, /* may be DOMID_SELF */
mjw@1623 373 int port,
mjw@1623 374 xc_evtchn_status_t *status);
mjw@1623 375
mjw@1623 376 int xc_physdev_pci_access_modify(int xc_handle,
mjw@1623 377 u32 domid,
mjw@1623 378 int bus,
mjw@1623 379 int dev,
mjw@1623 380 int func,
mjw@1623 381 int enable);
mjw@1623 382
mjw@1623 383 int xc_readconsolering(int xc_handle,
kaf24@5327 384 char **pbuffer,
kaf24@5327 385 unsigned int *pnr_chars,
mjw@1623 386 int clear);
mjw@1623 387
kaf24@2787 388 typedef dom0_physinfo_t xc_physinfo_t;
mjw@1623 389 int xc_physinfo(int xc_handle,
mjw@1623 390 xc_physinfo_t *info);
mjw@1623 391
gm281@2236 392 int xc_sched_id(int xc_handle,
gm281@2236 393 int *sched_id);
gm281@2236 394
mjw@1623 395 int xc_domain_setmaxmem(int xc_handle,
kaf24@3231 396 u32 domid,
kaf24@3231 397 unsigned int max_memkb);
mjw@1623 398
cl349@5045 399 int xc_domain_memory_increase_reservation(int xc_handle,
cl349@5045 400 u32 domid,
iap10@6688 401 unsigned long nr_extents,
iap10@6682 402 unsigned int extent_order,
iap10@6688 403 unsigned int address_bits,
iap10@6688 404 unsigned long *extent_start);
iap10@6688 405
iap10@6688 406 int xc_domain_memory_decrease_reservation(int xc_handle,
iap10@6688 407 u32 domid,
iap10@6688 408 unsigned long nr_extents,
iap10@6688 409 unsigned int extent_order,
iap10@6688 410 unsigned long *extent_start);
iap10@6688 411
iap10@6688 412 unsigned long xc_make_page_below_4G(int xc_handle, u32 domid,
iap10@6688 413 unsigned long mfn);
cl349@5045 414
kaf24@3231 415 typedef dom0_perfc_desc_t xc_perfc_desc_t;
kaf24@3231 416 /* IMPORTANT: The caller is responsible for mlock()'ing the @desc array. */
kaf24@3231 417 int xc_perfc_control(int xc_handle,
kaf24@3231 418 u32 op,
kaf24@3231 419 xc_perfc_desc_t *desc);
mjw@1623 420
rneugeba@3963 421 /* read/write msr */
rneugeba@3963 422 long long xc_msr_read(int xc_handle, int cpu_mask, int msr);
rneugeba@3963 423 int xc_msr_write(int xc_handle, int cpu_mask, int msr, unsigned int low,
rneugeba@3963 424 unsigned int high);
rneugeba@3963 425
iap10@3443 426 /**
iap10@3443 427 * Memory maps a range within one domain to a local address range. Mappings
iap10@3443 428 * should be unmapped with munmap and should follow the same rules as mmap
rusty@4866 429 * regarding page alignment. Returns NULL on failure.
iap10@3443 430 *
iap10@3443 431 * In Linux, the ring queue for the control channel is accessible by mapping
iap10@3443 432 * the shared_info_frame (from xc_domain_getinfo()) + 2048. The structure
iap10@3443 433 * stored there is of type control_if_t.
iap10@3443 434 *
iap10@3443 435 * @parm xc_handle a handle on an open hypervisor interface
iap10@3443 436 * @parm dom the domain to map memory from
iap10@3443 437 * @parm size the amount of memory to map (in multiples of page size)
iap10@3443 438 * @parm prot same flag as in mmap().
iap10@3443 439 * @parm mfn the frame address to map.
iap10@3443 440 */
iap10@2325 441 void *xc_map_foreign_range(int xc_handle, u32 dom,
iap10@2325 442 int size, int prot,
iap10@2325 443 unsigned long mfn );
iap10@2325 444
iap10@2325 445 void *xc_map_foreign_batch(int xc_handle, u32 dom, int prot,
iap10@2325 446 unsigned long *arr, int num );
iap10@2325 447
iap10@3390 448 int xc_get_pfn_list(int xc_handle, u32 domid, unsigned long *pfn_buf,
cl349@4853 449 unsigned long max_pfns);
iap10@3390 450
kaf24@5914 451 int xc_ia64_get_pfn_list(int xc_handle, u32 domid, unsigned long *pfn_buf,
kaf24@5914 452 unsigned int start_page, unsigned int nr_pages);
kaf24@5914 453
djm@6856 454 long xc_get_max_pages(int xc_handle, u32 domid);
djm@6856 455
cl349@6389 456 int xc_mmuext_op(int xc_handle, struct mmuext_op *op, unsigned int nr_ops,
cl349@6389 457 domid_t dom);
cl349@6389 458
kaf24@6468 459 int xc_memory_op(int xc_handle, int cmd, void *arg);
cl349@6389 460
cl349@6389 461 int xc_get_pfn_type_batch(int xc_handle, u32 dom, int num, unsigned long *arr);
cl349@6389 462
cl349@6389 463
cwc22@3985 464 /*\
cwc22@3985 465 * GRANT TABLE FUNCTIONS
cwc22@3985 466 \*/
cwc22@3985 467
cwc22@3985 468 /**
cwc22@3985 469 * This function opens a handle to the more restricted grant table hypervisor
cwc22@3985 470 * interface. This may be used where the standard interface is not
cwc22@3985 471 * available because the domain is not privileged.
cwc22@3985 472 * This function can be called multiple times within a single process.
cwc22@3985 473 * Multiple processes can have an open hypervisor interface at the same time.
cwc22@3985 474 *
cwc22@3985 475 * Each call to this function should have a corresponding call to
cwc22@3985 476 * xc_grant_interface_close().
cwc22@3985 477 *
cwc22@3985 478 * This function can fail if a Xen-enabled kernel is not currently running.
cwc22@3985 479 *
cwc22@3985 480 * @return a handle to the hypervisor grant table interface or -1 on failure
cwc22@3985 481 */
cwc22@3985 482 int xc_grant_interface_open(void);
cwc22@3985 483
cwc22@3985 484 /**
cwc22@3985 485 * This function closes an open grant table hypervisor interface.
cwc22@3985 486 *
cwc22@3985 487 * This function can fail if the handle does not represent an open interface or
cwc22@3985 488 * if there were problems closing the interface.
cwc22@3985 489 *
cwc22@3985 490 * @parm xc_handle a handle to an open grant table hypervisor interface
cwc22@3985 491 * @return 0 on success, -1 otherwise.
cwc22@3985 492 */
cwc22@3985 493 int xc_grant_interface_close(int xc_handle);
cwc22@3985 494
kaf24@6281 495 int xc_gnttab_map_grant_ref(int xc_handle,
kaf24@6281 496 u64 host_virt_addr,
kaf24@6281 497 u32 dom,
kaf24@6281 498 u16 ref,
kaf24@6281 499 u16 flags,
kaf24@6281 500 s16 *handle,
kaf24@6281 501 u64 *dev_bus_addr);
cwc22@3985 502
kaf24@6281 503 int xc_gnttab_unmap_grant_ref(int xc_handle,
kaf24@6281 504 u64 host_virt_addr,
kaf24@6281 505 u64 dev_bus_addr,
kaf24@6281 506 u16 handle,
kaf24@6281 507 s16 *status);
cwc22@3985 508
cwc22@3985 509 int xc_gnttab_setup_table(int xc_handle,
cwc22@3985 510 u32 dom,
cwc22@3985 511 u16 nr_frames,
cwc22@3985 512 s16 *status,
kaf24@6281 513 unsigned long **frame_list);
cwc22@3985 514
cwc22@3985 515 /* Grant debug builds only: */
cwc22@3985 516 int xc_gnttab_dump_table(int xc_handle,
cwc22@3985 517 u32 dom,
cwc22@3985 518 s16 *status);
cwc22@3985 519
kaf24@5318 520 /* Get current total pages allocated to a domain. */
kaf24@5318 521 long xc_get_tot_pages(int xc_handle, u32 domid);
kaf24@5318 522
kaf24@5318 523 /* Execute a privileged dom0 operation. */
kaf24@5318 524 int xc_dom0_op(int xc_handle, dom0_op_t *op);
cwc22@3985 525
vh249@6549 526 int xc_version(int xc_handle, int cmd, void *arg);
vh249@6549 527
cl349@5748 528 /* Initializes the store (for dom0)
cl349@5748 529 remote_port should be the remote end of a bound interdomain channel between
cl349@5748 530 the store and dom0.
cl349@5748 531
cl349@5748 532 This function returns a shared frame that should be passed to
cl349@5748 533 xs_introduce_domain
cl349@5748 534 */
cl349@5748 535 long xc_init_store(int xc_handle, int remote_port);
cl349@5748 536
cl349@6389 537 /*
cl349@6389 538 * MMU updates.
cl349@6389 539 */
cl349@6389 540 #define MAX_MMU_UPDATES 1024
cl349@6389 541 struct xc_mmu {
cl349@6389 542 mmu_update_t updates[MAX_MMU_UPDATES];
cl349@6389 543 int idx;
cl349@6389 544 domid_t subject;
cl349@6389 545 };
cl349@6389 546 typedef struct xc_mmu xc_mmu_t;
cl349@6389 547 xc_mmu_t *xc_init_mmu_updates(int xc_handle, domid_t dom);
cl349@6389 548 int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
iap10@6680 549 unsigned long long ptr, unsigned long long val);
cl349@6389 550 int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu);
cl349@6389 551
cl349@6389 552 #endif