]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/60010_xen3-auto-include-xen-interface.patch1
Stop dhcpcd before starting if it was running
[people/pmueller/ipfire-2.x.git] / src / patches / 60010_xen3-auto-include-xen-interface.patch1
CommitLineData
cc90b958
BS
1Subject: xen3 include-xen-interface
2From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
3Patch-mainline: obsolete
4Acked-by: jbeulich@novell.com
5
6Index: head-2008-11-25/include/xen/interface/COPYING
7===================================================================
8--- /dev/null 1970-01-01 00:00:00.000000000 +0000
9+++ head-2008-11-25/include/xen/interface/COPYING 2007-06-12 13:14:19.000000000 +0200
10@@ -0,0 +1,38 @@
11+XEN NOTICE
12+==========
13+
14+This copyright applies to all files within this subdirectory and its
15+subdirectories:
16+ include/public/*.h
17+ include/public/hvm/*.h
18+ include/public/io/*.h
19+
20+The intention is that these files can be freely copied into the source
21+tree of an operating system when porting that OS to run on Xen. Doing
22+so does *not* cause the OS to become subject to the terms of the GPL.
23+
24+All other files in the Xen source distribution are covered by version
25+2 of the GNU General Public License except where explicitly stated
26+otherwise within individual source files.
27+
28+ -- Keir Fraser (on behalf of the Xen team)
29+
30+=====================================================================
31+
32+Permission is hereby granted, free of charge, to any person obtaining a copy
33+of this software and associated documentation files (the "Software"), to
34+deal in the Software without restriction, including without limitation the
35+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
36+sell copies of the Software, and to permit persons to whom the Software is
37+furnished to do so, subject to the following conditions:
38+
39+The above copyright notice and this permission notice shall be included in
40+all copies or substantial portions of the Software.
41+
42+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
43+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
44+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
45+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
46+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
47+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
48+DEALINGS IN THE SOFTWARE.
49Index: head-2008-11-25/include/xen/interface/acm.h
50===================================================================
51--- /dev/null 1970-01-01 00:00:00.000000000 +0000
52+++ head-2008-11-25/include/xen/interface/acm.h 2007-06-12 13:14:19.000000000 +0200
53@@ -0,0 +1,228 @@
54+/*
55+ * acm.h: Xen access control module interface defintions
56+ *
57+ * Permission is hereby granted, free of charge, to any person obtaining a copy
58+ * of this software and associated documentation files (the "Software"), to
59+ * deal in the Software without restriction, including without limitation the
60+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
61+ * sell copies of the Software, and to permit persons to whom the Software is
62+ * furnished to do so, subject to the following conditions:
63+ *
64+ * The above copyright notice and this permission notice shall be included in
65+ * all copies or substantial portions of the Software.
66+ *
67+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
68+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
69+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
70+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
71+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
72+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
73+ * DEALINGS IN THE SOFTWARE.
74+ *
75+ * Reiner Sailer <sailer@watson.ibm.com>
76+ * Copyright (c) 2005, International Business Machines Corporation.
77+ */
78+
79+#ifndef _XEN_PUBLIC_ACM_H
80+#define _XEN_PUBLIC_ACM_H
81+
82+#include "xen.h"
83+
84+/* if ACM_DEBUG defined, all hooks should
85+ * print a short trace message (comment it out
86+ * when not in testing mode )
87+ */
88+/* #define ACM_DEBUG */
89+
90+#ifdef ACM_DEBUG
91+# define printkd(fmt, args...) printk(fmt,## args)
92+#else
93+# define printkd(fmt, args...)
94+#endif
95+
96+/* default ssid reference value if not supplied */
97+#define ACM_DEFAULT_SSID 0x0
98+#define ACM_DEFAULT_LOCAL_SSID 0x0
99+
100+/* Internal ACM ERROR types */
101+#define ACM_OK 0
102+#define ACM_UNDEF -1
103+#define ACM_INIT_SSID_ERROR -2
104+#define ACM_INIT_SOID_ERROR -3
105+#define ACM_ERROR -4
106+
107+/* External ACCESS DECISIONS */
108+#define ACM_ACCESS_PERMITTED 0
109+#define ACM_ACCESS_DENIED -111
110+#define ACM_NULL_POINTER_ERROR -200
111+
112+/*
113+ Error codes reported in when trying to test for a new policy
114+ These error codes are reported in an array of tuples where
115+ each error code is followed by a parameter describing the error
116+ more closely, such as a domain id.
117+*/
118+#define ACM_EVTCHN_SHARING_VIOLATION 0x100
119+#define ACM_GNTTAB_SHARING_VIOLATION 0x101
120+#define ACM_DOMAIN_LOOKUP 0x102
121+#define ACM_CHWALL_CONFLICT 0x103
122+#define ACM_SSIDREF_IN_USE 0x104
123+
124+
125+/* primary policy in lower 4 bits */
126+#define ACM_NULL_POLICY 0
127+#define ACM_CHINESE_WALL_POLICY 1
128+#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2
129+#define ACM_POLICY_UNDEFINED 15
130+
131+/* combinations have secondary policy component in higher 4bit */
132+#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \
133+ ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY)
134+
135+/* policy: */
136+#define ACM_POLICY_NAME(X) \
137+ ((X) == (ACM_NULL_POLICY)) ? "NULL" : \
138+ ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" : \
139+ ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" : \
140+ ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT" : \
141+ "UNDEFINED"
142+
143+/* the following policy versions must be increased
144+ * whenever the interpretation of the related
145+ * policy's data structure changes
146+ */
147+#define ACM_POLICY_VERSION 3
148+#define ACM_CHWALL_VERSION 1
149+#define ACM_STE_VERSION 1
150+
151+/* defines a ssid reference used by xen */
152+typedef uint32_t ssidref_t;
153+
154+/* hooks that are known to domains */
155+#define ACMHOOK_none 0
156+#define ACMHOOK_sharing 1
157+
158+/* -------security policy relevant type definitions-------- */
159+
160+/* type identifier; compares to "equal" or "not equal" */
161+typedef uint16_t domaintype_t;
162+
163+/* CHINESE WALL POLICY DATA STRUCTURES
164+ *
165+ * current accumulated conflict type set:
166+ * When a domain is started and has a type that is in
167+ * a conflict set, the conflicting types are incremented in
168+ * the aggregate set. When a domain is destroyed, the
169+ * conflicting types to its type are decremented.
170+ * If a domain has multiple types, this procedure works over
171+ * all those types.
172+ *
173+ * conflict_aggregate_set[i] holds the number of
174+ * running domains that have a conflict with type i.
175+ *
176+ * running_types[i] holds the number of running domains
177+ * that include type i in their ssidref-referenced type set
178+ *
179+ * conflict_sets[i][j] is "0" if type j has no conflict
180+ * with type i and is "1" otherwise.
181+ */
182+/* high-16 = version, low-16 = check magic */
183+#define ACM_MAGIC 0x0001debc
184+
185+/* each offset in bytes from start of the struct they
186+ * are part of */
187+
188+/* V3 of the policy buffer aded a version structure */
189+struct acm_policy_version
190+{
191+ uint32_t major;
192+ uint32_t minor;
193+};
194+
195+
196+/* each buffer consists of all policy information for
197+ * the respective policy given in the policy code
198+ *
199+ * acm_policy_buffer, acm_chwall_policy_buffer,
200+ * and acm_ste_policy_buffer need to stay 32-bit aligned
201+ * because we create binary policies also with external
202+ * tools that assume packed representations (e.g. the java tool)
203+ */
204+struct acm_policy_buffer {
205+ uint32_t policy_version; /* ACM_POLICY_VERSION */
206+ uint32_t magic;
207+ uint32_t len;
208+ uint32_t policy_reference_offset;
209+ uint32_t primary_policy_code;
210+ uint32_t primary_buffer_offset;
211+ uint32_t secondary_policy_code;
212+ uint32_t secondary_buffer_offset;
213+ struct acm_policy_version xml_pol_version; /* add in V3 */
214+};
215+
216+
217+struct acm_policy_reference_buffer {
218+ uint32_t len;
219+};
220+
221+struct acm_chwall_policy_buffer {
222+ uint32_t policy_version; /* ACM_CHWALL_VERSION */
223+ uint32_t policy_code;
224+ uint32_t chwall_max_types;
225+ uint32_t chwall_max_ssidrefs;
226+ uint32_t chwall_max_conflictsets;
227+ uint32_t chwall_ssid_offset;
228+ uint32_t chwall_conflict_sets_offset;
229+ uint32_t chwall_running_types_offset;
230+ uint32_t chwall_conflict_aggregate_offset;
231+};
232+
233+struct acm_ste_policy_buffer {
234+ uint32_t policy_version; /* ACM_STE_VERSION */
235+ uint32_t policy_code;
236+ uint32_t ste_max_types;
237+ uint32_t ste_max_ssidrefs;
238+ uint32_t ste_ssid_offset;
239+};
240+
241+struct acm_stats_buffer {
242+ uint32_t magic;
243+ uint32_t len;
244+ uint32_t primary_policy_code;
245+ uint32_t primary_stats_offset;
246+ uint32_t secondary_policy_code;
247+ uint32_t secondary_stats_offset;
248+};
249+
250+struct acm_ste_stats_buffer {
251+ uint32_t ec_eval_count;
252+ uint32_t gt_eval_count;
253+ uint32_t ec_denied_count;
254+ uint32_t gt_denied_count;
255+ uint32_t ec_cachehit_count;
256+ uint32_t gt_cachehit_count;
257+};
258+
259+struct acm_ssid_buffer {
260+ uint32_t len;
261+ ssidref_t ssidref;
262+ uint32_t policy_reference_offset;
263+ uint32_t primary_policy_code;
264+ uint32_t primary_max_types;
265+ uint32_t primary_types_offset;
266+ uint32_t secondary_policy_code;
267+ uint32_t secondary_max_types;
268+ uint32_t secondary_types_offset;
269+};
270+
271+#endif
272+
273+/*
274+ * Local variables:
275+ * mode: C
276+ * c-set-style: "BSD"
277+ * c-basic-offset: 4
278+ * tab-width: 4
279+ * indent-tabs-mode: nil
280+ * End:
281+ */
282Index: head-2008-11-25/include/xen/interface/acm_ops.h
283===================================================================
284--- /dev/null 1970-01-01 00:00:00.000000000 +0000
285+++ head-2008-11-25/include/xen/interface/acm_ops.h 2007-06-12 13:14:19.000000000 +0200
286@@ -0,0 +1,159 @@
287+/*
288+ * acm_ops.h: Xen access control module hypervisor commands
289+ *
290+ * Permission is hereby granted, free of charge, to any person obtaining a copy
291+ * of this software and associated documentation files (the "Software"), to
292+ * deal in the Software without restriction, including without limitation the
293+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
294+ * sell copies of the Software, and to permit persons to whom the Software is
295+ * furnished to do so, subject to the following conditions:
296+ *
297+ * The above copyright notice and this permission notice shall be included in
298+ * all copies or substantial portions of the Software.
299+ *
300+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
301+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
302+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
303+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
304+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
305+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
306+ * DEALINGS IN THE SOFTWARE.
307+ *
308+ * Reiner Sailer <sailer@watson.ibm.com>
309+ * Copyright (c) 2005,2006 International Business Machines Corporation.
310+ */
311+
312+#ifndef __XEN_PUBLIC_ACM_OPS_H__
313+#define __XEN_PUBLIC_ACM_OPS_H__
314+
315+#include "xen.h"
316+#include "acm.h"
317+
318+/*
319+ * Make sure you increment the interface version whenever you modify this file!
320+ * This makes sure that old versions of acm tools will stop working in a
321+ * well-defined way (rather than crashing the machine, for instance).
322+ */
323+#define ACM_INTERFACE_VERSION 0xAAAA000A
324+
325+/************************************************************************/
326+
327+/*
328+ * Prototype for this hypercall is:
329+ * int acm_op(int cmd, void *args)
330+ * @cmd == ACMOP_??? (access control module operation).
331+ * @args == Operation-specific extra arguments (NULL if none).
332+ */
333+
334+
335+#define ACMOP_setpolicy 1
336+struct acm_setpolicy {
337+ /* IN */
338+ XEN_GUEST_HANDLE_64(void) pushcache;
339+ uint32_t pushcache_size;
340+};
341+
342+
343+#define ACMOP_getpolicy 2
344+struct acm_getpolicy {
345+ /* IN */
346+ XEN_GUEST_HANDLE_64(void) pullcache;
347+ uint32_t pullcache_size;
348+};
349+
350+
351+#define ACMOP_dumpstats 3
352+struct acm_dumpstats {
353+ /* IN */
354+ XEN_GUEST_HANDLE_64(void) pullcache;
355+ uint32_t pullcache_size;
356+};
357+
358+
359+#define ACMOP_getssid 4
360+#define ACM_GETBY_ssidref 1
361+#define ACM_GETBY_domainid 2
362+struct acm_getssid {
363+ /* IN */
364+ uint32_t get_ssid_by; /* ACM_GETBY_* */
365+ union {
366+ domaintype_t domainid;
367+ ssidref_t ssidref;
368+ } id;
369+ XEN_GUEST_HANDLE_64(void) ssidbuf;
370+ uint32_t ssidbuf_size;
371+};
372+
373+#define ACMOP_getdecision 5
374+struct acm_getdecision {
375+ /* IN */
376+ uint32_t get_decision_by1; /* ACM_GETBY_* */
377+ uint32_t get_decision_by2; /* ACM_GETBY_* */
378+ union {
379+ domaintype_t domainid;
380+ ssidref_t ssidref;
381+ } id1;
382+ union {
383+ domaintype_t domainid;
384+ ssidref_t ssidref;
385+ } id2;
386+ uint32_t hook;
387+ /* OUT */
388+ uint32_t acm_decision;
389+};
390+
391+
392+#define ACMOP_chgpolicy 6
393+struct acm_change_policy {
394+ /* IN */
395+ XEN_GUEST_HANDLE_64(void) policy_pushcache;
396+ uint32_t policy_pushcache_size;
397+ XEN_GUEST_HANDLE_64(void) del_array;
398+ uint32_t delarray_size;
399+ XEN_GUEST_HANDLE_64(void) chg_array;
400+ uint32_t chgarray_size;
401+ /* OUT */
402+ /* array with error code */
403+ XEN_GUEST_HANDLE_64(void) err_array;
404+ uint32_t errarray_size;
405+};
406+
407+#define ACMOP_relabeldoms 7
408+struct acm_relabel_doms {
409+ /* IN */
410+ XEN_GUEST_HANDLE_64(void) relabel_map;
411+ uint32_t relabel_map_size;
412+ /* OUT */
413+ XEN_GUEST_HANDLE_64(void) err_array;
414+ uint32_t errarray_size;
415+};
416+
417+/* future interface to Xen */
418+struct xen_acmctl {
419+ uint32_t cmd;
420+ uint32_t interface_version;
421+ union {
422+ struct acm_setpolicy setpolicy;
423+ struct acm_getpolicy getpolicy;
424+ struct acm_dumpstats dumpstats;
425+ struct acm_getssid getssid;
426+ struct acm_getdecision getdecision;
427+ struct acm_change_policy change_policy;
428+ struct acm_relabel_doms relabel_doms;
429+ } u;
430+};
431+
432+typedef struct xen_acmctl xen_acmctl_t;
433+DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t);
434+
435+#endif /* __XEN_PUBLIC_ACM_OPS_H__ */
436+
437+/*
438+ * Local variables:
439+ * mode: C
440+ * c-set-style: "BSD"
441+ * c-basic-offset: 4
442+ * tab-width: 4
443+ * indent-tabs-mode: nil
444+ * End:
445+ */
446Index: head-2008-11-25/include/xen/interface/arch-x86/cpuid.h
447===================================================================
448--- /dev/null 1970-01-01 00:00:00.000000000 +0000
449+++ head-2008-11-25/include/xen/interface/arch-x86/cpuid.h 2008-01-21 11:15:27.000000000 +0100
450@@ -0,0 +1,68 @@
451+/******************************************************************************
452+ * arch-x86/cpuid.h
453+ *
454+ * CPUID interface to Xen.
455+ *
456+ * Permission is hereby granted, free of charge, to any person obtaining a copy
457+ * of this software and associated documentation files (the "Software"), to
458+ * deal in the Software without restriction, including without limitation the
459+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
460+ * sell copies of the Software, and to permit persons to whom the Software is
461+ * furnished to do so, subject to the following conditions:
462+ *
463+ * The above copyright notice and this permission notice shall be included in
464+ * all copies or substantial portions of the Software.
465+ *
466+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
467+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
468+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
469+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
470+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
471+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
472+ * DEALINGS IN THE SOFTWARE.
473+ *
474+ * Copyright (c) 2007 Citrix Systems, Inc.
475+ *
476+ * Authors:
477+ * Keir Fraser <keir.fraser@citrix.com>
478+ */
479+
480+#ifndef __XEN_PUBLIC_ARCH_X86_CPUID_H__
481+#define __XEN_PUBLIC_ARCH_X86_CPUID_H__
482+
483+/* Xen identification leaves start at 0x40000000. */
484+#define XEN_CPUID_FIRST_LEAF 0x40000000
485+#define XEN_CPUID_LEAF(i) (XEN_CPUID_FIRST_LEAF + (i))
486+
487+/*
488+ * Leaf 1 (0x40000000)
489+ * EAX: Largest Xen-information leaf. All leaves up to an including @EAX
490+ * are supported by the Xen host.
491+ * EBX-EDX: "XenVMMXenVMM" signature, allowing positive identification
492+ * of a Xen host.
493+ */
494+#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */
495+#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */
496+#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */
497+
498+/*
499+ * Leaf 2 (0x40000001)
500+ * EAX[31:16]: Xen major version.
501+ * EAX[15: 0]: Xen minor version.
502+ * EBX-EDX: Reserved (currently all zeroes).
503+ */
504+
505+/*
506+ * Leaf 3 (0x40000002)
507+ * EAX: Number of hypercall transfer pages. This register is always guaranteed
508+ * to specify one hypercall page.
509+ * EBX: Base address of Xen-specific MSRs.
510+ * ECX: Features 1. Unused bits are set to zero.
511+ * EDX: Features 2. Unused bits are set to zero.
512+ */
513+
514+/* Does the host support MMU_PT_UPDATE_PRESERVE_AD for this guest? */
515+#define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0
516+#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0)
517+
518+#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */
519Index: head-2008-11-25/include/xen/interface/arch-x86/hvm/save.h
520===================================================================
521--- /dev/null 1970-01-01 00:00:00.000000000 +0000
522+++ head-2008-11-25/include/xen/interface/arch-x86/hvm/save.h 2008-10-29 09:55:56.000000000 +0100
523@@ -0,0 +1,440 @@
524+/*
525+ * Structure definitions for HVM state that is held by Xen and must
526+ * be saved along with the domain's memory and device-model state.
527+ *
528+ * Copyright (c) 2007 XenSource Ltd.
529+ *
530+ * Permission is hereby granted, free of charge, to any person obtaining a copy
531+ * of this software and associated documentation files (the "Software"), to
532+ * deal in the Software without restriction, including without limitation the
533+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
534+ * sell copies of the Software, and to permit persons to whom the Software is
535+ * furnished to do so, subject to the following conditions:
536+ *
537+ * The above copyright notice and this permission notice shall be included in
538+ * all copies or substantial portions of the Software.
539+ *
540+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
541+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
542+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
543+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
544+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
545+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
546+ * DEALINGS IN THE SOFTWARE.
547+ */
548+
549+#ifndef __XEN_PUBLIC_HVM_SAVE_X86_H__
550+#define __XEN_PUBLIC_HVM_SAVE_X86_H__
551+
552+/*
553+ * Save/restore header: general info about the save file.
554+ */
555+
556+#define HVM_FILE_MAGIC 0x54381286
557+#define HVM_FILE_VERSION 0x00000001
558+
559+struct hvm_save_header {
560+ uint32_t magic; /* Must be HVM_FILE_MAGIC */
561+ uint32_t version; /* File format version */
562+ uint64_t changeset; /* Version of Xen that saved this file */
563+ uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */
564+ uint32_t pad0;
565+};
566+
567+DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header);
568+
569+
570+/*
571+ * Processor
572+ */
573+
574+struct hvm_hw_cpu {
575+ uint8_t fpu_regs[512];
576+
577+ uint64_t rax;
578+ uint64_t rbx;
579+ uint64_t rcx;
580+ uint64_t rdx;
581+ uint64_t rbp;
582+ uint64_t rsi;
583+ uint64_t rdi;
584+ uint64_t rsp;
585+ uint64_t r8;
586+ uint64_t r9;
587+ uint64_t r10;
588+ uint64_t r11;
589+ uint64_t r12;
590+ uint64_t r13;
591+ uint64_t r14;
592+ uint64_t r15;
593+
594+ uint64_t rip;
595+ uint64_t rflags;
596+
597+ uint64_t cr0;
598+ uint64_t cr2;
599+ uint64_t cr3;
600+ uint64_t cr4;
601+
602+ uint64_t dr0;
603+ uint64_t dr1;
604+ uint64_t dr2;
605+ uint64_t dr3;
606+ uint64_t dr6;
607+ uint64_t dr7;
608+
609+ uint32_t cs_sel;
610+ uint32_t ds_sel;
611+ uint32_t es_sel;
612+ uint32_t fs_sel;
613+ uint32_t gs_sel;
614+ uint32_t ss_sel;
615+ uint32_t tr_sel;
616+ uint32_t ldtr_sel;
617+
618+ uint32_t cs_limit;
619+ uint32_t ds_limit;
620+ uint32_t es_limit;
621+ uint32_t fs_limit;
622+ uint32_t gs_limit;
623+ uint32_t ss_limit;
624+ uint32_t tr_limit;
625+ uint32_t ldtr_limit;
626+ uint32_t idtr_limit;
627+ uint32_t gdtr_limit;
628+
629+ uint64_t cs_base;
630+ uint64_t ds_base;
631+ uint64_t es_base;
632+ uint64_t fs_base;
633+ uint64_t gs_base;
634+ uint64_t ss_base;
635+ uint64_t tr_base;
636+ uint64_t ldtr_base;
637+ uint64_t idtr_base;
638+ uint64_t gdtr_base;
639+
640+ uint32_t cs_arbytes;
641+ uint32_t ds_arbytes;
642+ uint32_t es_arbytes;
643+ uint32_t fs_arbytes;
644+ uint32_t gs_arbytes;
645+ uint32_t ss_arbytes;
646+ uint32_t tr_arbytes;
647+ uint32_t ldtr_arbytes;
648+
649+ uint32_t sysenter_cs;
650+ uint32_t padding0;
651+
652+ uint64_t sysenter_esp;
653+ uint64_t sysenter_eip;
654+
655+ /* msr for em64t */
656+ uint64_t shadow_gs;
657+
658+ /* msr content saved/restored. */
659+ uint64_t msr_flags;
660+ uint64_t msr_lstar;
661+ uint64_t msr_star;
662+ uint64_t msr_cstar;
663+ uint64_t msr_syscall_mask;
664+ uint64_t msr_efer;
665+
666+ /* guest's idea of what rdtsc() would return */
667+ uint64_t tsc;
668+
669+ /* pending event, if any */
670+ union {
671+ uint32_t pending_event;
672+ struct {
673+ uint8_t pending_vector:8;
674+ uint8_t pending_type:3;
675+ uint8_t pending_error_valid:1;
676+ uint32_t pending_reserved:19;
677+ uint8_t pending_valid:1;
678+ };
679+ };
680+ /* error code for pending event */
681+ uint32_t error_code;
682+};
683+
684+DECLARE_HVM_SAVE_TYPE(CPU, 2, struct hvm_hw_cpu);
685+
686+
687+/*
688+ * PIC
689+ */
690+
691+struct hvm_hw_vpic {
692+ /* IR line bitmasks. */
693+ uint8_t irr;
694+ uint8_t imr;
695+ uint8_t isr;
696+
697+ /* Line IRx maps to IRQ irq_base+x */
698+ uint8_t irq_base;
699+
700+ /*
701+ * Where are we in ICW2-4 initialisation (0 means no init in progress)?
702+ * Bits 0-1 (=x): Next write at A=1 sets ICW(x+1).
703+ * Bit 2: ICW1.IC4 (1 == ICW4 included in init sequence)
704+ * Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence)
705+ */
706+ uint8_t init_state:4;
707+
708+ /* IR line with highest priority. */
709+ uint8_t priority_add:4;
710+
711+ /* Reads from A=0 obtain ISR or IRR? */
712+ uint8_t readsel_isr:1;
713+
714+ /* Reads perform a polling read? */
715+ uint8_t poll:1;
716+
717+ /* Automatically clear IRQs from the ISR during INTA? */
718+ uint8_t auto_eoi:1;
719+
720+ /* Automatically rotate IRQ priorities during AEOI? */
721+ uint8_t rotate_on_auto_eoi:1;
722+
723+ /* Exclude slave inputs when considering in-service IRQs? */
724+ uint8_t special_fully_nested_mode:1;
725+
726+ /* Special mask mode excludes masked IRs from AEOI and priority checks. */
727+ uint8_t special_mask_mode:1;
728+
729+ /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */
730+ uint8_t is_master:1;
731+
732+ /* Edge/trigger selection. */
733+ uint8_t elcr;
734+
735+ /* Virtual INT output. */
736+ uint8_t int_output;
737+};
738+
739+DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic);
740+
741+
742+/*
743+ * IO-APIC
744+ */
745+
746+#ifdef __ia64__
747+#define VIOAPIC_IS_IOSAPIC 1
748+#define VIOAPIC_NUM_PINS 24
749+#else
750+#define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */
751+#endif
752+
753+struct hvm_hw_vioapic {
754+ uint64_t base_address;
755+ uint32_t ioregsel;
756+ uint32_t id;
757+ union vioapic_redir_entry
758+ {
759+ uint64_t bits;
760+ struct {
761+ uint8_t vector;
762+ uint8_t delivery_mode:3;
763+ uint8_t dest_mode:1;
764+ uint8_t delivery_status:1;
765+ uint8_t polarity:1;
766+ uint8_t remote_irr:1;
767+ uint8_t trig_mode:1;
768+ uint8_t mask:1;
769+ uint8_t reserve:7;
770+#if !VIOAPIC_IS_IOSAPIC
771+ uint8_t reserved[4];
772+ uint8_t dest_id;
773+#else
774+ uint8_t reserved[3];
775+ uint16_t dest_id;
776+#endif
777+ } fields;
778+ } redirtbl[VIOAPIC_NUM_PINS];
779+};
780+
781+DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic);
782+
783+
784+/*
785+ * LAPIC
786+ */
787+
788+struct hvm_hw_lapic {
789+ uint64_t apic_base_msr;
790+ uint32_t disabled; /* VLAPIC_xx_DISABLED */
791+ uint32_t timer_divisor;
792+};
793+
794+DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic);
795+
796+struct hvm_hw_lapic_regs {
797+ uint8_t data[1024];
798+};
799+
800+DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs);
801+
802+
803+/*
804+ * IRQs
805+ */
806+
807+struct hvm_hw_pci_irqs {
808+ /*
809+ * Virtual interrupt wires for a single PCI bus.
810+ * Indexed by: device*4 + INTx#.
811+ */
812+ union {
813+ DECLARE_BITMAP(i, 32*4);
814+ uint64_t pad[2];
815+ };
816+};
817+
818+DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs);
819+
820+struct hvm_hw_isa_irqs {
821+ /*
822+ * Virtual interrupt wires for ISA devices.
823+ * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing).
824+ */
825+ union {
826+ DECLARE_BITMAP(i, 16);
827+ uint64_t pad[1];
828+ };
829+};
830+
831+DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs);
832+
833+struct hvm_hw_pci_link {
834+ /*
835+ * PCI-ISA interrupt router.
836+ * Each PCI <device:INTx#> is 'wire-ORed' into one of four links using
837+ * the traditional 'barber's pole' mapping ((device + INTx#) & 3).
838+ * The router provides a programmable mapping from each link to a GSI.
839+ */
840+ uint8_t route[4];
841+ uint8_t pad0[4];
842+};
843+
844+DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
845+
846+/*
847+ * PIT
848+ */
849+
850+struct hvm_hw_pit {
851+ struct hvm_hw_pit_channel {
852+ uint32_t count; /* can be 65536 */
853+ uint16_t latched_count;
854+ uint8_t count_latched;
855+ uint8_t status_latched;
856+ uint8_t status;
857+ uint8_t read_state;
858+ uint8_t write_state;
859+ uint8_t write_latch;
860+ uint8_t rw_mode;
861+ uint8_t mode;
862+ uint8_t bcd; /* not supported */
863+ uint8_t gate; /* timer start */
864+ } channels[3]; /* 3 x 16 bytes */
865+ uint32_t speaker_data_on;
866+ uint32_t pad0;
867+};
868+
869+DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit);
870+
871+
872+/*
873+ * RTC
874+ */
875+
876+#define RTC_CMOS_SIZE 14
877+struct hvm_hw_rtc {
878+ /* CMOS bytes */
879+ uint8_t cmos_data[RTC_CMOS_SIZE];
880+ /* Index register for 2-part operations */
881+ uint8_t cmos_index;
882+ uint8_t pad0;
883+};
884+
885+DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc);
886+
887+
888+/*
889+ * HPET
890+ */
891+
892+#define HPET_TIMER_NUM 3 /* 3 timers supported now */
893+struct hvm_hw_hpet {
894+ /* Memory-mapped, software visible registers */
895+ uint64_t capability; /* capabilities */
896+ uint64_t res0; /* reserved */
897+ uint64_t config; /* configuration */
898+ uint64_t res1; /* reserved */
899+ uint64_t isr; /* interrupt status reg */
900+ uint64_t res2[25]; /* reserved */
901+ uint64_t mc64; /* main counter */
902+ uint64_t res3; /* reserved */
903+ struct { /* timers */
904+ uint64_t config; /* configuration/cap */
905+ uint64_t cmp; /* comparator */
906+ uint64_t fsb; /* FSB route, not supported now */
907+ uint64_t res4; /* reserved */
908+ } timers[HPET_TIMER_NUM];
909+ uint64_t res5[4*(24-HPET_TIMER_NUM)]; /* reserved, up to 0x3ff */
910+
911+ /* Hidden register state */
912+ uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */
913+};
914+
915+DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet);
916+
917+
918+/*
919+ * PM timer
920+ */
921+
922+struct hvm_hw_pmtimer {
923+ uint32_t tmr_val; /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */
924+ uint16_t pm1a_sts; /* PM1a_EVT_BLK.PM1a_STS: status register */
925+ uint16_t pm1a_en; /* PM1a_EVT_BLK.PM1a_EN: enable register */
926+};
927+
928+DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer);
929+
930+/*
931+ * MTRR MSRs
932+ */
933+
934+struct hvm_hw_mtrr {
935+#define MTRR_VCNT 8
936+#define NUM_FIXED_MSR 11
937+ uint64_t msr_pat_cr;
938+ /* mtrr physbase & physmask msr pair*/
939+ uint64_t msr_mtrr_var[MTRR_VCNT*2];
940+ uint64_t msr_mtrr_fixed[NUM_FIXED_MSR];
941+ uint64_t msr_mtrr_cap;
942+ uint64_t msr_mtrr_def_type;
943+};
944+
945+DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr);
946+
947+/*
948+ * Viridian hypervisor context.
949+ */
950+
951+struct hvm_viridian_context {
952+ uint64_t hypercall_gpa;
953+ uint64_t guest_os_id;
954+};
955+
956+DECLARE_HVM_SAVE_TYPE(VIRIDIAN, 15, struct hvm_viridian_context);
957+
958+/*
959+ * Largest type-code in use
960+ */
961+#define HVM_SAVE_CODE_MAX 15
962+
963+#endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */
964Index: head-2008-11-25/include/xen/interface/arch-x86/xen-mca.h
965===================================================================
966--- /dev/null 1970-01-01 00:00:00.000000000 +0000
967+++ head-2008-11-25/include/xen/interface/arch-x86/xen-mca.h 2008-09-01 12:07:31.000000000 +0200
968@@ -0,0 +1,279 @@
969+/******************************************************************************
970+ * arch-x86/mca.h
971+ *
972+ * Contributed by Advanced Micro Devices, Inc.
973+ * Author: Christoph Egger <Christoph.Egger@amd.com>
974+ *
975+ * Guest OS machine check interface to x86 Xen.
976+ *
977+ * Permission is hereby granted, free of charge, to any person obtaining a copy
978+ * of this software and associated documentation files (the "Software"), to
979+ * deal in the Software without restriction, including without limitation the
980+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
981+ * sell copies of the Software, and to permit persons to whom the Software is
982+ * furnished to do so, subject to the following conditions:
983+ *
984+ * The above copyright notice and this permission notice shall be included in
985+ * all copies or substantial portions of the Software.
986+ *
987+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
988+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
989+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
990+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
991+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
992+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
993+ * DEALINGS IN THE SOFTWARE.
994+ */
995+
996+/* Full MCA functionality has the following Usecases from the guest side:
997+ *
998+ * Must have's:
999+ * 1. Dom0 and DomU register machine check trap callback handlers
1000+ * (already done via "set_trap_table" hypercall)
1001+ * 2. Dom0 registers machine check event callback handler
1002+ * (doable via EVTCHNOP_bind_virq)
1003+ * 3. Dom0 and DomU fetches machine check data
1004+ * 4. Dom0 wants Xen to notify a DomU
1005+ * 5. Dom0 gets DomU ID from physical address
1006+ * 6. Dom0 wants Xen to kill DomU (already done for "xm destroy")
1007+ *
1008+ * Nice to have's:
1009+ * 7. Dom0 wants Xen to deactivate a physical CPU
1010+ * This is better done as separate task, physical CPU hotplugging,
1011+ * and hypercall(s) should be sysctl's
1012+ * 8. Page migration proposed from Xen NUMA work, where Dom0 can tell Xen to
1013+ * move a DomU (or Dom0 itself) away from a malicious page
1014+ * producing correctable errors.
1015+ * 9. offlining physical page:
1016+ * Xen free's and never re-uses a certain physical page.
1017+ * 10. Testfacility: Allow Dom0 to write values into machine check MSR's
1018+ * and tell Xen to trigger a machine check
1019+ */
1020+
1021+#ifndef __XEN_PUBLIC_ARCH_X86_MCA_H__
1022+#define __XEN_PUBLIC_ARCH_X86_MCA_H__
1023+
1024+/* Hypercall */
1025+#define __HYPERVISOR_mca __HYPERVISOR_arch_0
1026+
1027+#define XEN_MCA_INTERFACE_VERSION 0x03000001
1028+
1029+/* IN: Dom0 calls hypercall from MC event handler. */
1030+#define XEN_MC_CORRECTABLE 0x0
1031+/* IN: Dom0/DomU calls hypercall from MC trap handler. */
1032+#define XEN_MC_TRAP 0x1
1033+/* XEN_MC_CORRECTABLE and XEN_MC_TRAP are mutually exclusive. */
1034+
1035+/* OUT: All is ok */
1036+#define XEN_MC_OK 0x0
1037+/* OUT: Domain could not fetch data. */
1038+#define XEN_MC_FETCHFAILED 0x1
1039+/* OUT: There was no machine check data to fetch. */
1040+#define XEN_MC_NODATA 0x2
1041+/* OUT: Between notification time and this hypercall an other
1042+ * (most likely) correctable error happened. The fetched data,
1043+ * does not match the original machine check data. */
1044+#define XEN_MC_NOMATCH 0x4
1045+
1046+/* OUT: DomU did not register MC NMI handler. Try something else. */
1047+#define XEN_MC_CANNOTHANDLE 0x8
1048+/* OUT: Notifying DomU failed. Retry later or try something else. */
1049+#define XEN_MC_NOTDELIVERED 0x10
1050+/* Note, XEN_MC_CANNOTHANDLE and XEN_MC_NOTDELIVERED are mutually exclusive. */
1051+
1052+
1053+#ifndef __ASSEMBLY__
1054+
1055+#define VIRQ_MCA VIRQ_ARCH_0 /* G. (DOM0) Machine Check Architecture */
1056+
1057+/*
1058+ * Machine Check Architecure:
1059+ * structs are read-only and used to report all kinds of
1060+ * correctable and uncorrectable errors detected by the HW.
1061+ * Dom0 and DomU: register a handler to get notified.
1062+ * Dom0 only: Correctable errors are reported via VIRQ_MCA
1063+ * Dom0 and DomU: Uncorrectable errors are reported via nmi handlers
1064+ */
1065+#define MC_TYPE_GLOBAL 0
1066+#define MC_TYPE_BANK 1
1067+#define MC_TYPE_EXTENDED 2
1068+
1069+struct mcinfo_common {
1070+ uint16_t type; /* structure type */
1071+ uint16_t size; /* size of this struct in bytes */
1072+};
1073+
1074+
1075+#define MC_FLAG_CORRECTABLE (1 << 0)
1076+#define MC_FLAG_UNCORRECTABLE (1 << 1)
1077+
1078+/* contains global x86 mc information */
1079+struct mcinfo_global {
1080+ struct mcinfo_common common;
1081+
1082+ /* running domain at the time in error (most likely the impacted one) */
1083+ uint16_t mc_domid;
1084+ uint32_t mc_socketid; /* physical socket of the physical core */
1085+ uint16_t mc_coreid; /* physical impacted core */
1086+ uint16_t mc_core_threadid; /* core thread of physical core */
1087+ uint16_t mc_vcpuid; /* virtual cpu scheduled for mc_domid */
1088+ uint64_t mc_gstatus; /* global status */
1089+ uint32_t mc_flags;
1090+};
1091+
1092+/* contains bank local x86 mc information */
1093+struct mcinfo_bank {
1094+ struct mcinfo_common common;
1095+
1096+ uint16_t mc_bank; /* bank nr */
1097+ uint16_t mc_domid; /* Usecase 5: domain referenced by mc_addr on dom0
1098+ * and if mc_addr is valid. Never valid on DomU. */
1099+ uint64_t mc_status; /* bank status */
1100+ uint64_t mc_addr; /* bank address, only valid
1101+ * if addr bit is set in mc_status */
1102+ uint64_t mc_misc;
1103+};
1104+
1105+
1106+struct mcinfo_msr {
1107+ uint64_t reg; /* MSR */
1108+ uint64_t value; /* MSR value */
1109+};
1110+
1111+/* contains mc information from other
1112+ * or additional mc MSRs */
1113+struct mcinfo_extended {
1114+ struct mcinfo_common common;
1115+
1116+ /* You can fill up to five registers.
1117+ * If you need more, then use this structure
1118+ * multiple times. */
1119+
1120+ uint32_t mc_msrs; /* Number of msr with valid values. */
1121+ struct mcinfo_msr mc_msr[5];
1122+};
1123+
1124+#define MCINFO_HYPERCALLSIZE 1024
1125+#define MCINFO_MAXSIZE 768
1126+
1127+struct mc_info {
1128+ /* Number of mcinfo_* entries in mi_data */
1129+ uint32_t mi_nentries;
1130+
1131+ uint8_t mi_data[MCINFO_MAXSIZE - sizeof(uint32_t)];
1132+};
1133+typedef struct mc_info mc_info_t;
1134+
1135+
1136+
1137+/*
1138+ * OS's should use these instead of writing their own lookup function
1139+ * each with its own bugs and drawbacks.
1140+ * We use macros instead of static inline functions to allow guests
1141+ * to include this header in assembly files (*.S).
1142+ */
1143+/* Prototype:
1144+ * uint32_t x86_mcinfo_nentries(struct mc_info *mi);
1145+ */
1146+#define x86_mcinfo_nentries(_mi) \
1147+ (_mi)->mi_nentries
1148+/* Prototype:
1149+ * struct mcinfo_common *x86_mcinfo_first(struct mc_info *mi);
1150+ */
1151+#define x86_mcinfo_first(_mi) \
1152+ (struct mcinfo_common *)((_mi)->mi_data)
1153+/* Prototype:
1154+ * struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *mic);
1155+ */
1156+#define x86_mcinfo_next(_mic) \
1157+ (struct mcinfo_common *)((uint8_t *)(_mic) + (_mic)->size)
1158+
1159+/* Prototype:
1160+ * void x86_mcinfo_lookup(void *ret, struct mc_info *mi, uint16_t type);
1161+ */
1162+#define x86_mcinfo_lookup(_ret, _mi, _type) \
1163+ do { \
1164+ uint32_t found, i; \
1165+ struct mcinfo_common *_mic; \
1166+ \
1167+ found = 0; \
1168+ (_ret) = NULL; \
1169+ if (_mi == NULL) break; \
1170+ _mic = x86_mcinfo_first(_mi); \
1171+ for (i = 0; i < x86_mcinfo_nentries(_mi); i++) { \
1172+ if (_mic->type == (_type)) { \
1173+ found = 1; \
1174+ break; \
1175+ } \
1176+ _mic = x86_mcinfo_next(_mic); \
1177+ } \
1178+ (_ret) = found ? _mic : NULL; \
1179+ } while (0)
1180+
1181+
1182+/* Usecase 1
1183+ * Register machine check trap callback handler
1184+ * (already done via "set_trap_table" hypercall)
1185+ */
1186+
1187+/* Usecase 2
1188+ * Dom0 registers machine check event callback handler
1189+ * done by EVTCHNOP_bind_virq
1190+ */
1191+
1192+/* Usecase 3
1193+ * Fetch machine check data from hypervisor.
1194+ * Note, this hypercall is special, because both Dom0 and DomU must use this.
1195+ */
1196+#define XEN_MC_fetch 1
1197+struct xen_mc_fetch {
1198+ /* IN/OUT variables. */
1199+ uint32_t flags;
1200+
1201+/* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */
1202+/* OUT: XEN_MC_OK, XEN_MC_FETCHFAILED, XEN_MC_NODATA, XEN_MC_NOMATCH */
1203+
1204+ /* OUT variables. */
1205+ uint32_t fetch_idx; /* only useful for Dom0 for the notify hypercall */
1206+ struct mc_info mc_info;
1207+};
1208+typedef struct xen_mc_fetch xen_mc_fetch_t;
1209+DEFINE_XEN_GUEST_HANDLE(xen_mc_fetch_t);
1210+
1211+
1212+/* Usecase 4
1213+ * This tells the hypervisor to notify a DomU about the machine check error
1214+ */
1215+#define XEN_MC_notifydomain 2
1216+struct xen_mc_notifydomain {
1217+ /* IN variables. */
1218+ uint16_t mc_domid; /* The unprivileged domain to notify. */
1219+ uint16_t mc_vcpuid; /* The vcpu in mc_domid to notify.
1220+ * Usually echo'd value from the fetch hypercall. */
1221+ uint32_t fetch_idx; /* echo'd value from the fetch hypercall. */
1222+
1223+ /* IN/OUT variables. */
1224+ uint32_t flags;
1225+
1226+/* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */
1227+/* OUT: XEN_MC_OK, XEN_MC_CANNOTHANDLE, XEN_MC_NOTDELIVERED, XEN_MC_NOMATCH */
1228+};
1229+typedef struct xen_mc_notifydomain xen_mc_notifydomain_t;
1230+DEFINE_XEN_GUEST_HANDLE(xen_mc_notifydomain_t);
1231+
1232+
1233+struct xen_mc {
1234+ uint32_t cmd;
1235+ uint32_t interface_version; /* XEN_MCA_INTERFACE_VERSION */
1236+ union {
1237+ struct xen_mc_fetch mc_fetch;
1238+ struct xen_mc_notifydomain mc_notifydomain;
1239+ uint8_t pad[MCINFO_HYPERCALLSIZE];
1240+ } u;
1241+};
1242+typedef struct xen_mc xen_mc_t;
1243+DEFINE_XEN_GUEST_HANDLE(xen_mc_t);
1244+
1245+#endif /* __ASSEMBLY__ */
1246+
1247+#endif /* __XEN_PUBLIC_ARCH_X86_MCA_H__ */
1248Index: head-2008-11-25/include/xen/interface/arch-x86/xen-x86_32.h
1249===================================================================
1250--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1251+++ head-2008-11-25/include/xen/interface/arch-x86/xen-x86_32.h 2008-07-21 11:00:33.000000000 +0200
1252@@ -0,0 +1,180 @@
1253+/******************************************************************************
1254+ * xen-x86_32.h
1255+ *
1256+ * Guest OS interface to x86 32-bit Xen.
1257+ *
1258+ * Permission is hereby granted, free of charge, to any person obtaining a copy
1259+ * of this software and associated documentation files (the "Software"), to
1260+ * deal in the Software without restriction, including without limitation the
1261+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1262+ * sell copies of the Software, and to permit persons to whom the Software is
1263+ * furnished to do so, subject to the following conditions:
1264+ *
1265+ * The above copyright notice and this permission notice shall be included in
1266+ * all copies or substantial portions of the Software.
1267+ *
1268+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1269+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1270+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1271+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1272+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1273+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1274+ * DEALINGS IN THE SOFTWARE.
1275+ *
1276+ * Copyright (c) 2004-2007, K A Fraser
1277+ */
1278+
1279+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__
1280+#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__
1281+
1282+/*
1283+ * Hypercall interface:
1284+ * Input: %ebx, %ecx, %edx, %esi, %edi (arguments 1-5)
1285+ * Output: %eax
1286+ * Access is via hypercall page (set up by guest loader or via a Xen MSR):
1287+ * call hypercall_page + hypercall-number * 32
1288+ * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx)
1289+ */
1290+
1291+#if __XEN_INTERFACE_VERSION__ < 0x00030203
1292+/*
1293+ * Legacy hypercall interface:
1294+ * As above, except the entry sequence to the hypervisor is:
1295+ * mov $hypercall-number*32,%eax ; int $0x82
1296+ */
1297+#define TRAP_INSTR "int $0x82"
1298+#endif
1299+
1300+/*
1301+ * These flat segments are in the Xen-private section of every GDT. Since these
1302+ * are also present in the initial GDT, many OSes will be able to avoid
1303+ * installing their own GDT.
1304+ */
1305+#define FLAT_RING1_CS 0xe019 /* GDT index 259 */
1306+#define FLAT_RING1_DS 0xe021 /* GDT index 260 */
1307+#define FLAT_RING1_SS 0xe021 /* GDT index 260 */
1308+#define FLAT_RING3_CS 0xe02b /* GDT index 261 */
1309+#define FLAT_RING3_DS 0xe033 /* GDT index 262 */
1310+#define FLAT_RING3_SS 0xe033 /* GDT index 262 */
1311+
1312+#define FLAT_KERNEL_CS FLAT_RING1_CS
1313+#define FLAT_KERNEL_DS FLAT_RING1_DS
1314+#define FLAT_KERNEL_SS FLAT_RING1_SS
1315+#define FLAT_USER_CS FLAT_RING3_CS
1316+#define FLAT_USER_DS FLAT_RING3_DS
1317+#define FLAT_USER_SS FLAT_RING3_SS
1318+
1319+#define __HYPERVISOR_VIRT_START_PAE 0xF5800000
1320+#define __MACH2PHYS_VIRT_START_PAE 0xF5800000
1321+#define __MACH2PHYS_VIRT_END_PAE 0xF6800000
1322+#define HYPERVISOR_VIRT_START_PAE \
1323+ mk_unsigned_long(__HYPERVISOR_VIRT_START_PAE)
1324+#define MACH2PHYS_VIRT_START_PAE \
1325+ mk_unsigned_long(__MACH2PHYS_VIRT_START_PAE)
1326+#define MACH2PHYS_VIRT_END_PAE \
1327+ mk_unsigned_long(__MACH2PHYS_VIRT_END_PAE)
1328+
1329+/* Non-PAE bounds are obsolete. */
1330+#define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000
1331+#define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000
1332+#define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000
1333+#define HYPERVISOR_VIRT_START_NONPAE \
1334+ mk_unsigned_long(__HYPERVISOR_VIRT_START_NONPAE)
1335+#define MACH2PHYS_VIRT_START_NONPAE \
1336+ mk_unsigned_long(__MACH2PHYS_VIRT_START_NONPAE)
1337+#define MACH2PHYS_VIRT_END_NONPAE \
1338+ mk_unsigned_long(__MACH2PHYS_VIRT_END_NONPAE)
1339+
1340+#define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE
1341+#define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE
1342+#define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE
1343+
1344+#ifndef HYPERVISOR_VIRT_START
1345+#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
1346+#endif
1347+
1348+#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
1349+#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)
1350+#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2)
1351+#ifndef machine_to_phys_mapping
1352+#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START)
1353+#endif
1354+
1355+/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */
1356+#if defined(__XEN__) || defined(__XEN_TOOLS__)
1357+#undef ___DEFINE_XEN_GUEST_HANDLE
1358+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
1359+ typedef struct { type *p; } \
1360+ __guest_handle_ ## name; \
1361+ typedef struct { union { type *p; uint64_aligned_t q; }; } \
1362+ __guest_handle_64_ ## name
1363+#undef set_xen_guest_handle
1364+#define set_xen_guest_handle(hnd, val) \
1365+ do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0; \
1366+ (hnd).p = val; \
1367+ } while ( 0 )
1368+#define uint64_aligned_t uint64_t __attribute__((aligned(8)))
1369+#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name
1370+#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name)
1371+#endif
1372+
1373+#ifndef __ASSEMBLY__
1374+
1375+struct cpu_user_regs {
1376+ uint32_t ebx;
1377+ uint32_t ecx;
1378+ uint32_t edx;
1379+ uint32_t esi;
1380+ uint32_t edi;
1381+ uint32_t ebp;
1382+ uint32_t eax;
1383+ uint16_t error_code; /* private */
1384+ uint16_t entry_vector; /* private */
1385+ uint32_t eip;
1386+ uint16_t cs;
1387+ uint8_t saved_upcall_mask;
1388+ uint8_t _pad0;
1389+ uint32_t eflags; /* eflags.IF == !saved_upcall_mask */
1390+ uint32_t esp;
1391+ uint16_t ss, _pad1;
1392+ uint16_t es, _pad2;
1393+ uint16_t ds, _pad3;
1394+ uint16_t fs, _pad4;
1395+ uint16_t gs, _pad5;
1396+};
1397+typedef struct cpu_user_regs cpu_user_regs_t;
1398+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
1399+
1400+/*
1401+ * Page-directory addresses above 4GB do not fit into architectural %cr3.
1402+ * When accessing %cr3, or equivalent field in vcpu_guest_context, guests
1403+ * must use the following accessor macros to pack/unpack valid MFNs.
1404+ */
1405+#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20))
1406+#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20))
1407+
1408+struct arch_vcpu_info {
1409+ unsigned long cr2;
1410+ unsigned long pad[5]; /* sizeof(vcpu_info_t) == 64 */
1411+};
1412+typedef struct arch_vcpu_info arch_vcpu_info_t;
1413+
1414+struct xen_callback {
1415+ unsigned long cs;
1416+ unsigned long eip;
1417+};
1418+typedef struct xen_callback xen_callback_t;
1419+
1420+#endif /* !__ASSEMBLY__ */
1421+
1422+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */
1423+
1424+/*
1425+ * Local variables:
1426+ * mode: C
1427+ * c-set-style: "BSD"
1428+ * c-basic-offset: 4
1429+ * tab-width: 4
1430+ * indent-tabs-mode: nil
1431+ * End:
1432+ */
1433Index: head-2008-11-25/include/xen/interface/arch-x86/xen-x86_64.h
1434===================================================================
1435--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1436+++ head-2008-11-25/include/xen/interface/arch-x86/xen-x86_64.h 2008-04-02 12:34:02.000000000 +0200
1437@@ -0,0 +1,212 @@
1438+/******************************************************************************
1439+ * xen-x86_64.h
1440+ *
1441+ * Guest OS interface to x86 64-bit Xen.
1442+ *
1443+ * Permission is hereby granted, free of charge, to any person obtaining a copy
1444+ * of this software and associated documentation files (the "Software"), to
1445+ * deal in the Software without restriction, including without limitation the
1446+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1447+ * sell copies of the Software, and to permit persons to whom the Software is
1448+ * furnished to do so, subject to the following conditions:
1449+ *
1450+ * The above copyright notice and this permission notice shall be included in
1451+ * all copies or substantial portions of the Software.
1452+ *
1453+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1454+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1455+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1456+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1457+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1458+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1459+ * DEALINGS IN THE SOFTWARE.
1460+ *
1461+ * Copyright (c) 2004-2006, K A Fraser
1462+ */
1463+
1464+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
1465+#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
1466+
1467+/*
1468+ * Hypercall interface:
1469+ * Input: %rdi, %rsi, %rdx, %r10, %r8 (arguments 1-5)
1470+ * Output: %rax
1471+ * Access is via hypercall page (set up by guest loader or via a Xen MSR):
1472+ * call hypercall_page + hypercall-number * 32
1473+ * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi)
1474+ */
1475+
1476+#if __XEN_INTERFACE_VERSION__ < 0x00030203
1477+/*
1478+ * Legacy hypercall interface:
1479+ * As above, except the entry sequence to the hypervisor is:
1480+ * mov $hypercall-number*32,%eax ; syscall
1481+ * Clobbered: %rcx, %r11, argument registers (as above)
1482+ */
1483+#define TRAP_INSTR "syscall"
1484+#endif
1485+
1486+/*
1487+ * 64-bit segment selectors
1488+ * These flat segments are in the Xen-private section of every GDT. Since these
1489+ * are also present in the initial GDT, many OSes will be able to avoid
1490+ * installing their own GDT.
1491+ */
1492+
1493+#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */
1494+#define FLAT_RING3_CS64 0xe033 /* GDT index 261 */
1495+#define FLAT_RING3_DS32 0xe02b /* GDT index 262 */
1496+#define FLAT_RING3_DS64 0x0000 /* NULL selector */
1497+#define FLAT_RING3_SS32 0xe02b /* GDT index 262 */
1498+#define FLAT_RING3_SS64 0xe02b /* GDT index 262 */
1499+
1500+#define FLAT_KERNEL_DS64 FLAT_RING3_DS64
1501+#define FLAT_KERNEL_DS32 FLAT_RING3_DS32
1502+#define FLAT_KERNEL_DS FLAT_KERNEL_DS64
1503+#define FLAT_KERNEL_CS64 FLAT_RING3_CS64
1504+#define FLAT_KERNEL_CS32 FLAT_RING3_CS32
1505+#define FLAT_KERNEL_CS FLAT_KERNEL_CS64
1506+#define FLAT_KERNEL_SS64 FLAT_RING3_SS64
1507+#define FLAT_KERNEL_SS32 FLAT_RING3_SS32
1508+#define FLAT_KERNEL_SS FLAT_KERNEL_SS64
1509+
1510+#define FLAT_USER_DS64 FLAT_RING3_DS64
1511+#define FLAT_USER_DS32 FLAT_RING3_DS32
1512+#define FLAT_USER_DS FLAT_USER_DS64
1513+#define FLAT_USER_CS64 FLAT_RING3_CS64
1514+#define FLAT_USER_CS32 FLAT_RING3_CS32
1515+#define FLAT_USER_CS FLAT_USER_CS64
1516+#define FLAT_USER_SS64 FLAT_RING3_SS64
1517+#define FLAT_USER_SS32 FLAT_RING3_SS32
1518+#define FLAT_USER_SS FLAT_USER_SS64
1519+
1520+#define __HYPERVISOR_VIRT_START 0xFFFF800000000000
1521+#define __HYPERVISOR_VIRT_END 0xFFFF880000000000
1522+#define __MACH2PHYS_VIRT_START 0xFFFF800000000000
1523+#define __MACH2PHYS_VIRT_END 0xFFFF804000000000
1524+
1525+#ifndef HYPERVISOR_VIRT_START
1526+#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
1527+#define HYPERVISOR_VIRT_END mk_unsigned_long(__HYPERVISOR_VIRT_END)
1528+#endif
1529+
1530+#define MACH2PHYS_VIRT_START mk_unsigned_long(__MACH2PHYS_VIRT_START)
1531+#define MACH2PHYS_VIRT_END mk_unsigned_long(__MACH2PHYS_VIRT_END)
1532+#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3)
1533+#ifndef machine_to_phys_mapping
1534+#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START)
1535+#endif
1536+
1537+/*
1538+ * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base)
1539+ * @which == SEGBASE_* ; @base == 64-bit base address
1540+ * Returns 0 on success.
1541+ */
1542+#define SEGBASE_FS 0
1543+#define SEGBASE_GS_USER 1
1544+#define SEGBASE_GS_KERNEL 2
1545+#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */
1546+
1547+/*
1548+ * int HYPERVISOR_iret(void)
1549+ * All arguments are on the kernel stack, in the following format.
1550+ * Never returns if successful. Current kernel context is lost.
1551+ * The saved CS is mapped as follows:
1552+ * RING0 -> RING3 kernel mode.
1553+ * RING1 -> RING3 kernel mode.
1554+ * RING2 -> RING3 kernel mode.
1555+ * RING3 -> RING3 user mode.
1556+ * However RING0 indicates that the guest kernel should return to iteself
1557+ * directly with
1558+ * orb $3,1*8(%rsp)
1559+ * iretq
1560+ * If flags contains VGCF_in_syscall:
1561+ * Restore RAX, RIP, RFLAGS, RSP.
1562+ * Discard R11, RCX, CS, SS.
1563+ * Otherwise:
1564+ * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP.
1565+ * All other registers are saved on hypercall entry and restored to user.
1566+ */
1567+/* Guest exited in SYSCALL context? Return to guest with SYSRET? */
1568+#define _VGCF_in_syscall 8
1569+#define VGCF_in_syscall (1<<_VGCF_in_syscall)
1570+#define VGCF_IN_SYSCALL VGCF_in_syscall
1571+
1572+#ifndef __ASSEMBLY__
1573+
1574+struct iret_context {
1575+ /* Top of stack (%rsp at point of hypercall). */
1576+ uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
1577+ /* Bottom of iret stack frame. */
1578+};
1579+
1580+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
1581+/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
1582+#define __DECL_REG(name) union { \
1583+ uint64_t r ## name, e ## name; \
1584+ uint32_t _e ## name; \
1585+}
1586+#else
1587+/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */
1588+#define __DECL_REG(name) uint64_t r ## name
1589+#endif
1590+
1591+struct cpu_user_regs {
1592+ uint64_t r15;
1593+ uint64_t r14;
1594+ uint64_t r13;
1595+ uint64_t r12;
1596+ __DECL_REG(bp);
1597+ __DECL_REG(bx);
1598+ uint64_t r11;
1599+ uint64_t r10;
1600+ uint64_t r9;
1601+ uint64_t r8;
1602+ __DECL_REG(ax);
1603+ __DECL_REG(cx);
1604+ __DECL_REG(dx);
1605+ __DECL_REG(si);
1606+ __DECL_REG(di);
1607+ uint32_t error_code; /* private */
1608+ uint32_t entry_vector; /* private */
1609+ __DECL_REG(ip);
1610+ uint16_t cs, _pad0[1];
1611+ uint8_t saved_upcall_mask;
1612+ uint8_t _pad1[3];
1613+ __DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */
1614+ __DECL_REG(sp);
1615+ uint16_t ss, _pad2[3];
1616+ uint16_t es, _pad3[3];
1617+ uint16_t ds, _pad4[3];
1618+ uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base. */
1619+ uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
1620+};
1621+typedef struct cpu_user_regs cpu_user_regs_t;
1622+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
1623+
1624+#undef __DECL_REG
1625+
1626+#define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12)
1627+#define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12)
1628+
1629+struct arch_vcpu_info {
1630+ unsigned long cr2;
1631+ unsigned long pad; /* sizeof(vcpu_info_t) == 64 */
1632+};
1633+typedef struct arch_vcpu_info arch_vcpu_info_t;
1634+
1635+typedef unsigned long xen_callback_t;
1636+
1637+#endif /* !__ASSEMBLY__ */
1638+
1639+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */
1640+
1641+/*
1642+ * Local variables:
1643+ * mode: C
1644+ * c-set-style: "BSD"
1645+ * c-basic-offset: 4
1646+ * tab-width: 4
1647+ * indent-tabs-mode: nil
1648+ * End:
1649+ */
1650Index: head-2008-11-25/include/xen/interface/arch-x86/xen.h
1651===================================================================
1652--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1653+++ head-2008-11-25/include/xen/interface/arch-x86/xen.h 2008-09-01 12:07:31.000000000 +0200
1654@@ -0,0 +1,204 @@
1655+/******************************************************************************
1656+ * arch-x86/xen.h
1657+ *
1658+ * Guest OS interface to x86 Xen.
1659+ *
1660+ * Permission is hereby granted, free of charge, to any person obtaining a copy
1661+ * of this software and associated documentation files (the "Software"), to
1662+ * deal in the Software without restriction, including without limitation the
1663+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1664+ * sell copies of the Software, and to permit persons to whom the Software is
1665+ * furnished to do so, subject to the following conditions:
1666+ *
1667+ * The above copyright notice and this permission notice shall be included in
1668+ * all copies or substantial portions of the Software.
1669+ *
1670+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1671+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1672+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1673+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1674+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1675+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1676+ * DEALINGS IN THE SOFTWARE.
1677+ *
1678+ * Copyright (c) 2004-2006, K A Fraser
1679+ */
1680+
1681+#include "../xen.h"
1682+
1683+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__
1684+#define __XEN_PUBLIC_ARCH_X86_XEN_H__
1685+
1686+/* Structural guest handles introduced in 0x00030201. */
1687+#if __XEN_INTERFACE_VERSION__ >= 0x00030201
1688+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
1689+ typedef struct { type *p; } __guest_handle_ ## name
1690+#else
1691+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
1692+ typedef type * __guest_handle_ ## name
1693+#endif
1694+
1695+#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
1696+ ___DEFINE_XEN_GUEST_HANDLE(name, type); \
1697+ ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
1698+#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, name)
1699+#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name
1700+#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name)
1701+#define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0)
1702+#ifdef __XEN_TOOLS__
1703+#define get_xen_guest_handle(val, hnd) do { val = (hnd).p; } while (0)
1704+#endif
1705+
1706+#if defined(__i386__)
1707+#include "xen-x86_32.h"
1708+#elif defined(__x86_64__)
1709+#include "xen-x86_64.h"
1710+#endif
1711+
1712+#ifndef __ASSEMBLY__
1713+typedef unsigned long xen_pfn_t;
1714+#define PRI_xen_pfn "lx"
1715+#endif
1716+
1717+/*
1718+ * SEGMENT DESCRIPTOR TABLES
1719+ */
1720+/*
1721+ * A number of GDT entries are reserved by Xen. These are not situated at the
1722+ * start of the GDT because some stupid OSes export hard-coded selector values
1723+ * in their ABI. These hard-coded values are always near the start of the GDT,
1724+ * so Xen places itself out of the way, at the far end of the GDT.
1725+ */
1726+#define FIRST_RESERVED_GDT_PAGE 14
1727+#define FIRST_RESERVED_GDT_BYTE (FIRST_RESERVED_GDT_PAGE * 4096)
1728+#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8)
1729+
1730+/* Maximum number of virtual CPUs in multi-processor guests. */
1731+#define MAX_VIRT_CPUS 32
1732+
1733+
1734+/* Machine check support */
1735+#include "xen-mca.h"
1736+
1737+#ifndef __ASSEMBLY__
1738+
1739+typedef unsigned long xen_ulong_t;
1740+
1741+/*
1742+ * Send an array of these to HYPERVISOR_set_trap_table().
1743+ * The privilege level specifies which modes may enter a trap via a software
1744+ * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate
1745+ * privilege levels as follows:
1746+ * Level == 0: Noone may enter
1747+ * Level == 1: Kernel may enter
1748+ * Level == 2: Kernel may enter
1749+ * Level == 3: Everyone may enter
1750+ */
1751+#define TI_GET_DPL(_ti) ((_ti)->flags & 3)
1752+#define TI_GET_IF(_ti) ((_ti)->flags & 4)
1753+#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl))
1754+#define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2))
1755+struct trap_info {
1756+ uint8_t vector; /* exception vector */
1757+ uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */
1758+ uint16_t cs; /* code selector */
1759+ unsigned long address; /* code offset */
1760+};
1761+typedef struct trap_info trap_info_t;
1762+DEFINE_XEN_GUEST_HANDLE(trap_info_t);
1763+
1764+typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */
1765+
1766+/*
1767+ * The following is all CPU context. Note that the fpu_ctxt block is filled
1768+ * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used.
1769+ */
1770+struct vcpu_guest_context {
1771+ /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */
1772+ struct { char x[512]; } fpu_ctxt; /* User-level FPU registers */
1773+#define VGCF_I387_VALID (1<<0)
1774+#define VGCF_IN_KERNEL (1<<2)
1775+#define _VGCF_i387_valid 0
1776+#define VGCF_i387_valid (1<<_VGCF_i387_valid)
1777+#define _VGCF_in_kernel 2
1778+#define VGCF_in_kernel (1<<_VGCF_in_kernel)
1779+#define _VGCF_failsafe_disables_events 3
1780+#define VGCF_failsafe_disables_events (1<<_VGCF_failsafe_disables_events)
1781+#define _VGCF_syscall_disables_events 4
1782+#define VGCF_syscall_disables_events (1<<_VGCF_syscall_disables_events)
1783+#define _VGCF_online 5
1784+#define VGCF_online (1<<_VGCF_online)
1785+ unsigned long flags; /* VGCF_* flags */
1786+ struct cpu_user_regs user_regs; /* User-level CPU registers */
1787+ struct trap_info trap_ctxt[256]; /* Virtual IDT */
1788+ unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */
1789+ unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
1790+ unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */
1791+ /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
1792+ unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */
1793+ unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */
1794+#ifdef __i386__
1795+ unsigned long event_callback_cs; /* CS:EIP of event callback */
1796+ unsigned long event_callback_eip;
1797+ unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */
1798+ unsigned long failsafe_callback_eip;
1799+#else
1800+ unsigned long event_callback_eip;
1801+ unsigned long failsafe_callback_eip;
1802+#ifdef __XEN__
1803+ union {
1804+ unsigned long syscall_callback_eip;
1805+ struct {
1806+ unsigned int event_callback_cs; /* compat CS of event cb */
1807+ unsigned int failsafe_callback_cs; /* compat CS of failsafe cb */
1808+ };
1809+ };
1810+#else
1811+ unsigned long syscall_callback_eip;
1812+#endif
1813+#endif
1814+ unsigned long vm_assist; /* VMASST_TYPE_* bitmap */
1815+#ifdef __x86_64__
1816+ /* Segment base addresses. */
1817+ uint64_t fs_base;
1818+ uint64_t gs_base_kernel;
1819+ uint64_t gs_base_user;
1820+#endif
1821+};
1822+typedef struct vcpu_guest_context vcpu_guest_context_t;
1823+DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
1824+
1825+struct arch_shared_info {
1826+ unsigned long max_pfn; /* max pfn that appears in table */
1827+ /* Frame containing list of mfns containing list of mfns containing p2m. */
1828+ xen_pfn_t pfn_to_mfn_frame_list_list;
1829+ unsigned long nmi_reason;
1830+ uint64_t pad[32];
1831+};
1832+typedef struct arch_shared_info arch_shared_info_t;
1833+
1834+#endif /* !__ASSEMBLY__ */
1835+
1836+/*
1837+ * Prefix forces emulation of some non-trapping instructions.
1838+ * Currently only CPUID.
1839+ */
1840+#ifdef __ASSEMBLY__
1841+#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ;
1842+#define XEN_CPUID XEN_EMULATE_PREFIX cpuid
1843+#else
1844+#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; "
1845+#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid"
1846+#endif
1847+
1848+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */
1849+
1850+/*
1851+ * Local variables:
1852+ * mode: C
1853+ * c-set-style: "BSD"
1854+ * c-basic-offset: 4
1855+ * tab-width: 4
1856+ * indent-tabs-mode: nil
1857+ * End:
1858+ */
1859Index: head-2008-11-25/include/xen/interface/arch-x86_32.h
1860===================================================================
1861--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1862+++ head-2008-11-25/include/xen/interface/arch-x86_32.h 2007-06-12 13:14:19.000000000 +0200
1863@@ -0,0 +1,27 @@
1864+/******************************************************************************
1865+ * arch-x86_32.h
1866+ *
1867+ * Guest OS interface to x86 32-bit Xen.
1868+ *
1869+ * Permission is hereby granted, free of charge, to any person obtaining a copy
1870+ * of this software and associated documentation files (the "Software"), to
1871+ * deal in the Software without restriction, including without limitation the
1872+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1873+ * sell copies of the Software, and to permit persons to whom the Software is
1874+ * furnished to do so, subject to the following conditions:
1875+ *
1876+ * The above copyright notice and this permission notice shall be included in
1877+ * all copies or substantial portions of the Software.
1878+ *
1879+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1880+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1881+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1882+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1883+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1884+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1885+ * DEALINGS IN THE SOFTWARE.
1886+ *
1887+ * Copyright (c) 2004-2006, K A Fraser
1888+ */
1889+
1890+#include "arch-x86/xen.h"
1891Index: head-2008-11-25/include/xen/interface/arch-x86_64.h
1892===================================================================
1893--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1894+++ head-2008-11-25/include/xen/interface/arch-x86_64.h 2007-06-12 13:14:19.000000000 +0200
1895@@ -0,0 +1,27 @@
1896+/******************************************************************************
1897+ * arch-x86_64.h
1898+ *
1899+ * Guest OS interface to x86 64-bit Xen.
1900+ *
1901+ * Permission is hereby granted, free of charge, to any person obtaining a copy
1902+ * of this software and associated documentation files (the "Software"), to
1903+ * deal in the Software without restriction, including without limitation the
1904+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1905+ * sell copies of the Software, and to permit persons to whom the Software is
1906+ * furnished to do so, subject to the following conditions:
1907+ *
1908+ * The above copyright notice and this permission notice shall be included in
1909+ * all copies or substantial portions of the Software.
1910+ *
1911+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1912+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1913+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1914+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1915+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1916+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1917+ * DEALINGS IN THE SOFTWARE.
1918+ *
1919+ * Copyright (c) 2004-2006, K A Fraser
1920+ */
1921+
1922+#include "arch-x86/xen.h"
1923Index: head-2008-11-25/include/xen/interface/dom0_ops.h
1924===================================================================
1925--- /dev/null 1970-01-01 00:00:00.000000000 +0000
1926+++ head-2008-11-25/include/xen/interface/dom0_ops.h 2007-06-12 13:14:19.000000000 +0200
1927@@ -0,0 +1,120 @@
1928+/******************************************************************************
1929+ * dom0_ops.h
1930+ *
1931+ * Process command requests from domain-0 guest OS.
1932+ *
1933+ * Permission is hereby granted, free of charge, to any person obtaining a copy
1934+ * of this software and associated documentation files (the "Software"), to
1935+ * deal in the Software without restriction, including without limitation the
1936+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1937+ * sell copies of the Software, and to permit persons to whom the Software is
1938+ * furnished to do so, subject to the following conditions:
1939+ *
1940+ * The above copyright notice and this permission notice shall be included in
1941+ * all copies or substantial portions of the Software.
1942+ *
1943+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1944+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1945+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1946+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1947+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1948+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1949+ * DEALINGS IN THE SOFTWARE.
1950+ *
1951+ * Copyright (c) 2002-2003, B Dragovic
1952+ * Copyright (c) 2002-2006, K Fraser
1953+ */
1954+
1955+#ifndef __XEN_PUBLIC_DOM0_OPS_H__
1956+#define __XEN_PUBLIC_DOM0_OPS_H__
1957+
1958+#include "xen.h"
1959+#include "platform.h"
1960+
1961+#if __XEN_INTERFACE_VERSION__ >= 0x00030204
1962+#error "dom0_ops.h is a compatibility interface only"
1963+#endif
1964+
1965+#define DOM0_INTERFACE_VERSION XENPF_INTERFACE_VERSION
1966+
1967+#define DOM0_SETTIME XENPF_settime
1968+#define dom0_settime xenpf_settime
1969+#define dom0_settime_t xenpf_settime_t
1970+
1971+#define DOM0_ADD_MEMTYPE XENPF_add_memtype
1972+#define dom0_add_memtype xenpf_add_memtype
1973+#define dom0_add_memtype_t xenpf_add_memtype_t
1974+
1975+#define DOM0_DEL_MEMTYPE XENPF_del_memtype
1976+#define dom0_del_memtype xenpf_del_memtype
1977+#define dom0_del_memtype_t xenpf_del_memtype_t
1978+
1979+#define DOM0_READ_MEMTYPE XENPF_read_memtype
1980+#define dom0_read_memtype xenpf_read_memtype
1981+#define dom0_read_memtype_t xenpf_read_memtype_t
1982+
1983+#define DOM0_MICROCODE XENPF_microcode_update
1984+#define dom0_microcode xenpf_microcode_update
1985+#define dom0_microcode_t xenpf_microcode_update_t
1986+
1987+#define DOM0_PLATFORM_QUIRK XENPF_platform_quirk
1988+#define dom0_platform_quirk xenpf_platform_quirk
1989+#define dom0_platform_quirk_t xenpf_platform_quirk_t
1990+
1991+typedef uint64_t cpumap_t;
1992+
1993+/* Unsupported legacy operation -- defined for API compatibility. */
1994+#define DOM0_MSR 15
1995+struct dom0_msr {
1996+ /* IN variables. */
1997+ uint32_t write;
1998+ cpumap_t cpu_mask;
1999+ uint32_t msr;
2000+ uint32_t in1;
2001+ uint32_t in2;
2002+ /* OUT variables. */
2003+ uint32_t out1;
2004+ uint32_t out2;
2005+};
2006+typedef struct dom0_msr dom0_msr_t;
2007+DEFINE_XEN_GUEST_HANDLE(dom0_msr_t);
2008+
2009+/* Unsupported legacy operation -- defined for API compatibility. */
2010+#define DOM0_PHYSICAL_MEMORY_MAP 40
2011+struct dom0_memory_map_entry {
2012+ uint64_t start, end;
2013+ uint32_t flags; /* reserved */
2014+ uint8_t is_ram;
2015+};
2016+typedef struct dom0_memory_map_entry dom0_memory_map_entry_t;
2017+DEFINE_XEN_GUEST_HANDLE(dom0_memory_map_entry_t);
2018+
2019+struct dom0_op {
2020+ uint32_t cmd;
2021+ uint32_t interface_version; /* DOM0_INTERFACE_VERSION */
2022+ union {
2023+ struct dom0_msr msr;
2024+ struct dom0_settime settime;
2025+ struct dom0_add_memtype add_memtype;
2026+ struct dom0_del_memtype del_memtype;
2027+ struct dom0_read_memtype read_memtype;
2028+ struct dom0_microcode microcode;
2029+ struct dom0_platform_quirk platform_quirk;
2030+ struct dom0_memory_map_entry physical_memory_map;
2031+ uint8_t pad[128];
2032+ } u;
2033+};
2034+typedef struct dom0_op dom0_op_t;
2035+DEFINE_XEN_GUEST_HANDLE(dom0_op_t);
2036+
2037+#endif /* __XEN_PUBLIC_DOM0_OPS_H__ */
2038+
2039+/*
2040+ * Local variables:
2041+ * mode: C
2042+ * c-set-style: "BSD"
2043+ * c-basic-offset: 4
2044+ * tab-width: 4
2045+ * indent-tabs-mode: nil
2046+ * End:
2047+ */
2048Index: head-2008-11-25/include/xen/interface/domctl.h
2049===================================================================
2050--- /dev/null 1970-01-01 00:00:00.000000000 +0000
2051+++ head-2008-11-25/include/xen/interface/domctl.h 2008-10-29 09:55:56.000000000 +0100
2052@@ -0,0 +1,680 @@
2053+/******************************************************************************
2054+ * domctl.h
2055+ *
2056+ * Domain management operations. For use by node control stack.
2057+ *
2058+ * Permission is hereby granted, free of charge, to any person obtaining a copy
2059+ * of this software and associated documentation files (the "Software"), to
2060+ * deal in the Software without restriction, including without limitation the
2061+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
2062+ * sell copies of the Software, and to permit persons to whom the Software is
2063+ * furnished to do so, subject to the following conditions:
2064+ *
2065+ * The above copyright notice and this permission notice shall be included in
2066+ * all copies or substantial portions of the Software.
2067+ *
2068+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2069+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2070+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2071+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2072+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2073+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2074+ * DEALINGS IN THE SOFTWARE.
2075+ *
2076+ * Copyright (c) 2002-2003, B Dragovic
2077+ * Copyright (c) 2002-2006, K Fraser
2078+ */
2079+
2080+#ifndef __XEN_PUBLIC_DOMCTL_H__
2081+#define __XEN_PUBLIC_DOMCTL_H__
2082+
2083+#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
2084+#error "domctl operations are intended for use by node control tools only"
2085+#endif
2086+
2087+#include "xen.h"
2088+
2089+#define XEN_DOMCTL_INTERFACE_VERSION 0x00000005
2090+
2091+struct xenctl_cpumap {
2092+ XEN_GUEST_HANDLE_64(uint8) bitmap;
2093+ uint32_t nr_cpus;
2094+};
2095+
2096+/*
2097+ * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
2098+ * If it is specified as zero, an id is auto-allocated and returned.
2099+ */
2100+#define XEN_DOMCTL_createdomain 1
2101+struct xen_domctl_createdomain {
2102+ /* IN parameters */
2103+ uint32_t ssidref;
2104+ xen_domain_handle_t handle;
2105+ /* Is this an HVM guest (as opposed to a PV guest)? */
2106+#define _XEN_DOMCTL_CDF_hvm_guest 0
2107+#define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest)
2108+ /* Use hardware-assisted paging if available? */
2109+#define _XEN_DOMCTL_CDF_hap 1
2110+#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap)
2111+ uint32_t flags;
2112+};
2113+typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
2114+DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
2115+
2116+#define XEN_DOMCTL_destroydomain 2
2117+#define XEN_DOMCTL_pausedomain 3
2118+#define XEN_DOMCTL_unpausedomain 4
2119+#define XEN_DOMCTL_resumedomain 27
2120+
2121+#define XEN_DOMCTL_getdomaininfo 5
2122+struct xen_domctl_getdomaininfo {
2123+ /* OUT variables. */
2124+ domid_t domain; /* Also echoed in domctl.domain */
2125+ /* Domain is scheduled to die. */
2126+#define _XEN_DOMINF_dying 0
2127+#define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying)
2128+ /* Domain is an HVM guest (as opposed to a PV guest). */
2129+#define _XEN_DOMINF_hvm_guest 1
2130+#define XEN_DOMINF_hvm_guest (1U<<_XEN_DOMINF_hvm_guest)
2131+ /* The guest OS has shut down. */
2132+#define _XEN_DOMINF_shutdown 2
2133+#define XEN_DOMINF_shutdown (1U<<_XEN_DOMINF_shutdown)
2134+ /* Currently paused by control software. */
2135+#define _XEN_DOMINF_paused 3
2136+#define XEN_DOMINF_paused (1U<<_XEN_DOMINF_paused)
2137+ /* Currently blocked pending an event. */
2138+#define _XEN_DOMINF_blocked 4
2139+#define XEN_DOMINF_blocked (1U<<_XEN_DOMINF_blocked)
2140+ /* Domain is currently running. */
2141+#define _XEN_DOMINF_running 5
2142+#define XEN_DOMINF_running (1U<<_XEN_DOMINF_running)
2143+ /* Being debugged. */
2144+#define _XEN_DOMINF_debugged 6
2145+#define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged)
2146+ /* CPU to which this domain is bound. */
2147+#define XEN_DOMINF_cpumask 255
2148+#define XEN_DOMINF_cpushift 8
2149+ /* XEN_DOMINF_shutdown guest-supplied code. */
2150+#define XEN_DOMINF_shutdownmask 255
2151+#define XEN_DOMINF_shutdownshift 16
2152+ uint32_t flags; /* XEN_DOMINF_* */
2153+ uint64_aligned_t tot_pages;
2154+ uint64_aligned_t max_pages;
2155+ uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */
2156+ uint64_aligned_t cpu_time;
2157+ uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */
2158+ uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */
2159+ uint32_t ssidref;
2160+ xen_domain_handle_t handle;
2161+};
2162+typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
2163+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
2164+
2165+
2166+#define XEN_DOMCTL_getmemlist 6
2167+struct xen_domctl_getmemlist {
2168+ /* IN variables. */
2169+ /* Max entries to write to output buffer. */
2170+ uint64_aligned_t max_pfns;
2171+ /* Start index in guest's page list. */
2172+ uint64_aligned_t start_pfn;
2173+ XEN_GUEST_HANDLE_64(uint64) buffer;
2174+ /* OUT variables. */
2175+ uint64_aligned_t num_pfns;
2176+};
2177+typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t;
2178+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
2179+
2180+
2181+#define XEN_DOMCTL_getpageframeinfo 7
2182+
2183+#define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28
2184+#define XEN_DOMCTL_PFINFO_NOTAB (0x0U<<28)
2185+#define XEN_DOMCTL_PFINFO_L1TAB (0x1U<<28)
2186+#define XEN_DOMCTL_PFINFO_L2TAB (0x2U<<28)
2187+#define XEN_DOMCTL_PFINFO_L3TAB (0x3U<<28)
2188+#define XEN_DOMCTL_PFINFO_L4TAB (0x4U<<28)
2189+#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28)
2190+#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31)
2191+#define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */
2192+#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
2193+
2194+struct xen_domctl_getpageframeinfo {
2195+ /* IN variables. */
2196+ uint64_aligned_t gmfn; /* GMFN to query */
2197+ /* OUT variables. */
2198+ /* Is the page PINNED to a type? */
2199+ uint32_t type; /* see above type defs */
2200+};
2201+typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t;
2202+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t);
2203+
2204+
2205+#define XEN_DOMCTL_getpageframeinfo2 8
2206+struct xen_domctl_getpageframeinfo2 {
2207+ /* IN variables. */
2208+ uint64_aligned_t num;
2209+ /* IN/OUT variables. */
2210+ XEN_GUEST_HANDLE_64(uint32) array;
2211+};
2212+typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t;
2213+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t);
2214+
2215+
2216+/*
2217+ * Control shadow pagetables operation
2218+ */
2219+#define XEN_DOMCTL_shadow_op 10
2220+
2221+/* Disable shadow mode. */
2222+#define XEN_DOMCTL_SHADOW_OP_OFF 0
2223+
2224+/* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */
2225+#define XEN_DOMCTL_SHADOW_OP_ENABLE 32
2226+
2227+/* Log-dirty bitmap operations. */
2228+ /* Return the bitmap and clean internal copy for next round. */
2229+#define XEN_DOMCTL_SHADOW_OP_CLEAN 11
2230+ /* Return the bitmap but do not modify internal copy. */
2231+#define XEN_DOMCTL_SHADOW_OP_PEEK 12
2232+
2233+/* Memory allocation accessors. */
2234+#define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION 30
2235+#define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION 31
2236+
2237+/* Legacy enable operations. */
2238+ /* Equiv. to ENABLE with no mode flags. */
2239+#define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST 1
2240+ /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */
2241+#define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY 2
2242+ /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */
2243+#define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE 3
2244+
2245+/* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */
2246+ /*
2247+ * Shadow pagetables are refcounted: guest does not use explicit mmu
2248+ * operations nor write-protect its pagetables.
2249+ */
2250+#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT (1 << 1)
2251+ /*
2252+ * Log pages in a bitmap as they are dirtied.
2253+ * Used for live relocation to determine which pages must be re-sent.
2254+ */
2255+#define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
2256+ /*
2257+ * Automatically translate GPFNs into MFNs.
2258+ */
2259+#define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
2260+ /*
2261+ * Xen does not steal virtual address space from the guest.
2262+ * Requires HVM support.
2263+ */
2264+#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL (1 << 4)
2265+
2266+struct xen_domctl_shadow_op_stats {
2267+ uint32_t fault_count;
2268+ uint32_t dirty_count;
2269+};
2270+typedef struct xen_domctl_shadow_op_stats xen_domctl_shadow_op_stats_t;
2271+DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_stats_t);
2272+
2273+struct xen_domctl_shadow_op {
2274+ /* IN variables. */
2275+ uint32_t op; /* XEN_DOMCTL_SHADOW_OP_* */
2276+
2277+ /* OP_ENABLE */
2278+ uint32_t mode; /* XEN_DOMCTL_SHADOW_ENABLE_* */
2279+
2280+ /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
2281+ uint32_t mb; /* Shadow memory allocation in MB */
2282+
2283+ /* OP_PEEK / OP_CLEAN */
2284+ XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
2285+ uint64_aligned_t pages; /* Size of buffer. Updated with actual size. */
2286+ struct xen_domctl_shadow_op_stats stats;
2287+};
2288+typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t;
2289+DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t);
2290+
2291+
2292+#define XEN_DOMCTL_max_mem 11
2293+struct xen_domctl_max_mem {
2294+ /* IN variables. */
2295+ uint64_aligned_t max_memkb;
2296+};
2297+typedef struct xen_domctl_max_mem xen_domctl_max_mem_t;
2298+DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t);
2299+
2300+
2301+#define XEN_DOMCTL_setvcpucontext 12
2302+#define XEN_DOMCTL_getvcpucontext 13
2303+struct xen_domctl_vcpucontext {
2304+ uint32_t vcpu; /* IN */
2305+ XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */
2306+};
2307+typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t;
2308+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t);
2309+
2310+
2311+#define XEN_DOMCTL_getvcpuinfo 14
2312+struct xen_domctl_getvcpuinfo {
2313+ /* IN variables. */
2314+ uint32_t vcpu;
2315+ /* OUT variables. */
2316+ uint8_t online; /* currently online (not hotplugged)? */
2317+ uint8_t blocked; /* blocked waiting for an event? */
2318+ uint8_t running; /* currently scheduled on its CPU? */
2319+ uint64_aligned_t cpu_time; /* total cpu time consumed (ns) */
2320+ uint32_t cpu; /* current mapping */
2321+};
2322+typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t;
2323+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t);
2324+
2325+
2326+/* Get/set which physical cpus a vcpu can execute on. */
2327+#define XEN_DOMCTL_setvcpuaffinity 9
2328+#define XEN_DOMCTL_getvcpuaffinity 25
2329+struct xen_domctl_vcpuaffinity {
2330+ uint32_t vcpu; /* IN */
2331+ struct xenctl_cpumap cpumap; /* IN/OUT */
2332+};
2333+typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t;
2334+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t);
2335+
2336+
2337+#define XEN_DOMCTL_max_vcpus 15
2338+struct xen_domctl_max_vcpus {
2339+ uint32_t max; /* maximum number of vcpus */
2340+};
2341+typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
2342+DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
2343+
2344+
2345+#define XEN_DOMCTL_scheduler_op 16
2346+/* Scheduler types. */
2347+#define XEN_SCHEDULER_SEDF 4
2348+#define XEN_SCHEDULER_CREDIT 5
2349+/* Set or get info? */
2350+#define XEN_DOMCTL_SCHEDOP_putinfo 0
2351+#define XEN_DOMCTL_SCHEDOP_getinfo 1
2352+struct xen_domctl_scheduler_op {
2353+ uint32_t sched_id; /* XEN_SCHEDULER_* */
2354+ uint32_t cmd; /* XEN_DOMCTL_SCHEDOP_* */
2355+ union {
2356+ struct xen_domctl_sched_sedf {
2357+ uint64_aligned_t period;
2358+ uint64_aligned_t slice;
2359+ uint64_aligned_t latency;
2360+ uint32_t extratime;
2361+ uint32_t weight;
2362+ } sedf;
2363+ struct xen_domctl_sched_credit {
2364+ uint16_t weight;
2365+ uint16_t cap;
2366+ } credit;
2367+ } u;
2368+};
2369+typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
2370+DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
2371+
2372+
2373+#define XEN_DOMCTL_setdomainhandle 17
2374+struct xen_domctl_setdomainhandle {
2375+ xen_domain_handle_t handle;
2376+};
2377+typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t;
2378+DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t);
2379+
2380+
2381+#define XEN_DOMCTL_setdebugging 18
2382+struct xen_domctl_setdebugging {
2383+ uint8_t enable;
2384+};
2385+typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t;
2386+DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t);
2387+
2388+
2389+#define XEN_DOMCTL_irq_permission 19
2390+struct xen_domctl_irq_permission {
2391+ uint8_t pirq;
2392+ uint8_t allow_access; /* flag to specify enable/disable of IRQ access */
2393+};
2394+typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t;
2395+DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t);
2396+
2397+
2398+#define XEN_DOMCTL_iomem_permission 20
2399+struct xen_domctl_iomem_permission {
2400+ uint64_aligned_t first_mfn;/* first page (physical page number) in range */
2401+ uint64_aligned_t nr_mfns; /* number of pages in range (>0) */
2402+ uint8_t allow_access; /* allow (!0) or deny (0) access to range? */
2403+};
2404+typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t;
2405+DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t);
2406+
2407+
2408+#define XEN_DOMCTL_ioport_permission 21
2409+struct xen_domctl_ioport_permission {
2410+ uint32_t first_port; /* first port int range */
2411+ uint32_t nr_ports; /* size of port range */
2412+ uint8_t allow_access; /* allow or deny access to range? */
2413+};
2414+typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t;
2415+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t);
2416+
2417+
2418+#define XEN_DOMCTL_hypercall_init 22
2419+struct xen_domctl_hypercall_init {
2420+ uint64_aligned_t gmfn; /* GMFN to be initialised */
2421+};
2422+typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t;
2423+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t);
2424+
2425+
2426+#define XEN_DOMCTL_arch_setup 23
2427+#define _XEN_DOMAINSETUP_hvm_guest 0
2428+#define XEN_DOMAINSETUP_hvm_guest (1UL<<_XEN_DOMAINSETUP_hvm_guest)
2429+#define _XEN_DOMAINSETUP_query 1 /* Get parameters (for save) */
2430+#define XEN_DOMAINSETUP_query (1UL<<_XEN_DOMAINSETUP_query)
2431+#define _XEN_DOMAINSETUP_sioemu_guest 2
2432+#define XEN_DOMAINSETUP_sioemu_guest (1UL<<_XEN_DOMAINSETUP_sioemu_guest)
2433+typedef struct xen_domctl_arch_setup {
2434+ uint64_aligned_t flags; /* XEN_DOMAINSETUP_* */
2435+#ifdef __ia64__
2436+ uint64_aligned_t bp; /* mpaddr of boot param area */
2437+ uint64_aligned_t maxmem; /* Highest memory address for MDT. */
2438+ uint64_aligned_t xsi_va; /* Xen shared_info area virtual address. */
2439+ uint32_t hypercall_imm; /* Break imm for Xen hypercalls. */
2440+ int8_t vhpt_size_log2; /* Log2 of VHPT size. */
2441+#endif
2442+} xen_domctl_arch_setup_t;
2443+DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t);
2444+
2445+
2446+#define XEN_DOMCTL_settimeoffset 24
2447+struct xen_domctl_settimeoffset {
2448+ int32_t time_offset_seconds; /* applied to domain wallclock time */
2449+};
2450+typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
2451+DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
2452+
2453+
2454+#define XEN_DOMCTL_gethvmcontext 33
2455+#define XEN_DOMCTL_sethvmcontext 34
2456+typedef struct xen_domctl_hvmcontext {
2457+ uint32_t size; /* IN/OUT: size of buffer / bytes filled */
2458+ XEN_GUEST_HANDLE_64(uint8) buffer; /* IN/OUT: data, or call
2459+ * gethvmcontext with NULL
2460+ * buffer to get size req'd */
2461+} xen_domctl_hvmcontext_t;
2462+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_t);
2463+
2464+
2465+#define XEN_DOMCTL_set_address_size 35
2466+#define XEN_DOMCTL_get_address_size 36
2467+typedef struct xen_domctl_address_size {
2468+ uint32_t size;
2469+} xen_domctl_address_size_t;
2470+DEFINE_XEN_GUEST_HANDLE(xen_domctl_address_size_t);
2471+
2472+
2473+#define XEN_DOMCTL_real_mode_area 26
2474+struct xen_domctl_real_mode_area {
2475+ uint32_t log; /* log2 of Real Mode Area size */
2476+};
2477+typedef struct xen_domctl_real_mode_area xen_domctl_real_mode_area_t;
2478+DEFINE_XEN_GUEST_HANDLE(xen_domctl_real_mode_area_t);
2479+
2480+
2481+#define XEN_DOMCTL_sendtrigger 28
2482+#define XEN_DOMCTL_SENDTRIGGER_NMI 0
2483+#define XEN_DOMCTL_SENDTRIGGER_RESET 1
2484+#define XEN_DOMCTL_SENDTRIGGER_INIT 2
2485+struct xen_domctl_sendtrigger {
2486+ uint32_t trigger; /* IN */
2487+ uint32_t vcpu; /* IN */
2488+};
2489+typedef struct xen_domctl_sendtrigger xen_domctl_sendtrigger_t;
2490+DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendtrigger_t);
2491+
2492+
2493+/* Assign PCI device to HVM guest. Sets up IOMMU structures. */
2494+#define XEN_DOMCTL_assign_device 37
2495+#define XEN_DOMCTL_test_assign_device 45
2496+#define XEN_DOMCTL_deassign_device 47
2497+struct xen_domctl_assign_device {
2498+ uint32_t machine_bdf; /* machine PCI ID of assigned device */
2499+};
2500+typedef struct xen_domctl_assign_device xen_domctl_assign_device_t;
2501+DEFINE_XEN_GUEST_HANDLE(xen_domctl_assign_device_t);
2502+
2503+/* Retrieve sibling devices infomation of machine_bdf */
2504+#define XEN_DOMCTL_get_device_group 50
2505+struct xen_domctl_get_device_group {
2506+ uint32_t machine_bdf; /* IN */
2507+ uint32_t max_sdevs; /* IN */
2508+ uint32_t num_sdevs; /* OUT */
2509+ XEN_GUEST_HANDLE_64(uint32) sdev_array; /* OUT */
2510+};
2511+typedef struct xen_domctl_get_device_group xen_domctl_get_device_group_t;
2512+DEFINE_XEN_GUEST_HANDLE(xen_domctl_get_device_group_t);
2513+
2514+/* Pass-through interrupts: bind real irq -> hvm devfn. */
2515+#define XEN_DOMCTL_bind_pt_irq 38
2516+#define XEN_DOMCTL_unbind_pt_irq 48
2517+typedef enum pt_irq_type_e {
2518+ PT_IRQ_TYPE_PCI,
2519+ PT_IRQ_TYPE_ISA,
2520+ PT_IRQ_TYPE_MSI,
2521+} pt_irq_type_t;
2522+struct xen_domctl_bind_pt_irq {
2523+ uint32_t machine_irq;
2524+ pt_irq_type_t irq_type;
2525+ uint32_t hvm_domid;
2526+
2527+ union {
2528+ struct {
2529+ uint8_t isa_irq;
2530+ } isa;
2531+ struct {
2532+ uint8_t bus;
2533+ uint8_t device;
2534+ uint8_t intx;
2535+ } pci;
2536+ struct {
2537+ uint8_t gvec;
2538+ uint32_t gflags;
2539+ } msi;
2540+ } u;
2541+};
2542+typedef struct xen_domctl_bind_pt_irq xen_domctl_bind_pt_irq_t;
2543+DEFINE_XEN_GUEST_HANDLE(xen_domctl_bind_pt_irq_t);
2544+
2545+
2546+/* Bind machine I/O address range -> HVM address range. */
2547+#define XEN_DOMCTL_memory_mapping 39
2548+#define DPCI_ADD_MAPPING 1
2549+#define DPCI_REMOVE_MAPPING 0
2550+struct xen_domctl_memory_mapping {
2551+ uint64_aligned_t first_gfn; /* first page (hvm guest phys page) in range */
2552+ uint64_aligned_t first_mfn; /* first page (machine page) in range */
2553+ uint64_aligned_t nr_mfns; /* number of pages in range (>0) */
2554+ uint32_t add_mapping; /* add or remove mapping */
2555+ uint32_t padding; /* padding for 64-bit aligned structure */
2556+};
2557+typedef struct xen_domctl_memory_mapping xen_domctl_memory_mapping_t;
2558+DEFINE_XEN_GUEST_HANDLE(xen_domctl_memory_mapping_t);
2559+
2560+
2561+/* Bind machine I/O port range -> HVM I/O port range. */
2562+#define XEN_DOMCTL_ioport_mapping 40
2563+struct xen_domctl_ioport_mapping {
2564+ uint32_t first_gport; /* first guest IO port*/
2565+ uint32_t first_mport; /* first machine IO port */
2566+ uint32_t nr_ports; /* size of port range */
2567+ uint32_t add_mapping; /* add or remove mapping */
2568+};
2569+typedef struct xen_domctl_ioport_mapping xen_domctl_ioport_mapping_t;
2570+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_mapping_t);
2571+
2572+
2573+/*
2574+ * Pin caching type of RAM space for x86 HVM domU.
2575+ */
2576+#define XEN_DOMCTL_pin_mem_cacheattr 41
2577+/* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */
2578+#define XEN_DOMCTL_MEM_CACHEATTR_UC 0
2579+#define XEN_DOMCTL_MEM_CACHEATTR_WC 1
2580+#define XEN_DOMCTL_MEM_CACHEATTR_WT 4
2581+#define XEN_DOMCTL_MEM_CACHEATTR_WP 5
2582+#define XEN_DOMCTL_MEM_CACHEATTR_WB 6
2583+#define XEN_DOMCTL_MEM_CACHEATTR_UCM 7
2584+struct xen_domctl_pin_mem_cacheattr {
2585+ uint64_aligned_t start, end;
2586+ unsigned int type; /* XEN_DOMCTL_MEM_CACHEATTR_* */
2587+};
2588+typedef struct xen_domctl_pin_mem_cacheattr xen_domctl_pin_mem_cacheattr_t;
2589+DEFINE_XEN_GUEST_HANDLE(xen_domctl_pin_mem_cacheattr_t);
2590+
2591+
2592+#define XEN_DOMCTL_set_ext_vcpucontext 42
2593+#define XEN_DOMCTL_get_ext_vcpucontext 43
2594+struct xen_domctl_ext_vcpucontext {
2595+ /* IN: VCPU that this call applies to. */
2596+ uint32_t vcpu;
2597+ /*
2598+ * SET: Size of struct (IN)
2599+ * GET: Size of struct (OUT)
2600+ */
2601+ uint32_t size;
2602+#if defined(__i386__) || defined(__x86_64__)
2603+ /* SYSCALL from 32-bit mode and SYSENTER callback information. */
2604+ /* NB. SYSCALL from 64-bit mode is contained in vcpu_guest_context_t */
2605+ uint64_aligned_t syscall32_callback_eip;
2606+ uint64_aligned_t sysenter_callback_eip;
2607+ uint16_t syscall32_callback_cs;
2608+ uint16_t sysenter_callback_cs;
2609+ uint8_t syscall32_disables_events;
2610+ uint8_t sysenter_disables_events;
2611+#endif
2612+};
2613+typedef struct xen_domctl_ext_vcpucontext xen_domctl_ext_vcpucontext_t;
2614+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ext_vcpucontext_t);
2615+
2616+/*
2617+ * Set optimizaton features for a domain
2618+ */
2619+#define XEN_DOMCTL_set_opt_feature 44
2620+struct xen_domctl_set_opt_feature {
2621+#if defined(__ia64__)
2622+ struct xen_ia64_opt_feature optf;
2623+#else
2624+ /* Make struct non-empty: do not depend on this field name! */
2625+ uint64_t dummy;
2626+#endif
2627+};
2628+typedef struct xen_domctl_set_opt_feature xen_domctl_set_opt_feature_t;
2629+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_opt_feature_t);
2630+
2631+/*
2632+ * Set the target domain for a domain
2633+ */
2634+#define XEN_DOMCTL_set_target 46
2635+struct xen_domctl_set_target {
2636+ domid_t target;
2637+};
2638+typedef struct xen_domctl_set_target xen_domctl_set_target_t;
2639+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_target_t);
2640+
2641+#if defined(__i386__) || defined(__x86_64__)
2642+# define XEN_CPUID_INPUT_UNUSED 0xFFFFFFFF
2643+# define XEN_DOMCTL_set_cpuid 49
2644+struct xen_domctl_cpuid {
2645+ unsigned int input[2];
2646+ unsigned int eax;
2647+ unsigned int ebx;
2648+ unsigned int ecx;
2649+ unsigned int edx;
2650+};
2651+typedef struct xen_domctl_cpuid xen_domctl_cpuid_t;
2652+DEFINE_XEN_GUEST_HANDLE(xen_domctl_cpuid_t);
2653+#endif
2654+
2655+#define XEN_DOMCTL_subscribe 29
2656+struct xen_domctl_subscribe {
2657+ uint32_t port; /* IN */
2658+};
2659+typedef struct xen_domctl_subscribe xen_domctl_subscribe_t;
2660+DEFINE_XEN_GUEST_HANDLE(xen_domctl_subscribe_t);
2661+
2662+/*
2663+ * Define the maximum machine address size which should be allocated
2664+ * to a guest.
2665+ */
2666+#define XEN_DOMCTL_set_machine_address_size 51
2667+#define XEN_DOMCTL_get_machine_address_size 52
2668+
2669+/*
2670+ * Do not inject spurious page faults into this domain.
2671+ */
2672+#define XEN_DOMCTL_suppress_spurious_page_faults 53
2673+
2674+struct xen_domctl {
2675+ uint32_t cmd;
2676+ uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
2677+ domid_t domain;
2678+ union {
2679+ struct xen_domctl_createdomain createdomain;
2680+ struct xen_domctl_getdomaininfo getdomaininfo;
2681+ struct xen_domctl_getmemlist getmemlist;
2682+ struct xen_domctl_getpageframeinfo getpageframeinfo;
2683+ struct xen_domctl_getpageframeinfo2 getpageframeinfo2;
2684+ struct xen_domctl_vcpuaffinity vcpuaffinity;
2685+ struct xen_domctl_shadow_op shadow_op;
2686+ struct xen_domctl_max_mem max_mem;
2687+ struct xen_domctl_vcpucontext vcpucontext;
2688+ struct xen_domctl_getvcpuinfo getvcpuinfo;
2689+ struct xen_domctl_max_vcpus max_vcpus;
2690+ struct xen_domctl_scheduler_op scheduler_op;
2691+ struct xen_domctl_setdomainhandle setdomainhandle;
2692+ struct xen_domctl_setdebugging setdebugging;
2693+ struct xen_domctl_irq_permission irq_permission;
2694+ struct xen_domctl_iomem_permission iomem_permission;
2695+ struct xen_domctl_ioport_permission ioport_permission;
2696+ struct xen_domctl_hypercall_init hypercall_init;
2697+ struct xen_domctl_arch_setup arch_setup;
2698+ struct xen_domctl_settimeoffset settimeoffset;
2699+ struct xen_domctl_real_mode_area real_mode_area;
2700+ struct xen_domctl_hvmcontext hvmcontext;
2701+ struct xen_domctl_address_size address_size;
2702+ struct xen_domctl_sendtrigger sendtrigger;
2703+ struct xen_domctl_get_device_group get_device_group;
2704+ struct xen_domctl_assign_device assign_device;
2705+ struct xen_domctl_bind_pt_irq bind_pt_irq;
2706+ struct xen_domctl_memory_mapping memory_mapping;
2707+ struct xen_domctl_ioport_mapping ioport_mapping;
2708+ struct xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
2709+ struct xen_domctl_ext_vcpucontext ext_vcpucontext;
2710+ struct xen_domctl_set_opt_feature set_opt_feature;
2711+ struct xen_domctl_set_target set_target;
2712+ struct xen_domctl_subscribe subscribe;
2713+#if defined(__i386__) || defined(__x86_64__)
2714+ struct xen_domctl_cpuid cpuid;
2715+#endif
2716+ uint8_t pad[128];
2717+ } u;
2718+};
2719+typedef struct xen_domctl xen_domctl_t;
2720+DEFINE_XEN_GUEST_HANDLE(xen_domctl_t);
2721+
2722+#endif /* __XEN_PUBLIC_DOMCTL_H__ */
2723+
2724+/*
2725+ * Local variables:
2726+ * mode: C
2727+ * c-set-style: "BSD"
2728+ * c-basic-offset: 4
2729+ * tab-width: 4
2730+ * indent-tabs-mode: nil
2731+ * End:
2732+ */
2733Index: head-2008-11-25/include/xen/interface/elfstructs.h
2734===================================================================
2735--- /dev/null 1970-01-01 00:00:00.000000000 +0000
2736+++ head-2008-11-25/include/xen/interface/elfstructs.h 2007-06-12 13:14:19.000000000 +0200
2737@@ -0,0 +1,527 @@
2738+#ifndef __XEN_PUBLIC_ELFSTRUCTS_H__
2739+#define __XEN_PUBLIC_ELFSTRUCTS_H__ 1
2740+/*
2741+ * Copyright (c) 1995, 1996 Erik Theisen. All rights reserved.
2742+ *
2743+ * Redistribution and use in source and binary forms, with or without
2744+ * modification, are permitted provided that the following conditions
2745+ * are met:
2746+ * 1. Redistributions of source code must retain the above copyright
2747+ * notice, this list of conditions and the following disclaimer.
2748+ * 2. Redistributions in binary form must reproduce the above copyright
2749+ * notice, this list of conditions and the following disclaimer in the
2750+ * documentation and/or other materials provided with the distribution.
2751+ * 3. The name of the author may not be used to endorse or promote products
2752+ * derived from this software without specific prior written permission
2753+ *
2754+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2755+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2756+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2757+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2758+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2759+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2760+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2761+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2762+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2763+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2764+ */
2765+
2766+typedef uint8_t Elf_Byte;
2767+
2768+typedef uint32_t Elf32_Addr; /* Unsigned program address */
2769+typedef uint32_t Elf32_Off; /* Unsigned file offset */
2770+typedef int32_t Elf32_Sword; /* Signed large integer */
2771+typedef uint32_t Elf32_Word; /* Unsigned large integer */
2772+typedef uint16_t Elf32_Half; /* Unsigned medium integer */
2773+
2774+typedef uint64_t Elf64_Addr;
2775+typedef uint64_t Elf64_Off;
2776+typedef int32_t Elf64_Shalf;
2777+
2778+typedef int32_t Elf64_Sword;
2779+typedef uint32_t Elf64_Word;
2780+
2781+typedef int64_t Elf64_Sxword;
2782+typedef uint64_t Elf64_Xword;
2783+
2784+typedef uint32_t Elf64_Half;
2785+typedef uint16_t Elf64_Quarter;
2786+
2787+/*
2788+ * e_ident[] identification indexes
2789+ * See http://www.caldera.com/developers/gabi/2000-07-17/ch4.eheader.html
2790+ */
2791+#define EI_MAG0 0 /* file ID */
2792+#define EI_MAG1 1 /* file ID */
2793+#define EI_MAG2 2 /* file ID */
2794+#define EI_MAG3 3 /* file ID */
2795+#define EI_CLASS 4 /* file class */
2796+#define EI_DATA 5 /* data encoding */
2797+#define EI_VERSION 6 /* ELF header version */
2798+#define EI_OSABI 7 /* OS/ABI ID */
2799+#define EI_ABIVERSION 8 /* ABI version */
2800+#define EI_PAD 9 /* start of pad bytes */
2801+#define EI_NIDENT 16 /* Size of e_ident[] */
2802+
2803+/* e_ident[] magic number */
2804+#define ELFMAG0 0x7f /* e_ident[EI_MAG0] */
2805+#define ELFMAG1 'E' /* e_ident[EI_MAG1] */
2806+#define ELFMAG2 'L' /* e_ident[EI_MAG2] */
2807+#define ELFMAG3 'F' /* e_ident[EI_MAG3] */
2808+#define ELFMAG "\177ELF" /* magic */
2809+#define SELFMAG 4 /* size of magic */
2810+
2811+/* e_ident[] file class */
2812+#define ELFCLASSNONE 0 /* invalid */
2813+#define ELFCLASS32 1 /* 32-bit objs */
2814+#define ELFCLASS64 2 /* 64-bit objs */
2815+#define ELFCLASSNUM 3 /* number of classes */
2816+
2817+/* e_ident[] data encoding */
2818+#define ELFDATANONE 0 /* invalid */
2819+#define ELFDATA2LSB 1 /* Little-Endian */
2820+#define ELFDATA2MSB 2 /* Big-Endian */
2821+#define ELFDATANUM 3 /* number of data encode defines */
2822+
2823+/* e_ident[] Operating System/ABI */
2824+#define ELFOSABI_SYSV 0 /* UNIX System V ABI */
2825+#define ELFOSABI_HPUX 1 /* HP-UX operating system */
2826+#define ELFOSABI_NETBSD 2 /* NetBSD */
2827+#define ELFOSABI_LINUX 3 /* GNU/Linux */
2828+#define ELFOSABI_HURD 4 /* GNU/Hurd */
2829+#define ELFOSABI_86OPEN 5 /* 86Open common IA32 ABI */
2830+#define ELFOSABI_SOLARIS 6 /* Solaris */
2831+#define ELFOSABI_MONTEREY 7 /* Monterey */
2832+#define ELFOSABI_IRIX 8 /* IRIX */
2833+#define ELFOSABI_FREEBSD 9 /* FreeBSD */
2834+#define ELFOSABI_TRU64 10 /* TRU64 UNIX */
2835+#define ELFOSABI_MODESTO 11 /* Novell Modesto */
2836+#define ELFOSABI_OPENBSD 12 /* OpenBSD */
2837+#define ELFOSABI_ARM 97 /* ARM */
2838+#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
2839+
2840+/* e_ident */
2841+#define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
2842+ (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
2843+ (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
2844+ (ehdr).e_ident[EI_MAG3] == ELFMAG3)
2845+
2846+/* ELF Header */
2847+typedef struct elfhdr {
2848+ unsigned char e_ident[EI_NIDENT]; /* ELF Identification */
2849+ Elf32_Half e_type; /* object file type */
2850+ Elf32_Half e_machine; /* machine */
2851+ Elf32_Word e_version; /* object file version */
2852+ Elf32_Addr e_entry; /* virtual entry point */
2853+ Elf32_Off e_phoff; /* program header table offset */
2854+ Elf32_Off e_shoff; /* section header table offset */
2855+ Elf32_Word e_flags; /* processor-specific flags */
2856+ Elf32_Half e_ehsize; /* ELF header size */
2857+ Elf32_Half e_phentsize; /* program header entry size */
2858+ Elf32_Half e_phnum; /* number of program header entries */
2859+ Elf32_Half e_shentsize; /* section header entry size */
2860+ Elf32_Half e_shnum; /* number of section header entries */
2861+ Elf32_Half e_shstrndx; /* section header table's "section
2862+ header string table" entry offset */
2863+} Elf32_Ehdr;
2864+
2865+typedef struct {
2866+ unsigned char e_ident[EI_NIDENT]; /* Id bytes */
2867+ Elf64_Quarter e_type; /* file type */
2868+ Elf64_Quarter e_machine; /* machine type */
2869+ Elf64_Half e_version; /* version number */
2870+ Elf64_Addr e_entry; /* entry point */
2871+ Elf64_Off e_phoff; /* Program hdr offset */
2872+ Elf64_Off e_shoff; /* Section hdr offset */
2873+ Elf64_Half e_flags; /* Processor flags */
2874+ Elf64_Quarter e_ehsize; /* sizeof ehdr */
2875+ Elf64_Quarter e_phentsize; /* Program header entry size */
2876+ Elf64_Quarter e_phnum; /* Number of program headers */
2877+ Elf64_Quarter e_shentsize; /* Section header entry size */
2878+ Elf64_Quarter e_shnum; /* Number of section headers */
2879+ Elf64_Quarter e_shstrndx; /* String table index */
2880+} Elf64_Ehdr;
2881+
2882+/* e_type */
2883+#define ET_NONE 0 /* No file type */
2884+#define ET_REL 1 /* relocatable file */
2885+#define ET_EXEC 2 /* executable file */
2886+#define ET_DYN 3 /* shared object file */
2887+#define ET_CORE 4 /* core file */
2888+#define ET_NUM 5 /* number of types */
2889+#define ET_LOPROC 0xff00 /* reserved range for processor */
2890+#define ET_HIPROC 0xffff /* specific e_type */
2891+
2892+/* e_machine */
2893+#define EM_NONE 0 /* No Machine */
2894+#define EM_M32 1 /* AT&T WE 32100 */
2895+#define EM_SPARC 2 /* SPARC */
2896+#define EM_386 3 /* Intel 80386 */
2897+#define EM_68K 4 /* Motorola 68000 */
2898+#define EM_88K 5 /* Motorola 88000 */
2899+#define EM_486 6 /* Intel 80486 - unused? */
2900+#define EM_860 7 /* Intel 80860 */
2901+#define EM_MIPS 8 /* MIPS R3000 Big-Endian only */
2902+/*
2903+ * Don't know if EM_MIPS_RS4_BE,
2904+ * EM_SPARC64, EM_PARISC,
2905+ * or EM_PPC are ABI compliant
2906+ */
2907+#define EM_MIPS_RS4_BE 10 /* MIPS R4000 Big-Endian */
2908+#define EM_SPARC64 11 /* SPARC v9 64-bit unoffical */
2909+#define EM_PARISC 15 /* HPPA */
2910+#define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */
2911+#define EM_PPC 20 /* PowerPC */
2912+#define EM_PPC64 21 /* PowerPC 64-bit */
2913+#define EM_ARM 40 /* Advanced RISC Machines ARM */
2914+#define EM_ALPHA 41 /* DEC ALPHA */
2915+#define EM_SPARCV9 43 /* SPARC version 9 */
2916+#define EM_ALPHA_EXP 0x9026 /* DEC ALPHA */
2917+#define EM_IA_64 50 /* Intel Merced */
2918+#define EM_X86_64 62 /* AMD x86-64 architecture */
2919+#define EM_VAX 75 /* DEC VAX */
2920+
2921+/* Version */
2922+#define EV_NONE 0 /* Invalid */
2923+#define EV_CURRENT 1 /* Current */
2924+#define EV_NUM 2 /* number of versions */
2925+
2926+/* Section Header */
2927+typedef struct {
2928+ Elf32_Word sh_name; /* name - index into section header
2929+ string table section */
2930+ Elf32_Word sh_type; /* type */
2931+ Elf32_Word sh_flags; /* flags */
2932+ Elf32_Addr sh_addr; /* address */
2933+ Elf32_Off sh_offset; /* file offset */
2934+ Elf32_Word sh_size; /* section size */
2935+ Elf32_Word sh_link; /* section header table index link */
2936+ Elf32_Word sh_info; /* extra information */
2937+ Elf32_Word sh_addralign; /* address alignment */
2938+ Elf32_Word sh_entsize; /* section entry size */
2939+} Elf32_Shdr;
2940+
2941+typedef struct {
2942+ Elf64_Half sh_name; /* section name */
2943+ Elf64_Half sh_type; /* section type */
2944+ Elf64_Xword sh_flags; /* section flags */
2945+ Elf64_Addr sh_addr; /* virtual address */
2946+ Elf64_Off sh_offset; /* file offset */
2947+ Elf64_Xword sh_size; /* section size */
2948+ Elf64_Half sh_link; /* link to another */
2949+ Elf64_Half sh_info; /* misc info */
2950+ Elf64_Xword sh_addralign; /* memory alignment */
2951+ Elf64_Xword sh_entsize; /* table entry size */
2952+} Elf64_Shdr;
2953+
2954+/* Special Section Indexes */
2955+#define SHN_UNDEF 0 /* undefined */
2956+#define SHN_LORESERVE 0xff00 /* lower bounds of reserved indexes */
2957+#define SHN_LOPROC 0xff00 /* reserved range for processor */
2958+#define SHN_HIPROC 0xff1f /* specific section indexes */
2959+#define SHN_ABS 0xfff1 /* absolute value */
2960+#define SHN_COMMON 0xfff2 /* common symbol */
2961+#define SHN_HIRESERVE 0xffff /* upper bounds of reserved indexes */
2962+
2963+/* sh_type */
2964+#define SHT_NULL 0 /* inactive */
2965+#define SHT_PROGBITS 1 /* program defined information */
2966+#define SHT_SYMTAB 2 /* symbol table section */
2967+#define SHT_STRTAB 3 /* string table section */
2968+#define SHT_RELA 4 /* relocation section with addends*/
2969+#define SHT_HASH 5 /* symbol hash table section */
2970+#define SHT_DYNAMIC 6 /* dynamic section */
2971+#define SHT_NOTE 7 /* note section */
2972+#define SHT_NOBITS 8 /* no space section */
2973+#define SHT_REL 9 /* relation section without addends */
2974+#define SHT_SHLIB 10 /* reserved - purpose unknown */
2975+#define SHT_DYNSYM 11 /* dynamic symbol table section */
2976+#define SHT_NUM 12 /* number of section types */
2977+#define SHT_LOPROC 0x70000000 /* reserved range for processor */
2978+#define SHT_HIPROC 0x7fffffff /* specific section header types */
2979+#define SHT_LOUSER 0x80000000 /* reserved range for application */
2980+#define SHT_HIUSER 0xffffffff /* specific indexes */
2981+
2982+/* Section names */
2983+#define ELF_BSS ".bss" /* uninitialized data */
2984+#define ELF_DATA ".data" /* initialized data */
2985+#define ELF_DEBUG ".debug" /* debug */
2986+#define ELF_DYNAMIC ".dynamic" /* dynamic linking information */
2987+#define ELF_DYNSTR ".dynstr" /* dynamic string table */
2988+#define ELF_DYNSYM ".dynsym" /* dynamic symbol table */
2989+#define ELF_FINI ".fini" /* termination code */
2990+#define ELF_GOT ".got" /* global offset table */
2991+#define ELF_HASH ".hash" /* symbol hash table */
2992+#define ELF_INIT ".init" /* initialization code */
2993+#define ELF_REL_DATA ".rel.data" /* relocation data */
2994+#define ELF_REL_FINI ".rel.fini" /* relocation termination code */
2995+#define ELF_REL_INIT ".rel.init" /* relocation initialization code */
2996+#define ELF_REL_DYN ".rel.dyn" /* relocaltion dynamic link info */
2997+#define ELF_REL_RODATA ".rel.rodata" /* relocation read-only data */
2998+#define ELF_REL_TEXT ".rel.text" /* relocation code */
2999+#define ELF_RODATA ".rodata" /* read-only data */
3000+#define ELF_SHSTRTAB ".shstrtab" /* section header string table */
3001+#define ELF_STRTAB ".strtab" /* string table */
3002+#define ELF_SYMTAB ".symtab" /* symbol table */
3003+#define ELF_TEXT ".text" /* code */
3004+
3005+
3006+/* Section Attribute Flags - sh_flags */
3007+#define SHF_WRITE 0x1 /* Writable */
3008+#define SHF_ALLOC 0x2 /* occupies memory */
3009+#define SHF_EXECINSTR 0x4 /* executable */
3010+#define SHF_MASKPROC 0xf0000000 /* reserved bits for processor */
3011+ /* specific section attributes */
3012+
3013+/* Symbol Table Entry */
3014+typedef struct elf32_sym {
3015+ Elf32_Word st_name; /* name - index into string table */
3016+ Elf32_Addr st_value; /* symbol value */
3017+ Elf32_Word st_size; /* symbol size */
3018+ unsigned char st_info; /* type and binding */
3019+ unsigned char st_other; /* 0 - no defined meaning */
3020+ Elf32_Half st_shndx; /* section header index */
3021+} Elf32_Sym;
3022+
3023+typedef struct {
3024+ Elf64_Half st_name; /* Symbol name index in str table */
3025+ Elf_Byte st_info; /* type / binding attrs */
3026+ Elf_Byte st_other; /* unused */
3027+ Elf64_Quarter st_shndx; /* section index of symbol */
3028+ Elf64_Xword st_value; /* value of symbol */
3029+ Elf64_Xword st_size; /* size of symbol */
3030+} Elf64_Sym;
3031+
3032+/* Symbol table index */
3033+#define STN_UNDEF 0 /* undefined */
3034+
3035+/* Extract symbol info - st_info */
3036+#define ELF32_ST_BIND(x) ((x) >> 4)
3037+#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
3038+#define ELF32_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
3039+
3040+#define ELF64_ST_BIND(x) ((x) >> 4)
3041+#define ELF64_ST_TYPE(x) (((unsigned int) x) & 0xf)
3042+#define ELF64_ST_INFO(b,t) (((b) << 4) + ((t) & 0xf))
3043+
3044+/* Symbol Binding - ELF32_ST_BIND - st_info */
3045+#define STB_LOCAL 0 /* Local symbol */
3046+#define STB_GLOBAL 1 /* Global symbol */
3047+#define STB_WEAK 2 /* like global - lower precedence */
3048+#define STB_NUM 3 /* number of symbol bindings */
3049+#define STB_LOPROC 13 /* reserved range for processor */
3050+#define STB_HIPROC 15 /* specific symbol bindings */
3051+
3052+/* Symbol type - ELF32_ST_TYPE - st_info */
3053+#define STT_NOTYPE 0 /* not specified */
3054+#define STT_OBJECT 1 /* data object */
3055+#define STT_FUNC 2 /* function */
3056+#define STT_SECTION 3 /* section */
3057+#define STT_FILE 4 /* file */
3058+#define STT_NUM 5 /* number of symbol types */
3059+#define STT_LOPROC 13 /* reserved range for processor */
3060+#define STT_HIPROC 15 /* specific symbol types */
3061+
3062+/* Relocation entry with implicit addend */
3063+typedef struct {
3064+ Elf32_Addr r_offset; /* offset of relocation */
3065+ Elf32_Word r_info; /* symbol table index and type */
3066+} Elf32_Rel;
3067+
3068+/* Relocation entry with explicit addend */
3069+typedef struct {
3070+ Elf32_Addr r_offset; /* offset of relocation */
3071+ Elf32_Word r_info; /* symbol table index and type */
3072+ Elf32_Sword r_addend;
3073+} Elf32_Rela;
3074+
3075+/* Extract relocation info - r_info */
3076+#define ELF32_R_SYM(i) ((i) >> 8)
3077+#define ELF32_R_TYPE(i) ((unsigned char) (i))
3078+#define ELF32_R_INFO(s,t) (((s) << 8) + (unsigned char)(t))
3079+
3080+typedef struct {
3081+ Elf64_Xword r_offset; /* where to do it */
3082+ Elf64_Xword r_info; /* index & type of relocation */
3083+} Elf64_Rel;
3084+
3085+typedef struct {
3086+ Elf64_Xword r_offset; /* where to do it */
3087+ Elf64_Xword r_info; /* index & type of relocation */
3088+ Elf64_Sxword r_addend; /* adjustment value */
3089+} Elf64_Rela;
3090+
3091+#define ELF64_R_SYM(info) ((info) >> 32)
3092+#define ELF64_R_TYPE(info) ((info) & 0xFFFFFFFF)
3093+#define ELF64_R_INFO(s,t) (((s) << 32) + (u_int32_t)(t))
3094+
3095+/* Program Header */
3096+typedef struct {
3097+ Elf32_Word p_type; /* segment type */
3098+ Elf32_Off p_offset; /* segment offset */
3099+ Elf32_Addr p_vaddr; /* virtual address of segment */
3100+ Elf32_Addr p_paddr; /* physical address - ignored? */
3101+ Elf32_Word p_filesz; /* number of bytes in file for seg. */
3102+ Elf32_Word p_memsz; /* number of bytes in mem. for seg. */
3103+ Elf32_Word p_flags; /* flags */
3104+ Elf32_Word p_align; /* memory alignment */
3105+} Elf32_Phdr;
3106+
3107+typedef struct {
3108+ Elf64_Half p_type; /* entry type */
3109+ Elf64_Half p_flags; /* flags */
3110+ Elf64_Off p_offset; /* offset */
3111+ Elf64_Addr p_vaddr; /* virtual address */
3112+ Elf64_Addr p_paddr; /* physical address */
3113+ Elf64_Xword p_filesz; /* file size */
3114+ Elf64_Xword p_memsz; /* memory size */
3115+ Elf64_Xword p_align; /* memory & file alignment */
3116+} Elf64_Phdr;
3117+
3118+/* Segment types - p_type */
3119+#define PT_NULL 0 /* unused */
3120+#define PT_LOAD 1 /* loadable segment */
3121+#define PT_DYNAMIC 2 /* dynamic linking section */
3122+#define PT_INTERP 3 /* the RTLD */
3123+#define PT_NOTE 4 /* auxiliary information */
3124+#define PT_SHLIB 5 /* reserved - purpose undefined */
3125+#define PT_PHDR 6 /* program header */
3126+#define PT_NUM 7 /* Number of segment types */
3127+#define PT_LOPROC 0x70000000 /* reserved range for processor */
3128+#define PT_HIPROC 0x7fffffff /* specific segment types */
3129+
3130+/* Segment flags - p_flags */
3131+#define PF_X 0x1 /* Executable */
3132+#define PF_W 0x2 /* Writable */
3133+#define PF_R 0x4 /* Readable */
3134+#define PF_MASKPROC 0xf0000000 /* reserved bits for processor */
3135+ /* specific segment flags */
3136+
3137+/* Dynamic structure */
3138+typedef struct {
3139+ Elf32_Sword d_tag; /* controls meaning of d_val */
3140+ union {
3141+ Elf32_Word d_val; /* Multiple meanings - see d_tag */
3142+ Elf32_Addr d_ptr; /* program virtual address */
3143+ } d_un;
3144+} Elf32_Dyn;
3145+
3146+typedef struct {
3147+ Elf64_Xword d_tag; /* controls meaning of d_val */
3148+ union {
3149+ Elf64_Addr d_ptr;
3150+ Elf64_Xword d_val;
3151+ } d_un;
3152+} Elf64_Dyn;
3153+
3154+/* Dynamic Array Tags - d_tag */
3155+#define DT_NULL 0 /* marks end of _DYNAMIC array */
3156+#define DT_NEEDED 1 /* string table offset of needed lib */
3157+#define DT_PLTRELSZ 2 /* size of relocation entries in PLT */
3158+#define DT_PLTGOT 3 /* address PLT/GOT */
3159+#define DT_HASH 4 /* address of symbol hash table */
3160+#define DT_STRTAB 5 /* address of string table */
3161+#define DT_SYMTAB 6 /* address of symbol table */
3162+#define DT_RELA 7 /* address of relocation table */
3163+#define DT_RELASZ 8 /* size of relocation table */
3164+#define DT_RELAENT 9 /* size of relocation entry */
3165+#define DT_STRSZ 10 /* size of string table */
3166+#define DT_SYMENT 11 /* size of symbol table entry */
3167+#define DT_INIT 12 /* address of initialization func. */
3168+#define DT_FINI 13 /* address of termination function */
3169+#define DT_SONAME 14 /* string table offset of shared obj */
3170+#define DT_RPATH 15 /* string table offset of library
3171+ search path */
3172+#define DT_SYMBOLIC 16 /* start sym search in shared obj. */
3173+#define DT_REL 17 /* address of rel. tbl. w addends */
3174+#define DT_RELSZ 18 /* size of DT_REL relocation table */
3175+#define DT_RELENT 19 /* size of DT_REL relocation entry */
3176+#define DT_PLTREL 20 /* PLT referenced relocation entry */
3177+#define DT_DEBUG 21 /* bugger */
3178+#define DT_TEXTREL 22 /* Allow rel. mod. to unwritable seg */
3179+#define DT_JMPREL 23 /* add. of PLT's relocation entries */
3180+#define DT_BIND_NOW 24 /* Bind now regardless of env setting */
3181+#define DT_NUM 25 /* Number used. */
3182+#define DT_LOPROC 0x70000000 /* reserved range for processor */
3183+#define DT_HIPROC 0x7fffffff /* specific dynamic array tags */
3184+
3185+/* Standard ELF hashing function */
3186+unsigned int elf_hash(const unsigned char *name);
3187+
3188+/*
3189+ * Note Definitions
3190+ */
3191+typedef struct {
3192+ Elf32_Word namesz;
3193+ Elf32_Word descsz;
3194+ Elf32_Word type;
3195+} Elf32_Note;
3196+
3197+typedef struct {
3198+ Elf64_Half namesz;
3199+ Elf64_Half descsz;
3200+ Elf64_Half type;
3201+} Elf64_Note;
3202+
3203+
3204+#if defined(ELFSIZE)
3205+#define CONCAT(x,y) __CONCAT(x,y)
3206+#define ELFNAME(x) CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
3207+#define ELFNAME2(x,y) CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
3208+#define ELFNAMEEND(x) CONCAT(x,CONCAT(_elf,ELFSIZE))
3209+#define ELFDEFNNAME(x) CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
3210+#endif
3211+
3212+#if defined(ELFSIZE) && (ELFSIZE == 32)
3213+#define Elf_Ehdr Elf32_Ehdr
3214+#define Elf_Phdr Elf32_Phdr
3215+#define Elf_Shdr Elf32_Shdr
3216+#define Elf_Sym Elf32_Sym
3217+#define Elf_Rel Elf32_Rel
3218+#define Elf_RelA Elf32_Rela
3219+#define Elf_Dyn Elf32_Dyn
3220+#define Elf_Word Elf32_Word
3221+#define Elf_Sword Elf32_Sword
3222+#define Elf_Addr Elf32_Addr
3223+#define Elf_Off Elf32_Off
3224+#define Elf_Nhdr Elf32_Nhdr
3225+#define Elf_Note Elf32_Note
3226+
3227+#define ELF_R_SYM ELF32_R_SYM
3228+#define ELF_R_TYPE ELF32_R_TYPE
3229+#define ELF_R_INFO ELF32_R_INFO
3230+#define ELFCLASS ELFCLASS32
3231+
3232+#define ELF_ST_BIND ELF32_ST_BIND
3233+#define ELF_ST_TYPE ELF32_ST_TYPE
3234+#define ELF_ST_INFO ELF32_ST_INFO
3235+
3236+#define AuxInfo Aux32Info
3237+#elif defined(ELFSIZE) && (ELFSIZE == 64)
3238+#define Elf_Ehdr Elf64_Ehdr
3239+#define Elf_Phdr Elf64_Phdr
3240+#define Elf_Shdr Elf64_Shdr
3241+#define Elf_Sym Elf64_Sym
3242+#define Elf_Rel Elf64_Rel
3243+#define Elf_RelA Elf64_Rela
3244+#define Elf_Dyn Elf64_Dyn
3245+#define Elf_Word Elf64_Word
3246+#define Elf_Sword Elf64_Sword
3247+#define Elf_Addr Elf64_Addr
3248+#define Elf_Off Elf64_Off
3249+#define Elf_Nhdr Elf64_Nhdr
3250+#define Elf_Note Elf64_Note
3251+
3252+#define ELF_R_SYM ELF64_R_SYM
3253+#define ELF_R_TYPE ELF64_R_TYPE
3254+#define ELF_R_INFO ELF64_R_INFO
3255+#define ELFCLASS ELFCLASS64
3256+
3257+#define ELF_ST_BIND ELF64_ST_BIND
3258+#define ELF_ST_TYPE ELF64_ST_TYPE
3259+#define ELF_ST_INFO ELF64_ST_INFO
3260+
3261+#define AuxInfo Aux64Info
3262+#endif
3263+
3264+#endif /* __XEN_PUBLIC_ELFSTRUCTS_H__ */
3265Index: head-2008-11-25/include/xen/interface/hvm/e820.h
3266===================================================================
3267--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3268+++ head-2008-11-25/include/xen/interface/hvm/e820.h 2007-06-12 13:14:19.000000000 +0200
3269@@ -0,0 +1,34 @@
3270+
3271+/*
3272+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3273+ * of this software and associated documentation files (the "Software"), to
3274+ * deal in the Software without restriction, including without limitation the
3275+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3276+ * sell copies of the Software, and to permit persons to whom the Software is
3277+ * furnished to do so, subject to the following conditions:
3278+ *
3279+ * The above copyright notice and this permission notice shall be included in
3280+ * all copies or substantial portions of the Software.
3281+ *
3282+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3283+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3284+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3285+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3286+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3287+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3288+ * DEALINGS IN THE SOFTWARE.
3289+ */
3290+
3291+#ifndef __XEN_PUBLIC_HVM_E820_H__
3292+#define __XEN_PUBLIC_HVM_E820_H__
3293+
3294+/* E820 location in HVM virtual address space. */
3295+#define HVM_E820_PAGE 0x00090000
3296+#define HVM_E820_NR_OFFSET 0x000001E8
3297+#define HVM_E820_OFFSET 0x000002D0
3298+
3299+#define HVM_BELOW_4G_RAM_END 0xF0000000
3300+#define HVM_BELOW_4G_MMIO_START HVM_BELOW_4G_RAM_END
3301+#define HVM_BELOW_4G_MMIO_LENGTH ((1ULL << 32) - HVM_BELOW_4G_MMIO_START)
3302+
3303+#endif /* __XEN_PUBLIC_HVM_E820_H__ */
3304Index: head-2008-11-25/include/xen/interface/hvm/hvm_info_table.h
3305===================================================================
3306--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3307+++ head-2008-11-25/include/xen/interface/hvm/hvm_info_table.h 2007-06-12 13:14:19.000000000 +0200
3308@@ -0,0 +1,41 @@
3309+/******************************************************************************
3310+ * hvm/hvm_info_table.h
3311+ *
3312+ * HVM parameter and information table, written into guest memory map.
3313+ *
3314+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3315+ * of this software and associated documentation files (the "Software"), to
3316+ * deal in the Software without restriction, including without limitation the
3317+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3318+ * sell copies of the Software, and to permit persons to whom the Software is
3319+ * furnished to do so, subject to the following conditions:
3320+ *
3321+ * The above copyright notice and this permission notice shall be included in
3322+ * all copies or substantial portions of the Software.
3323+ *
3324+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3325+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3326+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3327+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3328+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3329+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3330+ * DEALINGS IN THE SOFTWARE.
3331+ */
3332+
3333+#ifndef __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__
3334+#define __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__
3335+
3336+#define HVM_INFO_PFN 0x09F
3337+#define HVM_INFO_OFFSET 0x800
3338+#define HVM_INFO_PADDR ((HVM_INFO_PFN << 12) + HVM_INFO_OFFSET)
3339+
3340+struct hvm_info_table {
3341+ char signature[8]; /* "HVM INFO" */
3342+ uint32_t length;
3343+ uint8_t checksum;
3344+ uint8_t acpi_enabled;
3345+ uint8_t apic_mode;
3346+ uint32_t nr_vcpus;
3347+};
3348+
3349+#endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */
3350Index: head-2008-11-25/include/xen/interface/hvm/hvm_op.h
3351===================================================================
3352--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3353+++ head-2008-11-25/include/xen/interface/hvm/hvm_op.h 2008-09-01 12:07:31.000000000 +0200
3354@@ -0,0 +1,131 @@
3355+/*
3356+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3357+ * of this software and associated documentation files (the "Software"), to
3358+ * deal in the Software without restriction, including without limitation the
3359+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3360+ * sell copies of the Software, and to permit persons to whom the Software is
3361+ * furnished to do so, subject to the following conditions:
3362+ *
3363+ * The above copyright notice and this permission notice shall be included in
3364+ * all copies or substantial portions of the Software.
3365+ *
3366+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3367+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3368+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3369+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3370+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3371+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3372+ * DEALINGS IN THE SOFTWARE.
3373+ */
3374+
3375+#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__
3376+#define __XEN_PUBLIC_HVM_HVM_OP_H__
3377+
3378+/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
3379+#define HVMOP_set_param 0
3380+#define HVMOP_get_param 1
3381+struct xen_hvm_param {
3382+ domid_t domid; /* IN */
3383+ uint32_t index; /* IN */
3384+ uint64_t value; /* IN/OUT */
3385+};
3386+typedef struct xen_hvm_param xen_hvm_param_t;
3387+DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
3388+
3389+/* Set the logical level of one of a domain's PCI INTx wires. */
3390+#define HVMOP_set_pci_intx_level 2
3391+struct xen_hvm_set_pci_intx_level {
3392+ /* Domain to be updated. */
3393+ domid_t domid;
3394+ /* PCI INTx identification in PCI topology (domain:bus:device:intx). */
3395+ uint8_t domain, bus, device, intx;
3396+ /* Assertion level (0 = unasserted, 1 = asserted). */
3397+ uint8_t level;
3398+};
3399+typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t;
3400+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t);
3401+
3402+/* Set the logical level of one of a domain's ISA IRQ wires. */
3403+#define HVMOP_set_isa_irq_level 3
3404+struct xen_hvm_set_isa_irq_level {
3405+ /* Domain to be updated. */
3406+ domid_t domid;
3407+ /* ISA device identification, by ISA IRQ (0-15). */
3408+ uint8_t isa_irq;
3409+ /* Assertion level (0 = unasserted, 1 = asserted). */
3410+ uint8_t level;
3411+};
3412+typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t;
3413+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t);
3414+
3415+#define HVMOP_set_pci_link_route 4
3416+struct xen_hvm_set_pci_link_route {
3417+ /* Domain to be updated. */
3418+ domid_t domid;
3419+ /* PCI link identifier (0-3). */
3420+ uint8_t link;
3421+ /* ISA IRQ (1-15), or 0 (disable link). */
3422+ uint8_t isa_irq;
3423+};
3424+typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t;
3425+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t);
3426+
3427+/* Flushes all VCPU TLBs: @arg must be NULL. */
3428+#define HVMOP_flush_tlbs 5
3429+
3430+/* Following tools-only interfaces may change in future. */
3431+#if defined(__XEN__) || defined(__XEN_TOOLS__)
3432+
3433+/* Track dirty VRAM. */
3434+#define HVMOP_track_dirty_vram 6
3435+struct xen_hvm_track_dirty_vram {
3436+ /* Domain to be tracked. */
3437+ domid_t domid;
3438+ /* First pfn to track. */
3439+ uint64_aligned_t first_pfn;
3440+ /* Number of pages to track. */
3441+ uint64_aligned_t nr;
3442+ /* OUT variable. */
3443+ /* Dirty bitmap buffer. */
3444+ XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
3445+};
3446+typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t;
3447+DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t);
3448+
3449+/* Notify that some pages got modified by the Device Model. */
3450+#define HVMOP_modified_memory 7
3451+struct xen_hvm_modified_memory {
3452+ /* Domain to be updated. */
3453+ domid_t domid;
3454+ /* First pfn. */
3455+ uint64_aligned_t first_pfn;
3456+ /* Number of pages. */
3457+ uint64_aligned_t nr;
3458+};
3459+typedef struct xen_hvm_modified_memory xen_hvm_modified_memory_t;
3460+DEFINE_XEN_GUEST_HANDLE(xen_hvm_modified_memory_t);
3461+
3462+#define HVMOP_set_mem_type 8
3463+typedef enum {
3464+ HVMMEM_ram_rw, /* Normal read/write guest RAM */
3465+ HVMMEM_ram_ro, /* Read-only; writes are discarded */
3466+ HVMMEM_mmio_dm, /* Reads and write go to the device model */
3467+} hvmmem_type_t;
3468+/* Notify that a region of memory is to be treated in a specific way. */
3469+struct xen_hvm_set_mem_type {
3470+ /* Domain to be updated. */
3471+ domid_t domid;
3472+ /* Memory type */
3473+ hvmmem_type_t hvmmem_type;
3474+ /* First pfn. */
3475+ uint64_aligned_t first_pfn;
3476+ /* Number of pages. */
3477+ uint64_aligned_t nr;
3478+};
3479+typedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t;
3480+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t);
3481+
3482+
3483+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
3484+
3485+#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
3486Index: head-2008-11-25/include/xen/interface/hvm/ioreq.h
3487===================================================================
3488--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3489+++ head-2008-11-25/include/xen/interface/hvm/ioreq.h 2008-04-02 12:34:02.000000000 +0200
3490@@ -0,0 +1,127 @@
3491+/*
3492+ * ioreq.h: I/O request definitions for device models
3493+ * Copyright (c) 2004, Intel Corporation.
3494+ *
3495+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3496+ * of this software and associated documentation files (the "Software"), to
3497+ * deal in the Software without restriction, including without limitation the
3498+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3499+ * sell copies of the Software, and to permit persons to whom the Software is
3500+ * furnished to do so, subject to the following conditions:
3501+ *
3502+ * The above copyright notice and this permission notice shall be included in
3503+ * all copies or substantial portions of the Software.
3504+ *
3505+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3506+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3507+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3508+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3509+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3510+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3511+ * DEALINGS IN THE SOFTWARE.
3512+ */
3513+
3514+#ifndef _IOREQ_H_
3515+#define _IOREQ_H_
3516+
3517+#define IOREQ_READ 1
3518+#define IOREQ_WRITE 0
3519+
3520+#define STATE_IOREQ_NONE 0
3521+#define STATE_IOREQ_READY 1
3522+#define STATE_IOREQ_INPROCESS 2
3523+#define STATE_IORESP_READY 3
3524+
3525+#define IOREQ_TYPE_PIO 0 /* pio */
3526+#define IOREQ_TYPE_COPY 1 /* mmio ops */
3527+#define IOREQ_TYPE_TIMEOFFSET 7
3528+#define IOREQ_TYPE_INVALIDATE 8 /* mapcache */
3529+
3530+/*
3531+ * VMExit dispatcher should cooperate with instruction decoder to
3532+ * prepare this structure and notify service OS and DM by sending
3533+ * virq
3534+ */
3535+struct ioreq {
3536+ uint64_t addr; /* physical address */
3537+ uint64_t size; /* size in bytes */
3538+ uint64_t count; /* for rep prefixes */
3539+ uint64_t data; /* data (or paddr of data) */
3540+ uint8_t state:4;
3541+ uint8_t data_is_ptr:1; /* if 1, data above is the guest paddr
3542+ * of the real data to use. */
3543+ uint8_t dir:1; /* 1=read, 0=write */
3544+ uint8_t df:1;
3545+ uint8_t pad:1;
3546+ uint8_t type; /* I/O type */
3547+ uint8_t _pad0[6];
3548+ uint64_t io_count; /* How many IO done on a vcpu */
3549+};
3550+typedef struct ioreq ioreq_t;
3551+
3552+struct vcpu_iodata {
3553+ struct ioreq vp_ioreq;
3554+ /* Event channel port, used for notifications to/from the device model. */
3555+ uint32_t vp_eport;
3556+ uint32_t _pad0;
3557+};
3558+typedef struct vcpu_iodata vcpu_iodata_t;
3559+
3560+struct shared_iopage {
3561+ struct vcpu_iodata vcpu_iodata[1];
3562+};
3563+typedef struct shared_iopage shared_iopage_t;
3564+
3565+struct buf_ioreq {
3566+ uint8_t type; /* I/O type */
3567+ uint8_t pad:1;
3568+ uint8_t dir:1; /* 1=read, 0=write */
3569+ uint8_t size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
3570+ uint32_t addr:20;/* physical address */
3571+ uint32_t data; /* data */
3572+};
3573+typedef struct buf_ioreq buf_ioreq_t;
3574+
3575+#define IOREQ_BUFFER_SLOT_NUM 511 /* 8 bytes each, plus 2 4-byte indexes */
3576+struct buffered_iopage {
3577+ unsigned int read_pointer;
3578+ unsigned int write_pointer;
3579+ buf_ioreq_t buf_ioreq[IOREQ_BUFFER_SLOT_NUM];
3580+}; /* NB. Size of this structure must be no greater than one page. */
3581+typedef struct buffered_iopage buffered_iopage_t;
3582+
3583+#if defined(__ia64__)
3584+struct pio_buffer {
3585+ uint32_t page_offset;
3586+ uint32_t pointer;
3587+ uint32_t data_end;
3588+ uint32_t buf_size;
3589+ void *opaque;
3590+};
3591+
3592+#define PIO_BUFFER_IDE_PRIMARY 0 /* I/O port = 0x1F0 */
3593+#define PIO_BUFFER_IDE_SECONDARY 1 /* I/O port = 0x170 */
3594+#define PIO_BUFFER_ENTRY_NUM 2
3595+struct buffered_piopage {
3596+ struct pio_buffer pio[PIO_BUFFER_ENTRY_NUM];
3597+ uint8_t buffer[1];
3598+};
3599+#endif /* defined(__ia64__) */
3600+
3601+#define ACPI_PM1A_EVT_BLK_ADDRESS 0x0000000000001f40
3602+#define ACPI_PM1A_CNT_BLK_ADDRESS (ACPI_PM1A_EVT_BLK_ADDRESS + 0x04)
3603+#define ACPI_PM_TMR_BLK_ADDRESS (ACPI_PM1A_EVT_BLK_ADDRESS + 0x08)
3604+#define ACPI_GPE0_BLK_ADDRESS (ACPI_PM_TMR_BLK_ADDRESS + 0x20)
3605+#define ACPI_GPE0_BLK_LEN 0x08
3606+
3607+#endif /* _IOREQ_H_ */
3608+
3609+/*
3610+ * Local variables:
3611+ * mode: C
3612+ * c-set-style: "BSD"
3613+ * c-basic-offset: 4
3614+ * tab-width: 4
3615+ * indent-tabs-mode: nil
3616+ * End:
3617+ */
3618Index: head-2008-11-25/include/xen/interface/hvm/params.h
3619===================================================================
3620--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3621+++ head-2008-11-25/include/xen/interface/hvm/params.h 2008-10-29 09:55:56.000000000 +0100
3622@@ -0,0 +1,105 @@
3623+/*
3624+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3625+ * of this software and associated documentation files (the "Software"), to
3626+ * deal in the Software without restriction, including without limitation the
3627+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3628+ * sell copies of the Software, and to permit persons to whom the Software is
3629+ * furnished to do so, subject to the following conditions:
3630+ *
3631+ * The above copyright notice and this permission notice shall be included in
3632+ * all copies or substantial portions of the Software.
3633+ *
3634+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3635+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3636+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3637+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3638+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3639+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3640+ * DEALINGS IN THE SOFTWARE.
3641+ */
3642+
3643+#ifndef __XEN_PUBLIC_HVM_PARAMS_H__
3644+#define __XEN_PUBLIC_HVM_PARAMS_H__
3645+
3646+#include "hvm_op.h"
3647+
3648+/*
3649+ * Parameter space for HVMOP_{set,get}_param.
3650+ */
3651+
3652+/*
3653+ * How should CPU0 event-channel notifications be delivered?
3654+ * val[63:56] == 0: val[55:0] is a delivery GSI (Global System Interrupt).
3655+ * val[63:56] == 1: val[55:0] is a delivery PCI INTx line, as follows:
3656+ * Domain = val[47:32], Bus = val[31:16],
3657+ * DevFn = val[15: 8], IntX = val[ 1: 0]
3658+ * If val == 0 then CPU0 event-channel notifications are not delivered.
3659+ */
3660+#define HVM_PARAM_CALLBACK_IRQ 0
3661+
3662+/*
3663+ * These are not used by Xen. They are here for convenience of HVM-guest
3664+ * xenbus implementations.
3665+ */
3666+#define HVM_PARAM_STORE_PFN 1
3667+#define HVM_PARAM_STORE_EVTCHN 2
3668+
3669+#define HVM_PARAM_PAE_ENABLED 4
3670+
3671+#define HVM_PARAM_IOREQ_PFN 5
3672+
3673+#define HVM_PARAM_BUFIOREQ_PFN 6
3674+
3675+#ifdef __ia64__
3676+
3677+#define HVM_PARAM_NVRAM_FD 7
3678+#define HVM_PARAM_VHPT_SIZE 8
3679+#define HVM_PARAM_BUFPIOREQ_PFN 9
3680+
3681+#elif defined(__i386__) || defined(__x86_64__)
3682+
3683+/* Expose Viridian interfaces to this HVM guest? */
3684+#define HVM_PARAM_VIRIDIAN 9
3685+
3686+#endif
3687+
3688+/*
3689+ * Set mode for virtual timers (currently x86 only):
3690+ * delay_for_missed_ticks (default):
3691+ * Do not advance a vcpu's time beyond the correct delivery time for
3692+ * interrupts that have been missed due to preemption. Deliver missed
3693+ * interrupts when the vcpu is rescheduled and advance the vcpu's virtual
3694+ * time stepwise for each one.
3695+ * no_delay_for_missed_ticks:
3696+ * As above, missed interrupts are delivered, but guest time always tracks
3697+ * wallclock (i.e., real) time while doing so.
3698+ * no_missed_ticks_pending:
3699+ * No missed interrupts are held pending. Instead, to ensure ticks are
3700+ * delivered at some non-zero rate, if we detect missed ticks then the
3701+ * internal tick alarm is not disabled if the VCPU is preempted during the
3702+ * next tick period.
3703+ * one_missed_tick_pending:
3704+ * Missed interrupts are collapsed together and delivered as one 'late tick'.
3705+ * Guest time always tracks wallclock (i.e., real) time.
3706+ */
3707+#define HVM_PARAM_TIMER_MODE 10
3708+#define HVMPTM_delay_for_missed_ticks 0
3709+#define HVMPTM_no_delay_for_missed_ticks 1
3710+#define HVMPTM_no_missed_ticks_pending 2
3711+#define HVMPTM_one_missed_tick_pending 3
3712+
3713+/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
3714+#define HVM_PARAM_HPET_ENABLED 11
3715+
3716+/* Identity-map page directory used by Intel EPT when CR0.PG=0. */
3717+#define HVM_PARAM_IDENT_PT 12
3718+
3719+/* Device Model domain, defaults to 0. */
3720+#define HVM_PARAM_DM_DOMAIN 13
3721+
3722+/* ACPI S state: currently support S0 and S3 on x86. */
3723+#define HVM_PARAM_ACPI_S_STATE 14
3724+
3725+#define HVM_NR_PARAMS 15
3726+
3727+#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
3728Index: head-2008-11-25/include/xen/interface/hvm/save.h
3729===================================================================
3730--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3731+++ head-2008-11-25/include/xen/interface/hvm/save.h 2008-04-02 12:34:02.000000000 +0200
3732@@ -0,0 +1,88 @@
3733+/*
3734+ * hvm/save.h
3735+ *
3736+ * Structure definitions for HVM state that is held by Xen and must
3737+ * be saved along with the domain's memory and device-model state.
3738+ *
3739+ * Copyright (c) 2007 XenSource Ltd.
3740+ *
3741+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3742+ * of this software and associated documentation files (the "Software"), to
3743+ * deal in the Software without restriction, including without limitation the
3744+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3745+ * sell copies of the Software, and to permit persons to whom the Software is
3746+ * furnished to do so, subject to the following conditions:
3747+ *
3748+ * The above copyright notice and this permission notice shall be included in
3749+ * all copies or substantial portions of the Software.
3750+ *
3751+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3752+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3753+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3754+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3755+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3756+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3757+ * DEALINGS IN THE SOFTWARE.
3758+ */
3759+
3760+#ifndef __XEN_PUBLIC_HVM_SAVE_H__
3761+#define __XEN_PUBLIC_HVM_SAVE_H__
3762+
3763+/*
3764+ * Structures in this header *must* have the same layout in 32bit
3765+ * and 64bit environments: this means that all fields must be explicitly
3766+ * sized types and aligned to their sizes, and the structs must be
3767+ * a multiple of eight bytes long.
3768+ *
3769+ * Only the state necessary for saving and restoring (i.e. fields
3770+ * that are analogous to actual hardware state) should go in this file.
3771+ * Internal mechanisms should be kept in Xen-private headers.
3772+ */
3773+
3774+#if !defined(__GNUC__) || defined(__STRICT_ANSI__)
3775+#error "Anonymous structs/unions are a GNU extension."
3776+#endif
3777+
3778+/*
3779+ * Each entry is preceded by a descriptor giving its type and length
3780+ */
3781+struct hvm_save_descriptor {
3782+ uint16_t typecode; /* Used to demux the various types below */
3783+ uint16_t instance; /* Further demux within a type */
3784+ uint32_t length; /* In bytes, *not* including this descriptor */
3785+};
3786+
3787+
3788+/*
3789+ * Each entry has a datatype associated with it: for example, the CPU state
3790+ * is saved as a HVM_SAVE_TYPE(CPU), which has HVM_SAVE_LENGTH(CPU),
3791+ * and is identified by a descriptor with typecode HVM_SAVE_CODE(CPU).
3792+ * DECLARE_HVM_SAVE_TYPE binds these things together with some type-system
3793+ * ugliness.
3794+ */
3795+
3796+#define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \
3797+ struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; }
3798+
3799+#define HVM_SAVE_TYPE(_x) typeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->t)
3800+#define HVM_SAVE_LENGTH(_x) (sizeof (HVM_SAVE_TYPE(_x)))
3801+#define HVM_SAVE_CODE(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->c))
3802+
3803+
3804+/*
3805+ * The series of save records is teminated by a zero-type, zero-length
3806+ * descriptor.
3807+ */
3808+
3809+struct hvm_save_end {};
3810+DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end);
3811+
3812+#if defined(__i386__) || defined(__x86_64__)
3813+#include "../arch-x86/hvm/save.h"
3814+#elif defined(__ia64__)
3815+#include "../arch-ia64/hvm/save.h"
3816+#else
3817+#error "unsupported architecture"
3818+#endif
3819+
3820+#endif /* __XEN_PUBLIC_HVM_SAVE_H__ */
3821Index: head-2008-11-25/include/xen/interface/hvm/vmx_assist.h
3822===================================================================
3823--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3824+++ head-2008-11-25/include/xen/interface/hvm/vmx_assist.h 2007-06-12 13:14:19.000000000 +0200
3825@@ -0,0 +1,122 @@
3826+/*
3827+ * vmx_assist.h: Context definitions for the VMXASSIST world switch.
3828+ *
3829+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3830+ * of this software and associated documentation files (the "Software"), to
3831+ * deal in the Software without restriction, including without limitation the
3832+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3833+ * sell copies of the Software, and to permit persons to whom the Software is
3834+ * furnished to do so, subject to the following conditions:
3835+ *
3836+ * The above copyright notice and this permission notice shall be included in
3837+ * all copies or substantial portions of the Software.
3838+ *
3839+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3840+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3841+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3842+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3843+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3844+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3845+ * DEALINGS IN THE SOFTWARE.
3846+ *
3847+ * Leendert van Doorn, leendert@watson.ibm.com
3848+ * Copyright (c) 2005, International Business Machines Corporation.
3849+ */
3850+
3851+#ifndef _VMX_ASSIST_H_
3852+#define _VMX_ASSIST_H_
3853+
3854+#define VMXASSIST_BASE 0xD0000
3855+#define VMXASSIST_MAGIC 0x17101966
3856+#define VMXASSIST_MAGIC_OFFSET (VMXASSIST_BASE+8)
3857+
3858+#define VMXASSIST_NEW_CONTEXT (VMXASSIST_BASE + 12)
3859+#define VMXASSIST_OLD_CONTEXT (VMXASSIST_NEW_CONTEXT + 4)
3860+
3861+#ifndef __ASSEMBLY__
3862+
3863+#define NR_EXCEPTION_HANDLER 32
3864+#define NR_INTERRUPT_HANDLERS 16
3865+#define NR_TRAPS (NR_EXCEPTION_HANDLER+NR_INTERRUPT_HANDLERS)
3866+
3867+union vmcs_arbytes {
3868+ struct arbyte_fields {
3869+ unsigned int seg_type : 4,
3870+ s : 1,
3871+ dpl : 2,
3872+ p : 1,
3873+ reserved0 : 4,
3874+ avl : 1,
3875+ reserved1 : 1,
3876+ default_ops_size: 1,
3877+ g : 1,
3878+ null_bit : 1,
3879+ reserved2 : 15;
3880+ } fields;
3881+ unsigned int bytes;
3882+};
3883+
3884+/*
3885+ * World switch state
3886+ */
3887+struct vmx_assist_context {
3888+ uint32_t eip; /* execution pointer */
3889+ uint32_t esp; /* stack pointer */
3890+ uint32_t eflags; /* flags register */
3891+ uint32_t cr0;
3892+ uint32_t cr3; /* page table directory */
3893+ uint32_t cr4;
3894+ uint32_t idtr_limit; /* idt */
3895+ uint32_t idtr_base;
3896+ uint32_t gdtr_limit; /* gdt */
3897+ uint32_t gdtr_base;
3898+ uint32_t cs_sel; /* cs selector */
3899+ uint32_t cs_limit;
3900+ uint32_t cs_base;
3901+ union vmcs_arbytes cs_arbytes;
3902+ uint32_t ds_sel; /* ds selector */
3903+ uint32_t ds_limit;
3904+ uint32_t ds_base;
3905+ union vmcs_arbytes ds_arbytes;
3906+ uint32_t es_sel; /* es selector */
3907+ uint32_t es_limit;
3908+ uint32_t es_base;
3909+ union vmcs_arbytes es_arbytes;
3910+ uint32_t ss_sel; /* ss selector */
3911+ uint32_t ss_limit;
3912+ uint32_t ss_base;
3913+ union vmcs_arbytes ss_arbytes;
3914+ uint32_t fs_sel; /* fs selector */
3915+ uint32_t fs_limit;
3916+ uint32_t fs_base;
3917+ union vmcs_arbytes fs_arbytes;
3918+ uint32_t gs_sel; /* gs selector */
3919+ uint32_t gs_limit;
3920+ uint32_t gs_base;
3921+ union vmcs_arbytes gs_arbytes;
3922+ uint32_t tr_sel; /* task selector */
3923+ uint32_t tr_limit;
3924+ uint32_t tr_base;
3925+ union vmcs_arbytes tr_arbytes;
3926+ uint32_t ldtr_sel; /* ldtr selector */
3927+ uint32_t ldtr_limit;
3928+ uint32_t ldtr_base;
3929+ union vmcs_arbytes ldtr_arbytes;
3930+
3931+ unsigned char rm_irqbase[2];
3932+};
3933+typedef struct vmx_assist_context vmx_assist_context_t;
3934+
3935+#endif /* __ASSEMBLY__ */
3936+
3937+#endif /* _VMX_ASSIST_H_ */
3938+
3939+/*
3940+ * Local variables:
3941+ * mode: C
3942+ * c-set-style: "BSD"
3943+ * c-basic-offset: 4
3944+ * tab-width: 4
3945+ * indent-tabs-mode: nil
3946+ * End:
3947+ */
3948Index: head-2008-11-25/include/xen/interface/io/fsif.h
3949===================================================================
3950--- /dev/null 1970-01-01 00:00:00.000000000 +0000
3951+++ head-2008-11-25/include/xen/interface/io/fsif.h 2008-09-01 12:07:31.000000000 +0200
3952@@ -0,0 +1,191 @@
3953+/******************************************************************************
3954+ * fsif.h
3955+ *
3956+ * Interface to FS level split device drivers.
3957+ *
3958+ * Permission is hereby granted, free of charge, to any person obtaining a copy
3959+ * of this software and associated documentation files (the "Software"), to
3960+ * deal in the Software without restriction, including without limitation the
3961+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3962+ * sell copies of the Software, and to permit persons to whom the Software is
3963+ * furnished to do so, subject to the following conditions:
3964+ *
3965+ * The above copyright notice and this permission notice shall be included in
3966+ * all copies or substantial portions of the Software.
3967+ *
3968+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3969+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3970+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3971+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3972+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3973+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3974+ * DEALINGS IN THE SOFTWARE.
3975+ *
3976+ * Copyright (c) 2007, Grzegorz Milos, <gm281@cam.ac.uk>.
3977+ */
3978+
3979+#ifndef __XEN_PUBLIC_IO_FSIF_H__
3980+#define __XEN_PUBLIC_IO_FSIF_H__
3981+
3982+#include "ring.h"
3983+#include "../grant_table.h"
3984+
3985+#define REQ_FILE_OPEN 1
3986+#define REQ_FILE_CLOSE 2
3987+#define REQ_FILE_READ 3
3988+#define REQ_FILE_WRITE 4
3989+#define REQ_STAT 5
3990+#define REQ_FILE_TRUNCATE 6
3991+#define REQ_REMOVE 7
3992+#define REQ_RENAME 8
3993+#define REQ_CREATE 9
3994+#define REQ_DIR_LIST 10
3995+#define REQ_CHMOD 11
3996+#define REQ_FS_SPACE 12
3997+#define REQ_FILE_SYNC 13
3998+
3999+struct fsif_open_request {
4000+ grant_ref_t gref;
4001+};
4002+
4003+struct fsif_close_request {
4004+ uint32_t fd;
4005+};
4006+
4007+struct fsif_read_request {
4008+ uint32_t fd;
4009+ int32_t pad;
4010+ uint64_t len;
4011+ uint64_t offset;
4012+ grant_ref_t grefs[1]; /* Variable length */
4013+};
4014+
4015+struct fsif_write_request {
4016+ uint32_t fd;
4017+ int32_t pad;
4018+ uint64_t len;
4019+ uint64_t offset;
4020+ grant_ref_t grefs[1]; /* Variable length */
4021+};
4022+
4023+struct fsif_stat_request {
4024+ uint32_t fd;
4025+};
4026+
4027+/* This structure is a copy of some fields from stat structure, returned
4028+ * via the ring. */
4029+struct fsif_stat_response {
4030+ int32_t stat_mode;
4031+ uint32_t stat_uid;
4032+ uint32_t stat_gid;
4033+ int32_t stat_ret;
4034+ int64_t stat_size;
4035+ int64_t stat_atime;
4036+ int64_t stat_mtime;
4037+ int64_t stat_ctime;
4038+};
4039+
4040+struct fsif_truncate_request {
4041+ uint32_t fd;
4042+ int32_t pad;
4043+ int64_t length;
4044+};
4045+
4046+struct fsif_remove_request {
4047+ grant_ref_t gref;
4048+};
4049+
4050+struct fsif_rename_request {
4051+ uint16_t old_name_offset;
4052+ uint16_t new_name_offset;
4053+ grant_ref_t gref;
4054+};
4055+
4056+struct fsif_create_request {
4057+ int8_t directory;
4058+ int8_t pad;
4059+ int16_t pad2;
4060+ int32_t mode;
4061+ grant_ref_t gref;
4062+};
4063+
4064+struct fsif_list_request {
4065+ uint32_t offset;
4066+ grant_ref_t gref;
4067+};
4068+
4069+#define NR_FILES_SHIFT 0
4070+#define NR_FILES_SIZE 16 /* 16 bits for the number of files mask */
4071+#define NR_FILES_MASK (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT)
4072+#define ERROR_SIZE 32 /* 32 bits for the error mask */
4073+#define ERROR_SHIFT (NR_FILES_SIZE + NR_FILES_SHIFT)
4074+#define ERROR_MASK (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT)
4075+#define HAS_MORE_SHIFT (ERROR_SHIFT + ERROR_SIZE)
4076+#define HAS_MORE_FLAG (1ULL << HAS_MORE_SHIFT)
4077+
4078+struct fsif_chmod_request {
4079+ uint32_t fd;
4080+ int32_t mode;
4081+};
4082+
4083+struct fsif_space_request {
4084+ grant_ref_t gref;
4085+};
4086+
4087+struct fsif_sync_request {
4088+ uint32_t fd;
4089+};
4090+
4091+
4092+/* FS operation request */
4093+struct fsif_request {
4094+ uint8_t type; /* Type of the request */
4095+ uint8_t pad;
4096+ uint16_t id; /* Request ID, copied to the response */
4097+ uint32_t pad2;
4098+ union {
4099+ struct fsif_open_request fopen;
4100+ struct fsif_close_request fclose;
4101+ struct fsif_read_request fread;
4102+ struct fsif_write_request fwrite;
4103+ struct fsif_stat_request fstat;
4104+ struct fsif_truncate_request ftruncate;
4105+ struct fsif_remove_request fremove;
4106+ struct fsif_rename_request frename;
4107+ struct fsif_create_request fcreate;
4108+ struct fsif_list_request flist;
4109+ struct fsif_chmod_request fchmod;
4110+ struct fsif_space_request fspace;
4111+ struct fsif_sync_request fsync;
4112+ } u;
4113+};
4114+typedef struct fsif_request fsif_request_t;
4115+
4116+/* FS operation response */
4117+struct fsif_response {
4118+ uint16_t id;
4119+ uint16_t pad1;
4120+ uint32_t pad2;
4121+ union {
4122+ uint64_t ret_val;
4123+ struct fsif_stat_response fstat;
4124+ };
4125+};
4126+
4127+typedef struct fsif_response fsif_response_t;
4128+
4129+#define FSIF_RING_ENTRY_SIZE 64
4130+
4131+#define FSIF_NR_READ_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) / \
4132+ sizeof(grant_ref_t) + 1)
4133+#define FSIF_NR_WRITE_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \
4134+ sizeof(grant_ref_t) + 1)
4135+
4136+DEFINE_RING_TYPES(fsif, struct fsif_request, struct fsif_response);
4137+
4138+#define STATE_INITIALISED "init"
4139+#define STATE_READY "ready"
4140+
4141+
4142+
4143+#endif
4144Index: head-2008-11-25/include/xen/interface/io/pciif.h
4145===================================================================
4146--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4147+++ head-2008-11-25/include/xen/interface/io/pciif.h 2008-07-21 11:00:33.000000000 +0200
4148@@ -0,0 +1,101 @@
4149+/*
4150+ * PCI Backend/Frontend Common Data Structures & Macros
4151+ *
4152+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4153+ * of this software and associated documentation files (the "Software"), to
4154+ * deal in the Software without restriction, including without limitation the
4155+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4156+ * sell copies of the Software, and to permit persons to whom the Software is
4157+ * furnished to do so, subject to the following conditions:
4158+ *
4159+ * The above copyright notice and this permission notice shall be included in
4160+ * all copies or substantial portions of the Software.
4161+ *
4162+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4163+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4164+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4165+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4166+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4167+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4168+ * DEALINGS IN THE SOFTWARE.
4169+ *
4170+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
4171+ */
4172+#ifndef __XEN_PCI_COMMON_H__
4173+#define __XEN_PCI_COMMON_H__
4174+
4175+/* Be sure to bump this number if you change this file */
4176+#define XEN_PCI_MAGIC "7"
4177+
4178+/* xen_pci_sharedinfo flags */
4179+#define _XEN_PCIF_active (0)
4180+#define XEN_PCIF_active (1<<_XEN_PCI_active)
4181+
4182+/* xen_pci_op commands */
4183+#define XEN_PCI_OP_conf_read (0)
4184+#define XEN_PCI_OP_conf_write (1)
4185+#define XEN_PCI_OP_enable_msi (2)
4186+#define XEN_PCI_OP_disable_msi (3)
4187+#define XEN_PCI_OP_enable_msix (4)
4188+#define XEN_PCI_OP_disable_msix (5)
4189+
4190+/* xen_pci_op error numbers */
4191+#define XEN_PCI_ERR_success (0)
4192+#define XEN_PCI_ERR_dev_not_found (-1)
4193+#define XEN_PCI_ERR_invalid_offset (-2)
4194+#define XEN_PCI_ERR_access_denied (-3)
4195+#define XEN_PCI_ERR_not_implemented (-4)
4196+/* XEN_PCI_ERR_op_failed - backend failed to complete the operation */
4197+#define XEN_PCI_ERR_op_failed (-5)
4198+
4199+/*
4200+ * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry))
4201+ * Should not exceed 128
4202+ */
4203+#define SH_INFO_MAX_VEC 128
4204+
4205+struct xen_msix_entry {
4206+ uint16_t vector;
4207+ uint16_t entry;
4208+};
4209+struct xen_pci_op {
4210+ /* IN: what action to perform: XEN_PCI_OP_* */
4211+ uint32_t cmd;
4212+
4213+ /* OUT: will contain an error number (if any) from errno.h */
4214+ int32_t err;
4215+
4216+ /* IN: which device to touch */
4217+ uint32_t domain; /* PCI Domain/Segment */
4218+ uint32_t bus;
4219+ uint32_t devfn;
4220+
4221+ /* IN: which configuration registers to touch */
4222+ int32_t offset;
4223+ int32_t size;
4224+
4225+ /* IN/OUT: Contains the result after a READ or the value to WRITE */
4226+ uint32_t value;
4227+ /* IN: Contains extra infor for this operation */
4228+ uint32_t info;
4229+ /*IN: param for msi-x */
4230+ struct xen_msix_entry msix_entries[SH_INFO_MAX_VEC];
4231+};
4232+
4233+struct xen_pci_sharedinfo {
4234+ /* flags - XEN_PCIF_* */
4235+ uint32_t flags;
4236+ struct xen_pci_op op;
4237+};
4238+
4239+#endif /* __XEN_PCI_COMMON_H__ */
4240+
4241+/*
4242+ * Local variables:
4243+ * mode: C
4244+ * c-set-style: "BSD"
4245+ * c-basic-offset: 4
4246+ * tab-width: 4
4247+ * indent-tabs-mode: nil
4248+ * End:
4249+ */
4250Index: head-2008-11-25/include/xen/interface/io/tpmif.h
4251===================================================================
4252--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4253+++ head-2008-11-25/include/xen/interface/io/tpmif.h 2007-06-12 13:14:19.000000000 +0200
4254@@ -0,0 +1,77 @@
4255+/******************************************************************************
4256+ * tpmif.h
4257+ *
4258+ * TPM I/O interface for Xen guest OSes.
4259+ *
4260+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4261+ * of this software and associated documentation files (the "Software"), to
4262+ * deal in the Software without restriction, including without limitation the
4263+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4264+ * sell copies of the Software, and to permit persons to whom the Software is
4265+ * furnished to do so, subject to the following conditions:
4266+ *
4267+ * The above copyright notice and this permission notice shall be included in
4268+ * all copies or substantial portions of the Software.
4269+ *
4270+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4271+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4272+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4273+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4274+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4275+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4276+ * DEALINGS IN THE SOFTWARE.
4277+ *
4278+ * Copyright (c) 2005, IBM Corporation
4279+ *
4280+ * Author: Stefan Berger, stefanb@us.ibm.com
4281+ * Grant table support: Mahadevan Gomathisankaran
4282+ *
4283+ * This code has been derived from tools/libxc/xen/io/netif.h
4284+ *
4285+ * Copyright (c) 2003-2004, Keir Fraser
4286+ */
4287+
4288+#ifndef __XEN_PUBLIC_IO_TPMIF_H__
4289+#define __XEN_PUBLIC_IO_TPMIF_H__
4290+
4291+#include "../grant_table.h"
4292+
4293+struct tpmif_tx_request {
4294+ unsigned long addr; /* Machine address of packet. */
4295+ grant_ref_t ref; /* grant table access reference */
4296+ uint16_t unused;
4297+ uint16_t size; /* Packet size in bytes. */
4298+};
4299+typedef struct tpmif_tx_request tpmif_tx_request_t;
4300+
4301+/*
4302+ * The TPMIF_TX_RING_SIZE defines the number of pages the
4303+ * front-end and backend can exchange (= size of array).
4304+ */
4305+typedef uint32_t TPMIF_RING_IDX;
4306+
4307+#define TPMIF_TX_RING_SIZE 1
4308+
4309+/* This structure must fit in a memory page. */
4310+
4311+struct tpmif_ring {
4312+ struct tpmif_tx_request req;
4313+};
4314+typedef struct tpmif_ring tpmif_ring_t;
4315+
4316+struct tpmif_tx_interface {
4317+ struct tpmif_ring ring[TPMIF_TX_RING_SIZE];
4318+};
4319+typedef struct tpmif_tx_interface tpmif_tx_interface_t;
4320+
4321+#endif
4322+
4323+/*
4324+ * Local variables:
4325+ * mode: C
4326+ * c-set-style: "BSD"
4327+ * c-basic-offset: 4
4328+ * tab-width: 4
4329+ * indent-tabs-mode: nil
4330+ * End:
4331+ */
4332Index: head-2008-11-25/include/xen/interface/io/vscsiif.h
4333===================================================================
4334--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4335+++ head-2008-11-25/include/xen/interface/io/vscsiif.h 2008-07-21 11:00:33.000000000 +0200
4336@@ -0,0 +1,105 @@
4337+/******************************************************************************
4338+ * vscsiif.h
4339+ *
4340+ * Based on the blkif.h code.
4341+ *
4342+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4343+ * of this software and associated documentation files (the "Software"), to
4344+ * deal in the Software without restriction, including without limitation the
4345+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4346+ * sell copies of the Software, and to permit persons to whom the Software is
4347+ * furnished to do so, subject to the following conditions:
4348+ *
4349+ * The above copyright notice and this permission notice shall be included in
4350+ * all copies or substantial portions of the Software.
4351+ *
4352+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4353+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4354+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4355+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4356+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4357+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4358+ * DEALINGS IN THE SOFTWARE.
4359+ *
4360+ * Copyright(c) FUJITSU Limited 2008.
4361+ */
4362+
4363+#ifndef __XEN__PUBLIC_IO_SCSI_H__
4364+#define __XEN__PUBLIC_IO_SCSI_H__
4365+
4366+#include "ring.h"
4367+#include "../grant_table.h"
4368+
4369+/* command between backend and frontend */
4370+#define VSCSIIF_ACT_SCSI_CDB 1 /* SCSI CDB command */
4371+#define VSCSIIF_ACT_SCSI_ABORT 2 /* SCSI Device(Lun) Abort*/
4372+#define VSCSIIF_ACT_SCSI_RESET 3 /* SCSI Device(Lun) Reset*/
4373+
4374+
4375+#define VSCSIIF_BACK_MAX_PENDING_REQS 128
4376+
4377+/*
4378+ * Maximum scatter/gather segments per request.
4379+ *
4380+ * Considering balance between allocating al least 16 "vscsiif_request"
4381+ * structures on one page (4096bytes) and number of scatter gather
4382+ * needed, we decided to use 26 as a magic number.
4383+ */
4384+#define VSCSIIF_SG_TABLESIZE 26
4385+
4386+/*
4387+ * base on linux kernel 2.6.18
4388+ */
4389+#define VSCSIIF_MAX_COMMAND_SIZE 16
4390+#define VSCSIIF_SENSE_BUFFERSIZE 96
4391+
4392+
4393+struct vscsiif_request {
4394+ uint16_t rqid; /* private guest value, echoed in resp */
4395+ uint8_t act; /* command between backend and frontend */
4396+ uint8_t cmd_len;
4397+
4398+ uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE];
4399+ uint16_t timeout_per_command; /* The command is issued by twice
4400+ the value in Backend. */
4401+ uint16_t channel, id, lun;
4402+ uint16_t padding;
4403+ uint8_t sc_data_direction; /* for DMA_TO_DEVICE(1)
4404+ DMA_FROM_DEVICE(2)
4405+ DMA_NONE(3) requests */
4406+ uint8_t nr_segments; /* Number of pieces of scatter-gather */
4407+
4408+ struct scsiif_request_segment {
4409+ grant_ref_t gref;
4410+ uint16_t offset;
4411+ uint16_t length;
4412+ } seg[VSCSIIF_SG_TABLESIZE];
4413+ uint32_t reserved[3];
4414+};
4415+typedef struct vscsiif_request vscsiif_request_t;
4416+
4417+struct vscsiif_response {
4418+ uint16_t rqid;
4419+ uint8_t padding;
4420+ uint8_t sense_len;
4421+ uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE];
4422+ int32_t rslt;
4423+ uint32_t residual_len; /* request bufflen -
4424+ return the value from physical device */
4425+ uint32_t reserved[36];
4426+};
4427+typedef struct vscsiif_response vscsiif_response_t;
4428+
4429+DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response);
4430+
4431+
4432+#endif /*__XEN__PUBLIC_IO_SCSI_H__*/
4433+/*
4434+ * Local variables:
4435+ * mode: C
4436+ * c-set-style: "BSD"
4437+ * c-basic-offset: 4
4438+ * tab-width: 4
4439+ * indent-tabs-mode: nil
4440+ * End:
4441+ */
4442Index: head-2008-11-25/include/xen/interface/kexec.h
4443===================================================================
4444--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4445+++ head-2008-11-25/include/xen/interface/kexec.h 2008-11-25 12:22:34.000000000 +0100
4446@@ -0,0 +1,168 @@
4447+/******************************************************************************
4448+ * kexec.h - Public portion
4449+ *
4450+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4451+ * of this software and associated documentation files (the "Software"), to
4452+ * deal in the Software without restriction, including without limitation the
4453+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4454+ * sell copies of the Software, and to permit persons to whom the Software is
4455+ * furnished to do so, subject to the following conditions:
4456+ *
4457+ * The above copyright notice and this permission notice shall be included in
4458+ * all copies or substantial portions of the Software.
4459+ *
4460+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4461+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4462+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4463+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4464+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4465+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4466+ * DEALINGS IN THE SOFTWARE.
4467+ *
4468+ * Xen port written by:
4469+ * - Simon 'Horms' Horman <horms@verge.net.au>
4470+ * - Magnus Damm <magnus@valinux.co.jp>
4471+ */
4472+
4473+#ifndef _XEN_PUBLIC_KEXEC_H
4474+#define _XEN_PUBLIC_KEXEC_H
4475+
4476+
4477+/* This file describes the Kexec / Kdump hypercall interface for Xen.
4478+ *
4479+ * Kexec under vanilla Linux allows a user to reboot the physical machine
4480+ * into a new user-specified kernel. The Xen port extends this idea
4481+ * to allow rebooting of the machine from dom0. When kexec for dom0
4482+ * is used to reboot, both the hypervisor and the domains get replaced
4483+ * with some other kernel. It is possible to kexec between vanilla
4484+ * Linux and Xen and back again. Xen to Xen works well too.
4485+ *
4486+ * The hypercall interface for kexec can be divided into three main
4487+ * types of hypercall operations:
4488+ *
4489+ * 1) Range information:
4490+ * This is used by the dom0 kernel to ask the hypervisor about various
4491+ * address information. This information is needed to allow kexec-tools
4492+ * to fill in the ELF headers for /proc/vmcore properly.
4493+ *
4494+ * 2) Load and unload of images:
4495+ * There are no big surprises here, the kexec binary from kexec-tools
4496+ * runs in userspace in dom0. The tool loads/unloads data into the
4497+ * dom0 kernel such as new kernel, initramfs and hypervisor. When
4498+ * loaded the dom0 kernel performs a load hypercall operation, and
4499+ * before releasing all page references the dom0 kernel calls unload.
4500+ *
4501+ * 3) Kexec operation:
4502+ * This is used to start a previously loaded kernel.
4503+ */
4504+
4505+#include "xen.h"
4506+
4507+#if defined(__i386__) || defined(__x86_64__)
4508+#define KEXEC_XEN_NO_PAGES 17
4509+#endif
4510+
4511+/*
4512+ * Prototype for this hypercall is:
4513+ * int kexec_op(int cmd, void *args)
4514+ * @cmd == KEXEC_CMD_...
4515+ * KEXEC operation to perform
4516+ * @args == Operation-specific extra arguments (NULL if none).
4517+ */
4518+
4519+/*
4520+ * Kexec supports two types of operation:
4521+ * - kexec into a regular kernel, very similar to a standard reboot
4522+ * - KEXEC_TYPE_DEFAULT is used to specify this type
4523+ * - kexec into a special "crash kernel", aka kexec-on-panic
4524+ * - KEXEC_TYPE_CRASH is used to specify this type
4525+ * - parts of our system may be broken at kexec-on-panic time
4526+ * - the code should be kept as simple and self-contained as possible
4527+ */
4528+
4529+#define KEXEC_TYPE_DEFAULT 0
4530+#define KEXEC_TYPE_CRASH 1
4531+
4532+
4533+/* The kexec implementation for Xen allows the user to load two
4534+ * types of kernels, KEXEC_TYPE_DEFAULT and KEXEC_TYPE_CRASH.
4535+ * All data needed for a kexec reboot is kept in one xen_kexec_image_t
4536+ * per "instance". The data mainly consists of machine address lists to pages
4537+ * together with destination addresses. The data in xen_kexec_image_t
4538+ * is passed to the "code page" which is one page of code that performs
4539+ * the final relocations before jumping to the new kernel.
4540+ */
4541+
4542+typedef struct xen_kexec_image {
4543+#if defined(__i386__) || defined(__x86_64__)
4544+ unsigned long page_list[KEXEC_XEN_NO_PAGES];
4545+#endif
4546+#if defined(__ia64__)
4547+ unsigned long reboot_code_buffer;
4548+#endif
4549+ unsigned long indirection_page;
4550+ unsigned long start_address;
4551+} xen_kexec_image_t;
4552+
4553+/*
4554+ * Perform kexec having previously loaded a kexec or kdump kernel
4555+ * as appropriate.
4556+ * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in]
4557+ */
4558+#define KEXEC_CMD_kexec 0
4559+typedef struct xen_kexec_exec {
4560+ int type;
4561+} xen_kexec_exec_t;
4562+
4563+/*
4564+ * Load/Unload kernel image for kexec or kdump.
4565+ * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in]
4566+ * image == relocation information for kexec (ignored for unload) [in]
4567+ */
4568+#define KEXEC_CMD_kexec_load 1
4569+#define KEXEC_CMD_kexec_unload 2
4570+typedef struct xen_kexec_load {
4571+ int type;
4572+ xen_kexec_image_t image;
4573+} xen_kexec_load_t;
4574+
4575+#define KEXEC_RANGE_MA_CRASH 0 /* machine address and size of crash area */
4576+#define KEXEC_RANGE_MA_XEN 1 /* machine address and size of Xen itself */
4577+#define KEXEC_RANGE_MA_CPU 2 /* machine address and size of a CPU note */
4578+#define KEXEC_RANGE_MA_XENHEAP 3 /* machine address and size of xenheap
4579+ * Note that although this is adjacent
4580+ * to Xen it exists in a separate EFI
4581+ * region on ia64, and thus needs to be
4582+ * inserted into iomem_machine separately */
4583+#define KEXEC_RANGE_MA_BOOT_PARAM 4 /* machine address and size of
4584+ * the ia64_boot_param */
4585+#define KEXEC_RANGE_MA_EFI_MEMMAP 5 /* machine address and size of
4586+ * of the EFI Memory Map */
4587+#define KEXEC_RANGE_MA_VMCOREINFO 6 /* machine address and size of vmcoreinfo */
4588+
4589+/*
4590+ * Find the address and size of certain memory areas
4591+ * range == KEXEC_RANGE_... [in]
4592+ * nr == physical CPU number (starting from 0) if KEXEC_RANGE_MA_CPU [in]
4593+ * size == number of bytes reserved in window [out]
4594+ * start == address of the first byte in the window [out]
4595+ */
4596+#define KEXEC_CMD_kexec_get_range 3
4597+typedef struct xen_kexec_range {
4598+ int range;
4599+ int nr;
4600+ unsigned long size;
4601+ unsigned long start;
4602+} xen_kexec_range_t;
4603+
4604+#endif /* _XEN_PUBLIC_KEXEC_H */
4605+
4606+/*
4607+ * Local variables:
4608+ * mode: C
4609+ * c-set-style: "BSD"
4610+ * c-basic-offset: 4
4611+ * tab-width: 4
4612+ * indent-tabs-mode: nil
4613+ * End:
4614+ */
4615Index: head-2008-11-25/include/xen/interface/libelf.h
4616===================================================================
4617--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4618+++ head-2008-11-25/include/xen/interface/libelf.h 2008-07-21 11:00:33.000000000 +0200
4619@@ -0,0 +1,265 @@
4620+/******************************************************************************
4621+ * libelf.h
4622+ *
4623+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4624+ * of this software and associated documentation files (the "Software"), to
4625+ * deal in the Software without restriction, including without limitation the
4626+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4627+ * sell copies of the Software, and to permit persons to whom the Software is
4628+ * furnished to do so, subject to the following conditions:
4629+ *
4630+ * The above copyright notice and this permission notice shall be included in
4631+ * all copies or substantial portions of the Software.
4632+ *
4633+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4634+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4635+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4636+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4637+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4638+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4639+ * DEALINGS IN THE SOFTWARE.
4640+ */
4641+
4642+#ifndef __XC_LIBELF__
4643+#define __XC_LIBELF__ 1
4644+
4645+#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
4646+#define XEN_ELF_LITTLE_ENDIAN
4647+#else
4648+#error define architectural endianness
4649+#endif
4650+
4651+#undef ELFSIZE
4652+#include "elfnote.h"
4653+#include "elfstructs.h"
4654+#include "features.h"
4655+
4656+/* ------------------------------------------------------------------------ */
4657+
4658+typedef union {
4659+ Elf32_Ehdr e32;
4660+ Elf64_Ehdr e64;
4661+} elf_ehdr;
4662+
4663+typedef union {
4664+ Elf32_Phdr e32;
4665+ Elf64_Phdr e64;
4666+} elf_phdr;
4667+
4668+typedef union {
4669+ Elf32_Shdr e32;
4670+ Elf64_Shdr e64;
4671+} elf_shdr;
4672+
4673+typedef union {
4674+ Elf32_Sym e32;
4675+ Elf64_Sym e64;
4676+} elf_sym;
4677+
4678+typedef union {
4679+ Elf32_Rel e32;
4680+ Elf64_Rel e64;
4681+} elf_rel;
4682+
4683+typedef union {
4684+ Elf32_Rela e32;
4685+ Elf64_Rela e64;
4686+} elf_rela;
4687+
4688+typedef union {
4689+ Elf32_Note e32;
4690+ Elf64_Note e64;
4691+} elf_note;
4692+
4693+struct elf_binary {
4694+ /* elf binary */
4695+ const char *image;
4696+ size_t size;
4697+ char class;
4698+ char data;
4699+
4700+ const elf_ehdr *ehdr;
4701+ const char *sec_strtab;
4702+ const elf_shdr *sym_tab;
4703+ const char *sym_strtab;
4704+
4705+ /* loaded to */
4706+ char *dest;
4707+ uint64_t pstart;
4708+ uint64_t pend;
4709+ uint64_t reloc_offset;
4710+
4711+ uint64_t bsd_symtab_pstart;
4712+ uint64_t bsd_symtab_pend;
4713+
4714+#ifndef __XEN__
4715+ /* misc */
4716+ FILE *log;
4717+#endif
4718+ int verbose;
4719+};
4720+
4721+/* ------------------------------------------------------------------------ */
4722+/* accessing elf header fields */
4723+
4724+#ifdef XEN_ELF_BIG_ENDIAN
4725+# define NATIVE_ELFDATA ELFDATA2MSB
4726+#else
4727+# define NATIVE_ELFDATA ELFDATA2LSB
4728+#endif
4729+
4730+#define elf_32bit(elf) (ELFCLASS32 == (elf)->class)
4731+#define elf_64bit(elf) (ELFCLASS64 == (elf)->class)
4732+#define elf_msb(elf) (ELFDATA2MSB == (elf)->data)
4733+#define elf_lsb(elf) (ELFDATA2LSB == (elf)->data)
4734+#define elf_swap(elf) (NATIVE_ELFDATA != (elf)->data)
4735+
4736+#define elf_uval(elf, str, elem) \
4737+ ((ELFCLASS64 == (elf)->class) \
4738+ ? elf_access_unsigned((elf), (str), \
4739+ offsetof(typeof(*(str)),e64.elem), \
4740+ sizeof((str)->e64.elem)) \
4741+ : elf_access_unsigned((elf), (str), \
4742+ offsetof(typeof(*(str)),e32.elem), \
4743+ sizeof((str)->e32.elem)))
4744+
4745+#define elf_sval(elf, str, elem) \
4746+ ((ELFCLASS64 == (elf)->class) \
4747+ ? elf_access_signed((elf), (str), \
4748+ offsetof(typeof(*(str)),e64.elem), \
4749+ sizeof((str)->e64.elem)) \
4750+ : elf_access_signed((elf), (str), \
4751+ offsetof(typeof(*(str)),e32.elem), \
4752+ sizeof((str)->e32.elem)))
4753+
4754+#define elf_size(elf, str) \
4755+ ((ELFCLASS64 == (elf)->class) \
4756+ ? sizeof((str)->e64) : sizeof((str)->e32))
4757+
4758+uint64_t elf_access_unsigned(struct elf_binary *elf, const void *ptr,
4759+ uint64_t offset, size_t size);
4760+int64_t elf_access_signed(struct elf_binary *elf, const void *ptr,
4761+ uint64_t offset, size_t size);
4762+
4763+uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr);
4764+
4765+/* ------------------------------------------------------------------------ */
4766+/* xc_libelf_tools.c */
4767+
4768+int elf_shdr_count(struct elf_binary *elf);
4769+int elf_phdr_count(struct elf_binary *elf);
4770+
4771+const elf_shdr *elf_shdr_by_name(struct elf_binary *elf, const char *name);
4772+const elf_shdr *elf_shdr_by_index(struct elf_binary *elf, int index);
4773+const elf_phdr *elf_phdr_by_index(struct elf_binary *elf, int index);
4774+
4775+const char *elf_section_name(struct elf_binary *elf, const elf_shdr * shdr);
4776+const void *elf_section_start(struct elf_binary *elf, const elf_shdr * shdr);
4777+const void *elf_section_end(struct elf_binary *elf, const elf_shdr * shdr);
4778+
4779+const void *elf_segment_start(struct elf_binary *elf, const elf_phdr * phdr);
4780+const void *elf_segment_end(struct elf_binary *elf, const elf_phdr * phdr);
4781+
4782+const elf_sym *elf_sym_by_name(struct elf_binary *elf, const char *symbol);
4783+const elf_sym *elf_sym_by_index(struct elf_binary *elf, int index);
4784+
4785+const char *elf_note_name(struct elf_binary *elf, const elf_note * note);
4786+const void *elf_note_desc(struct elf_binary *elf, const elf_note * note);
4787+uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note);
4788+const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note);
4789+
4790+int elf_is_elfbinary(const void *image);
4791+int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr);
4792+
4793+/* ------------------------------------------------------------------------ */
4794+/* xc_libelf_loader.c */
4795+
4796+int elf_init(struct elf_binary *elf, const char *image, size_t size);
4797+#ifdef __XEN__
4798+void elf_set_verbose(struct elf_binary *elf);
4799+#else
4800+void elf_set_logfile(struct elf_binary *elf, FILE * log, int verbose);
4801+#endif
4802+
4803+void elf_parse_binary(struct elf_binary *elf);
4804+void elf_load_binary(struct elf_binary *elf);
4805+
4806+void *elf_get_ptr(struct elf_binary *elf, unsigned long addr);
4807+uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol);
4808+
4809+void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private */
4810+
4811+/* ------------------------------------------------------------------------ */
4812+/* xc_libelf_relocate.c */
4813+
4814+int elf_reloc(struct elf_binary *elf);
4815+
4816+/* ------------------------------------------------------------------------ */
4817+/* xc_libelf_dominfo.c */
4818+
4819+#define UNSET_ADDR ((uint64_t)-1)
4820+
4821+enum xen_elfnote_type {
4822+ XEN_ENT_NONE = 0,
4823+ XEN_ENT_LONG = 1,
4824+ XEN_ENT_STR = 2
4825+};
4826+
4827+struct xen_elfnote {
4828+ enum xen_elfnote_type type;
4829+ const char *name;
4830+ union {
4831+ const char *str;
4832+ uint64_t num;
4833+ } data;
4834+};
4835+
4836+struct elf_dom_parms {
4837+ /* raw */
4838+ const char *guest_info;
4839+ const void *elf_note_start;
4840+ const void *elf_note_end;
4841+ struct xen_elfnote elf_notes[XEN_ELFNOTE_MAX + 1];
4842+
4843+ /* parsed */
4844+ char guest_os[16];
4845+ char guest_ver[16];
4846+ char xen_ver[16];
4847+ char loader[16];
4848+ int pae;
4849+ int bsd_symtab;
4850+ uint64_t virt_base;
4851+ uint64_t virt_entry;
4852+ uint64_t virt_hypercall;
4853+ uint64_t virt_hv_start_low;
4854+ uint64_t elf_paddr_offset;
4855+ uint32_t f_supported[XENFEAT_NR_SUBMAPS];
4856+ uint32_t f_required[XENFEAT_NR_SUBMAPS];
4857+
4858+ /* calculated */
4859+ uint64_t virt_offset;
4860+ uint64_t virt_kstart;
4861+ uint64_t virt_kend;
4862+};
4863+
4864+static inline void elf_xen_feature_set(int nr, uint32_t * addr)
4865+{
4866+ addr[nr >> 5] |= 1 << (nr & 31);
4867+}
4868+static inline int elf_xen_feature_get(int nr, uint32_t * addr)
4869+{
4870+ return !!(addr[nr >> 5] & (1 << (nr & 31)));
4871+}
4872+
4873+int elf_xen_parse_features(const char *features,
4874+ uint32_t *supported,
4875+ uint32_t *required);
4876+int elf_xen_parse_note(struct elf_binary *elf,
4877+ struct elf_dom_parms *parms,
4878+ const elf_note *note);
4879+int elf_xen_parse_guest_info(struct elf_binary *elf,
4880+ struct elf_dom_parms *parms);
4881+int elf_xen_parse(struct elf_binary *elf,
4882+ struct elf_dom_parms *parms);
4883+
4884+#endif /* __XC_LIBELF__ */
4885Index: head-2008-11-25/include/xen/interface/nmi.h
4886===================================================================
4887--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4888+++ head-2008-11-25/include/xen/interface/nmi.h 2007-06-12 13:14:19.000000000 +0200
4889@@ -0,0 +1,78 @@
4890+/******************************************************************************
4891+ * nmi.h
4892+ *
4893+ * NMI callback registration and reason codes.
4894+ *
4895+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4896+ * of this software and associated documentation files (the "Software"), to
4897+ * deal in the Software without restriction, including without limitation the
4898+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4899+ * sell copies of the Software, and to permit persons to whom the Software is
4900+ * furnished to do so, subject to the following conditions:
4901+ *
4902+ * The above copyright notice and this permission notice shall be included in
4903+ * all copies or substantial portions of the Software.
4904+ *
4905+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4906+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4907+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4908+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4909+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4910+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4911+ * DEALINGS IN THE SOFTWARE.
4912+ *
4913+ * Copyright (c) 2005, Keir Fraser <keir@xensource.com>
4914+ */
4915+
4916+#ifndef __XEN_PUBLIC_NMI_H__
4917+#define __XEN_PUBLIC_NMI_H__
4918+
4919+/*
4920+ * NMI reason codes:
4921+ * Currently these are x86-specific, stored in arch_shared_info.nmi_reason.
4922+ */
4923+ /* I/O-check error reported via ISA port 0x61, bit 6. */
4924+#define _XEN_NMIREASON_io_error 0
4925+#define XEN_NMIREASON_io_error (1UL << _XEN_NMIREASON_io_error)
4926+ /* Parity error reported via ISA port 0x61, bit 7. */
4927+#define _XEN_NMIREASON_parity_error 1
4928+#define XEN_NMIREASON_parity_error (1UL << _XEN_NMIREASON_parity_error)
4929+ /* Unknown hardware-generated NMI. */
4930+#define _XEN_NMIREASON_unknown 2
4931+#define XEN_NMIREASON_unknown (1UL << _XEN_NMIREASON_unknown)
4932+
4933+/*
4934+ * long nmi_op(unsigned int cmd, void *arg)
4935+ * NB. All ops return zero on success, else a negative error code.
4936+ */
4937+
4938+/*
4939+ * Register NMI callback for this (calling) VCPU. Currently this only makes
4940+ * sense for domain 0, vcpu 0. All other callers will be returned EINVAL.
4941+ * arg == pointer to xennmi_callback structure.
4942+ */
4943+#define XENNMI_register_callback 0
4944+struct xennmi_callback {
4945+ unsigned long handler_address;
4946+ unsigned long pad;
4947+};
4948+typedef struct xennmi_callback xennmi_callback_t;
4949+DEFINE_XEN_GUEST_HANDLE(xennmi_callback_t);
4950+
4951+/*
4952+ * Deregister NMI callback for this (calling) VCPU.
4953+ * arg == NULL.
4954+ */
4955+#define XENNMI_unregister_callback 1
4956+
4957+#endif /* __XEN_PUBLIC_NMI_H__ */
4958+
4959+/*
4960+ * Local variables:
4961+ * mode: C
4962+ * c-set-style: "BSD"
4963+ * c-basic-offset: 4
4964+ * tab-width: 4
4965+ * indent-tabs-mode: nil
4966+ * End:
4967+ */
4968Index: head-2008-11-25/include/xen/interface/platform.h
4969===================================================================
4970--- /dev/null 1970-01-01 00:00:00.000000000 +0000
4971+++ head-2008-11-25/include/xen/interface/platform.h 2008-09-25 13:55:33.000000000 +0200
4972@@ -0,0 +1,346 @@
4973+/******************************************************************************
4974+ * platform.h
4975+ *
4976+ * Hardware platform operations. Intended for use by domain-0 kernel.
4977+ *
4978+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4979+ * of this software and associated documentation files (the "Software"), to
4980+ * deal in the Software without restriction, including without limitation the
4981+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
4982+ * sell copies of the Software, and to permit persons to whom the Software is
4983+ * furnished to do so, subject to the following conditions:
4984+ *
4985+ * The above copyright notice and this permission notice shall be included in
4986+ * all copies or substantial portions of the Software.
4987+ *
4988+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4989+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4990+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4991+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4992+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4993+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4994+ * DEALINGS IN THE SOFTWARE.
4995+ *
4996+ * Copyright (c) 2002-2006, K Fraser
4997+ */
4998+
4999+#ifndef __XEN_PUBLIC_PLATFORM_H__
5000+#define __XEN_PUBLIC_PLATFORM_H__
5001+
5002+#include "xen.h"
5003+
5004+#define XENPF_INTERFACE_VERSION 0x03000001
5005+
5006+/*
5007+ * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC,
5008+ * 1 January, 1970 if the current system time was <system_time>.
5009+ */
5010+#define XENPF_settime 17
5011+struct xenpf_settime {
5012+ /* IN variables. */
5013+ uint32_t secs;
5014+ uint32_t nsecs;
5015+ uint64_t system_time;
5016+};
5017+typedef struct xenpf_settime xenpf_settime_t;
5018+DEFINE_XEN_GUEST_HANDLE(xenpf_settime_t);
5019+
5020+/*
5021+ * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type.
5022+ * On x86, @type is an architecture-defined MTRR memory type.
5023+ * On success, returns the MTRR that was used (@reg) and a handle that can
5024+ * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting.
5025+ * (x86-specific).
5026+ */
5027+#define XENPF_add_memtype 31
5028+struct xenpf_add_memtype {
5029+ /* IN variables. */
5030+ xen_pfn_t mfn;
5031+ uint64_t nr_mfns;
5032+ uint32_t type;
5033+ /* OUT variables. */
5034+ uint32_t handle;
5035+ uint32_t reg;
5036+};
5037+typedef struct xenpf_add_memtype xenpf_add_memtype_t;
5038+DEFINE_XEN_GUEST_HANDLE(xenpf_add_memtype_t);
5039+
5040+/*
5041+ * Tear down an existing memory-range type. If @handle is remembered then it
5042+ * should be passed in to accurately tear down the correct setting (in case
5043+ * of overlapping memory regions with differing types). If it is not known
5044+ * then @handle should be set to zero. In all cases @reg must be set.
5045+ * (x86-specific).
5046+ */
5047+#define XENPF_del_memtype 32
5048+struct xenpf_del_memtype {
5049+ /* IN variables. */
5050+ uint32_t handle;
5051+ uint32_t reg;
5052+};
5053+typedef struct xenpf_del_memtype xenpf_del_memtype_t;
5054+DEFINE_XEN_GUEST_HANDLE(xenpf_del_memtype_t);
5055+
5056+/* Read current type of an MTRR (x86-specific). */
5057+#define XENPF_read_memtype 33
5058+struct xenpf_read_memtype {
5059+ /* IN variables. */
5060+ uint32_t reg;
5061+ /* OUT variables. */
5062+ xen_pfn_t mfn;
5063+ uint64_t nr_mfns;
5064+ uint32_t type;
5065+};
5066+typedef struct xenpf_read_memtype xenpf_read_memtype_t;
5067+DEFINE_XEN_GUEST_HANDLE(xenpf_read_memtype_t);
5068+
5069+#define XENPF_microcode_update 35
5070+struct xenpf_microcode_update {
5071+ /* IN variables. */
5072+ XEN_GUEST_HANDLE(const_void) data;/* Pointer to microcode data */
5073+ uint32_t length; /* Length of microcode data. */
5074+};
5075+typedef struct xenpf_microcode_update xenpf_microcode_update_t;
5076+DEFINE_XEN_GUEST_HANDLE(xenpf_microcode_update_t);
5077+
5078+#define XENPF_platform_quirk 39
5079+#define QUIRK_NOIRQBALANCING 1 /* Do not restrict IO-APIC RTE targets */
5080+#define QUIRK_IOAPIC_BAD_REGSEL 2 /* IO-APIC REGSEL forgets its value */
5081+#define QUIRK_IOAPIC_GOOD_REGSEL 3 /* IO-APIC REGSEL behaves properly */
5082+struct xenpf_platform_quirk {
5083+ /* IN variables. */
5084+ uint32_t quirk_id;
5085+};
5086+typedef struct xenpf_platform_quirk xenpf_platform_quirk_t;
5087+DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t);
5088+
5089+#define XENPF_firmware_info 50
5090+#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */
5091+#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
5092+#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */
5093+struct xenpf_firmware_info {
5094+ /* IN variables. */
5095+ uint32_t type;
5096+ uint32_t index;
5097+ /* OUT variables. */
5098+ union {
5099+ struct {
5100+ /* Int13, Fn48: Check Extensions Present. */
5101+ uint8_t device; /* %dl: bios device number */
5102+ uint8_t version; /* %ah: major version */
5103+ uint16_t interface_support; /* %cx: support bitmap */
5104+ /* Int13, Fn08: Legacy Get Device Parameters. */
5105+ uint16_t legacy_max_cylinder; /* %cl[7:6]:%ch: max cyl # */
5106+ uint8_t legacy_max_head; /* %dh: max head # */
5107+ uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector # */
5108+ /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */
5109+ /* NB. First uint16_t of buffer must be set to buffer size. */
5110+ XEN_GUEST_HANDLE(void) edd_params;
5111+ } disk_info; /* XEN_FW_DISK_INFO */
5112+ struct {
5113+ uint8_t device; /* bios device number */
5114+ uint32_t mbr_signature; /* offset 0x1b8 in mbr */
5115+ } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */
5116+ struct {
5117+ /* Int10, AX=4F15: Get EDID info. */
5118+ uint8_t capabilities;
5119+ uint8_t edid_transfer_time;
5120+ /* must refer to 128-byte buffer */
5121+ XEN_GUEST_HANDLE(uint8) edid;
5122+ } vbeddc_info; /* XEN_FW_VBEDDC_INFO */
5123+ } u;
5124+};
5125+typedef struct xenpf_firmware_info xenpf_firmware_info_t;
5126+DEFINE_XEN_GUEST_HANDLE(xenpf_firmware_info_t);
5127+
5128+#define XENPF_enter_acpi_sleep 51
5129+struct xenpf_enter_acpi_sleep {
5130+ /* IN variables */
5131+ uint16_t pm1a_cnt_val; /* PM1a control value. */
5132+ uint16_t pm1b_cnt_val; /* PM1b control value. */
5133+ uint32_t sleep_state; /* Which state to enter (Sn). */
5134+ uint32_t flags; /* Must be zero. */
5135+};
5136+typedef struct xenpf_enter_acpi_sleep xenpf_enter_acpi_sleep_t;
5137+DEFINE_XEN_GUEST_HANDLE(xenpf_enter_acpi_sleep_t);
5138+
5139+#define XENPF_change_freq 52
5140+struct xenpf_change_freq {
5141+ /* IN variables */
5142+ uint32_t flags; /* Must be zero. */
5143+ uint32_t cpu; /* Physical cpu. */
5144+ uint64_t freq; /* New frequency (Hz). */
5145+};
5146+typedef struct xenpf_change_freq xenpf_change_freq_t;
5147+DEFINE_XEN_GUEST_HANDLE(xenpf_change_freq_t);
5148+
5149+/*
5150+ * Get idle times (nanoseconds since boot) for physical CPUs specified in the
5151+ * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is
5152+ * indexed by CPU number; only entries with the corresponding @cpumap_bitmap
5153+ * bit set are written to. On return, @cpumap_bitmap is modified so that any
5154+ * non-existent CPUs are cleared. Such CPUs have their @idletime array entry
5155+ * cleared.
5156+ */
5157+#define XENPF_getidletime 53
5158+struct xenpf_getidletime {
5159+ /* IN/OUT variables */
5160+ /* IN: CPUs to interrogate; OUT: subset of IN which are present */
5161+ XEN_GUEST_HANDLE(uint8) cpumap_bitmap;
5162+ /* IN variables */
5163+ /* Size of cpumap bitmap. */
5164+ uint32_t cpumap_nr_cpus;
5165+ /* Must be indexable for every cpu in cpumap_bitmap. */
5166+ XEN_GUEST_HANDLE(uint64) idletime;
5167+ /* OUT variables */
5168+ /* System time when the idletime snapshots were taken. */
5169+ uint64_t now;
5170+};
5171+typedef struct xenpf_getidletime xenpf_getidletime_t;
5172+DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t);
5173+
5174+#define XENPF_set_processor_pminfo 54
5175+
5176+/* ability bits */
5177+#define XEN_PROCESSOR_PM_CX 1
5178+#define XEN_PROCESSOR_PM_PX 2
5179+#define XEN_PROCESSOR_PM_TX 4
5180+
5181+/* cmd type */
5182+#define XEN_PM_CX 0
5183+#define XEN_PM_PX 1
5184+#define XEN_PM_TX 2
5185+
5186+/* Px sub info type */
5187+#define XEN_PX_PCT 1
5188+#define XEN_PX_PSS 2
5189+#define XEN_PX_PPC 4
5190+#define XEN_PX_PSD 8
5191+
5192+struct xen_power_register {
5193+ uint32_t space_id;
5194+ uint32_t bit_width;
5195+ uint32_t bit_offset;
5196+ uint32_t access_size;
5197+ uint64_t address;
5198+};
5199+
5200+struct xen_processor_csd {
5201+ uint32_t domain; /* domain number of one dependent group */
5202+ uint32_t coord_type; /* coordination type */
5203+ uint32_t num; /* number of processors in same domain */
5204+};
5205+typedef struct xen_processor_csd xen_processor_csd_t;
5206+DEFINE_XEN_GUEST_HANDLE(xen_processor_csd_t);
5207+
5208+struct xen_processor_cx {
5209+ struct xen_power_register reg; /* GAS for Cx trigger register */
5210+ uint8_t type; /* cstate value, c0: 0, c1: 1, ... */
5211+ uint32_t latency; /* worst latency (ms) to enter/exit this cstate */
5212+ uint32_t power; /* average power consumption(mW) */
5213+ uint32_t dpcnt; /* number of dependency entries */
5214+ XEN_GUEST_HANDLE(xen_processor_csd_t) dp; /* NULL if no dependency */
5215+};
5216+typedef struct xen_processor_cx xen_processor_cx_t;
5217+DEFINE_XEN_GUEST_HANDLE(xen_processor_cx_t);
5218+
5219+struct xen_processor_flags {
5220+ uint32_t bm_control:1;
5221+ uint32_t bm_check:1;
5222+ uint32_t has_cst:1;
5223+ uint32_t power_setup_done:1;
5224+ uint32_t bm_rld_set:1;
5225+};
5226+
5227+struct xen_processor_power {
5228+ uint32_t count; /* number of C state entries in array below */
5229+ struct xen_processor_flags flags; /* global flags of this processor */
5230+ XEN_GUEST_HANDLE(xen_processor_cx_t) states; /* supported c states */
5231+};
5232+
5233+struct xen_pct_register {
5234+ uint8_t descriptor;
5235+ uint16_t length;
5236+ uint8_t space_id;
5237+ uint8_t bit_width;
5238+ uint8_t bit_offset;
5239+ uint8_t reserved;
5240+ uint64_t address;
5241+};
5242+
5243+struct xen_processor_px {
5244+ uint64_t core_frequency; /* megahertz */
5245+ uint64_t power; /* milliWatts */
5246+ uint64_t transition_latency; /* microseconds */
5247+ uint64_t bus_master_latency; /* microseconds */
5248+ uint64_t control; /* control value */
5249+ uint64_t status; /* success indicator */
5250+};
5251+typedef struct xen_processor_px xen_processor_px_t;
5252+DEFINE_XEN_GUEST_HANDLE(xen_processor_px_t);
5253+
5254+struct xen_psd_package {
5255+ uint64_t num_entries;
5256+ uint64_t revision;
5257+ uint64_t domain;
5258+ uint64_t coord_type;
5259+ uint64_t num_processors;
5260+};
5261+
5262+struct xen_processor_performance {
5263+ uint32_t flags; /* flag for Px sub info type */
5264+ uint32_t platform_limit; /* Platform limitation on freq usage */
5265+ struct xen_pct_register control_register;
5266+ struct xen_pct_register status_register;
5267+ uint32_t state_count; /* total available performance states */
5268+ XEN_GUEST_HANDLE(xen_processor_px_t) states;
5269+ struct xen_psd_package domain_info;
5270+ uint32_t shared_type; /* coordination type of this processor */
5271+};
5272+typedef struct xen_processor_performance xen_processor_performance_t;
5273+DEFINE_XEN_GUEST_HANDLE(xen_processor_performance_t);
5274+
5275+struct xenpf_set_processor_pminfo {
5276+ /* IN variables */
5277+ uint32_t id; /* ACPI CPU ID */
5278+ uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */
5279+ union {
5280+ struct xen_processor_power power;/* Cx: _CST/_CSD */
5281+ struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */
5282+ };
5283+};
5284+typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t;
5285+DEFINE_XEN_GUEST_HANDLE(xenpf_set_processor_pminfo_t);
5286+
5287+struct xen_platform_op {
5288+ uint32_t cmd;
5289+ uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
5290+ union {
5291+ struct xenpf_settime settime;
5292+ struct xenpf_add_memtype add_memtype;
5293+ struct xenpf_del_memtype del_memtype;
5294+ struct xenpf_read_memtype read_memtype;
5295+ struct xenpf_microcode_update microcode;
5296+ struct xenpf_platform_quirk platform_quirk;
5297+ struct xenpf_firmware_info firmware_info;
5298+ struct xenpf_enter_acpi_sleep enter_acpi_sleep;
5299+ struct xenpf_change_freq change_freq;
5300+ struct xenpf_getidletime getidletime;
5301+ struct xenpf_set_processor_pminfo set_pminfo;
5302+ uint8_t pad[128];
5303+ } u;
5304+};
5305+typedef struct xen_platform_op xen_platform_op_t;
5306+DEFINE_XEN_GUEST_HANDLE(xen_platform_op_t);
5307+
5308+#endif /* __XEN_PUBLIC_PLATFORM_H__ */
5309+
5310+/*
5311+ * Local variables:
5312+ * mode: C
5313+ * c-set-style: "BSD"
5314+ * c-basic-offset: 4
5315+ * tab-width: 4
5316+ * indent-tabs-mode: nil
5317+ * End:
5318+ */
5319Index: head-2008-11-25/include/xen/interface/sysctl.h
5320===================================================================
5321--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5322+++ head-2008-11-25/include/xen/interface/sysctl.h 2008-09-25 13:55:33.000000000 +0200
5323@@ -0,0 +1,308 @@
5324+/******************************************************************************
5325+ * sysctl.h
5326+ *
5327+ * System management operations. For use by node control stack.
5328+ *
5329+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5330+ * of this software and associated documentation files (the "Software"), to
5331+ * deal in the Software without restriction, including without limitation the
5332+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
5333+ * sell copies of the Software, and to permit persons to whom the Software is
5334+ * furnished to do so, subject to the following conditions:
5335+ *
5336+ * The above copyright notice and this permission notice shall be included in
5337+ * all copies or substantial portions of the Software.
5338+ *
5339+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5340+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5341+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5342+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5343+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5344+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
5345+ * DEALINGS IN THE SOFTWARE.
5346+ *
5347+ * Copyright (c) 2002-2006, K Fraser
5348+ */
5349+
5350+#ifndef __XEN_PUBLIC_SYSCTL_H__
5351+#define __XEN_PUBLIC_SYSCTL_H__
5352+
5353+#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
5354+#error "sysctl operations are intended for use by node control tools only"
5355+#endif
5356+
5357+#include "xen.h"
5358+#include "domctl.h"
5359+
5360+#define XEN_SYSCTL_INTERFACE_VERSION 0x00000006
5361+
5362+/*
5363+ * Read console content from Xen buffer ring.
5364+ */
5365+#define XEN_SYSCTL_readconsole 1
5366+struct xen_sysctl_readconsole {
5367+ /* IN: Non-zero -> clear after reading. */
5368+ uint8_t clear;
5369+ /* IN: Non-zero -> start index specified by @index field. */
5370+ uint8_t incremental;
5371+ uint8_t pad0, pad1;
5372+ /*
5373+ * IN: Start index for consuming from ring buffer (if @incremental);
5374+ * OUT: End index after consuming from ring buffer.
5375+ */
5376+ uint32_t index;
5377+ /* IN: Virtual address to write console data. */
5378+ XEN_GUEST_HANDLE_64(char) buffer;
5379+ /* IN: Size of buffer; OUT: Bytes written to buffer. */
5380+ uint32_t count;
5381+};
5382+typedef struct xen_sysctl_readconsole xen_sysctl_readconsole_t;
5383+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_readconsole_t);
5384+
5385+/* Get trace buffers machine base address */
5386+#define XEN_SYSCTL_tbuf_op 2
5387+struct xen_sysctl_tbuf_op {
5388+ /* IN variables */
5389+#define XEN_SYSCTL_TBUFOP_get_info 0
5390+#define XEN_SYSCTL_TBUFOP_set_cpu_mask 1
5391+#define XEN_SYSCTL_TBUFOP_set_evt_mask 2
5392+#define XEN_SYSCTL_TBUFOP_set_size 3
5393+#define XEN_SYSCTL_TBUFOP_enable 4
5394+#define XEN_SYSCTL_TBUFOP_disable 5
5395+ uint32_t cmd;
5396+ /* IN/OUT variables */
5397+ struct xenctl_cpumap cpu_mask;
5398+ uint32_t evt_mask;
5399+ /* OUT variables */
5400+ uint64_aligned_t buffer_mfn;
5401+ uint32_t size;
5402+};
5403+typedef struct xen_sysctl_tbuf_op xen_sysctl_tbuf_op_t;
5404+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_tbuf_op_t);
5405+
5406+/*
5407+ * Get physical information about the host machine
5408+ */
5409+#define XEN_SYSCTL_physinfo 3
5410+ /* (x86) The platform supports HVM guests. */
5411+#define _XEN_SYSCTL_PHYSCAP_hvm 0
5412+#define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm)
5413+ /* (x86) The platform supports HVM-guest direct access to I/O devices. */
5414+#define _XEN_SYSCTL_PHYSCAP_hvm_directio 1
5415+#define XEN_SYSCTL_PHYSCAP_hvm_directio (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio)
5416+struct xen_sysctl_physinfo {
5417+ uint32_t threads_per_core;
5418+ uint32_t cores_per_socket;
5419+ uint32_t nr_cpus;
5420+ uint32_t nr_nodes;
5421+ uint32_t cpu_khz;
5422+ uint64_aligned_t total_pages;
5423+ uint64_aligned_t free_pages;
5424+ uint64_aligned_t scrub_pages;
5425+ uint32_t hw_cap[8];
5426+
5427+ /*
5428+ * IN: maximum addressable entry in the caller-provided cpu_to_node array.
5429+ * OUT: largest cpu identifier in the system.
5430+ * If OUT is greater than IN then the cpu_to_node array is truncated!
5431+ */
5432+ uint32_t max_cpu_id;
5433+ /*
5434+ * If not NULL, this array is filled with node identifier for each cpu.
5435+ * If a cpu has no node information (e.g., cpu not present) then the
5436+ * sentinel value ~0u is written.
5437+ * The size of this array is specified by the caller in @max_cpu_id.
5438+ * If the actual @max_cpu_id is smaller than the array then the trailing
5439+ * elements of the array will not be written by the sysctl.
5440+ */
5441+ XEN_GUEST_HANDLE_64(uint32) cpu_to_node;
5442+
5443+ /* XEN_SYSCTL_PHYSCAP_??? */
5444+ uint32_t capabilities;
5445+};
5446+typedef struct xen_sysctl_physinfo xen_sysctl_physinfo_t;
5447+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_physinfo_t);
5448+
5449+/*
5450+ * Get the ID of the current scheduler.
5451+ */
5452+#define XEN_SYSCTL_sched_id 4
5453+struct xen_sysctl_sched_id {
5454+ /* OUT variable */
5455+ uint32_t sched_id;
5456+};
5457+typedef struct xen_sysctl_sched_id xen_sysctl_sched_id_t;
5458+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_sched_id_t);
5459+
5460+/* Interface for controlling Xen software performance counters. */
5461+#define XEN_SYSCTL_perfc_op 5
5462+/* Sub-operations: */
5463+#define XEN_SYSCTL_PERFCOP_reset 1 /* Reset all counters to zero. */
5464+#define XEN_SYSCTL_PERFCOP_query 2 /* Get perfctr information. */
5465+struct xen_sysctl_perfc_desc {
5466+ char name[80]; /* name of perf counter */
5467+ uint32_t nr_vals; /* number of values for this counter */
5468+};
5469+typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t;
5470+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t);
5471+typedef uint32_t xen_sysctl_perfc_val_t;
5472+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t);
5473+
5474+struct xen_sysctl_perfc_op {
5475+ /* IN variables. */
5476+ uint32_t cmd; /* XEN_SYSCTL_PERFCOP_??? */
5477+ /* OUT variables. */
5478+ uint32_t nr_counters; /* number of counters description */
5479+ uint32_t nr_vals; /* number of values */
5480+ /* counter information (or NULL) */
5481+ XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc;
5482+ /* counter values (or NULL) */
5483+ XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val;
5484+};
5485+typedef struct xen_sysctl_perfc_op xen_sysctl_perfc_op_t;
5486+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_op_t);
5487+
5488+#define XEN_SYSCTL_getdomaininfolist 6
5489+struct xen_sysctl_getdomaininfolist {
5490+ /* IN variables. */
5491+ domid_t first_domain;
5492+ uint32_t max_domains;
5493+ XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer;
5494+ /* OUT variables. */
5495+ uint32_t num_domains;
5496+};
5497+typedef struct xen_sysctl_getdomaininfolist xen_sysctl_getdomaininfolist_t;
5498+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getdomaininfolist_t);
5499+
5500+/* Inject debug keys into Xen. */
5501+#define XEN_SYSCTL_debug_keys 7
5502+struct xen_sysctl_debug_keys {
5503+ /* IN variables. */
5504+ XEN_GUEST_HANDLE_64(char) keys;
5505+ uint32_t nr_keys;
5506+};
5507+typedef struct xen_sysctl_debug_keys xen_sysctl_debug_keys_t;
5508+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_debug_keys_t);
5509+
5510+/* Get physical CPU information. */
5511+#define XEN_SYSCTL_getcpuinfo 8
5512+struct xen_sysctl_cpuinfo {
5513+ uint64_aligned_t idletime;
5514+};
5515+typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t;
5516+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t);
5517+struct xen_sysctl_getcpuinfo {
5518+ /* IN variables. */
5519+ uint32_t max_cpus;
5520+ XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info;
5521+ /* OUT variables. */
5522+ uint32_t nr_cpus;
5523+};
5524+typedef struct xen_sysctl_getcpuinfo xen_sysctl_getcpuinfo_t;
5525+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getcpuinfo_t);
5526+
5527+#define XEN_SYSCTL_availheap 9
5528+struct xen_sysctl_availheap {
5529+ /* IN variables. */
5530+ uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */
5531+ uint32_t max_bitwidth; /* Largest address width (zero if don't care). */
5532+ int32_t node; /* NUMA node of interest (-1 for all nodes). */
5533+ /* OUT variables. */
5534+ uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */
5535+};
5536+typedef struct xen_sysctl_availheap xen_sysctl_availheap_t;
5537+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t);
5538+
5539+#define XEN_SYSCTL_get_pmstat 10
5540+struct pm_px_val {
5541+ uint64_aligned_t freq; /* Px core frequency */
5542+ uint64_aligned_t residency; /* Px residency time */
5543+ uint64_aligned_t count; /* Px transition count */
5544+};
5545+typedef struct pm_px_val pm_px_val_t;
5546+DEFINE_XEN_GUEST_HANDLE(pm_px_val_t);
5547+
5548+struct pm_px_stat {
5549+ uint8_t total; /* total Px states */
5550+ uint8_t usable; /* usable Px states */
5551+ uint8_t last; /* last Px state */
5552+ uint8_t cur; /* current Px state */
5553+ XEN_GUEST_HANDLE_64(uint64) trans_pt; /* Px transition table */
5554+ XEN_GUEST_HANDLE_64(pm_px_val_t) pt;
5555+};
5556+typedef struct pm_px_stat pm_px_stat_t;
5557+DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t);
5558+
5559+struct pm_cx_stat {
5560+ uint32_t nr; /* entry nr in triggers & residencies, including C0 */
5561+ uint32_t last; /* last Cx state */
5562+ uint64_aligned_t idle_time; /* idle time from boot */
5563+ XEN_GUEST_HANDLE_64(uint64) triggers; /* Cx trigger counts */
5564+ XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
5565+};
5566+
5567+struct xen_sysctl_get_pmstat {
5568+#define PMSTAT_CATEGORY_MASK 0xf0
5569+#define PMSTAT_PX 0x10
5570+#define PMSTAT_CX 0x20
5571+#define PMSTAT_get_max_px (PMSTAT_PX | 0x1)
5572+#define PMSTAT_get_pxstat (PMSTAT_PX | 0x2)
5573+#define PMSTAT_reset_pxstat (PMSTAT_PX | 0x3)
5574+#define PMSTAT_get_max_cx (PMSTAT_CX | 0x1)
5575+#define PMSTAT_get_cxstat (PMSTAT_CX | 0x2)
5576+#define PMSTAT_reset_cxstat (PMSTAT_CX | 0x3)
5577+ uint32_t type;
5578+ uint32_t cpuid;
5579+ union {
5580+ struct pm_px_stat getpx;
5581+ struct pm_cx_stat getcx;
5582+ /* other struct for tx, etc */
5583+ } u;
5584+};
5585+typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
5586+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
5587+
5588+#define XEN_SYSCTL_cpu_hotplug 11
5589+struct xen_sysctl_cpu_hotplug {
5590+ /* IN variables */
5591+ uint32_t cpu; /* Physical cpu. */
5592+#define XEN_SYSCTL_CPU_HOTPLUG_ONLINE 0
5593+#define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1
5594+ uint32_t op; /* hotplug opcode */
5595+};
5596+typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t;
5597+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_hotplug_t);
5598+
5599+
5600+struct xen_sysctl {
5601+ uint32_t cmd;
5602+ uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
5603+ union {
5604+ struct xen_sysctl_readconsole readconsole;
5605+ struct xen_sysctl_tbuf_op tbuf_op;
5606+ struct xen_sysctl_physinfo physinfo;
5607+ struct xen_sysctl_sched_id sched_id;
5608+ struct xen_sysctl_perfc_op perfc_op;
5609+ struct xen_sysctl_getdomaininfolist getdomaininfolist;
5610+ struct xen_sysctl_debug_keys debug_keys;
5611+ struct xen_sysctl_getcpuinfo getcpuinfo;
5612+ struct xen_sysctl_availheap availheap;
5613+ struct xen_sysctl_get_pmstat get_pmstat;
5614+ struct xen_sysctl_cpu_hotplug cpu_hotplug;
5615+ uint8_t pad[128];
5616+ } u;
5617+};
5618+typedef struct xen_sysctl xen_sysctl_t;
5619+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t);
5620+
5621+#endif /* __XEN_PUBLIC_SYSCTL_H__ */
5622+
5623+/*
5624+ * Local variables:
5625+ * mode: C
5626+ * c-set-style: "BSD"
5627+ * c-basic-offset: 4
5628+ * tab-width: 4
5629+ * indent-tabs-mode: nil
5630+ * End:
5631+ */
5632Index: head-2008-11-25/include/xen/interface/trace.h
5633===================================================================
5634--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5635+++ head-2008-11-25/include/xen/interface/trace.h 2008-11-25 12:22:34.000000000 +0100
5636@@ -0,0 +1,205 @@
5637+/******************************************************************************
5638+ * include/public/trace.h
5639+ *
5640+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5641+ * of this software and associated documentation files (the "Software"), to
5642+ * deal in the Software without restriction, including without limitation the
5643+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
5644+ * sell copies of the Software, and to permit persons to whom the Software is
5645+ * furnished to do so, subject to the following conditions:
5646+ *
5647+ * The above copyright notice and this permission notice shall be included in
5648+ * all copies or substantial portions of the Software.
5649+ *
5650+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5651+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5652+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5653+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5654+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5655+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
5656+ * DEALINGS IN THE SOFTWARE.
5657+ *
5658+ * Mark Williamson, (C) 2004 Intel Research Cambridge
5659+ * Copyright (C) 2005 Bin Ren
5660+ */
5661+
5662+#ifndef __XEN_PUBLIC_TRACE_H__
5663+#define __XEN_PUBLIC_TRACE_H__
5664+
5665+#define TRACE_EXTRA_MAX 7
5666+#define TRACE_EXTRA_SHIFT 28
5667+
5668+/* Trace classes */
5669+#define TRC_CLS_SHIFT 16
5670+#define TRC_GEN 0x0001f000 /* General trace */
5671+#define TRC_SCHED 0x0002f000 /* Xen Scheduler trace */
5672+#define TRC_DOM0OP 0x0004f000 /* Xen DOM0 operation trace */
5673+#define TRC_HVM 0x0008f000 /* Xen HVM trace */
5674+#define TRC_MEM 0x0010f000 /* Xen memory trace */
5675+#define TRC_PV 0x0020f000 /* Xen PV traces */
5676+#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */
5677+#define TRC_PM 0x0080f000 /* Xen power management trace */
5678+#define TRC_ALL 0x0ffff000
5679+#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)
5680+#define TRC_HD_CYCLE_FLAG (1UL<<31)
5681+#define TRC_HD_INCLUDES_CYCLE_COUNT(x) ( !!( (x) & TRC_HD_CYCLE_FLAG ) )
5682+#define TRC_HD_EXTRA(x) (((x)>>TRACE_EXTRA_SHIFT)&TRACE_EXTRA_MAX)
5683+
5684+/* Trace subclasses */
5685+#define TRC_SUBCLS_SHIFT 12
5686+
5687+/* trace subclasses for SVM */
5688+#define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */
5689+#define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */
5690+
5691+#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */
5692+#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */
5693+
5694+/* Trace events per class */
5695+#define TRC_LOST_RECORDS (TRC_GEN + 1)
5696+#define TRC_TRACE_WRAP_BUFFER (TRC_GEN + 2)
5697+#define TRC_TRACE_CPU_CHANGE (TRC_GEN + 3)
5698+
5699+#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1)
5700+#define TRC_SCHED_DOM_ADD (TRC_SCHED_VERBOSE + 1)
5701+#define TRC_SCHED_DOM_REM (TRC_SCHED_VERBOSE + 2)
5702+#define TRC_SCHED_SLEEP (TRC_SCHED_VERBOSE + 3)
5703+#define TRC_SCHED_WAKE (TRC_SCHED_VERBOSE + 4)
5704+#define TRC_SCHED_YIELD (TRC_SCHED_VERBOSE + 5)
5705+#define TRC_SCHED_BLOCK (TRC_SCHED_VERBOSE + 6)
5706+#define TRC_SCHED_SHUTDOWN (TRC_SCHED_VERBOSE + 7)
5707+#define TRC_SCHED_CTL (TRC_SCHED_VERBOSE + 8)
5708+#define TRC_SCHED_ADJDOM (TRC_SCHED_VERBOSE + 9)
5709+#define TRC_SCHED_SWITCH (TRC_SCHED_VERBOSE + 10)
5710+#define TRC_SCHED_S_TIMER_FN (TRC_SCHED_VERBOSE + 11)
5711+#define TRC_SCHED_T_TIMER_FN (TRC_SCHED_VERBOSE + 12)
5712+#define TRC_SCHED_DOM_TIMER_FN (TRC_SCHED_VERBOSE + 13)
5713+#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14)
5714+#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15)
5715+
5716+#define TRC_MEM_PAGE_GRANT_MAP (TRC_MEM + 1)
5717+#define TRC_MEM_PAGE_GRANT_UNMAP (TRC_MEM + 2)
5718+#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3)
5719+
5720+#define TRC_PV_HYPERCALL (TRC_PV + 1)
5721+#define TRC_PV_TRAP (TRC_PV + 3)
5722+#define TRC_PV_PAGE_FAULT (TRC_PV + 4)
5723+#define TRC_PV_FORCED_INVALID_OP (TRC_PV + 5)
5724+#define TRC_PV_EMULATE_PRIVOP (TRC_PV + 6)
5725+#define TRC_PV_EMULATE_4GB (TRC_PV + 7)
5726+#define TRC_PV_MATH_STATE_RESTORE (TRC_PV + 8)
5727+#define TRC_PV_PAGING_FIXUP (TRC_PV + 9)
5728+#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV + 10)
5729+#define TRC_PV_PTWR_EMULATION (TRC_PV + 11)
5730+#define TRC_PV_PTWR_EMULATION_PAE (TRC_PV + 12)
5731+ /* Indicates that addresses in trace record are 64 bits */
5732+#define TRC_64_FLAG (0x100)
5733+
5734+#define TRC_SHADOW_NOT_SHADOW (TRC_SHADOW + 1)
5735+#define TRC_SHADOW_FAST_PROPAGATE (TRC_SHADOW + 2)
5736+#define TRC_SHADOW_FAST_MMIO (TRC_SHADOW + 3)
5737+#define TRC_SHADOW_FALSE_FAST_PATH (TRC_SHADOW + 4)
5738+#define TRC_SHADOW_MMIO (TRC_SHADOW + 5)
5739+#define TRC_SHADOW_FIXUP (TRC_SHADOW + 6)
5740+#define TRC_SHADOW_DOMF_DYING (TRC_SHADOW + 7)
5741+#define TRC_SHADOW_EMULATE (TRC_SHADOW + 8)
5742+#define TRC_SHADOW_EMULATE_UNSHADOW_USER (TRC_SHADOW + 9)
5743+#define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ (TRC_SHADOW + 10)
5744+#define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11)
5745+#define TRC_SHADOW_WRMAP_BF (TRC_SHADOW + 12)
5746+#define TRC_SHADOW_PREALLOC_UNPIN (TRC_SHADOW + 13)
5747+#define TRC_SHADOW_RESYNC_FULL (TRC_SHADOW + 14)
5748+#define TRC_SHADOW_RESYNC_ONLY (TRC_SHADOW + 15)
5749+
5750+/* trace events per subclass */
5751+#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01)
5752+#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02)
5753+#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
5754+#define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01)
5755+#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01)
5756+#define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02)
5757+#define TRC_HVM_PF_INJECT64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02)
5758+#define TRC_HVM_INJ_EXC (TRC_HVM_HANDLER + 0x03)
5759+#define TRC_HVM_INJ_VIRQ (TRC_HVM_HANDLER + 0x04)
5760+#define TRC_HVM_REINJ_VIRQ (TRC_HVM_HANDLER + 0x05)
5761+#define TRC_HVM_IO_READ (TRC_HVM_HANDLER + 0x06)
5762+#define TRC_HVM_IO_WRITE (TRC_HVM_HANDLER + 0x07)
5763+#define TRC_HVM_CR_READ (TRC_HVM_HANDLER + 0x08)
5764+#define TRC_HVM_CR_READ64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08)
5765+#define TRC_HVM_CR_WRITE (TRC_HVM_HANDLER + 0x09)
5766+#define TRC_HVM_CR_WRITE64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09)
5767+#define TRC_HVM_DR_READ (TRC_HVM_HANDLER + 0x0A)
5768+#define TRC_HVM_DR_WRITE (TRC_HVM_HANDLER + 0x0B)
5769+#define TRC_HVM_MSR_READ (TRC_HVM_HANDLER + 0x0C)
5770+#define TRC_HVM_MSR_WRITE (TRC_HVM_HANDLER + 0x0D)
5771+#define TRC_HVM_CPUID (TRC_HVM_HANDLER + 0x0E)
5772+#define TRC_HVM_INTR (TRC_HVM_HANDLER + 0x0F)
5773+#define TRC_HVM_NMI (TRC_HVM_HANDLER + 0x10)
5774+#define TRC_HVM_SMI (TRC_HVM_HANDLER + 0x11)
5775+#define TRC_HVM_VMMCALL (TRC_HVM_HANDLER + 0x12)
5776+#define TRC_HVM_HLT (TRC_HVM_HANDLER + 0x13)
5777+#define TRC_HVM_INVLPG (TRC_HVM_HANDLER + 0x14)
5778+#define TRC_HVM_INVLPG64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14)
5779+#define TRC_HVM_MCE (TRC_HVM_HANDLER + 0x15)
5780+#define TRC_HVM_IO_ASSIST (TRC_HVM_HANDLER + 0x16)
5781+#define TRC_HVM_IO_ASSIST64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x16)
5782+#define TRC_HVM_MMIO_ASSIST (TRC_HVM_HANDLER + 0x17)
5783+#define TRC_HVM_MMIO_ASSIST64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x17)
5784+#define TRC_HVM_CLTS (TRC_HVM_HANDLER + 0x18)
5785+#define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19)
5786+#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19)
5787+
5788+/* trace subclasses for power management */
5789+#define TRC_PM_FREQ 0x00801000 /* xen cpu freq events */
5790+#define TRC_PM_IDLE 0x00802000 /* xen cpu idle events */
5791+
5792+/* trace events for per class */
5793+#define TRC_PM_FREQ_CHANGE (TRC_PM_FREQ + 0x01)
5794+#define TRC_PM_IDLE_ENTRY (TRC_PM_IDLE + 0x01)
5795+#define TRC_PM_IDLE_EXIT (TRC_PM_IDLE + 0x02)
5796+
5797+/* This structure represents a single trace buffer record. */
5798+struct t_rec {
5799+ uint32_t event:28;
5800+ uint32_t extra_u32:3; /* # entries in trailing extra_u32[] array */
5801+ uint32_t cycles_included:1; /* u.cycles or u.no_cycles? */
5802+ union {
5803+ struct {
5804+ uint32_t cycles_lo, cycles_hi; /* cycle counter timestamp */
5805+ uint32_t extra_u32[7]; /* event data items */
5806+ } cycles;
5807+ struct {
5808+ uint32_t extra_u32[7]; /* event data items */
5809+ } nocycles;
5810+ } u;
5811+};
5812+
5813+/*
5814+ * This structure contains the metadata for a single trace buffer. The head
5815+ * field, indexes into an array of struct t_rec's.
5816+ */
5817+struct t_buf {
5818+ /* Assume the data buffer size is X. X is generally not a power of 2.
5819+ * CONS and PROD are incremented modulo (2*X):
5820+ * 0 <= cons < 2*X
5821+ * 0 <= prod < 2*X
5822+ * This is done because addition modulo X breaks at 2^32 when X is not a
5823+ * power of 2:
5824+ * (((2^32 - 1) % X) + 1) % X != (2^32) % X
5825+ */
5826+ uint32_t cons; /* Offset of next item to be consumed by control tools. */
5827+ uint32_t prod; /* Offset of next item to be produced by Xen. */
5828+ /* Records follow immediately after the meta-data header. */
5829+};
5830+
5831+#endif /* __XEN_PUBLIC_TRACE_H__ */
5832+
5833+/*
5834+ * Local variables:
5835+ * mode: C
5836+ * c-set-style: "BSD"
5837+ * c-basic-offset: 4
5838+ * tab-width: 4
5839+ * indent-tabs-mode: nil
5840+ * End:
5841+ */
5842Index: head-2008-11-25/include/xen/interface/xen-compat.h
5843===================================================================
5844--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5845+++ head-2008-11-25/include/xen/interface/xen-compat.h 2008-09-01 12:07:31.000000000 +0200
5846@@ -0,0 +1,44 @@
5847+/******************************************************************************
5848+ * xen-compat.h
5849+ *
5850+ * Guest OS interface to Xen. Compatibility layer.
5851+ *
5852+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5853+ * of this software and associated documentation files (the "Software"), to
5854+ * deal in the Software without restriction, including without limitation the
5855+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
5856+ * sell copies of the Software, and to permit persons to whom the Software is
5857+ * furnished to do so, subject to the following conditions:
5858+ *
5859+ * The above copyright notice and this permission notice shall be included in
5860+ * all copies or substantial portions of the Software.
5861+ *
5862+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5863+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5864+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5865+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5866+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5867+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
5868+ * DEALINGS IN THE SOFTWARE.
5869+ *
5870+ * Copyright (c) 2006, Christian Limpach
5871+ */
5872+
5873+#ifndef __XEN_PUBLIC_XEN_COMPAT_H__
5874+#define __XEN_PUBLIC_XEN_COMPAT_H__
5875+
5876+#define __XEN_LATEST_INTERFACE_VERSION__ 0x00030209
5877+
5878+#if defined(__XEN__) || defined(__XEN_TOOLS__)
5879+/* Xen is built with matching headers and implements the latest interface. */
5880+#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__
5881+#elif !defined(__XEN_INTERFACE_VERSION__)
5882+/* Guests which do not specify a version get the legacy interface. */
5883+#define __XEN_INTERFACE_VERSION__ 0x00000000
5884+#endif
5885+
5886+#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__
5887+#error "These header files do not support the requested interface version."
5888+#endif
5889+
5890+#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */
5891Index: head-2008-11-25/include/xen/interface/xenoprof.h
5892===================================================================
5893--- /dev/null 1970-01-01 00:00:00.000000000 +0000
5894+++ head-2008-11-25/include/xen/interface/xenoprof.h 2007-06-12 13:14:19.000000000 +0200
5895@@ -0,0 +1,138 @@
5896+/******************************************************************************
5897+ * xenoprof.h
5898+ *
5899+ * Interface for enabling system wide profiling based on hardware performance
5900+ * counters
5901+ *
5902+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5903+ * of this software and associated documentation files (the "Software"), to
5904+ * deal in the Software without restriction, including without limitation the
5905+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
5906+ * sell copies of the Software, and to permit persons to whom the Software is
5907+ * furnished to do so, subject to the following conditions:
5908+ *
5909+ * The above copyright notice and this permission notice shall be included in
5910+ * all copies or substantial portions of the Software.
5911+ *
5912+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5913+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5914+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5915+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5916+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5917+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
5918+ * DEALINGS IN THE SOFTWARE.
5919+ *
5920+ * Copyright (C) 2005 Hewlett-Packard Co.
5921+ * Written by Aravind Menon & Jose Renato Santos
5922+ */
5923+
5924+#ifndef __XEN_PUBLIC_XENOPROF_H__
5925+#define __XEN_PUBLIC_XENOPROF_H__
5926+
5927+#include "xen.h"
5928+
5929+/*
5930+ * Commands to HYPERVISOR_xenoprof_op().
5931+ */
5932+#define XENOPROF_init 0
5933+#define XENOPROF_reset_active_list 1
5934+#define XENOPROF_reset_passive_list 2
5935+#define XENOPROF_set_active 3
5936+#define XENOPROF_set_passive 4
5937+#define XENOPROF_reserve_counters 5
5938+#define XENOPROF_counter 6
5939+#define XENOPROF_setup_events 7
5940+#define XENOPROF_enable_virq 8
5941+#define XENOPROF_start 9
5942+#define XENOPROF_stop 10
5943+#define XENOPROF_disable_virq 11
5944+#define XENOPROF_release_counters 12
5945+#define XENOPROF_shutdown 13
5946+#define XENOPROF_get_buffer 14
5947+#define XENOPROF_set_backtrace 15
5948+#define XENOPROF_last_op 15
5949+
5950+#define MAX_OPROF_EVENTS 32
5951+#define MAX_OPROF_DOMAINS 25
5952+#define XENOPROF_CPU_TYPE_SIZE 64
5953+
5954+/* Xenoprof performance events (not Xen events) */
5955+struct event_log {
5956+ uint64_t eip;
5957+ uint8_t mode;
5958+ uint8_t event;
5959+};
5960+
5961+/* PC value that indicates a special code */
5962+#define XENOPROF_ESCAPE_CODE ~0UL
5963+/* Transient events for the xenoprof->oprofile cpu buf */
5964+#define XENOPROF_TRACE_BEGIN 1
5965+
5966+/* Xenoprof buffer shared between Xen and domain - 1 per VCPU */
5967+struct xenoprof_buf {
5968+ uint32_t event_head;
5969+ uint32_t event_tail;
5970+ uint32_t event_size;
5971+ uint32_t vcpu_id;
5972+ uint64_t xen_samples;
5973+ uint64_t kernel_samples;
5974+ uint64_t user_samples;
5975+ uint64_t lost_samples;
5976+ struct event_log event_log[1];
5977+};
5978+#ifndef __XEN__
5979+typedef struct xenoprof_buf xenoprof_buf_t;
5980+DEFINE_XEN_GUEST_HANDLE(xenoprof_buf_t);
5981+#endif
5982+
5983+struct xenoprof_init {
5984+ int32_t num_events;
5985+ int32_t is_primary;
5986+ char cpu_type[XENOPROF_CPU_TYPE_SIZE];
5987+};
5988+typedef struct xenoprof_init xenoprof_init_t;
5989+DEFINE_XEN_GUEST_HANDLE(xenoprof_init_t);
5990+
5991+struct xenoprof_get_buffer {
5992+ int32_t max_samples;
5993+ int32_t nbuf;
5994+ int32_t bufsize;
5995+ uint64_t buf_gmaddr;
5996+};
5997+typedef struct xenoprof_get_buffer xenoprof_get_buffer_t;
5998+DEFINE_XEN_GUEST_HANDLE(xenoprof_get_buffer_t);
5999+
6000+struct xenoprof_counter {
6001+ uint32_t ind;
6002+ uint64_t count;
6003+ uint32_t enabled;
6004+ uint32_t event;
6005+ uint32_t hypervisor;
6006+ uint32_t kernel;
6007+ uint32_t user;
6008+ uint64_t unit_mask;
6009+};
6010+typedef struct xenoprof_counter xenoprof_counter_t;
6011+DEFINE_XEN_GUEST_HANDLE(xenoprof_counter_t);
6012+
6013+typedef struct xenoprof_passive {
6014+ uint16_t domain_id;
6015+ int32_t max_samples;
6016+ int32_t nbuf;
6017+ int32_t bufsize;
6018+ uint64_t buf_gmaddr;
6019+} xenoprof_passive_t;
6020+DEFINE_XEN_GUEST_HANDLE(xenoprof_passive_t);
6021+
6022+
6023+#endif /* __XEN_PUBLIC_XENOPROF_H__ */
6024+
6025+/*
6026+ * Local variables:
6027+ * mode: C
6028+ * c-set-style: "BSD"
6029+ * c-basic-offset: 4
6030+ * tab-width: 4
6031+ * indent-tabs-mode: nil
6032+ * End:
6033+ */
6034Index: head-2008-11-25/include/xen/interface/xsm/acm.h
6035===================================================================
6036--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6037+++ head-2008-11-25/include/xen/interface/xsm/acm.h 2008-07-21 11:00:33.000000000 +0200
6038@@ -0,0 +1,235 @@
6039+/*
6040+ * acm.h: Xen access control module interface defintions
6041+ *
6042+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6043+ * of this software and associated documentation files (the "Software"), to
6044+ * deal in the Software without restriction, including without limitation the
6045+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6046+ * sell copies of the Software, and to permit persons to whom the Software is
6047+ * furnished to do so, subject to the following conditions:
6048+ *
6049+ * The above copyright notice and this permission notice shall be included in
6050+ * all copies or substantial portions of the Software.
6051+ *
6052+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
6053+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6054+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
6055+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
6056+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
6057+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
6058+ * DEALINGS IN THE SOFTWARE.
6059+ *
6060+ * Reiner Sailer <sailer@watson.ibm.com>
6061+ * Copyright (c) 2005, International Business Machines Corporation.
6062+ */
6063+
6064+#ifndef _XEN_PUBLIC_ACM_H
6065+#define _XEN_PUBLIC_ACM_H
6066+
6067+#include "../xen.h"
6068+
6069+/* if ACM_DEBUG defined, all hooks should
6070+ * print a short trace message (comment it out
6071+ * when not in testing mode )
6072+ */
6073+/* #define ACM_DEBUG */
6074+
6075+#ifdef ACM_DEBUG
6076+# define printkd(fmt, args...) printk(fmt,## args)
6077+#else
6078+# define printkd(fmt, args...)
6079+#endif
6080+
6081+/* default ssid reference value if not supplied */
6082+#define ACM_DEFAULT_SSID 0x0
6083+#define ACM_DEFAULT_LOCAL_SSID 0x0
6084+
6085+/* Internal ACM ERROR types */
6086+#define ACM_OK 0
6087+#define ACM_UNDEF -1
6088+#define ACM_INIT_SSID_ERROR -2
6089+#define ACM_INIT_SOID_ERROR -3
6090+#define ACM_ERROR -4
6091+
6092+/* External ACCESS DECISIONS */
6093+#define ACM_ACCESS_PERMITTED 0
6094+#define ACM_ACCESS_DENIED -111
6095+#define ACM_NULL_POINTER_ERROR -200
6096+
6097+/*
6098+ Error codes reported in when trying to test for a new policy
6099+ These error codes are reported in an array of tuples where
6100+ each error code is followed by a parameter describing the error
6101+ more closely, such as a domain id.
6102+*/
6103+#define ACM_EVTCHN_SHARING_VIOLATION 0x100
6104+#define ACM_GNTTAB_SHARING_VIOLATION 0x101
6105+#define ACM_DOMAIN_LOOKUP 0x102
6106+#define ACM_CHWALL_CONFLICT 0x103
6107+#define ACM_SSIDREF_IN_USE 0x104
6108+
6109+
6110+/* primary policy in lower 4 bits */
6111+#define ACM_NULL_POLICY 0
6112+#define ACM_CHINESE_WALL_POLICY 1
6113+#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2
6114+#define ACM_POLICY_UNDEFINED 15
6115+
6116+/* combinations have secondary policy component in higher 4bit */
6117+#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \
6118+ ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY)
6119+
6120+/* policy: */
6121+#define ACM_POLICY_NAME(X) \
6122+ ((X) == (ACM_NULL_POLICY)) ? "NULL" : \
6123+ ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" : \
6124+ ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" : \
6125+ ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT" : \
6126+ "UNDEFINED"
6127+
6128+/* the following policy versions must be increased
6129+ * whenever the interpretation of the related
6130+ * policy's data structure changes
6131+ */
6132+#define ACM_POLICY_VERSION 4
6133+#define ACM_CHWALL_VERSION 1
6134+#define ACM_STE_VERSION 1
6135+
6136+/* defines a ssid reference used by xen */
6137+typedef uint32_t ssidref_t;
6138+
6139+/* hooks that are known to domains */
6140+#define ACMHOOK_none 0
6141+#define ACMHOOK_sharing 1
6142+#define ACMHOOK_authorization 2
6143+#define ACMHOOK_conflictset 3
6144+
6145+/* -------security policy relevant type definitions-------- */
6146+
6147+/* type identifier; compares to "equal" or "not equal" */
6148+typedef uint16_t domaintype_t;
6149+
6150+/* CHINESE WALL POLICY DATA STRUCTURES
6151+ *
6152+ * current accumulated conflict type set:
6153+ * When a domain is started and has a type that is in
6154+ * a conflict set, the conflicting types are incremented in
6155+ * the aggregate set. When a domain is destroyed, the
6156+ * conflicting types to its type are decremented.
6157+ * If a domain has multiple types, this procedure works over
6158+ * all those types.
6159+ *
6160+ * conflict_aggregate_set[i] holds the number of
6161+ * running domains that have a conflict with type i.
6162+ *
6163+ * running_types[i] holds the number of running domains
6164+ * that include type i in their ssidref-referenced type set
6165+ *
6166+ * conflict_sets[i][j] is "0" if type j has no conflict
6167+ * with type i and is "1" otherwise.
6168+ */
6169+/* high-16 = version, low-16 = check magic */
6170+#define ACM_MAGIC 0x0001debc
6171+
6172+/* size of the SHA1 hash identifying the XML policy from which the
6173+ binary policy was created */
6174+#define ACM_SHA1_HASH_SIZE 20
6175+
6176+/* each offset in bytes from start of the struct they
6177+ * are part of */
6178+
6179+/* V3 of the policy buffer aded a version structure */
6180+struct acm_policy_version
6181+{
6182+ uint32_t major;
6183+ uint32_t minor;
6184+};
6185+
6186+
6187+/* each buffer consists of all policy information for
6188+ * the respective policy given in the policy code
6189+ *
6190+ * acm_policy_buffer, acm_chwall_policy_buffer,
6191+ * and acm_ste_policy_buffer need to stay 32-bit aligned
6192+ * because we create binary policies also with external
6193+ * tools that assume packed representations (e.g. the java tool)
6194+ */
6195+struct acm_policy_buffer {
6196+ uint32_t magic;
6197+ uint32_t policy_version; /* ACM_POLICY_VERSION */
6198+ uint32_t len;
6199+ uint32_t policy_reference_offset;
6200+ uint32_t primary_policy_code;
6201+ uint32_t primary_buffer_offset;
6202+ uint32_t secondary_policy_code;
6203+ uint32_t secondary_buffer_offset;
6204+ struct acm_policy_version xml_pol_version; /* add in V3 */
6205+ uint8_t xml_policy_hash[ACM_SHA1_HASH_SIZE]; /* added in V4 */
6206+};
6207+
6208+
6209+struct acm_policy_reference_buffer {
6210+ uint32_t len;
6211+};
6212+
6213+struct acm_chwall_policy_buffer {
6214+ uint32_t policy_version; /* ACM_CHWALL_VERSION */
6215+ uint32_t policy_code;
6216+ uint32_t chwall_max_types;
6217+ uint32_t chwall_max_ssidrefs;
6218+ uint32_t chwall_max_conflictsets;
6219+ uint32_t chwall_ssid_offset;
6220+ uint32_t chwall_conflict_sets_offset;
6221+ uint32_t chwall_running_types_offset;
6222+ uint32_t chwall_conflict_aggregate_offset;
6223+};
6224+
6225+struct acm_ste_policy_buffer {
6226+ uint32_t policy_version; /* ACM_STE_VERSION */
6227+ uint32_t policy_code;
6228+ uint32_t ste_max_types;
6229+ uint32_t ste_max_ssidrefs;
6230+ uint32_t ste_ssid_offset;
6231+};
6232+
6233+struct acm_stats_buffer {
6234+ uint32_t magic;
6235+ uint32_t len;
6236+ uint32_t primary_policy_code;
6237+ uint32_t primary_stats_offset;
6238+ uint32_t secondary_policy_code;
6239+ uint32_t secondary_stats_offset;
6240+};
6241+
6242+struct acm_ste_stats_buffer {
6243+ uint32_t ec_eval_count;
6244+ uint32_t gt_eval_count;
6245+ uint32_t ec_denied_count;
6246+ uint32_t gt_denied_count;
6247+ uint32_t ec_cachehit_count;
6248+ uint32_t gt_cachehit_count;
6249+};
6250+
6251+struct acm_ssid_buffer {
6252+ uint32_t len;
6253+ ssidref_t ssidref;
6254+ uint32_t policy_reference_offset;
6255+ uint32_t primary_policy_code;
6256+ uint32_t primary_max_types;
6257+ uint32_t primary_types_offset;
6258+ uint32_t secondary_policy_code;
6259+ uint32_t secondary_max_types;
6260+ uint32_t secondary_types_offset;
6261+};
6262+
6263+#endif
6264+
6265+/*
6266+ * Local variables:
6267+ * mode: C
6268+ * c-set-style: "BSD"
6269+ * c-basic-offset: 4
6270+ * tab-width: 4
6271+ * indent-tabs-mode: nil
6272+ * End:
6273+ */
6274Index: head-2008-11-25/include/xen/interface/xsm/acm_ops.h
6275===================================================================
6276--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6277+++ head-2008-11-25/include/xen/interface/xsm/acm_ops.h 2007-10-22 13:39:15.000000000 +0200
6278@@ -0,0 +1,159 @@
6279+/*
6280+ * acm_ops.h: Xen access control module hypervisor commands
6281+ *
6282+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6283+ * of this software and associated documentation files (the "Software"), to
6284+ * deal in the Software without restriction, including without limitation the
6285+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6286+ * sell copies of the Software, and to permit persons to whom the Software is
6287+ * furnished to do so, subject to the following conditions:
6288+ *
6289+ * The above copyright notice and this permission notice shall be included in
6290+ * all copies or substantial portions of the Software.
6291+ *
6292+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
6293+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6294+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
6295+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
6296+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
6297+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
6298+ * DEALINGS IN THE SOFTWARE.
6299+ *
6300+ * Reiner Sailer <sailer@watson.ibm.com>
6301+ * Copyright (c) 2005,2006 International Business Machines Corporation.
6302+ */
6303+
6304+#ifndef __XEN_PUBLIC_ACM_OPS_H__
6305+#define __XEN_PUBLIC_ACM_OPS_H__
6306+
6307+#include "../xen.h"
6308+#include "acm.h"
6309+
6310+/*
6311+ * Make sure you increment the interface version whenever you modify this file!
6312+ * This makes sure that old versions of acm tools will stop working in a
6313+ * well-defined way (rather than crashing the machine, for instance).
6314+ */
6315+#define ACM_INTERFACE_VERSION 0xAAAA000A
6316+
6317+/************************************************************************/
6318+
6319+/*
6320+ * Prototype for this hypercall is:
6321+ * int acm_op(int cmd, void *args)
6322+ * @cmd == ACMOP_??? (access control module operation).
6323+ * @args == Operation-specific extra arguments (NULL if none).
6324+ */
6325+
6326+
6327+#define ACMOP_setpolicy 1
6328+struct acm_setpolicy {
6329+ /* IN */
6330+ XEN_GUEST_HANDLE_64(void) pushcache;
6331+ uint32_t pushcache_size;
6332+};
6333+
6334+
6335+#define ACMOP_getpolicy 2
6336+struct acm_getpolicy {
6337+ /* IN */
6338+ XEN_GUEST_HANDLE_64(void) pullcache;
6339+ uint32_t pullcache_size;
6340+};
6341+
6342+
6343+#define ACMOP_dumpstats 3
6344+struct acm_dumpstats {
6345+ /* IN */
6346+ XEN_GUEST_HANDLE_64(void) pullcache;
6347+ uint32_t pullcache_size;
6348+};
6349+
6350+
6351+#define ACMOP_getssid 4
6352+#define ACM_GETBY_ssidref 1
6353+#define ACM_GETBY_domainid 2
6354+struct acm_getssid {
6355+ /* IN */
6356+ uint32_t get_ssid_by; /* ACM_GETBY_* */
6357+ union {
6358+ domaintype_t domainid;
6359+ ssidref_t ssidref;
6360+ } id;
6361+ XEN_GUEST_HANDLE_64(void) ssidbuf;
6362+ uint32_t ssidbuf_size;
6363+};
6364+
6365+#define ACMOP_getdecision 5
6366+struct acm_getdecision {
6367+ /* IN */
6368+ uint32_t get_decision_by1; /* ACM_GETBY_* */
6369+ uint32_t get_decision_by2; /* ACM_GETBY_* */
6370+ union {
6371+ domaintype_t domainid;
6372+ ssidref_t ssidref;
6373+ } id1;
6374+ union {
6375+ domaintype_t domainid;
6376+ ssidref_t ssidref;
6377+ } id2;
6378+ uint32_t hook;
6379+ /* OUT */
6380+ uint32_t acm_decision;
6381+};
6382+
6383+
6384+#define ACMOP_chgpolicy 6
6385+struct acm_change_policy {
6386+ /* IN */
6387+ XEN_GUEST_HANDLE_64(void) policy_pushcache;
6388+ uint32_t policy_pushcache_size;
6389+ XEN_GUEST_HANDLE_64(void) del_array;
6390+ uint32_t delarray_size;
6391+ XEN_GUEST_HANDLE_64(void) chg_array;
6392+ uint32_t chgarray_size;
6393+ /* OUT */
6394+ /* array with error code */
6395+ XEN_GUEST_HANDLE_64(void) err_array;
6396+ uint32_t errarray_size;
6397+};
6398+
6399+#define ACMOP_relabeldoms 7
6400+struct acm_relabel_doms {
6401+ /* IN */
6402+ XEN_GUEST_HANDLE_64(void) relabel_map;
6403+ uint32_t relabel_map_size;
6404+ /* OUT */
6405+ XEN_GUEST_HANDLE_64(void) err_array;
6406+ uint32_t errarray_size;
6407+};
6408+
6409+/* future interface to Xen */
6410+struct xen_acmctl {
6411+ uint32_t cmd;
6412+ uint32_t interface_version;
6413+ union {
6414+ struct acm_setpolicy setpolicy;
6415+ struct acm_getpolicy getpolicy;
6416+ struct acm_dumpstats dumpstats;
6417+ struct acm_getssid getssid;
6418+ struct acm_getdecision getdecision;
6419+ struct acm_change_policy change_policy;
6420+ struct acm_relabel_doms relabel_doms;
6421+ } u;
6422+};
6423+
6424+typedef struct xen_acmctl xen_acmctl_t;
6425+DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t);
6426+
6427+#endif /* __XEN_PUBLIC_ACM_OPS_H__ */
6428+
6429+/*
6430+ * Local variables:
6431+ * mode: C
6432+ * c-set-style: "BSD"
6433+ * c-basic-offset: 4
6434+ * tab-width: 4
6435+ * indent-tabs-mode: nil
6436+ * End:
6437+ */
6438Index: head-2008-11-25/include/xen/interface/xsm/flask_op.h
6439===================================================================
6440--- /dev/null 1970-01-01 00:00:00.000000000 +0000
6441+++ head-2008-11-25/include/xen/interface/xsm/flask_op.h 2008-09-01 12:07:31.000000000 +0200
6442@@ -0,0 +1,45 @@
6443+/*
6444+ * This file contains the flask_op hypercall commands and definitions.
6445+ *
6446+ * Author: George Coker, <gscoker@alpha.ncsc.mil>
6447+ *
6448+ * This program is free software; you can redistribute it and/or modify
6449+ * it under the terms of the GNU General Public License version 2,
6450+ * as published by the Free Software Foundation.
6451+ */
6452+
6453+#ifndef __FLASK_OP_H__
6454+#define __FLASK_OP_H__
6455+
6456+#define FLASK_LOAD 1
6457+#define FLASK_GETENFORCE 2
6458+#define FLASK_SETENFORCE 3
6459+#define FLASK_CONTEXT_TO_SID 4
6460+#define FLASK_SID_TO_CONTEXT 5
6461+#define FLASK_ACCESS 6
6462+#define FLASK_CREATE 7
6463+#define FLASK_RELABEL 8
6464+#define FLASK_USER 9
6465+#define FLASK_POLICYVERS 10
6466+#define FLASK_GETBOOL 11
6467+#define FLASK_SETBOOL 12
6468+#define FLASK_COMMITBOOLS 13
6469+#define FLASK_MLS 14
6470+#define FLASK_DISABLE 15
6471+#define FLASK_GETAVC_THRESHOLD 16
6472+#define FLASK_SETAVC_THRESHOLD 17
6473+#define FLASK_AVC_HASHSTATS 18
6474+#define FLASK_AVC_CACHESTATS 19
6475+#define FLASK_MEMBER 20
6476+
6477+#define FLASK_LAST FLASK_MEMBER
6478+
6479+typedef struct flask_op {
6480+ uint32_t cmd;
6481+ uint32_t size;
6482+ char *buf;
6483+} flask_op_t;
6484+
6485+DEFINE_XEN_GUEST_HANDLE(flask_op_t);
6486+
6487+#endif