Print this page
patch lower-case-segops


 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