Print this page
6151 use NULL setpagesize segop as a shorthand for ENOTSUP


 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