164 static int segdev_unmap(struct seg *, caddr_t, size_t);
165 static void segdev_free(struct seg *);
166 static faultcode_t segdev_fault(struct hat *, struct seg *, caddr_t, size_t,
167 enum fault_type, enum seg_rw);
168 static faultcode_t segdev_faulta(struct seg *, caddr_t);
169 static int segdev_setprot(struct seg *, caddr_t, size_t, uint_t);
170 static int segdev_checkprot(struct seg *, caddr_t, size_t, uint_t);
171 static void segdev_badop(void);
172 static int segdev_sync(struct seg *, caddr_t, size_t, int, uint_t);
173 static size_t segdev_incore(struct seg *, caddr_t, size_t, char *);
174 static int segdev_lockop(struct seg *, caddr_t, size_t, int, int,
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
187 /*
188 * XXX this struct is used by rootnex_map_fault to identify
189 * the segment it has been passed. So if you make it
190 * "static" you'll need to fix rootnex_map_fault.
191 */
192 struct seg_ops segdev_ops = {
193 .dup = segdev_dup,
194 .unmap = segdev_unmap,
195 .free = segdev_free,
196 .fault = segdev_fault,
197 .faulta = segdev_faulta,
198 .setprot = segdev_setprot,
199 .checkprot = segdev_checkprot,
200 .kluster = (int (*)())segdev_badop,
201 .sync = segdev_sync,
202 .incore = segdev_incore,
203 .lockop = segdev_lockop,
204 .getprot = segdev_getprot,
205 .getoffset = segdev_getoffset,
206 .gettype = segdev_gettype,
207 .getvp = segdev_getvp,
208 .advise = segdev_advise,
209 .dump = segdev_dump,
210 .pagelock = segdev_pagelock,
211 .setpagesize = segdev_setpagesize,
212 .getmemid = segdev_getmemid,
213 };
214
215 /*
216 * Private segdev support routines
217 */
218 static struct segdev_data *sdp_alloc(void);
219
220 static void segdev_softunlock(struct hat *, struct seg *, caddr_t,
221 size_t, enum seg_rw);
222
223 static faultcode_t segdev_faultpage(struct hat *, struct seg *, caddr_t,
224 struct vpage *, enum fault_type, enum seg_rw, devmap_handle_t *);
225
226 static faultcode_t segdev_faultpages(struct hat *, struct seg *, caddr_t,
227 size_t, enum fault_type, enum seg_rw, devmap_handle_t *);
228
229 static struct devmap_ctx *devmap_ctxinit(dev_t, ulong_t);
230 static struct devmap_softlock *devmap_softlock_init(dev_t, ulong_t);
231 static void devmap_softlock_rele(devmap_handle_t *);
2454 dev_a.type = flags & MAP_TYPE;
2455 dev_a.prot = (uchar_t)prot;
2456 dev_a.maxprot = (uchar_t)maxprot;
2457 dev_a.hat_attr = hat_attr;
2458 dev_a.hat_flags = 0;
2459 dev_a.devmap_data = NULL;
2460
2461 error = as_map(as, *addrp, len, segdev_create, &dev_a);
2462 as_rangeunlock(as);
2463 return (error);
2464
2465 }
2466
2467 /*ARGSUSED*/
2468 static int
2469 segdev_pagelock(struct seg *seg, caddr_t addr, size_t len,
2470 struct page ***ppp, enum lock_type type, enum seg_rw rw)
2471 {
2472 TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_PAGELOCK,
2473 "segdev_pagelock:start");
2474 return (ENOTSUP);
2475 }
2476
2477 /*ARGSUSED*/
2478 static int
2479 segdev_setpagesize(struct seg *seg, caddr_t addr, size_t len,
2480 uint_t szc)
2481 {
2482 return (ENOTSUP);
2483 }
2484
2485 /*
2486 * devmap_device: Used by devmap framework to establish mapping
2487 * called by devmap_seup(9F) during map setup time.
2488 */
2489 /*ARGSUSED*/
2490 static int
2491 devmap_device(devmap_handle_t *dhp, struct as *as, caddr_t *addr,
2492 offset_t off, size_t len, uint_t flags)
2493 {
2494 devmap_handle_t *rdhp, *maxdhp;
2495 struct segdev_crargs dev_a;
2496 int err;
2497 uint_t maxprot = PROT_ALL;
2498 offset_t offset = 0;
2499 pfn_t pfn;
2500 struct devmap_pmem_cookie *pcp;
2501
|
164 static int segdev_unmap(struct seg *, caddr_t, size_t);
165 static void segdev_free(struct seg *);
166 static faultcode_t segdev_fault(struct hat *, struct seg *, caddr_t, size_t,
167 enum fault_type, enum seg_rw);
168 static faultcode_t segdev_faulta(struct seg *, caddr_t);
169 static int segdev_setprot(struct seg *, caddr_t, size_t, uint_t);
170 static int segdev_checkprot(struct seg *, caddr_t, size_t, uint_t);
171 static void segdev_badop(void);
172 static int segdev_sync(struct seg *, caddr_t, size_t, int, uint_t);
173 static size_t segdev_incore(struct seg *, caddr_t, size_t, char *);
174 static int segdev_lockop(struct seg *, caddr_t, size_t, int, int,
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_getmemid(struct seg *, caddr_t, memid_t *);
185
186 /*
187 * XXX this struct is used by rootnex_map_fault to identify
188 * the segment it has been passed. So if you make it
189 * "static" you'll need to fix rootnex_map_fault.
190 */
191 struct seg_ops segdev_ops = {
192 .dup = segdev_dup,
193 .unmap = segdev_unmap,
194 .free = segdev_free,
195 .fault = segdev_fault,
196 .faulta = segdev_faulta,
197 .setprot = segdev_setprot,
198 .checkprot = segdev_checkprot,
199 .kluster = (int (*)())segdev_badop,
200 .sync = segdev_sync,
201 .incore = segdev_incore,
202 .lockop = segdev_lockop,
203 .getprot = segdev_getprot,
204 .getoffset = segdev_getoffset,
205 .gettype = segdev_gettype,
206 .getvp = segdev_getvp,
207 .advise = segdev_advise,
208 .dump = segdev_dump,
209 .pagelock = segdev_pagelock,
210 .getmemid = segdev_getmemid,
211 };
212
213 /*
214 * Private segdev support routines
215 */
216 static struct segdev_data *sdp_alloc(void);
217
218 static void segdev_softunlock(struct hat *, struct seg *, caddr_t,
219 size_t, enum seg_rw);
220
221 static faultcode_t segdev_faultpage(struct hat *, struct seg *, caddr_t,
222 struct vpage *, enum fault_type, enum seg_rw, devmap_handle_t *);
223
224 static faultcode_t segdev_faultpages(struct hat *, struct seg *, caddr_t,
225 size_t, enum fault_type, enum seg_rw, devmap_handle_t *);
226
227 static struct devmap_ctx *devmap_ctxinit(dev_t, ulong_t);
228 static struct devmap_softlock *devmap_softlock_init(dev_t, ulong_t);
229 static void devmap_softlock_rele(devmap_handle_t *);
2452 dev_a.type = flags & MAP_TYPE;
2453 dev_a.prot = (uchar_t)prot;
2454 dev_a.maxprot = (uchar_t)maxprot;
2455 dev_a.hat_attr = hat_attr;
2456 dev_a.hat_flags = 0;
2457 dev_a.devmap_data = NULL;
2458
2459 error = as_map(as, *addrp, len, segdev_create, &dev_a);
2460 as_rangeunlock(as);
2461 return (error);
2462
2463 }
2464
2465 /*ARGSUSED*/
2466 static int
2467 segdev_pagelock(struct seg *seg, caddr_t addr, size_t len,
2468 struct page ***ppp, enum lock_type type, enum seg_rw rw)
2469 {
2470 TRACE_0(TR_FAC_DEVMAP, TR_DEVMAP_PAGELOCK,
2471 "segdev_pagelock:start");
2472 return (ENOTSUP);
2473 }
2474
2475 /*
2476 * devmap_device: Used by devmap framework to establish mapping
2477 * called by devmap_seup(9F) during map setup time.
2478 */
2479 /*ARGSUSED*/
2480 static int
2481 devmap_device(devmap_handle_t *dhp, struct as *as, caddr_t *addr,
2482 offset_t off, size_t len, uint_t flags)
2483 {
2484 devmap_handle_t *rdhp, *maxdhp;
2485 struct segdev_crargs dev_a;
2486 int err;
2487 uint_t maxprot = PROT_ALL;
2488 offset_t offset = 0;
2489 pfn_t pfn;
2490 struct devmap_pmem_cookie *pcp;
2491
|