direct-io.hg

annotate tools/libxc/xenctrl.h @ 12504:f555a90bcc37

[HVM] Reworked interrupt distribution logic.

TODO:
1. Fix IO-APIC ID to not conflict with LAPIC IDS.
2. Fix i8259 device model (seems to work already though!).
3. Add INTSRC overrides in MPBIOS and ACPI tables so
that PCI legacy IRQ routing always ends up at an
IO-APIC input with level trigger. Restricting link
routing to {5,6,10,11} and setting overrides for all
four of those would work.

Signed-off-by: Keir Fraser <keir@xensource.com>
author kfraser@localhost.localdomain
date Tue Nov 21 19:22:25 2006 +0000 (2006-11-21)
parents 58f28e00001e
children 2ae4e4e89d6d
rev   line source
mjw@1623 1 /******************************************************************************
cl349@6388 2 * xenctrl.h
kaf24@9660 3 *
mjw@1623 4 * A library for low-level access to the Xen control interfaces.
kaf24@9660 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@11393 12 /* Tell the Xen public headers we are a user-space tools build. */
kaf24@11393 13 #ifndef __XEN_TOOLS__
kaf24@11393 14 #define __XEN_TOOLS__ 1
kaf24@11393 15 #endif
kaf24@11393 16
kaf24@9999 17 #include <stddef.h>
kaf24@3266 18 #include <stdint.h>
kaf24@2821 19 #include <xen/xen.h>
kfraser@11257 20 #include <xen/domctl.h>
kfraser@11257 21 #include <xen/sysctl.h>
vh249@6549 22 #include <xen/version.h>
kaf24@2821 23 #include <xen/event_channel.h>
kaf24@7196 24 #include <xen/sched.h>
smh22@7702 25 #include <xen/memory.h>
kaf24@5541 26 #include <xen/acm.h>
kaf24@9907 27 #include <xen/acm_ops.h>
kaf24@2787 28
kaf24@5914 29 #ifdef __ia64__
kaf24@5914 30 #define XC_PAGE_SHIFT 14
kaf24@5914 31 #else
kaf24@5914 32 #define XC_PAGE_SHIFT 12
kaf24@5914 33 #endif
kaf24@5914 34 #define XC_PAGE_SIZE (1UL << XC_PAGE_SHIFT)
kaf24@5914 35 #define XC_PAGE_MASK (~(XC_PAGE_SIZE-1))
kaf24@5914 36
kaf24@3961 37 /*
kaf24@3961 38 * DEFINITIONS FOR CPU BARRIERS
kaf24@9660 39 */
kaf24@3961 40
kaf24@3961 41 #if defined(__i386__)
kaf24@3966 42 #define mb() __asm__ __volatile__ ( "lock; addl $0,0(%%esp)" : : : "memory" )
kaf24@3966 43 #define rmb() __asm__ __volatile__ ( "lock; addl $0,0(%%esp)" : : : "memory" )
kaf24@3966 44 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
kaf24@3961 45 #elif defined(__x86_64__)
kaf24@3966 46 #define mb() __asm__ __volatile__ ( "mfence" : : : "memory")
kaf24@3966 47 #define rmb() __asm__ __volatile__ ( "lfence" : : : "memory")
kaf24@3966 48 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
kaf24@5914 49 #elif defined(__ia64__)
kfraser@12271 50 #define mb() __asm__ __volatile__ ("mf" ::: "memory")
kfraser@12271 51 #define rmb() __asm__ __volatile__ ("mf" ::: "memory")
kfraser@12271 52 #define wmb() __asm__ __volatile__ ("mf" ::: "memory")
kaf24@10687 53 #elif defined(__powerpc__)
kaf24@10687 54 /* XXX loosen these up later */
kaf24@10687 55 #define mb() __asm__ __volatile__ ("sync" : : : "memory")
kaf24@10687 56 #define rmb() __asm__ __volatile__ ("sync" : : : "memory") /* lwsync? */
kaf24@10687 57 #define wmb() __asm__ __volatile__ ("sync" : : : "memory") /* eieio? */
kaf24@3961 58 #else
kaf24@3961 59 #error "Define barriers"
kaf24@3961 60 #endif
kaf24@3961 61
kaf24@3961 62 /*
iap10@3443 63 * INITIALIZATION FUNCTIONS
kaf24@9660 64 */
iap10@3443 65
iap10@3443 66 /**
iap10@3443 67 * This function opens a handle to the hypervisor interface. This function can
iap10@3443 68 * be called multiple times within a single process. Multiple processes can
iap10@3443 69 * have an open hypervisor interface at the same time.
iap10@3443 70 *
iap10@3443 71 * Each call to this function should have a corresponding call to
iap10@3443 72 * xc_interface_close().
iap10@3443 73 *
iap10@3443 74 * This function can fail if the caller does not have superuser permission or
iap10@3443 75 * if a Xen-enabled kernel is not currently running.
iap10@3443 76 *
iap10@3443 77 * @return a handle to the hypervisor interface or -1 on failure
iap10@3443 78 */
mjw@1623 79 int xc_interface_open(void);
iap10@3443 80
iap10@3443 81 /**
iap10@3443 82 * This function closes an open hypervisor interface.
iap10@3443 83 *
iap10@3443 84 * This function can fail if the handle does not represent an open interface or
iap10@3443 85 * if there were problems closing the interface.
iap10@3443 86 *
iap10@3443 87 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 88 * @return 0 on success, -1 otherwise.
iap10@3443 89 */
mjw@1623 90 int xc_interface_close(int xc_handle);
mjw@1623 91
kaf24@3961 92 /*
kfraser@11672 93 * KERNEL INTERFACES
kfraser@11672 94 */
kfraser@11672 95
kfraser@11672 96 /*
kfraser@11672 97 * Resolve a kernel device name (e.g., "evtchn", "blktap0") into a kernel
kfraser@11672 98 * device number. Returns -1 on error (and sets errno).
kfraser@11672 99 */
kfraser@11672 100 int xc_find_device_number(const char *name);
kfraser@11672 101
kfraser@11672 102 /*
kaf24@4719 103 * DOMAIN DEBUGGING FUNCTIONS
kaf24@4719 104 */
kaf24@4719 105
kaf24@4719 106 typedef struct xc_core_header {
kaf24@4719 107 unsigned int xch_magic;
kaf24@4719 108 unsigned int xch_nr_vcpus;
kaf24@4719 109 unsigned int xch_nr_pages;
kaf24@4719 110 unsigned int xch_ctxt_offset;
kaf24@4719 111 unsigned int xch_index_offset;
kaf24@4719 112 unsigned int xch_pages_offset;
kaf24@4719 113 } xc_core_header_t;
kaf24@4719 114
kfraser@12224 115 #define XC_CORE_MAGIC 0xF00FEBED
kfraser@12224 116 #define XC_CORE_MAGIC_HVM 0xF00FEBEE
kaf24@4719 117
kfraser@11791 118 #ifdef __linux__
kfraser@11791 119
kfraser@11791 120 #include <sys/ptrace.h>
kfraser@11791 121 #include <thread_db.h>
kfraser@11791 122
kfraser@11774 123 typedef void (*thr_ev_handler_t)(long);
kfraser@11774 124
kfraser@11774 125 void xc_register_event_handler(
kfraser@11774 126 thr_ev_handler_t h,
kfraser@11774 127 td_event_e e);
kfraser@11774 128
kfraser@11774 129 long xc_ptrace(
kfraser@11774 130 int xc_handle,
kfraser@11774 131 enum __ptrace_request request,
kfraser@11774 132 uint32_t domid,
kfraser@11774 133 long addr,
kfraser@11774 134 long data);
kfraser@11774 135
kfraser@11774 136 int xc_waitdomain(
kfraser@11774 137 int xc_handle,
kfraser@11774 138 int domain,
kfraser@11774 139 int *status,
kfraser@11774 140 int options);
kfraser@11774 141
kfraser@11774 142 #endif /* __linux__ */
kaf24@4719 143
kaf24@4719 144 /*
iap10@3443 145 * DOMAIN MANAGEMENT FUNCTIONS
kaf24@3961 146 */
iap10@3443 147
kfraser@12224 148 typedef struct xc_dominfo {
kaf24@7378 149 uint32_t domid;
kaf24@7378 150 uint32_t ssidref;
kaf24@9660 151 unsigned int dying:1, crashed:1, shutdown:1,
kfraser@12224 152 paused:1, blocked:1, running:1,
kfraser@12224 153 hvm:1;
mjw@1623 154 unsigned int shutdown_reason; /* only meaningful if shutdown==1 */
mjw@1623 155 unsigned long nr_pages;
mjw@1623 156 unsigned long shared_info_frame;
kaf24@7378 157 uint64_t cpu_time;
mjw@1623 158 unsigned long max_memkb;
kaf24@7397 159 unsigned int nr_online_vcpus;
kaf24@7397 160 unsigned int max_vcpu_id;
kaf24@7378 161 xen_domain_handle_t handle;
mjw@1623 162 } xc_dominfo_t;
mjw@1623 163
kfraser@11257 164 typedef xen_domctl_getdomaininfo_t xc_domaininfo_t;
kaf24@9660 165 int xc_domain_create(int xc_handle,
kaf24@7339 166 uint32_t ssidref,
kaf24@7378 167 xen_domain_handle_t handle,
kfraser@12196 168 uint32_t flags,
kaf24@7339 169 uint32_t *pdomid);
iap10@3443 170
kaf24@4719 171
kaf24@9221 172 /* Functions to produce a dump of a given domain
kaf24@9221 173 * xc_domain_dumpcore - produces a dump to a specified file
kaf24@9221 174 * xc_domain_dumpcore_via_callback - produces a dump, using a specified
kaf24@9221 175 * callback function
kaf24@9221 176 */
kaf24@9660 177 int xc_domain_dumpcore(int xc_handle,
kaf24@7339 178 uint32_t domid,
cl349@4853 179 const char *corename);
kaf24@4719 180
kaf24@9221 181 /* Define the callback function type for xc_domain_dumpcore_via_callback.
kaf24@9221 182 *
kaf24@9221 183 * This function is called by the coredump code for every "write",
kaf24@9221 184 * and passes an opaque object for the use of the function and
kaf24@9221 185 * created by the caller of xc_domain_dumpcore_via_callback.
kaf24@9221 186 */
kaf24@9221 187 typedef int (dumpcore_rtn_t)(void *arg, char *buffer, unsigned int length);
kaf24@9221 188
kaf24@9660 189 int xc_domain_dumpcore_via_callback(int xc_handle,
kaf24@9221 190 uint32_t domid,
kaf24@9221 191 void *arg,
kaf24@9221 192 dumpcore_rtn_t dump_rtn);
kaf24@9221 193
kaf24@7354 194 /*
kaf24@7566 195 * This function sets the maximum number of vcpus that a domain may create.
kaf24@7354 196 *
kaf24@7354 197 * @parm xc_handle a handle to an open hypervisor interface.
kaf24@7354 198 * @parm domid the domain id in which vcpus are to be created.
kaf24@7354 199 * @parm max the maximum number of vcpus that the domain may create.
kaf24@7354 200 * @return 0 on success, -1 on failure.
kaf24@7354 201 */
kaf24@7354 202 int xc_domain_max_vcpus(int xc_handle,
kaf24@9660 203 uint32_t domid,
kaf24@7354 204 unsigned int max);
kaf24@4719 205
iap10@3443 206 /**
iap10@3443 207 * This function pauses a domain. A paused domain still exists in memory
iap10@3443 208 * however it does not receive any timeslices from the hypervisor.
iap10@3443 209 *
iap10@3443 210 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 211 * @parm domid the domain id to pause
iap10@3443 212 * @return 0 on success, -1 on failure.
iap10@3443 213 */
kaf24@9660 214 int xc_domain_pause(int xc_handle,
kaf24@7339 215 uint32_t domid);
iap10@3443 216 /**
iap10@3443 217 * This function unpauses a domain. The domain should have been previously
iap10@3443 218 * paused.
iap10@3443 219 *
iap10@3443 220 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 221 * @parm domid the domain id to unpause
iap10@3443 222 * return 0 on success, -1 on failure
iap10@3443 223 */
kaf24@9660 224 int xc_domain_unpause(int xc_handle,
kaf24@7339 225 uint32_t domid);
iap10@3443 226
iap10@3443 227 /**
iap10@3443 228 * This function will destroy a domain. Destroying a domain removes the domain
iap10@3443 229 * completely from memory. This function should be called after sending the
iap10@3443 230 * domain a SHUTDOWN control message to free up the domain resources.
iap10@3443 231 *
iap10@3443 232 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 233 * @parm domid the domain id to destroy
iap10@3443 234 * @return 0 on success, -1 on failure
iap10@3443 235 */
kaf24@9660 236 int xc_domain_destroy(int xc_handle,
kaf24@7339 237 uint32_t domid);
kaf24@8500 238
kaf24@9560 239 /**
kaf24@9560 240 * This function will shutdown a domain. This is intended for use in
kaf24@9560 241 * fully-virtualized domains where this operation is analogous to the
kaf24@9560 242 * sched_op operations in a paravirtualized domain. The caller is
kaf24@9560 243 * expected to give the reason for the shutdown.
kaf24@9560 244 *
kaf24@9560 245 * @parm xc_handle a handle to an open hypervisor interface
kaf24@9560 246 * @parm domid the domain id to destroy
kaf24@9560 247 * @parm reason is the reason (SHUTDOWN_xxx) for the shutdown
kaf24@9560 248 * @return 0 on success, -1 on failure
kaf24@9560 249 */
kaf24@9660 250 int xc_domain_shutdown(int xc_handle,
kaf24@9560 251 uint32_t domid,
kaf24@9560 252 int reason);
kaf24@9560 253
kaf24@8500 254 int xc_vcpu_setaffinity(int xc_handle,
kaf24@8500 255 uint32_t domid,
kaf24@8500 256 int vcpu,
kfraser@11257 257 uint64_t cpumap);
kfraser@11257 258 int xc_vcpu_getaffinity(int xc_handle,
kfraser@11257 259 uint32_t domid,
kfraser@11257 260 int vcpu,
kfraser@11257 261 uint64_t *cpumap);
kaf24@7378 262
iap10@3443 263 /**
dsteklof@5498 264 * This function will return information about one or more domains. It is
dsteklof@5498 265 * designed to iterate over the list of domains. If a single domain is
dsteklof@5498 266 * requested, this function will return the next domain in the list - if
dsteklof@5498 267 * one exists. It is, therefore, important in this case to make sure the
dsteklof@5498 268 * domain requested was the one returned.
iap10@3443 269 *
iap10@3443 270 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 271 * @parm first_domid the first domain to enumerate information from. Domains
iap10@3443 272 * are currently enumerate in order of creation.
iap10@3443 273 * @parm max_doms the number of elements in info
iap10@3443 274 * @parm info an array of max_doms size that will contain the information for
iap10@3443 275 * the enumerated domains.
iap10@3443 276 * @return the number of domains enumerated or -1 on error
iap10@3443 277 */
mjw@1623 278 int xc_domain_getinfo(int xc_handle,
kaf24@9660 279 uint32_t first_domid,
mjw@1623 280 unsigned int max_doms,
mjw@1623 281 xc_dominfo_t *info);
iap10@3443 282
kaf24@8381 283
kaf24@8381 284 /**
kaf24@8500 285 * This function will set the execution context for the specified vcpu.
kaf24@8381 286 *
kaf24@8381 287 * @parm xc_handle a handle to an open hypervisor interface
kaf24@8381 288 * @parm domid the domain to set the vcpu context for
kaf24@8381 289 * @parm vcpu the vcpu number for the context
kaf24@8381 290 * @parm ctxt pointer to the the cpu context with the values to set
kaf24@8381 291 * @return the number of domains enumerated or -1 on error
kaf24@8381 292 */
kaf24@8500 293 int xc_vcpu_setcontext(int xc_handle,
kaf24@8500 294 uint32_t domid,
kaf24@8500 295 uint32_t vcpu,
kaf24@8500 296 vcpu_guest_context_t *ctxt);
iap10@3443 297 /**
kaf24@5699 298 * This function will return information about one or more domains, using a
kaf24@5699 299 * single hypercall. The domain information will be stored into the supplied
kaf24@5699 300 * array of xc_domaininfo_t structures.
kaf24@5699 301 *
kaf24@5699 302 * @parm xc_handle a handle to an open hypervisor interface
kaf24@5699 303 * @parm first_domain the first domain to enumerate information from.
kaf24@5699 304 * Domains are currently enumerate in order of creation.
kaf24@5699 305 * @parm max_domains the number of elements in info
kaf24@5699 306 * @parm info an array of max_doms size that will contain the information for
kaf24@5699 307 * the enumerated domains.
kaf24@5699 308 * @return the number of domains enumerated or -1 on error
kaf24@5699 309 */
kaf24@5699 310 int xc_domain_getinfolist(int xc_handle,
kaf24@7339 311 uint32_t first_domain,
kaf24@5699 312 unsigned int max_domains,
kaf24@5699 313 xc_domaininfo_t *info);
kaf24@5699 314
kaf24@5699 315 /**
emellor@7404 316 * This function returns information about the execution context of a
emellor@7404 317 * particular vcpu of a domain.
iap10@3443 318 *
iap10@3443 319 * @parm xc_handle a handle to an open hypervisor interface
iap10@3443 320 * @parm domid the domain to get information from
emellor@7404 321 * @parm vcpu the vcpu number
iap10@3443 322 * @parm ctxt a pointer to a structure to store the execution context of the
iap10@3443 323 * domain
iap10@3443 324 * @return 0 on success, -1 on failure
iap10@3443 325 */
kaf24@8500 326 int xc_vcpu_getcontext(int xc_handle,
kaf24@7339 327 uint32_t domid,
kaf24@7339 328 uint32_t vcpu,
cl349@4853 329 vcpu_guest_context_t *ctxt);
cl349@4849 330
kfraser@11257 331 typedef xen_domctl_getvcpuinfo_t xc_vcpuinfo_t;
kaf24@8500 332 int xc_vcpu_getinfo(int xc_handle,
kaf24@8500 333 uint32_t domid,
kaf24@8500 334 uint32_t vcpu,
kaf24@8500 335 xc_vcpuinfo_t *info);
kaf24@7397 336
gm281@2236 337 int xc_domain_setcpuweight(int xc_handle,
kaf24@7339 338 uint32_t domid,
gm281@2236 339 float weight);
kaf24@2787 340 long long xc_domain_get_cpu_usage(int xc_handle,
mafetter@3435 341 domid_t domid,
mafetter@3435 342 int vcpu);
mjw@1623 343
kaf24@9660 344 int xc_domain_sethandle(int xc_handle, uint32_t domid,
kaf24@7379 345 xen_domain_handle_t handle);
kaf24@2787 346
kfraser@11257 347 typedef xen_domctl_shadow_op_stats_t xc_shadow_op_stats_t;
mjw@1623 348 int xc_shadow_control(int xc_handle,
kaf24@9660 349 uint32_t domid,
mjw@1623 350 unsigned int sop,
mjw@1623 351 unsigned long *dirty_bitmap,
mjw@1623 352 unsigned long pages,
tdeegan@11151 353 unsigned long *mb,
tdeegan@11151 354 uint32_t mode,
kfraser@11257 355 xc_shadow_op_stats_t *stats);
mjw@1623 356
sd386@3449 357 int xc_sedf_domain_set(int xc_handle,
kaf24@7339 358 uint32_t domid,
kaf24@7339 359 uint64_t period, uint64_t slice,
kaf24@7339 360 uint64_t latency, uint16_t extratime,
kaf24@7339 361 uint16_t weight);
sd386@3449 362
sd386@3449 363 int xc_sedf_domain_get(int xc_handle,
kaf24@7339 364 uint32_t domid,
kaf24@7339 365 uint64_t* period, uint64_t *slice,
kaf24@7339 366 uint64_t *latency, uint16_t *extratime,
kaf24@7339 367 uint16_t *weight);
sd386@3449 368
kaf24@10174 369 int xc_sched_credit_domain_set(int xc_handle,
kaf24@10174 370 uint32_t domid,
kfraser@11257 371 struct xen_domctl_sched_credit *sdom);
ack@10168 372
kaf24@10174 373 int xc_sched_credit_domain_get(int xc_handle,
kaf24@10174 374 uint32_t domid,
kfraser@11257 375 struct xen_domctl_sched_credit *sdom);
ack@10168 376
kaf24@3961 377 /*
iap10@3443 378 * EVENT CHANNEL FUNCTIONS
kaf24@3961 379 */
iap10@3443 380
iap10@3443 381 /**
iap10@3443 382 * This function allocates an unbound port. Ports are named endpoints used for
iap10@3443 383 * interdomain communication. This function is most useful in opening a
iap10@3443 384 * well-known port within a domain to receive events on.
iap10@3443 385 *
iap10@3443 386 * @parm xc_handle a handle to an open hypervisor interface
kaf24@7223 387 * @parm dom the ID of the local domain (the 'allocatee')
kaf24@7237 388 * @parm remote_dom the ID of the domain who will later bind
kaf24@7237 389 * @return allocated port (in @dom) on success, -1 on failure
iap10@3443 390 */
kaf24@2713 391 int xc_evtchn_alloc_unbound(int xc_handle,
kaf24@7339 392 uint32_t dom,
kaf24@7339 393 uint32_t remote_dom);
iap10@3443 394
mjw@1623 395 int xc_physdev_pci_access_modify(int xc_handle,
kaf24@7339 396 uint32_t domid,
mjw@1623 397 int bus,
mjw@1623 398 int dev,
mjw@1623 399 int func,
mjw@1623 400 int enable);
mjw@1623 401
mjw@1623 402 int xc_readconsolering(int xc_handle,
kaf24@5327 403 char **pbuffer,
kaf24@9660 404 unsigned int *pnr_chars,
mjw@1623 405 int clear);
mjw@1623 406
kfraser@11257 407 typedef xen_sysctl_physinfo_t xc_physinfo_t;
mjw@1623 408 int xc_physinfo(int xc_handle,
mjw@1623 409 xc_physinfo_t *info);
mjw@1623 410
gm281@2236 411 int xc_sched_id(int xc_handle,
gm281@2236 412 int *sched_id);
gm281@2236 413
mjw@1623 414 int xc_domain_setmaxmem(int xc_handle,
kaf24@9660 415 uint32_t domid,
kaf24@3231 416 unsigned int max_memkb);
mjw@1623 417
kaf24@10474 418 int xc_domain_set_time_offset(int xc_handle,
kaf24@10474 419 uint32_t domid,
kaf24@10474 420 int32_t time_offset_seconds);
kaf24@10474 421
cl349@5045 422 int xc_domain_memory_increase_reservation(int xc_handle,
kaf24@9660 423 uint32_t domid,
iap10@6688 424 unsigned long nr_extents,
iap10@6682 425 unsigned int extent_order,
iap10@6688 426 unsigned int address_bits,
kaf24@10276 427 xen_pfn_t *extent_start);
iap10@6688 428
iap10@6688 429 int xc_domain_memory_decrease_reservation(int xc_handle,
kaf24@9660 430 uint32_t domid,
iap10@6688 431 unsigned long nr_extents,
iap10@6688 432 unsigned int extent_order,
kaf24@10276 433 xen_pfn_t *extent_start);
iap10@6688 434
kaf24@8856 435 int xc_domain_memory_populate_physmap(int xc_handle,
kaf24@8856 436 uint32_t domid,
kaf24@8856 437 unsigned long nr_extents,
kaf24@8856 438 unsigned int extent_order,
kaf24@8856 439 unsigned int address_bits,
kaf24@10276 440 xen_pfn_t *extent_start);
kaf24@8856 441
kaf24@8856 442 int xc_domain_translate_gpfn_list(int xc_handle,
kaf24@8856 443 uint32_t domid,
kaf24@8856 444 unsigned long nr_gpfns,
kaf24@10276 445 xen_pfn_t *gpfn_list,
kaf24@10276 446 xen_pfn_t *mfn_list);
kaf24@8856 447
kaf24@7624 448 int xc_domain_ioport_permission(int xc_handle,
kaf24@7624 449 uint32_t domid,
kaf24@8121 450 uint32_t first_port,
kaf24@8121 451 uint32_t nr_ports,
kaf24@8121 452 uint32_t allow_access);
kaf24@7624 453
kaf24@8460 454 int xc_domain_irq_permission(int xc_handle,
kaf24@8460 455 uint32_t domid,
kaf24@8460 456 uint8_t pirq,
kaf24@8460 457 uint8_t allow_access);
kaf24@8460 458
kaf24@8460 459 int xc_domain_iomem_permission(int xc_handle,
kaf24@8460 460 uint32_t domid,
kaf24@8736 461 unsigned long first_mfn,
kaf24@8736 462 unsigned long nr_mfns,
kaf24@8460 463 uint8_t allow_access);
kaf24@8460 464
kaf24@10266 465 unsigned long xc_make_page_below_4G(int xc_handle, uint32_t domid,
kaf24@10266 466 unsigned long mfn);
kaf24@10266 467
kfraser@11257 468 typedef xen_sysctl_perfc_desc_t xc_perfc_desc_t;
kfraser@11257 469 typedef xen_sysctl_perfc_val_t xc_perfc_val_t;
kaf24@10953 470 /* IMPORTANT: The caller is responsible for mlock()'ing the @desc and @val
kaf24@10953 471 arrays. */
kaf24@3231 472 int xc_perfc_control(int xc_handle,
kaf24@7339 473 uint32_t op,
kaf24@10953 474 xc_perfc_desc_t *desc,
kaf24@10953 475 xc_perfc_val_t *val,
kaf24@10953 476 int *nbr_desc,
kaf24@10953 477 int *nbr_val);
mjw@1623 478
iap10@3443 479 /**
iap10@3443 480 * Memory maps a range within one domain to a local address range. Mappings
iap10@3443 481 * should be unmapped with munmap and should follow the same rules as mmap
rusty@4866 482 * regarding page alignment. Returns NULL on failure.
iap10@3443 483 *
iap10@3443 484 * In Linux, the ring queue for the control channel is accessible by mapping
iap10@3443 485 * the shared_info_frame (from xc_domain_getinfo()) + 2048. The structure
iap10@3443 486 * stored there is of type control_if_t.
iap10@3443 487 *
iap10@3443 488 * @parm xc_handle a handle on an open hypervisor interface
iap10@3443 489 * @parm dom the domain to map memory from
iap10@3443 490 * @parm size the amount of memory to map (in multiples of page size)
iap10@3443 491 * @parm prot same flag as in mmap().
iap10@3443 492 * @parm mfn the frame address to map.
iap10@3443 493 */
kaf24@7339 494 void *xc_map_foreign_range(int xc_handle, uint32_t dom,
iap10@2325 495 int size, int prot,
iap10@2325 496 unsigned long mfn );
iap10@2325 497
kaf24@7339 498 void *xc_map_foreign_batch(int xc_handle, uint32_t dom, int prot,
kaf24@10276 499 xen_pfn_t *arr, int num );
iap10@2325 500
Ian@8435 501 /**
Ian@8435 502 * Translates a virtual address in the context of a given domain and
Ian@8435 503 * vcpu returning the machine page frame number of the associated
Ian@8435 504 * page.
Ian@8435 505 *
Ian@8435 506 * @parm xc_handle a handle on an open hypervisor interface
Ian@8435 507 * @parm dom the domain to perform the translation in
Ian@8435 508 * @parm vcpu the vcpu to perform the translation on
Ian@8435 509 * @parm virt the virtual address to translate
Ian@8435 510 */
Ian@8435 511 unsigned long xc_translate_foreign_address(int xc_handle, uint32_t dom,
kaf24@9221 512 int vcpu, unsigned long long virt);
Ian@8435 513
kaf24@10276 514 int xc_get_pfn_list(int xc_handle, uint32_t domid, xen_pfn_t *pfn_buf,
cl349@4853 515 unsigned long max_pfns);
iap10@3390 516
awilliam@12005 517 unsigned long xc_ia64_fpsr_default(void);
awilliam@12005 518
kaf24@7339 519 int xc_ia64_get_pfn_list(int xc_handle, uint32_t domid,
kaf24@10276 520 xen_pfn_t *pfn_buf,
kaf24@7339 521 unsigned int start_page, unsigned int nr_pages);
kaf24@5914 522
djm@7536 523 int xc_copy_to_domain_page(int xc_handle, uint32_t domid,
kaf24@9221 524 unsigned long dst_pfn, const char *src_page);
djm@7536 525
kaf24@7786 526 int xc_clear_domain_page(int xc_handle, uint32_t domid,
kaf24@7786 527 unsigned long dst_pfn);
kaf24@7786 528
kaf24@7339 529 long xc_get_max_pages(int xc_handle, uint32_t domid);
djm@6856 530
cl349@6389 531 int xc_mmuext_op(int xc_handle, struct mmuext_op *op, unsigned int nr_ops,
kaf24@9221 532 domid_t dom);
cl349@6389 533
kaf24@6468 534 int xc_memory_op(int xc_handle, int cmd, void *arg);
cl349@6389 535
kaf24@7339 536 int xc_get_pfn_type_batch(int xc_handle, uint32_t dom,
kaf24@7339 537 int num, unsigned long *arr);
cl349@6389 538
cl349@6389 539
kaf24@5318 540 /* Get current total pages allocated to a domain. */
kaf24@7339 541 long xc_get_tot_pages(int xc_handle, uint32_t domid);
kaf24@5318 542
kaf24@7566 543
kaf24@7566 544 /*
kaf24@7566 545 * Trace Buffer Operations
kaf24@7566 546 */
kaf24@7566 547
kaf24@7566 548 /**
kaf24@9996 549 * xc_tbuf_enable - enable tracing buffers
kaf24@7566 550 *
kaf24@7566 551 * @parm xc_handle a handle to an open hypervisor interface
kaf24@9996 552 * @parm cnt size of tracing buffers to create (in pages)
kaf24@9996 553 * @parm mfn location to store mfn of the trace buffers to
kaf24@9996 554 * @parm size location to store the size (in bytes) of a trace buffer to
kaf24@9996 555 *
kaf24@9996 556 * Gets the machine address of the trace pointer area and the size of the
kaf24@9996 557 * per CPU buffers.
kaf24@7566 558 */
kfraser@12485 559 int xc_tbuf_enable(int xc_handle, unsigned long pages,
kfraser@12485 560 unsigned long *mfn, unsigned long *size);
kaf24@9996 561
kaf24@9996 562 /*
kaf24@9996 563 * Disable tracing buffers.
kaf24@9996 564 */
kaf24@9996 565 int xc_tbuf_disable(int xc_handle);
kaf24@7566 566
kaf24@7566 567 /**
kaf24@7571 568 * This function sets the size of the trace buffers. Setting the size
kaf24@7571 569 * is currently a one-shot operation that may be performed either at boot
kaf24@7571 570 * time or via this interface, not both. The buffer size must be set before
kaf24@7571 571 * enabling tracing.
kaf24@7566 572 *
kaf24@7566 573 * @parm xc_handle a handle to an open hypervisor interface
kaf24@7566 574 * @parm size the size in pages per cpu for the trace buffers
kaf24@7566 575 * @return 0 on success, -1 on failure.
kaf24@7566 576 */
kaf24@9996 577 int xc_tbuf_set_size(int xc_handle, unsigned long size);
kaf24@7566 578
kaf24@7566 579 /**
kaf24@9660 580 * This function retrieves the current size of the trace buffers.
kaf24@7566 581 * Note that the size returned is in terms of bytes, not pages.
kaf24@7566 582
kaf24@7566 583 * @parm xc_handle a handle to an open hypervisor interface
kaf24@7566 584 * @parm size will contain the size in bytes for the trace buffers
kaf24@7566 585 * @return 0 on success, -1 on failure.
kaf24@7566 586 */
kaf24@9996 587 int xc_tbuf_get_size(int xc_handle, unsigned long *size);
kaf24@9907 588
kaf24@9907 589 int xc_tbuf_set_cpu_mask(int xc_handle, uint32_t mask);
kaf24@9907 590
kaf24@9907 591 int xc_tbuf_set_evt_mask(int xc_handle, uint32_t mask);
kaf24@7566 592
kfraser@11257 593 int xc_domctl(int xc_handle, struct xen_domctl *domctl);
kfraser@11257 594 int xc_sysctl(int xc_handle, struct xen_sysctl *sysctl);
cwc22@3985 595
vh249@6549 596 int xc_version(int xc_handle, int cmd, void *arg);
vh249@6549 597
cl349@6389 598 /*
cl349@6389 599 * MMU updates.
cl349@6389 600 */
cl349@6389 601 #define MAX_MMU_UPDATES 1024
cl349@6389 602 struct xc_mmu {
cl349@6389 603 mmu_update_t updates[MAX_MMU_UPDATES];
cl349@6389 604 int idx;
cl349@6389 605 domid_t subject;
cl349@6389 606 };
cl349@6389 607 typedef struct xc_mmu xc_mmu_t;
cl349@6389 608 xc_mmu_t *xc_init_mmu_updates(int xc_handle, domid_t dom);
kaf24@9660 609 int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
iap10@6680 610 unsigned long long ptr, unsigned long long val);
cl349@6389 611 int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu);
cl349@6389 612
kfraser@12485 613 int xc_acm_op(int xc_handle, int cmd, void *arg, unsigned long arg_size);
kaf24@9907 614
kaf24@10355 615 /*
kaf24@10355 616 * Return a handle to the event channel driver, or -1 on failure, in which case
kaf24@10355 617 * errno will be set appropriately.
kaf24@10355 618 */
kaf24@10355 619 int xc_evtchn_open(void);
kaf24@10355 620
kaf24@10355 621 /*
kaf24@10355 622 * Close a handle previously allocated with xc_evtchn_open().
kaf24@10355 623 */
kaf24@10355 624 int xc_evtchn_close(int xce_handle);
kaf24@10355 625
kaf24@10355 626 /*
kaf24@10355 627 * Return an fd that can be select()ed on for further calls to
kaf24@10355 628 * xc_evtchn_pending().
kaf24@10355 629 */
kaf24@10355 630 int xc_evtchn_fd(int xce_handle);
kaf24@10355 631
kaf24@10355 632 /*
kaf24@10355 633 * Notify the given event channel. Returns -1 on failure, in which case
kaf24@10355 634 * errno will be set appropriately.
kaf24@10355 635 */
kaf24@10355 636 int xc_evtchn_notify(int xce_handle, evtchn_port_t port);
kaf24@10355 637
kaf24@10355 638 /*
kaf24@10355 639 * Returns a new event port bound to the remote port for the given domain ID,
kaf24@10355 640 * or -1 on failure, in which case errno will be set appropriately.
kaf24@10355 641 */
kaf24@10355 642 evtchn_port_t xc_evtchn_bind_interdomain(int xce_handle, int domid,
kaf24@10355 643 evtchn_port_t remote_port);
kaf24@10355 644
kaf24@10355 645 /*
kaf24@10355 646 * Unbind the given event channel. Returns -1 on failure, in which case errno
kaf24@10355 647 * will be set appropriately.
kaf24@10355 648 */
kaf24@10355 649 int xc_evtchn_unbind(int xce_handle, evtchn_port_t port);
kaf24@10355 650
kaf24@10355 651 /*
kaf24@10355 652 * Bind an event channel to the given VIRQ. Returns the event channel bound to
kaf24@10355 653 * the VIRQ, or -1 on failure, in which case errno will be set appropriately.
kaf24@10355 654 */
kaf24@10355 655 evtchn_port_t xc_evtchn_bind_virq(int xce_handle, unsigned int virq);
kaf24@10355 656
kaf24@10355 657 /*
kaf24@10355 658 * Return the next event channel to become pending, or -1 on failure, in which
kaf24@10355 659 * case errno will be set appropriately.
kaf24@10355 660 */
kaf24@10355 661 evtchn_port_t xc_evtchn_pending(int xce_handle);
kaf24@10355 662
kaf24@10355 663 /*
kaf24@10355 664 * Unmask the given event channel. Returns -1 on failure, in which case errno
kaf24@10355 665 * will be set appropriately.
kaf24@10355 666 */
kaf24@10355 667 int xc_evtchn_unmask(int xce_handle, evtchn_port_t port);
kaf24@10355 668
kfraser@12504 669 int xc_hvm_set_pci_intx_level(
kfraser@12504 670 int xce_handle, domid_t dom,
kfraser@12504 671 uint8_t domain, uint8_t bus, uint8_t device, uint8_t intx,
kfraser@12504 672 unsigned int level);
kfraser@12504 673 int xc_hvm_set_isa_irq_level(
kfraser@12504 674 int xce_handle, domid_t dom,
kfraser@12504 675 uint8_t isa_irq,
kfraser@12504 676 unsigned int level);
kfraser@12504 677
kfraser@12504 678 int xc_hvm_set_pci_link_route(
kfraser@12504 679 int xce_handle, domid_t dom, uint8_t link, uint8_t isa_irq);
kfraser@12275 680
cl349@6389 681 #endif