diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-06-02 14:04:13 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-06-02 14:04:13 +0000 |
commit | 137cf1e1e3b56f74d76e17cc07e23d749eeaab46 (patch) | |
tree | 40f7a206bcf0423f200a335696ca742d9e41eaf8 /xen | |
parent | 7118797d4e08217a611a9c9039785064e1d6ef33 (diff) | |
download | xen-137cf1e1e3b56f74d76e17cc07e23d749eeaab46.tar.gz xen-137cf1e1e3b56f74d76e17cc07e23d749eeaab46.tar.bz2 xen-137cf1e1e3b56f74d76e17cc07e23d749eeaab46.zip |
bitkeeper revision 1.927 (40bdde5d1ZXH3mH4b7gbCihjzISvAg)
Interface cleanups.
Diffstat (limited to 'xen')
-rw-r--r-- | xen/include/hypervisor-ifs/arch-i386/hypervisor-if.h | 40 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h | 38 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/dom0_ops.h | 376 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/event_channel.h | 82 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/hypervisor-if.h | 46 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/physdev.h | 57 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/sched_ctl.h | 54 |
7 files changed, 360 insertions, 333 deletions
diff --git a/xen/include/hypervisor-ifs/arch-i386/hypervisor-if.h b/xen/include/hypervisor-ifs/arch-i386/hypervisor-if.h index e660a0438d..80055a5062 100644 --- a/xen/include/hypervisor-ifs/arch-i386/hypervisor-if.h +++ b/xen/include/hypervisor-ifs/arch-i386/hypervisor-if.h @@ -8,6 +8,16 @@ #define __HYPERVISOR_IF_I386_H__ /* + * Pointers and other address fields inside interface structures are padded to + * 64 bits. This means that field alignments aren't different between 32- and + * 64-bit architectures. + */ +/* NB. Multi-level macro ensures __LINE__ is expanded before concatenation. */ +#define __MEMORY_PADDING(_X) u32 __pad_ ## _X +#define _MEMORY_PADDING(_X) __MEMORY_PADDING(_X) +#define MEMORY_PADDING _MEMORY_PADDING(__LINE__) + +/* * SEGMENT DESCRIPTOR TABLES */ /* @@ -55,6 +65,10 @@ #ifndef __ASSEMBLY__ +/* NB. Both the following are 32 bits each. */ +typedef unsigned long memory_t; /* Full-sized pointer/address/memory-size. */ +typedef unsigned long cpureg_t; /* Full-sized register. */ + /* * Send an array of these to HYPERVISOR_set_trap_table() */ @@ -62,13 +76,12 @@ #define TI_GET_IF(_ti) ((_ti)->flags & 4) #define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl)) #define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2)) -typedef struct trap_info_st -{ - unsigned char vector; /* exception vector */ - unsigned char flags; /* 0-3: privilege level; 4: clear event enable? */ - unsigned short cs; /* code selector */ - unsigned long address; /* code address */ -} trap_info_t; +typedef struct { + u8 vector; /* 0: exception vector */ + u8 flags; /* 1: 0-3: privilege level; 4: clear event enable? */ + u16 cs; /* 2: code selector */ + memory_t address; /* 4: code address */ +} PACKED trap_info_t; /* 8 bytes */ typedef struct { @@ -89,19 +102,18 @@ typedef struct unsigned long eflags; unsigned long esp; unsigned long ss; -} execution_context_t; +} PACKED execution_context_t; typedef struct { - unsigned long tsc_bits; /* 32 bits read from the CPU's TSC. */ - unsigned int tsc_bitshift; /* 'tsc_bits' uses N:N+31 of TSC. */ -} tsc_timestamp_t; + u32 tsc_bits; /* 0: 32 bits read from the CPU's TSC. */ + u32 tsc_bitshift; /* 4: 'tsc_bits' uses N:N+31 of TSC. */ +} PACKED tsc_timestamp_t; /* 8 bytes */ /* * The following is all CPU context. Note that the i387_ctxt block is filled * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. */ -typedef struct full_execution_context_st -{ +typedef struct { #define ECF_I387_VALID (1<<0) unsigned long flags; execution_context_t cpu_ctxt; /* User-level CPU registers */ @@ -117,7 +129,7 @@ typedef struct full_execution_context_st unsigned long event_callback_eip; unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ unsigned long failsafe_callback_eip; -} full_execution_context_t; +} PACKED full_execution_context_t; #define ARCH_HAS_FAST_TRAP diff --git a/xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h b/xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h index 12cc5f6b1c..9eb578b781 100644 --- a/xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h +++ b/xen/include/hypervisor-ifs/arch-x86_64/hypervisor-if.h @@ -7,6 +7,9 @@ #ifndef __HYPERVISOR_IF_X86_64_H__ #define __HYPERVISOR_IF_X86_64_H__ +/* Pointers are naturally 64 bits in this architecture; no padding needed. */ +#define MEMORY_PADDING() ((void)0) + /* * SEGMENT DESCRIPTOR TABLES */ @@ -53,6 +56,10 @@ #ifndef __ASSEMBLY__ +/* NB. Both the following are 64 bits each. */ +typedef unsigned long memory_t; /* Full-sized pointer/address/memory-size. */ +typedef unsigned long cpureg_t; /* Full-sized register. */ + /* * Send an array of these to HYPERVISOR_set_trap_table() */ @@ -60,13 +67,13 @@ #define TI_GET_IF(_ti) ((_ti)->flags & 4) #define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl)) #define TI_SET_IF(_ti,_if) ((_ti)->flags |= ((!!(_if))<<2)) -typedef struct trap_info_st -{ - unsigned char vector; /* exception vector */ - unsigned char flags; /* 0-3: privilege level; 4: clear event enable? */ - unsigned short cs; /* code selector */ - unsigned long address; /* code address */ -} trap_info_t; +typedef struct { + u8 vector; /* 0: exception vector */ + u8 flags; /* 1: 0-3: privilege level; 4: clear event enable? */ + u16 cs; /* 2: code selector */ + u32 __pad; /* 4 */ + memory_t address; /* 8: code address */ +} PACKED trap_info_t; /* 16 bytes */ typedef struct { @@ -90,19 +97,22 @@ typedef struct unsigned long eflags; unsigned long rsp; unsigned long ss; -} execution_context_t; +} PACKED execution_context_t; +/* + * NB. This may become a 64-bit count with no shift. If this happens then the + * structure size will still be 8 bytes, so no other alignments will change. + */ typedef struct { - unsigned long tsc_bits; /* 32 bits read from the CPU's TSC. */ - unsigned int tsc_bitshift; /* 'tsc_bits' uses N:N+31 of TSC. */ -} tsc_timestamp_t; + u32 tsc_bits; /* 0: 32 bits read from the CPU's TSC. */ + u32 tsc_bitshift; /* 4: 'tsc_bits' uses N:N+31 of TSC. */ +} PACKED tsc_timestamp_t; /* 8 bytes */ /* * The following is all CPU context. Note that the i387_ctxt block is filled * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. */ -typedef struct full_execution_context_st -{ +typedef struct { #define ECF_I387_VALID (1<<0) unsigned long flags; execution_context_t cpu_ctxt; /* User-level CPU registers */ @@ -117,7 +127,7 @@ typedef struct full_execution_context_st unsigned long event_callback_eip; unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ unsigned long failsafe_callback_eip; -} full_execution_context_t; +} PACKED full_execution_context_t; #endif /* !__ASSEMBLY__ */ diff --git a/xen/include/hypervisor-ifs/dom0_ops.h b/xen/include/hypervisor-ifs/dom0_ops.h index 6273878d16..d5de8a8a85 100644 --- a/xen/include/hypervisor-ifs/dom0_ops.h +++ b/xen/include/hypervisor-ifs/dom0_ops.h @@ -3,7 +3,8 @@ * * Process command requests from domain-0 guest OS. * - * Copyright (c) 2002-2003, K A Fraser, B Dragovic + * Copyright (c) 2002-2003, B Dragovic + * Copyright (c) 2002-2004, K Fraser */ @@ -18,22 +19,24 @@ * This makes sure that old versions of dom0 tools will stop working in a * well-defined way (rather than crashing the machine, for instance). */ -#define DOM0_INTERFACE_VERSION 0xAAAA000C +#define DOM0_INTERFACE_VERSION 0xAAAA000D #define MAX_DOMAIN_NAME 16 /************************************************************************/ #define DOM0_GETMEMLIST 2 -typedef struct dom0_getmemlist_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - unsigned long max_pfns; - void *buffer; + domid_t domain; /* 0 */ + memory_t max_pfns; /* 8 */ + MEMORY_PADDING; + void *buffer; /* 16 */ + MEMORY_PADDING; /* OUT variables. */ - unsigned long num_pfns; -} dom0_getmemlist_t; + memory_t num_pfns; /* 24 */ + MEMORY_PADDING; +} PACKED dom0_getmemlist_t; /* 32 bytes */ #define DOM0_SCHEDCTL 6 /* struct sched_ctl_cmd is from sched-ctl.h */ @@ -44,110 +47,117 @@ typedef struct sched_ctl_cmd dom0_schedctl_t; typedef struct sched_adjdom_cmd dom0_adjustdom_t; #define DOM0_CREATEDOMAIN 8 -typedef struct dom0_createdomain_st -{ +typedef struct { /* IN parameters. */ - unsigned int memory_kb; - char name[MAX_DOMAIN_NAME]; - int cpu; + memory_t memory_kb; /* 0 */ + MEMORY_PADDING; + u8 name[MAX_DOMAIN_NAME]; /* 8 */ + u32 cpu; /* 24 */ + u32 __pad; /* 28 */ /* OUT parameters. */ - domid_t domain; -} dom0_createdomain_t; + domid_t domain; /* 32 */ +} PACKED dom0_createdomain_t; /* 40 bytes */ #define DOM0_DESTROYDOMAIN 9 -typedef struct dom0_destroydomain_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - int force; -} dom0_destroydomain_t; + domid_t domain; /* 0 */ + u32 force; /* 8 */ +} PACKED dom0_destroydomain_t; /* 12 bytes */ #define DOM0_STARTDOMAIN 10 -typedef struct dom0_startdomain_st -{ +typedef struct { /* IN parameters. */ - domid_t domain; -} dom0_startdomain_t; + domid_t domain; /* 0 */ +} PACKED dom0_startdomain_t; /* 8 bytes */ #define DOM0_STOPDOMAIN 11 -typedef struct dom0_stopdomain_st -{ +typedef struct { /* IN parameters. */ - domid_t domain; + domid_t domain; /* 0 */ /* hack to indicate that you want to wait for other domain -- replace with proper sychronous stop soon! */ - int sync; -} dom0_stopdomain_t; + u32 sync; /* 8 */ +} PACKED dom0_stopdomain_t; /* 12 bytes */ #define DOM0_GETDOMAININFO 12 -typedef struct dom0_getdomaininfo_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - full_execution_context_t *ctxt; + domid_t domain; /* 0 */ + full_execution_context_t *ctxt; /* 8 */ + MEMORY_PADDING; /* OUT variables. */ - char name[MAX_DOMAIN_NAME]; - int processor; - int has_cpu; + char name[MAX_DOMAIN_NAME]; /* 16 */ + u32 processor; /* 32 */ + u32 has_cpu; /* 36 */ #define DOMSTATE_ACTIVE 0 #define DOMSTATE_STOPPED 1 - int state; - int hyp_events; - unsigned int tot_pages, max_pages; - long long cpu_time; - unsigned long shared_info_frame; /* MFN of shared_info struct */ -} dom0_getdomaininfo_t; + u32 state; /* 40 */ + u32 hyp_events; /* 44 */ + u32 tot_pages; /* 48 */ + u32 max_pages; /* 52 */ + u64 cpu_time; /* 56 */ + memory_t shared_info_frame; /* 64: MFN of shared_info struct */ + MEMORY_PADDING; +} PACKED dom0_getdomaininfo_t; /* 72 bytes */ #define DOM0_BUILDDOMAIN 13 -typedef struct dom0_builddomain_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - unsigned int num_vifs; + domid_t domain; /* 0 */ + u32 num_vifs;/* 8 */ + u32 __pad; /* 12 */ /* IN/OUT parameters */ - full_execution_context_t *ctxt; -} dom0_builddomain_t; + full_execution_context_t *ctxt; /* 16 */ + MEMORY_PADDING; +} PACKED dom0_builddomain_t; /* 24 bytes */ #define DOM0_IOPL 14 -typedef struct dom0_iopl_st -{ - domid_t domain; - unsigned int iopl; -} dom0_iopl_t; +typedef struct { + domid_t domain; /* 0 */ + u32 iopl; /* 8 */ +} PACKED dom0_iopl_t; /* 12 bytes */ #define DOM0_MSR 15 -typedef struct dom0_msr_st -{ +typedef struct { /* IN variables. */ - int write, cpu_mask, msr; - unsigned int in1, in2; + u32 write; /* 0 */ + u32 cpu_mask; /* 4 */ + u32 msr; /* 8 */ + u32 in1; /* 12 */ + u32 in2; /* 16 */ /* OUT variables. */ - unsigned int out1, out2; -} dom0_msr_t; + u32 out1; /* 20 */ + u32 out2; /* 24 */ +} PACKED dom0_msr_t; /* 28 bytes */ #define DOM0_DEBUG 16 -typedef struct dom0_debug_st -{ +typedef struct { /* IN variables. */ - char opcode; - domid_t domain; - int in1, in2, in3, in4; + domid_t domain; /* 0 */ + u8 opcode; /* 8 */ + u8 __pad0, __pad1, __pad2; + u32 in1; /* 12 */ + u32 in2; /* 16 */ + u32 in3; /* 20 */ + u32 in4; /* 24 */ /* OUT variables. */ - unsigned int status; - int out1, out2; -} dom0_debug_t; + u32 status; /* 28 */ + u32 out1; /* 32 */ + u32 out2; /* 36 */ +} PACKED dom0_debug_t; /* 40 bytes */ /* * Set clock such that it would read <secs,usecs> after 00:00:00 UTC, * 1 January, 1970 if the current system time was <system_time>. */ #define DOM0_SETTIME 17 -typedef struct dom0_settime_st -{ +typedef struct { /* IN variables. */ - unsigned long secs, usecs; - u64 system_time; -} dom0_settime_t; + u32 secs; /* 0 */ + u32 usecs; /* 4 */ + u64 system_time; /* 8 */ +} PACKED dom0_settime_t; /* 16 bytes */ #define DOM0_GETPAGEFRAMEINFO 18 #define NOTAB 0 /* normal page */ @@ -157,85 +167,82 @@ typedef struct dom0_settime_st #define L4TAB (4<<28) #define XTAB (0xf<<28) /* invalid page */ #define LTAB_MASK XTAB -typedef struct dom0_getpageframeinfo_st -{ +typedef struct { /* IN variables. */ - unsigned long pfn; /* Machine page frame number to query. */ - domid_t domain; /* To which domain does the frame belong? */ + memory_t pfn; /* 0: Machine page frame number to query. */ + MEMORY_PADDING; + domid_t domain; /* 8: To which domain does the frame belong? */ /* OUT variables. */ /* Is the page PINNED to a type? */ - unsigned long type; /* see above type defs */ -} dom0_getpageframeinfo_t; - + u32 type; /* 16: see above type defs */ +} PACKED dom0_getpageframeinfo_t; /* 20 bytes */ /* * Read console content from Xen buffer ring. */ - #define DOM0_READCONSOLE 19 -typedef struct dom0_readconsole_st -{ - unsigned long str; - unsigned int count; - unsigned int cmd; -} dom0_readconsole_t; +typedef struct { + memory_t str; /* 0 */ + MEMORY_PADDING; + u32 count; /* 8 */ + u32 cmd; /* 12 */ +} PACKED dom0_readconsole_t; /* 16 bytes */ /* * Pin Domain to a particular CPU (use -1 to unpin) */ #define DOM0_PINCPUDOMAIN 20 -typedef struct dom0_pincpudomain_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - int cpu; /* -1 implies unpin */ -} dom0_pincpudomain_t; + domid_t domain; /* 0 */ + s32 cpu; /* 8: -1 implies unpin */ +} PACKED dom0_pincpudomain_t; /* 12 bytes */ /* Get trace buffers physical base pointer */ #define DOM0_GETTBUFS 21 -typedef struct dom0_gettbufs_st -{ - /* OUT variables */ - unsigned long phys_addr; /* location of the trace buffers */ - unsigned long size; /* size of each trace buffer, in bytes */ -} dom0_gettbufs_t; +typedef struct { + /* OUT variables */ + memory_t phys_addr; /* 0: location of the trace buffers */ + MEMORY_PADDING; + u32 size; /* 8: size of each trace buffer, in bytes */ +} PACKED dom0_gettbufs_t; /* 12 bytes */ /* * Get physical information about the host machine */ #define DOM0_PHYSINFO 22 -typedef struct dom0_physinfo_st -{ - int ht_per_core; - int cores; - unsigned long cpu_khz; - unsigned long total_pages; - unsigned long free_pages; -} dom0_physinfo_t; +typedef struct { + u32 ht_per_core; /* 0 */ + u32 cores; /* 4 */ + u32 cpu_khz; /* 8 */ + u32 __pad; /* 12 */ + memory_t total_pages; /* 16 */ + MEMORY_PADDING; + memory_t free_pages; /* 24 */ + MEMORY_PADDING; +} PACKED dom0_physinfo_t; /* 32 bytes */ /* * Allow a domain access to a physical PCI device */ #define DOM0_PCIDEV_ACCESS 23 -typedef struct dom0_pcidev_access_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - int bus; - int dev; - int func; - int enable; -} dom0_pcidev_access_t; + domid_t domain; /* 0 */ + u32 bus; /* 8 */ + u32 dev; /* 12 */ + u32 func; /* 16 */ + u32 enable; /* 20 */ +} PACKED dom0_pcidev_access_t; /* 24 bytes */ /* * Get the ID of the current scheduler. */ #define DOM0_SCHED_ID 24 -typedef struct dom0_sched_id_st -{ +typedef struct { /* OUT variable */ - int sched_id; -} dom0_sched_id_t; + u32 sched_id; /* 0 */ +} PACKED dom0_sched_id_t; /* 4 bytes */ /* * Control shadow pagetables operation @@ -249,87 +256,88 @@ typedef struct dom0_sched_id_st #define DOM0_SHADOW_CONTROL_OP_CLEAN 11 #define DOM0_SHADOW_CONTROL_OP_PEEK 12 #define DOM0_SHADOW_CONTROL_OP_CLEAN2 13 -typedef struct dom0_shadow_control_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - int op; - unsigned long *dirty_bitmap; // pointe to mlocked buffer - /* IN/OUT variables */ - unsigned long pages; // size of buffer, updated with actual size - /* OUT varaibles */ - unsigned long fault_count; - unsigned long dirty_count; -} dom0_shadow_control_t; + domid_t domain; /* 0 */ + u32 op; /* 8 */ + u32 __pad; /* 12 */ + unsigned long *dirty_bitmap; /* 16: pointer to locked buffer */ + MEMORY_PADDING; + /* IN/OUT variables. */ + memory_t pages; /* 24: size of buffer, updated with actual size */ + MEMORY_PADDING; + /* OUT variables. */ + memory_t fault_count; /* 32 */ + MEMORY_PADDING; + memory_t dirty_count; /* 40 */ + MEMORY_PADDING; +} PACKED dom0_shadow_control_t; /* 48 bytes */ #define DOM0_SETDOMAINNAME 26 -typedef struct dom0_setdomainname_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - char name[MAX_DOMAIN_NAME]; -} dom0_setdomainname_t; + domid_t domain; /* 0 */ + char name[MAX_DOMAIN_NAME]; /* 8 */ +} PACKED dom0_setdomainname_t; /* 24 bytes */ #define DOM0_SETDOMAININITIALMEM 27 -typedef struct dom0_setdomaininitialmem_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - unsigned int initial_memkb; /* use before domain is built */ -} dom0_setdomaininitialmem_t; + domid_t domain; /* 0 */ + memory_t initial_memkb; /* 8 */ + MEMORY_PADDING; +} PACKED dom0_setdomaininitialmem_t; /* 16 bytes */ #define DOM0_SETDOMAINMAXMEM 28 -typedef struct dom0_setdomainmaxmem_st -{ +typedef struct { /* IN variables. */ - domid_t domain; - unsigned int max_memkb; -} dom0_setdomainmaxmem_t; + domid_t domain; /* 0 */ + memory_t max_memkb; /* 8 */ + MEMORY_PADDING; +} PACKED dom0_setdomainmaxmem_t; /* 16 bytes */ #define DOM0_GETPAGEFRAMEINFO2 29 /* batched interface */ -typedef struct dom0_getpageframeinfo2_st -{ +typedef struct { /* IN variables. */ - domid_t domain; /* To which domain do frames belong? */ - int num; + domid_t domain; /* 0 */ + memory_t num; /* 8 */ + MEMORY_PADDING; /* IN/OUT variables. */ - unsigned long *array; -} dom0_getpageframeinfo2_t; - - -typedef struct dom0_op_st -{ - unsigned long cmd; - unsigned long interface_version; /* DOM0_INTERFACE_VERSION */ - union - { - unsigned long dummy[4]; - dom0_createdomain_t createdomain; - dom0_startdomain_t startdomain; - dom0_stopdomain_t stopdomain; - dom0_destroydomain_t destroydomain; - dom0_getmemlist_t getmemlist; - dom0_schedctl_t schedctl; - dom0_adjustdom_t adjustdom; - dom0_builddomain_t builddomain; - dom0_getdomaininfo_t getdomaininfo; - dom0_getpageframeinfo_t getpageframeinfo; - dom0_iopl_t iopl; - dom0_msr_t msr; - dom0_debug_t debug; - dom0_settime_t settime; - dom0_readconsole_t readconsole; - dom0_pincpudomain_t pincpudomain; - dom0_gettbufs_t gettbufs; - dom0_physinfo_t physinfo; - dom0_pcidev_access_t pcidev_access; - dom0_sched_id_t sched_id; - dom0_shadow_control_t shadow_control; - dom0_setdomainname_t setdomainname; + unsigned long *array; /* 16 */ + MEMORY_PADDING; +} PACKED dom0_getpageframeinfo2_t; /* 24 bytes */ + +typedef struct { + u32 cmd; /* 0 */ + u32 interface_version; /* 4 */ /* DOM0_INTERFACE_VERSION */ + union { /* 8 */ + u32 dummy[14]; /* 56 bytes */ + dom0_createdomain_t createdomain; + dom0_startdomain_t startdomain; + dom0_stopdomain_t stopdomain; + dom0_destroydomain_t destroydomain; + dom0_getmemlist_t getmemlist; + dom0_schedctl_t schedctl; + dom0_adjustdom_t adjustdom; + dom0_builddomain_t builddomain; + dom0_getdomaininfo_t getdomaininfo; + dom0_getpageframeinfo_t getpageframeinfo; + dom0_iopl_t iopl; + dom0_msr_t msr; + dom0_debug_t debug; + dom0_settime_t settime; + dom0_readconsole_t readconsole; + dom0_pincpudomain_t pincpudomain; + dom0_gettbufs_t gettbufs; + dom0_physinfo_t physinfo; + dom0_pcidev_access_t pcidev_access; + dom0_sched_id_t sched_id; + dom0_shadow_control_t shadow_control; + dom0_setdomainname_t setdomainname; dom0_setdomaininitialmem_t setdomaininitialmem; - dom0_setdomainmaxmem_t setdomainmaxmem; + dom0_setdomainmaxmem_t setdomainmaxmem; dom0_getpageframeinfo2_t getpageframeinfo2; - } u; -} dom0_op_t; + } PACKED u; +} PACKED dom0_op_t; /* 64 bytes */ #endif /* __DOM0_OPS_H__ */ diff --git a/xen/include/hypervisor-ifs/event_channel.h b/xen/include/hypervisor-ifs/event_channel.h index 20095c91a3..1c84fb3c22 100644 --- a/xen/include/hypervisor-ifs/event_channel.h +++ b/xen/include/hypervisor-ifs/event_channel.h @@ -17,13 +17,12 @@ * 3. <port1> and <port2> are only supplied if the op succeeds. */ #define EVTCHNOP_bind_interdomain 0 -typedef struct evtchn_bind_interdomain -{ +typedef struct { /* IN parameters. */ - domid_t dom1, dom2; + domid_t dom1, dom2; /* 0, 8 */ /* OUT parameters. */ - int port1, port2; -} evtchn_bind_interdomain_t; + u32 port1, port2; /* 16, 20 */ +} PACKED evtchn_bind_interdomain_t; /* 24 bytes */ /* * EVTCHNOP_bind_virq: Bind a local event channel to IRQ <irq>. @@ -31,13 +30,12 @@ typedef struct evtchn_bind_interdomain * 1. A virtual IRQ may be bound to at most one event channel per domain. */ #define EVTCHNOP_bind_virq 1 -typedef struct evtchn_bind_virq -{ +typedef struct { /* IN parameters. */ - int virq; + u32 virq; /* 0 */ /* OUT parameters. */ - int port; -} evtchn_bind_virq_t; + u32 port; /* 4 */ +} PACKED evtchn_bind_virq_t; /* 8 bytes */ /* * EVTCHNOP_bind_pirq: Bind a local event channel to IRQ <irq>. @@ -46,15 +44,14 @@ typedef struct evtchn_bind_virq * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. */ #define EVTCHNOP_bind_pirq 2 -typedef struct evtchn_bind_pirq -{ +typedef struct { /* IN parameters. */ - int pirq; + u32 pirq; /* 0 */ #define BIND_PIRQ__WILL_SHARE 1 - unsigned int flags; /* BIND_PIRQ__* */ + u32 flags; /* BIND_PIRQ__* */ /* 4 */ /* OUT parameters. */ - int port; -} evtchn_bind_pirq_t; + u32 port; /* 8 */ +} PACKED evtchn_bind_pirq_t; /* 12 bytes */ /* * EVTCHNOP_close: Close the communication channel which has an endpoint at @@ -65,25 +62,23 @@ typedef struct evtchn_bind_pirq * for which <dom> is not DOMID_SELF. */ #define EVTCHNOP_close 3 -typedef struct evtchn_close -{ +typedef struct { /* IN parameters. */ - domid_t dom; - int port; + domid_t dom; /* 0 */ + u32 port; /* 8 */ /* No OUT parameters. */ -} evtchn_close_t; +} PACKED evtchn_close_t; /* 12 bytes */ /* * EVTCHNOP_send: Send an event to the remote end of the channel whose local * endpoint is <DOMID_SELF, local_port>. */ #define EVTCHNOP_send 4 -typedef struct evtchn_send -{ +typedef struct { /* IN parameters. */ - int local_port; + u32 local_port; /* 0 */ /* No OUT parameters. */ -} evtchn_send_t; +} PACKED evtchn_send_t; /* 4 bytes */ /* * EVTCHNOP_status: Get the current status of the communication channel which @@ -94,40 +89,39 @@ typedef struct evtchn_send * channel for which <dom> is not DOMID_SELF. */ #define EVTCHNOP_status 5 -typedef struct evtchn_status -{ +typedef struct { /* IN parameters */ - domid_t dom; - int port; + domid_t dom; /* 0 */ + u32 port; /* 8 */ /* OUT parameters */ #define EVTCHNSTAT_closed 0 /* Chennel is not in use. */ #define EVTCHNSTAT_unbound 1 /* Channel is not bound to a source. */ #define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domain. */ #define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line. */ #define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ line */ - int status; + u32 status; /* 12 */ union { - int __none; /* EVTCHNSTAT_closed, EVTCHNSTAT_unbound */ struct { - domid_t dom; - int port; - } interdomain; /* EVTCHNSTAT_interdomain */ - int pirq; /* EVTCHNSTAT_pirq */ - int virq; /* EVTCHNSTAT_virq */ - } u; -} evtchn_status_t; + domid_t dom; /* 16 */ + u32 port; /* 24 */ + } PACKED interdomain; /* EVTCHNSTAT_interdomain */ + u32 pirq; /* EVTCHNSTAT_pirq */ /* 16 */ + u32 virq; /* EVTCHNSTAT_virq */ /* 16 */ + } PACKED u; +} PACKED evtchn_status_t; /* 28 bytes */ -typedef struct evtchn_op -{ - int cmd; /* EVTCHNOP_* */ - union { +typedef struct { + u32 cmd; /* EVTCHNOP_* */ /* 0 */ + u32 __reserved; /* 4 */ + union { /* 8 */ evtchn_bind_interdomain_t bind_interdomain; evtchn_bind_virq_t bind_virq; evtchn_bind_pirq_t bind_pirq; evtchn_close_t close; evtchn_send_t send; evtchn_status_t status; - } u; -} evtchn_op_t; + u8 __dummy[32]; + } PACKED u; +} PACKED evtchn_op_t; /* 40 bytes */ #endif /* __HYPERVISOR_IFS__EVENT_CHANNEL_H__ */ diff --git a/xen/include/hypervisor-ifs/hypervisor-if.h b/xen/include/hypervisor-ifs/hypervisor-if.h index 57b9dff13f..66b06ae1d6 100644 --- a/xen/include/hypervisor-ifs/hypervisor-if.h +++ b/xen/include/hypervisor-ifs/hypervisor-if.h @@ -7,6 +7,9 @@ #ifndef __HYPERVISOR_IF_H__ #define __HYPERVISOR_IF_H__ +/* GCC-specific way to pack structure definitions (no implicit padding). */ +#define PACKED __attribute__ ((packed)) + #include "arch/hypervisor-if.h" /* @@ -197,21 +200,24 @@ typedef u64 domid_t; #include "block.h" /* - * Send an array of these to HYPERVISOR_mmu_update() + * Send an array of these to HYPERVISOR_mmu_update(). + * NB. The fields are natural pointer/address size for this architecture. */ typedef struct { - unsigned long ptr, val; /* *ptr = val */ -} mmu_update_t; + memory_t ptr; /* Machine address of PTE. */ + memory_t val; /* New contents of PTE. */ +} PACKED mmu_update_t; /* - * Send an array of these to HYPERVISOR_multicall() + * Send an array of these to HYPERVISOR_multicall(). + * NB. The fields are natural register size for this architecture. */ typedef struct { - unsigned long op; - unsigned long args[7]; -} multicall_entry_t; + cpureg_t op; + cpureg_t args[7]; +} PACKED multicall_entry_t; /* Event channel endpoints per domain. */ #define NR_EVENT_CHANNELS 1024 @@ -258,7 +264,7 @@ typedef struct shared_info_st u8 evtchn_upcall_pending; u8 evtchn_upcall_mask; u8 pad0, pad1; - } vcpu_data[MAX_VIRT_CPUS]; + } PACKED vcpu_data[MAX_VIRT_CPUS]; /* 0 */ /* * A domain can have up to 1024 "event channels" on which it can send @@ -295,16 +301,16 @@ typedef struct shared_info_st * 32-bit selector to be set. Each bit in the selector covers a 32-bit * word in the PENDING bitfield array. */ - u32 evtchn_pending[32]; - u32 evtchn_pending_sel; - u32 evtchn_exception[32]; - u32 evtchn_mask[32]; + u32 evtchn_pending[32]; /* 4 */ + u32 evtchn_pending_sel; /* 132 */ + u32 evtchn_exception[32]; /* 136 */ + u32 evtchn_mask[32]; /* 264 */ /* * Time: The following abstractions are exposed: System Time, Clock Time, * Domain Virtual Time. Domains can access Cycle counter time directly. */ - u64 cpu_freq; /* CPU frequency (Hz). */ + u64 cpu_freq; /* 392: CPU frequency (Hz). */ /* * The following values are updated periodically (and not necessarily @@ -313,12 +319,12 @@ typedef struct shared_info_st * incremented immediately after. See the Xen-specific Linux code for an * example of how to read these values safely (arch/xen/kernel/time.c). */ - unsigned long time_version1; /* A version number for info below. */ - unsigned long time_version2; /* A version number for info below. */ + u32 time_version1; /* 400 */ + u32 time_version2; /* 404 */ tsc_timestamp_t tsc_timestamp; /* TSC at last update of time vals. */ u64 system_time; /* Time, in nanosecs, since boot. */ - unsigned long wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ - unsigned long wc_usec; /* Usecs 00:00:00 UTC, Jan 1, 1970. */ + u32 wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ + u32 wc_usec; /* Usecs 00:00:00 UTC, Jan 1, 1970. */ u64 domain_time; /* Domain virtual time, in nanosecs. */ /* @@ -326,8 +332,8 @@ typedef struct shared_info_st * Allow a domain to specify a timeout value in system time and * domain virtual time. */ - u64 wall_timeout; - u64 domain_timeout; + u64 wall_timeout; /* 440 */ + u64 domain_timeout; /* 448 */ /* * The index structures are all stored here for convenience. The rings @@ -339,7 +345,7 @@ typedef struct shared_info_st execution_context_t execution_context; -} shared_info_t; +} PACKED shared_info_t; /* * Start-of-day memory layout for the initial domain (DOM0): diff --git a/xen/include/hypervisor-ifs/physdev.h b/xen/include/hypervisor-ifs/physdev.h index 50372bf2be..4e1aa135d3 100644 --- a/xen/include/hypervisor-ifs/physdev.h +++ b/xen/include/hypervisor-ifs/physdev.h @@ -20,60 +20,61 @@ /* Read from PCI configuration space. */ typedef struct { /* IN */ - int bus; - int dev; - int func; - int reg; - int len; + u32 bus; /* 0 */ + u32 dev; /* 4 */ + u32 func; /* 8 */ + u32 reg; /* 12 */ + u32 len; /* 16 */ /* OUT */ - u32 value; -} physdevop_pci_cfgreg_read_t; + u32 value; /* 20 */ +} PACKED physdevop_pci_cfgreg_read_t; /* 24 bytes */ /* Write to PCI configuration space. */ typedef struct { /* IN */ - int bus; - int dev; - int func; - int reg; - int len; - u32 value; -} physdevop_pci_cfgreg_write_t; + u32 bus; /* 0 */ + u32 dev; /* 4 */ + u32 func; /* 8 */ + u32 reg; /* 12 */ + u32 len; /* 16 */ + u32 value; /* 20 */ +} PACKED physdevop_pci_cfgreg_write_t; /* 24 bytes */ /* Do final initialisation of a PCI device (e.g., last-moment IRQ routing). */ typedef struct { /* IN */ - int bus; - int dev; - int func; -} physdevop_pci_initialise_device_t; + u32 bus; /* 0 */ + u32 dev; /* 4 */ + u32 func; /* 8 */ +} PACKED physdevop_pci_initialise_device_t; /* 12 bytes */ /* Find the root buses for subsequent scanning. */ typedef struct { /* OUT */ - u32 busmask[256/32]; -} physdevop_pci_probe_root_buses_t; + u32 busmask[256/32]; /* 0 */ +} PACKED physdevop_pci_probe_root_buses_t; /* 32 bytes */ typedef struct { /* IN */ - int irq; + u32 irq; /* 0 */ /* OUT */ /* Need to call PHYSDEVOP_IRQ_UNMASK_NOTIFY when the IRQ has been serviced? */ #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY (1<<0) - unsigned long flags; -} physdevop_irq_status_query_t; + u32 flags; /* 4 */ +} PACKED physdevop_irq_status_query_t; /* 8 bytes */ typedef struct _physdev_op_st { - unsigned long cmd; - union - { + u32 cmd; /* 0 */ + u32 __pad; /* 4 */ + union { /* 8 */ physdevop_pci_cfgreg_read_t pci_cfgreg_read; physdevop_pci_cfgreg_write_t pci_cfgreg_write; physdevop_pci_initialise_device_t pci_initialise_device; physdevop_pci_probe_root_buses_t pci_probe_root_buses; physdevop_irq_status_query_t irq_status_query; - } u; -} physdev_op_t; + u8 __dummy[32]; + } PACKED u; +} PACKED physdev_op_t; /* 40 bytes */ #endif /* __HYPERVISOR_IFS_PHYSDEV_H__ */ diff --git a/xen/include/hypervisor-ifs/sched_ctl.h b/xen/include/hypervisor-ifs/sched_ctl.h index cdf682963a..641ad2c192 100644 --- a/xen/include/hypervisor-ifs/sched_ctl.h +++ b/xen/include/hypervisor-ifs/sched_ctl.h @@ -23,49 +23,45 @@ */ struct sched_ctl_cmd { - unsigned int sched_id; - int direction; /* are we getting or putting settings? */ - - union - { + u32 sched_id; /* 0 */ + u32 direction; /* 4 */ + union { /* 8 */ struct bvt_ctl { /* IN variables. */ - unsigned long ctx_allow; /* context switch allowance */ - } bvt; + u32 ctx_allow; /* 8: context switch allowance */ + } PACKED bvt; struct rrobin_ctl { /* IN variables */ - u64 slice; /* round robin time slice */ - } rrobin; - } u; -}; + u64 slice; /* 8: round robin time slice */ + } PACKED rrobin; + } PACKED u; +} PACKED; /* 16 bytes */ struct sched_adjdom_cmd { - unsigned int sched_id; - domid_t domain; - int direction; /* are we getting or putting settings? */ - - union - { + u32 sched_id; /* 0 */ + u32 direction; /* 4 */ + domid_t domain; /* 8 */ + union { /* 16 */ struct bvt_adjdom { - unsigned long mcu_adv; /* mcu advance: inverse of weight */ - unsigned long warp; /* time warp */ - unsigned long warpl; /* warp limit */ - unsigned long warpu; /* unwarp time requirement */ - } bvt; + u32 mcu_adv; /* 16: mcu advance: inverse of weight */ + u32 warp; /* 20: time warp */ + u32 warpl; /* 24: warp limit */ + u32 warpu; /* 28: unwarp time requirement */ + } PACKED bvt; struct atropos_adjdom { - u64 nat_period; - u64 nat_slice; - u64 latency; - int xtratime; - } atropos; - } u; -}; + u64 nat_period; /* 16 */ + u64 nat_slice; /* 24 */ + u64 latency; /* 32 */ + u32 xtratime; /* 36 */ + } PACKED atropos; + } PACKED u; +} PACKED; /* 40 bytes */ #endif /* __SCHED_CTL_H__ */ |