direct-io.hg

view xen/include/public/xen.h @ 14287:38513d22d234

xen: Provide notification of console updates via VIRQ.

The readconsolering capabilities provide the opportunity to
provide console output to other clients (remote systems,
logging systems, etc). This patchs adds the ability to generate
a notification of a change in the console buffer.

Signed-off-by: Ben Thomas <ben@virtualiron.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
author kfraser@localhost.localdomain
date Thu Mar 08 15:21:10 2007 +0000 (2007-03-08)
parents 939d2b7d4a12
children 3cc79ef896a2
line source
1 /******************************************************************************
2 * xen.h
3 *
4 * Guest OS interface to Xen.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Copyright (c) 2004, K A Fraser
25 */
27 #ifndef __XEN_PUBLIC_XEN_H__
28 #define __XEN_PUBLIC_XEN_H__
30 #include "xen-compat.h"
32 #if defined(__i386__) || defined(__x86_64__)
33 #include "arch-x86/xen.h"
34 #elif defined(__ia64__)
35 #include "arch-ia64.h"
36 #elif defined(__powerpc__)
37 #include "arch-powerpc.h"
38 #else
39 #error "Unsupported architecture"
40 #endif
42 /*
43 * HYPERCALLS
44 */
46 #define __HYPERVISOR_set_trap_table 0
47 #define __HYPERVISOR_mmu_update 1
48 #define __HYPERVISOR_set_gdt 2
49 #define __HYPERVISOR_stack_switch 3
50 #define __HYPERVISOR_set_callbacks 4
51 #define __HYPERVISOR_fpu_taskswitch 5
52 #define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */
53 #define __HYPERVISOR_platform_op 7
54 #define __HYPERVISOR_set_debugreg 8
55 #define __HYPERVISOR_get_debugreg 9
56 #define __HYPERVISOR_update_descriptor 10
57 #define __HYPERVISOR_memory_op 12
58 #define __HYPERVISOR_multicall 13
59 #define __HYPERVISOR_update_va_mapping 14
60 #define __HYPERVISOR_set_timer_op 15
61 #define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202 */
62 #define __HYPERVISOR_xen_version 17
63 #define __HYPERVISOR_console_io 18
64 #define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */
65 #define __HYPERVISOR_grant_table_op 20
66 #define __HYPERVISOR_vm_assist 21
67 #define __HYPERVISOR_update_va_mapping_otherdomain 22
68 #define __HYPERVISOR_iret 23 /* x86 only */
69 #define __HYPERVISOR_vcpu_op 24
70 #define __HYPERVISOR_set_segment_base 25 /* x86/64 only */
71 #define __HYPERVISOR_mmuext_op 26
72 #define __HYPERVISOR_acm_op 27
73 #define __HYPERVISOR_nmi_op 28
74 #define __HYPERVISOR_sched_op 29
75 #define __HYPERVISOR_callback_op 30
76 #define __HYPERVISOR_xenoprof_op 31
77 #define __HYPERVISOR_event_channel_op 32
78 #define __HYPERVISOR_physdev_op 33
79 #define __HYPERVISOR_hvm_op 34
80 #define __HYPERVISOR_sysctl 35
81 #define __HYPERVISOR_domctl 36
82 #define __HYPERVISOR_kexec_op 37
84 /* Architecture-specific hypercall definitions. */
85 #define __HYPERVISOR_arch_0 48
86 #define __HYPERVISOR_arch_1 49
87 #define __HYPERVISOR_arch_2 50
88 #define __HYPERVISOR_arch_3 51
89 #define __HYPERVISOR_arch_4 52
90 #define __HYPERVISOR_arch_5 53
91 #define __HYPERVISOR_arch_6 54
92 #define __HYPERVISOR_arch_7 55
94 /*
95 * HYPERCALL COMPATIBILITY.
96 */
98 /* New sched_op hypercall introduced in 0x00030101. */
99 #if __XEN_INTERFACE_VERSION__ < 0x00030101
100 #undef __HYPERVISOR_sched_op
101 #define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat
102 #endif
104 /* New event-channel and physdev hypercalls introduced in 0x00030202. */
105 #if __XEN_INTERFACE_VERSION__ < 0x00030202
106 #undef __HYPERVISOR_event_channel_op
107 #define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat
108 #undef __HYPERVISOR_physdev_op
109 #define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat
110 #endif
112 /* New platform_op hypercall introduced in 0x00030204. */
113 #if __XEN_INTERFACE_VERSION__ < 0x00030204
114 #define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op
115 #endif
117 /*
118 * VIRTUAL INTERRUPTS
119 *
120 * Virtual interrupts that a guest OS may receive from Xen.
121 *
122 * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a
123 * global VIRQ. The former can be bound once per VCPU and cannot be re-bound.
124 * The latter can be allocated only once per guest: they must initially be
125 * allocated to VCPU0 but can subsequently be re-bound.
126 */
127 #define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout. */
128 #define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */
129 #define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */
130 #define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */
131 #define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */
132 #define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */
133 #define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */
134 #define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console */
136 /* Architecture-specific VIRQ definitions. */
137 #define VIRQ_ARCH_0 16
138 #define VIRQ_ARCH_1 17
139 #define VIRQ_ARCH_2 18
140 #define VIRQ_ARCH_3 19
141 #define VIRQ_ARCH_4 20
142 #define VIRQ_ARCH_5 21
143 #define VIRQ_ARCH_6 22
144 #define VIRQ_ARCH_7 23
146 #define NR_VIRQS 24
148 /*
149 * MMU-UPDATE REQUESTS
150 *
151 * HYPERVISOR_mmu_update() accepts a list of (ptr, val) pairs.
152 * A foreigndom (FD) can be specified (or DOMID_SELF for none).
153 * Where the FD has some effect, it is described below.
154 * ptr[1:0] specifies the appropriate MMU_* command.
155 *
156 * ptr[1:0] == MMU_NORMAL_PT_UPDATE:
157 * Updates an entry in a page table. If updating an L1 table, and the new
158 * table entry is valid/present, the mapped frame must belong to the FD, if
159 * an FD has been specified. If attempting to map an I/O page then the
160 * caller assumes the privilege of the FD.
161 * FD == DOMID_IO: Permit /only/ I/O mappings, at the priv level of the caller.
162 * FD == DOMID_XEN: Map restricted areas of Xen's heap space.
163 * ptr[:2] -- Machine address of the page-table entry to modify.
164 * val -- Value to write.
165 *
166 * ptr[1:0] == MMU_MACHPHYS_UPDATE:
167 * Updates an entry in the machine->pseudo-physical mapping table.
168 * ptr[:2] -- Machine address within the frame whose mapping to modify.
169 * The frame must belong to the FD, if one is specified.
170 * val -- Value to write into the mapping entry.
171 */
172 #define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr = val'. ptr is MA. */
173 #define MMU_MACHPHYS_UPDATE 1 /* ptr = MA of frame to modify entry for */
175 /*
176 * MMU EXTENDED OPERATIONS
177 *
178 * HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures.
179 * A foreigndom (FD) can be specified (or DOMID_SELF for none).
180 * Where the FD has some effect, it is described below.
181 *
182 * cmd: MMUEXT_(UN)PIN_*_TABLE
183 * mfn: Machine frame number to be (un)pinned as a p.t. page.
184 * The frame must belong to the FD, if one is specified.
185 *
186 * cmd: MMUEXT_NEW_BASEPTR
187 * mfn: Machine frame number of new page-table base to install in MMU.
188 *
189 * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only]
190 * mfn: Machine frame number of new page-table base to install in MMU
191 * when in user space.
192 *
193 * cmd: MMUEXT_TLB_FLUSH_LOCAL
194 * No additional arguments. Flushes local TLB.
195 *
196 * cmd: MMUEXT_INVLPG_LOCAL
197 * linear_addr: Linear address to be flushed from the local TLB.
198 *
199 * cmd: MMUEXT_TLB_FLUSH_MULTI
200 * vcpumask: Pointer to bitmap of VCPUs to be flushed.
201 *
202 * cmd: MMUEXT_INVLPG_MULTI
203 * linear_addr: Linear address to be flushed.
204 * vcpumask: Pointer to bitmap of VCPUs to be flushed.
205 *
206 * cmd: MMUEXT_TLB_FLUSH_ALL
207 * No additional arguments. Flushes all VCPUs' TLBs.
208 *
209 * cmd: MMUEXT_INVLPG_ALL
210 * linear_addr: Linear address to be flushed from all VCPUs' TLBs.
211 *
212 * cmd: MMUEXT_FLUSH_CACHE
213 * No additional arguments. Writes back and flushes cache contents.
214 *
215 * cmd: MMUEXT_SET_LDT
216 * linear_addr: Linear address of LDT base (NB. must be page-aligned).
217 * nr_ents: Number of entries in LDT.
218 */
219 #define MMUEXT_PIN_L1_TABLE 0
220 #define MMUEXT_PIN_L2_TABLE 1
221 #define MMUEXT_PIN_L3_TABLE 2
222 #define MMUEXT_PIN_L4_TABLE 3
223 #define MMUEXT_UNPIN_TABLE 4
224 #define MMUEXT_NEW_BASEPTR 5
225 #define MMUEXT_TLB_FLUSH_LOCAL 6
226 #define MMUEXT_INVLPG_LOCAL 7
227 #define MMUEXT_TLB_FLUSH_MULTI 8
228 #define MMUEXT_INVLPG_MULTI 9
229 #define MMUEXT_TLB_FLUSH_ALL 10
230 #define MMUEXT_INVLPG_ALL 11
231 #define MMUEXT_FLUSH_CACHE 12
232 #define MMUEXT_SET_LDT 13
233 #define MMUEXT_NEW_USER_BASEPTR 15
235 #ifndef __ASSEMBLY__
236 struct mmuext_op {
237 unsigned int cmd;
238 union {
239 /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR */
240 xen_pfn_t mfn;
241 /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */
242 unsigned long linear_addr;
243 } arg1;
244 union {
245 /* SET_LDT */
246 unsigned int nr_ents;
247 /* TLB_FLUSH_MULTI, INVLPG_MULTI */
248 XEN_GUEST_HANDLE_00030205(void) vcpumask;
249 } arg2;
250 };
251 typedef struct mmuext_op mmuext_op_t;
252 DEFINE_XEN_GUEST_HANDLE(mmuext_op_t);
253 #endif
255 /* These are passed as 'flags' to update_va_mapping. They can be ORed. */
256 /* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. */
257 /* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */
258 #define UVMF_NONE (0UL<<0) /* No flushing at all. */
259 #define UVMF_TLB_FLUSH (1UL<<0) /* Flush entire TLB(s). */
260 #define UVMF_INVLPG (2UL<<0) /* Flush only one entry. */
261 #define UVMF_FLUSHTYPE_MASK (3UL<<0)
262 #define UVMF_MULTI (0UL<<2) /* Flush subset of TLBs. */
263 #define UVMF_LOCAL (0UL<<2) /* Flush local TLB. */
264 #define UVMF_ALL (1UL<<2) /* Flush all TLBs. */
266 /*
267 * Commands to HYPERVISOR_console_io().
268 */
269 #define CONSOLEIO_write 0
270 #define CONSOLEIO_read 1
272 /*
273 * Commands to HYPERVISOR_vm_assist().
274 */
275 #define VMASST_CMD_enable 0
276 #define VMASST_CMD_disable 1
278 /* x86/32 guests: simulate full 4GB segment limits. */
279 #define VMASST_TYPE_4gb_segments 0
281 /* x86/32 guests: trap (vector 15) whenever above vmassist is used. */
282 #define VMASST_TYPE_4gb_segments_notify 1
284 /*
285 * x86 guests: support writes to bottom-level PTEs.
286 * NB1. Page-directory entries cannot be written.
287 * NB2. Guest must continue to remove all writable mappings of PTEs.
288 */
289 #define VMASST_TYPE_writable_pagetables 2
291 /* x86/PAE guests: support PDPTs above 4GB. */
292 #define VMASST_TYPE_pae_extended_cr3 3
294 #define MAX_VMASST_TYPE 3
296 #ifndef __ASSEMBLY__
298 typedef uint16_t domid_t;
300 /* Domain ids >= DOMID_FIRST_RESERVED cannot be used for ordinary domains. */
301 #define DOMID_FIRST_RESERVED (0x7FF0U)
303 /* DOMID_SELF is used in certain contexts to refer to oneself. */
304 #define DOMID_SELF (0x7FF0U)
306 /*
307 * DOMID_IO is used to restrict page-table updates to mapping I/O memory.
308 * Although no Foreign Domain need be specified to map I/O pages, DOMID_IO
309 * is useful to ensure that no mappings to the OS's own heap are accidentally
310 * installed. (e.g., in Linux this could cause havoc as reference counts
311 * aren't adjusted on the I/O-mapping code path).
312 * This only makes sense in MMUEXT_SET_FOREIGNDOM, but in that context can
313 * be specified by any calling domain.
314 */
315 #define DOMID_IO (0x7FF1U)
317 /*
318 * DOMID_XEN is used to allow privileged domains to map restricted parts of
319 * Xen's heap space (e.g., the machine_to_phys table).
320 * This only makes sense in MMUEXT_SET_FOREIGNDOM, and is only permitted if
321 * the caller is privileged.
322 */
323 #define DOMID_XEN (0x7FF2U)
325 /*
326 * Send an array of these to HYPERVISOR_mmu_update().
327 * NB. The fields are natural pointer/address size for this architecture.
328 */
329 struct mmu_update {
330 uint64_t ptr; /* Machine address of PTE. */
331 uint64_t val; /* New contents of PTE. */
332 };
333 typedef struct mmu_update mmu_update_t;
334 DEFINE_XEN_GUEST_HANDLE(mmu_update_t);
336 /*
337 * Send an array of these to HYPERVISOR_multicall().
338 * NB. The fields are natural register size for this architecture.
339 */
340 struct multicall_entry {
341 unsigned long op, result;
342 unsigned long args[6];
343 };
344 typedef struct multicall_entry multicall_entry_t;
345 DEFINE_XEN_GUEST_HANDLE(multicall_entry_t);
347 /*
348 * Event channel endpoints per domain:
349 * 1024 if a long is 32 bits; 4096 if a long is 64 bits.
350 */
351 #define NR_EVENT_CHANNELS (sizeof(unsigned long) * sizeof(unsigned long) * 64)
353 struct vcpu_time_info {
354 /*
355 * Updates to the following values are preceded and followed by an
356 * increment of 'version'. The guest can therefore detect updates by
357 * looking for changes to 'version'. If the least-significant bit of
358 * the version number is set then an update is in progress and the guest
359 * must wait to read a consistent set of values.
360 * The correct way to interact with the version number is similar to
361 * Linux's seqlock: see the implementations of read_seqbegin/read_seqretry.
362 */
363 uint32_t version;
364 uint32_t pad0;
365 uint64_t tsc_timestamp; /* TSC at last update of time vals. */
366 uint64_t system_time; /* Time, in nanosecs, since boot. */
367 /*
368 * Current system time:
369 * system_time +
370 * ((((tsc - tsc_timestamp) << tsc_shift) * tsc_to_system_mul) >> 32)
371 * CPU frequency (Hz):
372 * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift
373 */
374 uint32_t tsc_to_system_mul;
375 int8_t tsc_shift;
376 int8_t pad1[3];
377 }; /* 32 bytes */
378 typedef struct vcpu_time_info vcpu_time_info_t;
380 struct vcpu_info {
381 /*
382 * 'evtchn_upcall_pending' is written non-zero by Xen to indicate
383 * a pending notification for a particular VCPU. It is then cleared
384 * by the guest OS /before/ checking for pending work, thus avoiding
385 * a set-and-check race. Note that the mask is only accessed by Xen
386 * on the CPU that is currently hosting the VCPU. This means that the
387 * pending and mask flags can be updated by the guest without special
388 * synchronisation (i.e., no need for the x86 LOCK prefix).
389 * This may seem suboptimal because if the pending flag is set by
390 * a different CPU then an IPI may be scheduled even when the mask
391 * is set. However, note:
392 * 1. The task of 'interrupt holdoff' is covered by the per-event-
393 * channel mask bits. A 'noisy' event that is continually being
394 * triggered can be masked at source at this very precise
395 * granularity.
396 * 2. The main purpose of the per-VCPU mask is therefore to restrict
397 * reentrant execution: whether for concurrency control, or to
398 * prevent unbounded stack usage. Whatever the purpose, we expect
399 * that the mask will be asserted only for short periods at a time,
400 * and so the likelihood of a 'spurious' IPI is suitably small.
401 * The mask is read before making an event upcall to the guest: a
402 * non-zero mask therefore guarantees that the VCPU will not receive
403 * an upcall activation. The mask is cleared when the VCPU requests
404 * to block: this avoids wakeup-waiting races.
405 */
406 uint8_t evtchn_upcall_pending;
407 uint8_t evtchn_upcall_mask;
408 unsigned long evtchn_pending_sel;
409 struct arch_vcpu_info arch;
410 struct vcpu_time_info time;
411 }; /* 64 bytes (x86) */
412 #ifndef __XEN__
413 typedef struct vcpu_info vcpu_info_t;
414 #endif
416 /*
417 * Xen/kernel shared data -- pointer provided in start_info.
418 *
419 * This structure is defined to be both smaller than a page, and the
420 * only data on the shared page, but may vary in actual size even within
421 * compatible Xen versions; guests should not rely on the size
422 * of this structure remaining constant.
423 */
424 struct shared_info {
425 struct vcpu_info vcpu_info[MAX_VIRT_CPUS];
427 /*
428 * A domain can create "event channels" on which it can send and receive
429 * asynchronous event notifications. There are three classes of event that
430 * are delivered by this mechanism:
431 * 1. Bi-directional inter- and intra-domain connections. Domains must
432 * arrange out-of-band to set up a connection (usually by allocating
433 * an unbound 'listener' port and avertising that via a storage service
434 * such as xenstore).
435 * 2. Physical interrupts. A domain with suitable hardware-access
436 * privileges can bind an event-channel port to a physical interrupt
437 * source.
438 * 3. Virtual interrupts ('events'). A domain can bind an event-channel
439 * port to a virtual interrupt source, such as the virtual-timer
440 * device or the emergency console.
441 *
442 * Event channels are addressed by a "port index". Each channel is
443 * associated with two bits of information:
444 * 1. PENDING -- notifies the domain that there is a pending notification
445 * to be processed. This bit is cleared by the guest.
446 * 2. MASK -- if this bit is clear then a 0->1 transition of PENDING
447 * will cause an asynchronous upcall to be scheduled. This bit is only
448 * updated by the guest. It is read-only within Xen. If a channel
449 * becomes pending while the channel is masked then the 'edge' is lost
450 * (i.e., when the channel is unmasked, the guest must manually handle
451 * pending notifications as no upcall will be scheduled by Xen).
452 *
453 * To expedite scanning of pending notifications, any 0->1 pending
454 * transition on an unmasked channel causes a corresponding bit in a
455 * per-vcpu selector word to be set. Each bit in the selector covers a
456 * 'C long' in the PENDING bitfield array.
457 */
458 unsigned long evtchn_pending[sizeof(unsigned long) * 8];
459 unsigned long evtchn_mask[sizeof(unsigned long) * 8];
461 /*
462 * Wallclock time: updated only by control software. Guests should base
463 * their gettimeofday() syscall on this wallclock-base value.
464 */
465 uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */
466 uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */
467 uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */
469 struct arch_shared_info arch;
471 };
472 #ifndef __XEN__
473 typedef struct shared_info shared_info_t;
474 #endif
476 /*
477 * Start-of-day memory layout:
478 * 1. The domain is started within contiguous virtual-memory region.
479 * 2. The contiguous region ends on an aligned 4MB boundary.
480 * 3. This the order of bootstrap elements in the initial virtual region:
481 * a. relocated kernel image
482 * b. initial ram disk [mod_start, mod_len]
483 * c. list of allocated page frames [mfn_list, nr_pages]
484 * d. start_info_t structure [register ESI (x86)]
485 * e. bootstrap page tables [pt_base, CR3 (x86)]
486 * f. bootstrap stack [register ESP (x86)]
487 * 4. Bootstrap elements are packed together, but each is 4kB-aligned.
488 * 5. The initial ram disk may be omitted.
489 * 6. The list of page frames forms a contiguous 'pseudo-physical' memory
490 * layout for the domain. In particular, the bootstrap virtual-memory
491 * region is a 1:1 mapping to the first section of the pseudo-physical map.
492 * 7. All bootstrap elements are mapped read-writable for the guest OS. The
493 * only exception is the bootstrap page table, which is mapped read-only.
494 * 8. There is guaranteed to be at least 512kB padding after the final
495 * bootstrap element. If necessary, the bootstrap virtual region is
496 * extended by an extra 4MB to ensure this.
497 */
499 #define MAX_GUEST_CMDLINE 1024
500 struct start_info {
501 /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */
502 char magic[32]; /* "xen-<version>-<platform>". */
503 unsigned long nr_pages; /* Total pages allocated to this domain. */
504 unsigned long shared_info; /* MACHINE address of shared info struct. */
505 uint32_t flags; /* SIF_xxx flags. */
506 xen_pfn_t store_mfn; /* MACHINE page number of shared page. */
507 uint32_t store_evtchn; /* Event channel for store communication. */
508 union {
509 struct {
510 xen_pfn_t mfn; /* MACHINE page number of console page. */
511 uint32_t evtchn; /* Event channel for console page. */
512 } domU;
513 struct {
514 uint32_t info_off; /* Offset of console_info struct. */
515 uint32_t info_size; /* Size of console_info struct from start.*/
516 } dom0;
517 } console;
518 /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */
519 unsigned long pt_base; /* VIRTUAL address of page directory. */
520 unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. */
521 unsigned long mfn_list; /* VIRTUAL address of page-frame list. */
522 unsigned long mod_start; /* VIRTUAL address of pre-loaded module. */
523 unsigned long mod_len; /* Size (bytes) of pre-loaded module. */
524 int8_t cmd_line[MAX_GUEST_CMDLINE];
525 };
526 typedef struct start_info start_info_t;
528 /* New console union for dom0 introduced in 0x00030203. */
529 #if __XEN_INTERFACE_VERSION__ < 0x00030203
530 #define console_mfn console.domU.mfn
531 #define console_evtchn console.domU.evtchn
532 #endif
534 /* These flags are passed in the 'flags' field of start_info_t. */
535 #define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */
536 #define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */
538 typedef struct dom0_vga_console_info {
539 uint8_t video_type; /* DOM0_VGA_CONSOLE_??? */
540 #define XEN_VGATYPE_TEXT_MODE_3 0x03
541 #define XEN_VGATYPE_VESA_LFB 0x23
543 union {
544 struct {
545 /* Font height, in pixels. */
546 uint16_t font_height;
547 /* Cursor location (column, row). */
548 uint16_t cursor_x, cursor_y;
549 /* Number of rows and columns (dimensions in characters). */
550 uint16_t rows, columns;
551 } text_mode_3;
553 struct {
554 /* Width and height, in pixels. */
555 uint16_t width, height;
556 /* Bytes per scan line. */
557 uint16_t bytes_per_line;
558 /* Bits per pixel. */
559 uint16_t bits_per_pixel;
560 /* LFB physical address, and size (in units of 64kB). */
561 uint32_t lfb_base;
562 uint32_t lfb_size;
563 /* RGB mask offsets and sizes, as defined by VBE 1.2+ */
564 uint8_t red_pos, red_size;
565 uint8_t green_pos, green_size;
566 uint8_t blue_pos, blue_size;
567 uint8_t rsvd_pos, rsvd_size;
568 } vesa_lfb;
569 } u;
570 } dom0_vga_console_info_t;
572 typedef uint8_t xen_domain_handle_t[16];
574 /* Turn a plain number into a C unsigned long constant. */
575 #define __mk_unsigned_long(x) x ## UL
576 #define mk_unsigned_long(x) __mk_unsigned_long(x)
578 DEFINE_XEN_GUEST_HANDLE(uint8_t);
579 DEFINE_XEN_GUEST_HANDLE(uint16_t);
580 DEFINE_XEN_GUEST_HANDLE(uint32_t);
581 DEFINE_XEN_GUEST_HANDLE(uint64_t);
583 #else /* __ASSEMBLY__ */
585 /* In assembly code we cannot use C numeric constant suffixes. */
586 #define mk_unsigned_long(x) x
588 #endif /* !__ASSEMBLY__ */
590 /* Default definitions for macros used by domctl/sysctl. */
591 #if defined(__XEN__) || defined(__XEN_TOOLS__)
592 #ifndef uint64_aligned_t
593 #define uint64_aligned_t uint64_t
594 #endif
595 #ifndef XEN_GUEST_HANDLE_64
596 #define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name)
597 #endif
598 #endif
600 #endif /* __XEN_PUBLIC_XEN_H__ */
602 /*
603 * Local variables:
604 * mode: C
605 * c-set-style: "BSD"
606 * c-basic-offset: 4
607 * tab-width: 4
608 * indent-tabs-mode: nil
609 * End:
610 */