6811333 Remove prom_printf() message in emlxs driver
[opensolaris.git] / usr / src / uts / common / vm / xhat.h
blob808262f2c94a3d27afaee6bf4505243fee2d4297
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
20 * CDDL HEADER END
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _VM_XHAT_H
28 #define _VM_XHAT_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
37 #ifndef _ASM
39 #include <sys/types.h>
40 #include <vm/page.h>
41 #include <sys/kmem.h>
43 struct xhat;
44 struct xhat_hme_blk;
46 struct xhat_ops {
47 struct xhat *(*xhat_alloc)(void *);
48 void (*xhat_free)(struct xhat *);
49 void (*xhat_free_start)(struct xhat *);
50 void (*xhat_free_end)(struct xhat *);
51 int (*xhat_dup)(struct xhat *, struct xhat *, caddr_t,
52 size_t, uint_t);
53 void (*xhat_swapin)(struct xhat *);
54 void (*xhat_swapout)(struct xhat *);
55 void (*xhat_memload)(struct xhat *, caddr_t, struct page *,
56 uint_t, uint_t);
57 void (*xhat_memload_array)(struct xhat *, caddr_t, size_t,
58 struct page **, uint_t, uint_t);
59 void (*xhat_devload)(struct xhat *, caddr_t, size_t, pfn_t,
60 uint_t, int);
61 void (*xhat_unload)(struct xhat *, caddr_t, size_t, uint_t);
62 void (*xhat_unload_callback)(struct xhat *, caddr_t, size_t,
63 uint_t, hat_callback_t *);
64 void (*xhat_setattr)(struct xhat *, caddr_t, size_t, uint_t);
65 void (*xhat_clrattr)(struct xhat *, caddr_t, size_t, uint_t);
66 void (*xhat_chgattr)(struct xhat *, caddr_t, size_t, uint_t);
67 void (*xhat_unshare)(struct xhat *, caddr_t, size_t);
68 void (*xhat_chgprot)(struct xhat *, caddr_t, size_t, uint_t);
69 int (*xhat_pageunload)(struct xhat *, struct page *, uint_t,
70 void *);
74 #define XHAT_POPS(_p) (_p)->xhat_provider_ops
75 #define XHAT_PROPS(_h) XHAT_POPS(((struct xhat *)(_h))->xhat_provider)
76 #define XHAT_HOPS(hat, func, args) \
77 { \
78 if (XHAT_PROPS(hat)-> /* */ func) \
79 XHAT_PROPS(hat)-> /* */ func /* */ args; \
82 #define XHAT_FREE_START(a) \
83 XHAT_HOPS(a, xhat_free_start, ((struct xhat *)(a)))
84 #define XHAT_FREE_END(a) \
85 XHAT_HOPS(a, xhat_free_end, ((struct xhat *)(a)))
86 #define XHAT_DUP(a, b, c, d, e) \
87 ((XHAT_PROPS(a)->xhat_dup == NULL) ? (0) : \
88 XHAT_PROPS(a)->xhat_dup((struct xhat *)(a), \
89 (struct xhat *)(b), c, d, e))
90 #define XHAT_SWAPIN(a) \
91 XHAT_HOPS(a, xhat_swapin, ((struct xhat *)(a)))
92 #define XHAT_SWAPOUT(a) \
93 XHAT_HOPS(a, xhat_swapout, ((struct xhat *)(a)))
94 #define XHAT_MEMLOAD(a, b, c, d, e) \
95 XHAT_HOPS(a, xhat_memload, ((struct xhat *)(a), b, c, d, e))
96 #define XHAT_MEMLOAD_ARRAY(a, b, c, d, e, f) \
97 XHAT_HOPS(a, xhat_memload_array, ((struct xhat *)(a), b, c, d, e, f))
98 #define XHAT_DEVLOAD(a, b, c, d, e, f) \
99 XHAT_HOPS(a, xhat_devload, ((struct xhat *)(a), b, c, d, e, f))
100 #define XHAT_UNLOAD(a, b, c, d) \
101 XHAT_HOPS(a, xhat_unload, ((struct xhat *)(a), b, c, d))
102 #define XHAT_UNLOAD_CALLBACK(a, b, c, d, e) \
103 XHAT_HOPS(a, xhat_unload_callback, ((struct xhat *)(a), b, c, d, e))
104 #define XHAT_SETATTR(a, b, c, d) \
105 XHAT_HOPS(a, xhat_setattr, ((struct xhat *)(a), b, c, d))
106 #define XHAT_CLRATTR(a, b, c, d) \
107 XHAT_HOPS(a, xhat_clrattr, ((struct xhat *)(a), b, c, d))
108 #define XHAT_CHGATTR(a, b, c, d) \
109 XHAT_HOPS(a, xhat_chgattr, ((struct xhat *)(a), b, c, d))
110 #define XHAT_UNSHARE(a, b, c) \
111 XHAT_HOPS(a, xhat_unshare, ((struct xhat *)(a), b, c))
112 #define XHAT_CHGPROT(a, b, c, d) \
113 XHAT_HOPS(a, xhat_chgprot, ((struct xhat *)(a), b, c, d))
114 #define XHAT_PAGEUNLOAD(a, b, c, d) \
115 ((XHAT_PROPS(a)->xhat_pageunload == NULL) ? (0) : \
116 XHAT_PROPS(a)->xhat_pageunload((struct xhat *)(a), b, c, d))
120 #define XHAT_PROVIDER_VERSION 1
123 * Provider name will be appended with "_cache"
124 * when initializing kmem cache.
125 * The resulting sring must be less than
126 * KMEM_CACHE_NAMELEN
128 #define XHAT_CACHE_NAMELEN 24
130 typedef struct xblk_cache {
131 kmutex_t lock;
132 kmem_cache_t *cache;
133 void *free_blks;
134 void (*reclaim)(void *);
135 } xblk_cache_t;
137 typedef struct xhat_provider {
138 int xhat_provider_version;
139 int xhat_provider_refcnt;
140 struct xhat_provider *next;
141 struct xhat_provider *prev;
142 char xhat_provider_name[XHAT_CACHE_NAMELEN];
143 xblk_cache_t *xblkcache;
144 struct xhat_ops *xhat_provider_ops;
145 int xhat_provider_blk_size;
146 } xhat_provider_t;
149 * The xhat structure is protected by xhat_lock.
150 * A particular xhat implementation is a extension of the
151 * xhat structure and may contain its own lock(s) to
152 * protect those additional fields.
153 * The xhat structure is never allocated directly.
154 * Instead its allocation is provided by the hat implementation.
155 * The xhat provider ops xhat_alloc/xhat_free are used to
156 * alloc/free a implementation dependant xhat structure.
158 struct xhat {
159 xhat_provider_t *xhat_provider;
160 struct as *xhat_as;
161 void *arg;
162 struct xhat *prev;
163 struct xhat *next;
164 kmutex_t xhat_lock;
165 int xhat_refcnt;
166 kthread_t *holder;
170 /* Error codes */
171 #define XH_PRVDR (1) /* Provider-specific error */
172 #define XH_ASBUSY (2) /* Address space is busy */
173 #define XH_XHHELD (3) /* XHAT is being held */
174 #define XH_NOTATTCHD (4) /* Provider is not attached to as */
177 int xhat_provider_register(xhat_provider_t *);
178 int xhat_provider_unregister(xhat_provider_t *);
179 void xhat_init(void);
180 int xhat_attach_xhat(xhat_provider_t *, struct as *, struct xhat **,
181 void *);
182 int xhat_detach_xhat(xhat_provider_t *, struct as *);
183 pfn_t xhat_insert_xhatblk(page_t *, struct xhat *, void **);
184 int xhat_delete_xhatblk(void *, int);
185 void xhat_hat_hold(struct xhat *);
186 void xhat_hat_rele(struct xhat *);
187 int xhat_hat_holders(struct xhat *);
189 void xhat_free_start_all(struct as *);
190 void xhat_free_end_all(struct as *);
191 int xhat_dup_all(struct as *, struct as *, caddr_t, size_t, uint_t);
192 void xhat_swapout_all(struct as *);
193 void xhat_unload_callback_all(struct as *, caddr_t, size_t, uint_t,
194 hat_callback_t *);
195 void xhat_setattr_all(struct as *, caddr_t, size_t, uint_t);
196 void xhat_clrattr_all(struct as *, caddr_t, size_t, uint_t);
197 void xhat_chgattr_all(struct as *, caddr_t, size_t, uint_t);
198 void xhat_chgprot_all(struct as *, caddr_t, size_t, uint_t);
199 void xhat_unshare_all(struct as *, caddr_t, size_t);
202 #endif /* _ASM */
204 #ifdef __cplusplus
206 #endif
208 #endif /* _VM_XHAT_H */