61 static int segnf_dup(struct seg *seg, struct seg *newseg);
62 static int segnf_unmap(struct seg *seg, caddr_t addr, size_t len);
63 static void segnf_free(struct seg *seg);
64 static faultcode_t segnf_nomap(void);
65 static int segnf_setprot(struct seg *seg, caddr_t addr,
66 size_t len, uint_t prot);
67 static int segnf_checkprot(struct seg *seg, caddr_t addr,
68 size_t len, uint_t prot);
69 static int segnf_nop(void);
70 static int segnf_getprot(struct seg *seg, caddr_t addr,
71 size_t len, uint_t *protv);
72 static u_offset_t segnf_getoffset(struct seg *seg, caddr_t addr);
73 static int segnf_gettype(struct seg *seg, caddr_t addr);
74 static int segnf_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
75 static void segnf_dump(struct seg *seg);
76 static int segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
77 struct page ***ppp, enum lock_type type, enum seg_rw rw);
78 static int segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
79 uint_t szc);
80 static int segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp);
81 static lgrp_mem_policy_info_t *segnf_getpolicy(struct seg *seg,
82 caddr_t addr);
83
84
85 struct seg_ops segnf_ops = {
86 .dup = segnf_dup,
87 .unmap = segnf_unmap,
88 .free = segnf_free,
89 .fault = (faultcode_t (*)(struct hat *, struct seg *, caddr_t,
90 size_t, enum fault_type, enum seg_rw))segnf_nomap,
91 .faulta = (faultcode_t (*)(struct seg *, caddr_t)) segnf_nomap,
92 .setprot = segnf_setprot,
93 .checkprot = segnf_checkprot,
94 .sync = (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
95 segnf_nop,
96 .incore = (size_t (*)(struct seg *, caddr_t, size_t, char *))
97 segnf_nop,
98 .lockop = (int (*)(struct seg *, caddr_t, size_t, int, int,
99 ulong_t *, size_t))segnf_nop,
100 .getprot = segnf_getprot,
101 .getoffset = segnf_getoffset,
102 .gettype = segnf_gettype,
103 .getvp = segnf_getvp,
104 .advise = (int (*)(struct seg *, caddr_t, size_t, uint_t))
105 segnf_nop,
106 .dump = segnf_dump,
107 .pagelock = segnf_pagelock,
108 .setpagesize = segnf_setpagesize,
109 .getmemid = segnf_getmemid,
110 .getpolicy = segnf_getpolicy,
111 };
112
113 /*
114 * vnode and page for the page of zeros we use for the nf mappings.
115 */
116 static kmutex_t segnf_lock;
117 static struct vnode nfvp;
118 static struct page **nfpp;
119
120 #define addr_to_vcolor(addr) \
121 (shm_alignment) ? \
122 ((int)(((uintptr_t)(addr) & (shm_alignment - 1)) >> PAGESHIFT)) : 0
123
124 /*
125 * We try to limit the number of Non-fault segments created.
126 * Non fault segments are created to optimize sparc V9 code which uses
127 * the sparc nonfaulting load ASI (ASI_PRIMARY_NOFAULT).
128 *
129 * There are several reasons why creating too many non-fault segments
130 * could cause problems.
457 static int
458 segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
459 struct page ***ppp, enum lock_type type, enum seg_rw rw)
460 {
461 return (ENOTSUP);
462 }
463
464 /*ARGSUSED*/
465 static int
466 segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
467 uint_t szc)
468 {
469 return (ENOTSUP);
470 }
471
472 /*ARGSUSED*/
473 static int
474 segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp)
475 {
476 return (ENODEV);
477 }
478
479 /*ARGSUSED*/
480 static lgrp_mem_policy_info_t *
481 segnf_getpolicy(struct seg *seg, caddr_t addr)
482 {
483 return (NULL);
484 }
|
61 static int segnf_dup(struct seg *seg, struct seg *newseg);
62 static int segnf_unmap(struct seg *seg, caddr_t addr, size_t len);
63 static void segnf_free(struct seg *seg);
64 static faultcode_t segnf_nomap(void);
65 static int segnf_setprot(struct seg *seg, caddr_t addr,
66 size_t len, uint_t prot);
67 static int segnf_checkprot(struct seg *seg, caddr_t addr,
68 size_t len, uint_t prot);
69 static int segnf_nop(void);
70 static int segnf_getprot(struct seg *seg, caddr_t addr,
71 size_t len, uint_t *protv);
72 static u_offset_t segnf_getoffset(struct seg *seg, caddr_t addr);
73 static int segnf_gettype(struct seg *seg, caddr_t addr);
74 static int segnf_getvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
75 static void segnf_dump(struct seg *seg);
76 static int segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
77 struct page ***ppp, enum lock_type type, enum seg_rw rw);
78 static int segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
79 uint_t szc);
80 static int segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp);
81
82
83 struct seg_ops segnf_ops = {
84 .dup = segnf_dup,
85 .unmap = segnf_unmap,
86 .free = segnf_free,
87 .fault = (faultcode_t (*)(struct hat *, struct seg *, caddr_t,
88 size_t, enum fault_type, enum seg_rw))segnf_nomap,
89 .faulta = (faultcode_t (*)(struct seg *, caddr_t)) segnf_nomap,
90 .setprot = segnf_setprot,
91 .checkprot = segnf_checkprot,
92 .sync = (int (*)(struct seg *, caddr_t, size_t, int, uint_t))
93 segnf_nop,
94 .incore = (size_t (*)(struct seg *, caddr_t, size_t, char *))
95 segnf_nop,
96 .lockop = (int (*)(struct seg *, caddr_t, size_t, int, int,
97 ulong_t *, size_t))segnf_nop,
98 .getprot = segnf_getprot,
99 .getoffset = segnf_getoffset,
100 .gettype = segnf_gettype,
101 .getvp = segnf_getvp,
102 .advise = (int (*)(struct seg *, caddr_t, size_t, uint_t))
103 segnf_nop,
104 .dump = segnf_dump,
105 .pagelock = segnf_pagelock,
106 .setpagesize = segnf_setpagesize,
107 .getmemid = segnf_getmemid,
108 };
109
110 /*
111 * vnode and page for the page of zeros we use for the nf mappings.
112 */
113 static kmutex_t segnf_lock;
114 static struct vnode nfvp;
115 static struct page **nfpp;
116
117 #define addr_to_vcolor(addr) \
118 (shm_alignment) ? \
119 ((int)(((uintptr_t)(addr) & (shm_alignment - 1)) >> PAGESHIFT)) : 0
120
121 /*
122 * We try to limit the number of Non-fault segments created.
123 * Non fault segments are created to optimize sparc V9 code which uses
124 * the sparc nonfaulting load ASI (ASI_PRIMARY_NOFAULT).
125 *
126 * There are several reasons why creating too many non-fault segments
127 * could cause problems.
454 static int
455 segnf_pagelock(struct seg *seg, caddr_t addr, size_t len,
456 struct page ***ppp, enum lock_type type, enum seg_rw rw)
457 {
458 return (ENOTSUP);
459 }
460
461 /*ARGSUSED*/
462 static int
463 segnf_setpagesize(struct seg *seg, caddr_t addr, size_t len,
464 uint_t szc)
465 {
466 return (ENOTSUP);
467 }
468
469 /*ARGSUSED*/
470 static int
471 segnf_getmemid(struct seg *seg, caddr_t addr, memid_t *memidp)
472 {
473 return (ENODEV);
474 }
|