175 ulong_t *, size_t);
176 static int segdev_getprot(struct seg *, caddr_t, size_t, uint_t *);
177 static u_offset_t segdev_getoffset(struct seg *, caddr_t);
178 static int segdev_gettype(struct seg *, caddr_t);
179 static int segdev_getvp(struct seg *, caddr_t, struct vnode **);
180 static int segdev_advise(struct seg *, caddr_t, size_t, uint_t);
181 static void segdev_dump(struct seg *);
182 static int segdev_pagelock(struct seg *, caddr_t, size_t,
183 struct page ***, enum lock_type, enum seg_rw);
184 static int segdev_setpagesize(struct seg *, caddr_t, size_t, uint_t);
185 static int segdev_getmemid(struct seg *, caddr_t, memid_t *);
186 static lgrp_mem_policy_info_t *segdev_getpolicy(struct seg *, caddr_t);
187 static int segdev_capable(struct seg *, segcapability_t);
188
189 /*
190 * XXX this struct is used by rootnex_map_fault to identify
191 * the segment it has been passed. So if you make it
192 * "static" you'll need to fix rootnex_map_fault.
193 */
194 struct seg_ops segdev_ops = {
195 segdev_dup,
196 segdev_unmap,
197 segdev_free,
198 segdev_fault,
199 segdev_faulta,
200 segdev_setprot,
201 segdev_checkprot,
202 (int (*)())segdev_badop, /* kluster */
203 (size_t (*)(struct seg *))NULL, /* swapout */
204 segdev_sync, /* sync */
205 segdev_incore,
206 segdev_lockop, /* lockop */
207 segdev_getprot,
208 segdev_getoffset,
209 segdev_gettype,
210 segdev_getvp,
211 segdev_advise,
212 segdev_dump,
213 segdev_pagelock,
214 segdev_setpagesize,
215 segdev_getmemid,
216 segdev_getpolicy,
217 segdev_capable,
218 seg_inherit_notsup
219 };
220
221 /*
222 * Private segdev support routines
223 */
224 static struct segdev_data *sdp_alloc(void);
225
226 static void segdev_softunlock(struct hat *, struct seg *, caddr_t,
227 size_t, enum seg_rw);
228
229 static faultcode_t segdev_faultpage(struct hat *, struct seg *, caddr_t,
230 struct vpage *, enum fault_type, enum seg_rw, devmap_handle_t *);
231
232 static faultcode_t segdev_faultpages(struct hat *, struct seg *, caddr_t,
233 size_t, enum fault_type, enum seg_rw, devmap_handle_t *);
234
235 static struct devmap_ctx *devmap_ctxinit(dev_t, ulong_t);
236 static struct devmap_softlock *devmap_softlock_init(dev_t, ulong_t);
237 static void devmap_softlock_rele(devmap_handle_t *);
238 static void devmap_ctx_rele(devmap_handle_t *);
|
175 ulong_t *, size_t);
176 static int segdev_getprot(struct seg *, caddr_t, size_t, uint_t *);
177 static u_offset_t segdev_getoffset(struct seg *, caddr_t);
178 static int segdev_gettype(struct seg *, caddr_t);
179 static int segdev_getvp(struct seg *, caddr_t, struct vnode **);
180 static int segdev_advise(struct seg *, caddr_t, size_t, uint_t);
181 static void segdev_dump(struct seg *);
182 static int segdev_pagelock(struct seg *, caddr_t, size_t,
183 struct page ***, enum lock_type, enum seg_rw);
184 static int segdev_setpagesize(struct seg *, caddr_t, size_t, uint_t);
185 static int segdev_getmemid(struct seg *, caddr_t, memid_t *);
186 static lgrp_mem_policy_info_t *segdev_getpolicy(struct seg *, caddr_t);
187 static int segdev_capable(struct seg *, segcapability_t);
188
189 /*
190 * XXX this struct is used by rootnex_map_fault to identify
191 * the segment it has been passed. So if you make it
192 * "static" you'll need to fix rootnex_map_fault.
193 */
194 struct seg_ops segdev_ops = {
195 .dup = segdev_dup,
196 .unmap = segdev_unmap,
197 .free = segdev_free,
198 .fault = segdev_fault,
199 .faulta = segdev_faulta,
200 .setprot = segdev_setprot,
201 .checkprot = segdev_checkprot,
202 .kluster = (int (*)())segdev_badop,
203 .sync = segdev_sync,
204 .incore = segdev_incore,
205 .lockop = segdev_lockop,
206 .getprot = segdev_getprot,
207 .getoffset = segdev_getoffset,
208 .gettype = segdev_gettype,
209 .getvp = segdev_getvp,
210 .advise = segdev_advise,
211 .dump = segdev_dump,
212 .pagelock = segdev_pagelock,
213 .setpagesize = segdev_setpagesize,
214 .getmemid = segdev_getmemid,
215 .getpolicy = segdev_getpolicy,
216 .capable = segdev_capable,
217 .inherit = seg_inherit_notsup,
218 };
219
220 /*
221 * Private segdev support routines
222 */
223 static struct segdev_data *sdp_alloc(void);
224
225 static void segdev_softunlock(struct hat *, struct seg *, caddr_t,
226 size_t, enum seg_rw);
227
228 static faultcode_t segdev_faultpage(struct hat *, struct seg *, caddr_t,
229 struct vpage *, enum fault_type, enum seg_rw, devmap_handle_t *);
230
231 static faultcode_t segdev_faultpages(struct hat *, struct seg *, caddr_t,
232 size_t, enum fault_type, enum seg_rw, devmap_handle_t *);
233
234 static struct devmap_ctx *devmap_ctxinit(dev_t, ulong_t);
235 static struct devmap_softlock *devmap_softlock_init(dev_t, ulong_t);
236 static void devmap_softlock_rele(devmap_handle_t *);
237 static void devmap_ctx_rele(devmap_handle_t *);
|