273
274 if (devload)
275 hat_unload(kas.a_hat, mm_map, PAGESIZE, HAT_UNLOAD_UNLOCK);
276 else if (pp)
277 hat_kpm_mapout(pp, NULL, va);
278 else
279 hat_kpm_mapout_pfn(pfn);
280
281 mutex_exit(&mm_lock);
282 return (error);
283 }
284
285 static int
286 mmpagelock(struct as *as, caddr_t va)
287 {
288 struct seg *seg;
289 int i;
290
291 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
292 seg = as_segat(as, va);
293 i = (seg != NULL)? SEGOP_CAPABLE(seg, S_CAPABILITY_NOMINFLT) : 0;
294 AS_LOCK_EXIT(as, &as->a_lock);
295
296 return (i);
297 }
298
299 #ifdef __sparc
300
301 #define NEED_LOCK_KVADDR(kva) mmpagelock(&kas, kva)
302
303 #else /* __i386, __amd64 */
304
305 #define NEED_LOCK_KVADDR(va) 0
306
307 #endif /* __sparc */
308
309 /*ARGSUSED3*/
310 static int
311 mmrw(dev_t dev, struct uio *uio, enum uio_rw rw, cred_t *cred)
312 {
313 pfn_t v;
|
273
274 if (devload)
275 hat_unload(kas.a_hat, mm_map, PAGESIZE, HAT_UNLOAD_UNLOCK);
276 else if (pp)
277 hat_kpm_mapout(pp, NULL, va);
278 else
279 hat_kpm_mapout_pfn(pfn);
280
281 mutex_exit(&mm_lock);
282 return (error);
283 }
284
285 static int
286 mmpagelock(struct as *as, caddr_t va)
287 {
288 struct seg *seg;
289 int i;
290
291 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
292 seg = as_segat(as, va);
293 i = (seg != NULL)? segop_capable(seg, S_CAPABILITY_NOMINFLT) : 0;
294 AS_LOCK_EXIT(as, &as->a_lock);
295
296 return (i);
297 }
298
299 #ifdef __sparc
300
301 #define NEED_LOCK_KVADDR(kva) mmpagelock(&kas, kva)
302
303 #else /* __i386, __amd64 */
304
305 #define NEED_LOCK_KVADDR(va) 0
306
307 #endif /* __sparc */
308
309 /*ARGSUSED3*/
310 static int
311 mmrw(dev_t dev, struct uio *uio, enum uio_rw rw, cred_t *cred)
312 {
313 pfn_t v;
|