pandora: reserve CMA area for c64_tools
[pandora-kernel.git] / drivers / hv / hv_kvp.h
1 /*
2  * An implementation of HyperV key value pair (KVP) functionality for Linux.
3  *
4  *
5  * Copyright (C) 2010, Novell, Inc.
6  * Author : K. Y. Srinivasan <ksrinivasan@novell.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License version 2 as published
10  * by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
15  * NON INFRINGEMENT.  See the GNU General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21  *
22  */
23 #ifndef _KVP_H
24 #define _KVP_H_
25
26 /*
27  * Maximum value size - used for both key names and value data, and includes
28  * any applicable NULL terminators.
29  *
30  * Note:  This limit is somewhat arbitrary, but falls easily within what is
31  * supported for all native guests (back to Win 2000) and what is reasonable
32  * for the IC KVP exchange functionality.  Note that Windows Me/98/95 are
33  * limited to 255 character key names.
34  *
35  * MSDN recommends not storing data values larger than 2048 bytes in the
36  * registry.
37  *
38  * Note:  This value is used in defining the KVP exchange message - this value
39  * cannot be modified without affecting the message size and compatibility.
40  */
41
42 /*
43  * bytes, including any null terminators
44  */
45 #define HV_KVP_EXCHANGE_MAX_VALUE_SIZE          (2048)
46
47
48 /*
49  * Maximum key size - the registry limit for the length of an entry name
50  * is 256 characters, including the null terminator
51  */
52
53 #define HV_KVP_EXCHANGE_MAX_KEY_SIZE            (512)
54
55 /*
56  * In Linux, we implement the KVP functionality in two components:
57  * 1) The kernel component which is packaged as part of the hv_utils driver
58  * is responsible for communicating with the host and responsible for
59  * implementing the host/guest protocol. 2) A user level daemon that is
60  * responsible for data gathering.
61  *
62  * Host/Guest Protocol: The host iterates over an index and expects the guest
63  * to assign a key name to the index and also return the value corresponding to
64  * the key. The host will have atmost one KVP transaction outstanding at any
65  * given point in time. The host side iteration stops when the guest returns
66  * an error. Microsoft has specified the following mapping of key names to
67  * host specified index:
68  *
69  *      Index           Key Name
70  *      0               FullyQualifiedDomainName
71  *      1               IntegrationServicesVersion
72  *      2               NetworkAddressIPv4
73  *      3               NetworkAddressIPv6
74  *      4               OSBuildNumber
75  *      5               OSName
76  *      6               OSMajorVersion
77  *      7               OSMinorVersion
78  *      8               OSVersion
79  *      9               ProcessorArchitecture
80  *
81  * The Windows host expects the Key Name and Key Value to be encoded in utf16.
82  *
83  * Guest Kernel/KVP Daemon Protocol: As noted earlier, we implement all of the
84  * data gathering functionality in a user mode daemon. The user level daemon
85  * is also responsible for binding the key name to the index as well. The
86  * kernel and user-level daemon communicate using a connector channel.
87  *
88  * The user mode component first registers with the
89  * the kernel component. Subsequently, the kernel component requests, data
90  * for the specified keys. In response to this message the user mode component
91  * fills in the value corresponding to the specified key. We overload the
92  * sequence field in the cn_msg header to define our KVP message types.
93  *
94  *
95  * The kernel component simply acts as a conduit for communication between the
96  * Windows host and the user-level daemon. The kernel component passes up the
97  * index received from the Host to the user-level daemon. If the index is
98  * valid (supported), the corresponding key as well as its
99  * value (both are strings) is returned. If the index is invalid
100  * (not supported), a NULL key string is returned.
101  */
102
103 /*
104  *
105  * The following definitions are shared with the user-mode component; do not
106  * change any of this without making the corresponding changes in
107  * the KVP user-mode component.
108  */
109
110 #define CN_KVP_VAL             0x1 /* This supports queries from the kernel */
111 #define CN_KVP_USER_VAL       0x2 /* This supports queries from the user */
112
113 enum hv_ku_op {
114         KVP_REGISTER = 0, /* Register the user mode component */
115         KVP_KERNEL_GET, /* Kernel is requesting the value */
116         KVP_KERNEL_SET, /* Kernel is providing the value */
117         KVP_USER_GET,  /* User is requesting the value */
118         KVP_USER_SET  /* User is providing the value */
119 };
120
121 struct hv_ku_msg {
122         __u32 kvp_index; /* Key index */
123         __u8  kvp_key[HV_KVP_EXCHANGE_MAX_KEY_SIZE]; /* Key name */
124         __u8  kvp_value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE]; /* Key  value */
125 };
126
127
128
129
130 #ifdef __KERNEL__
131
132 /*
133  * Registry value types.
134  */
135
136 #define REG_SZ 1
137
138 enum hv_kvp_exchg_op {
139         KVP_OP_GET = 0,
140         KVP_OP_SET,
141         KVP_OP_DELETE,
142         KVP_OP_ENUMERATE,
143         KVP_OP_COUNT /* Number of operations, must be last. */
144 };
145
146 enum hv_kvp_exchg_pool {
147         KVP_POOL_EXTERNAL = 0,
148         KVP_POOL_GUEST,
149         KVP_POOL_AUTO,
150         KVP_POOL_AUTO_EXTERNAL,
151         KVP_POOL_AUTO_INTERNAL,
152         KVP_POOL_COUNT /* Number of pools, must be last. */
153 };
154
155 struct hv_kvp_hdr {
156         u8 operation;
157         u8 pool;
158 };
159
160 struct hv_kvp_exchg_msg_value {
161         u32 value_type;
162         u32 key_size;
163         u32 value_size;
164         u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
165         u8 value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE];
166 };
167
168 struct hv_kvp_msg_enumerate {
169         u32 index;
170         struct hv_kvp_exchg_msg_value data;
171 };
172
173 struct hv_kvp_msg {
174         struct hv_kvp_hdr       kvp_hdr;
175         struct hv_kvp_msg_enumerate     kvp_data;
176 };
177
178 int hv_kvp_init(struct hv_util_service *);
179 void hv_kvp_deinit(void);
180 void hv_kvp_onchannelcallback(void *);
181
182 #endif /* __KERNEL__ */
183 #endif  /* _KVP_H */
184