290 /* cannot have write-only protection */
291 prot |= PROT_READ|PROT_WRITE;
292 #if 0 /* damned broken mmu feature! */
293 if (sum(pwp->wp_umap) == 0)
294 prot &= ~PROT_USER;
295 #endif
296 }
297 }
298
299
300 if (pwp->wp_oprot != 0) { /* if page exists */
301 struct seg *seg;
302 uint_t oprot;
303 int err, retrycnt = 0;
304
305 AS_LOCK_EXIT(as, &as->a_lock);
306 AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
307 retry:
308 seg = as_segat(as, addr);
309 ASSERT(seg != NULL);
310 SEGOP_GETPROT(seg, addr, 0, &oprot);
311 if (prot != oprot) {
312 err = SEGOP_SETPROT(seg, addr, PAGESIZE, prot);
313 if (err == IE_RETRY) {
314 ASSERT(retrycnt == 0);
315 retrycnt++;
316 goto retry;
317 }
318 }
319 AS_LOCK_EXIT(as, &as->a_lock);
320 } else
321 AS_LOCK_EXIT(as, &as->a_lock);
322
323 /*
324 * When all pages are mapped back to their normal state,
325 * continue the other lwps.
326 */
327 if (!mapin) {
328 ASSERT(p->p_mapcnt > 0);
329 p->p_mapcnt--;
330 if (p->p_mapcnt == 0) {
331 mutex_exit(&p->p_maplock);
332 mutex_enter(&p->p_lock);
385 uint_t prot;
386 int err, retrycnt;
387
388 if (p->p_wprot == NULL)
389 return;
390
391 ASSERT(MUTEX_NOT_HELD(&curproc->p_lock));
392
393 AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
394
395 pwp = p->p_wprot;
396 while (pwp != NULL) {
397
398 vaddr = pwp->wp_vaddr;
399 retrycnt = 0;
400 retry:
401 ASSERT(pwp->wp_flags & WP_SETPROT);
402 if ((seg = as_segat(as, vaddr)) != NULL &&
403 !(pwp->wp_flags & WP_NOWATCH)) {
404 prot = pwp->wp_prot;
405 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
406 if (err == IE_RETRY) {
407 ASSERT(retrycnt == 0);
408 retrycnt++;
409 goto retry;
410 }
411 }
412
413 next = pwp->wp_list;
414
415 if (pwp->wp_read + pwp->wp_write + pwp->wp_exec == 0) {
416 /*
417 * No watched areas remain in this page.
418 * Free the watched_page structure.
419 */
420 avl_remove(&as->a_wpage, pwp);
421 kmem_free(pwp, sizeof (struct watched_page));
422 } else {
423 pwp->wp_flags &= ~WP_SETPROT;
424 }
425
|
290 /* cannot have write-only protection */
291 prot |= PROT_READ|PROT_WRITE;
292 #if 0 /* damned broken mmu feature! */
293 if (sum(pwp->wp_umap) == 0)
294 prot &= ~PROT_USER;
295 #endif
296 }
297 }
298
299
300 if (pwp->wp_oprot != 0) { /* if page exists */
301 struct seg *seg;
302 uint_t oprot;
303 int err, retrycnt = 0;
304
305 AS_LOCK_EXIT(as, &as->a_lock);
306 AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
307 retry:
308 seg = as_segat(as, addr);
309 ASSERT(seg != NULL);
310 segop_getprot(seg, addr, 0, &oprot);
311 if (prot != oprot) {
312 err = segop_setprot(seg, addr, PAGESIZE, prot);
313 if (err == IE_RETRY) {
314 ASSERT(retrycnt == 0);
315 retrycnt++;
316 goto retry;
317 }
318 }
319 AS_LOCK_EXIT(as, &as->a_lock);
320 } else
321 AS_LOCK_EXIT(as, &as->a_lock);
322
323 /*
324 * When all pages are mapped back to their normal state,
325 * continue the other lwps.
326 */
327 if (!mapin) {
328 ASSERT(p->p_mapcnt > 0);
329 p->p_mapcnt--;
330 if (p->p_mapcnt == 0) {
331 mutex_exit(&p->p_maplock);
332 mutex_enter(&p->p_lock);
385 uint_t prot;
386 int err, retrycnt;
387
388 if (p->p_wprot == NULL)
389 return;
390
391 ASSERT(MUTEX_NOT_HELD(&curproc->p_lock));
392
393 AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
394
395 pwp = p->p_wprot;
396 while (pwp != NULL) {
397
398 vaddr = pwp->wp_vaddr;
399 retrycnt = 0;
400 retry:
401 ASSERT(pwp->wp_flags & WP_SETPROT);
402 if ((seg = as_segat(as, vaddr)) != NULL &&
403 !(pwp->wp_flags & WP_NOWATCH)) {
404 prot = pwp->wp_prot;
405 err = segop_setprot(seg, vaddr, PAGESIZE, prot);
406 if (err == IE_RETRY) {
407 ASSERT(retrycnt == 0);
408 retrycnt++;
409 goto retry;
410 }
411 }
412
413 next = pwp->wp_list;
414
415 if (pwp->wp_read + pwp->wp_write + pwp->wp_exec == 0) {
416 /*
417 * No watched areas remain in this page.
418 * Free the watched_page structure.
419 */
420 avl_remove(&as->a_wpage, pwp);
421 kmem_free(pwp, sizeof (struct watched_page));
422 } else {
423 pwp->wp_flags &= ~WP_SETPROT;
424 }
425
|