643
644 /*
645 * Mark 'pfn' in the bitmap
646 */
647 void
648 dump_page(pfn_t pfn)
649 {
650 pgcnt_t bitnum;
651
652 if ((bitnum = dump_pfn_to_bitnum(pfn)) != (pgcnt_t)-1) {
653 if (!BT_TEST(dumpcfg.bitmap, bitnum)) {
654 dumphdr->dump_npages++;
655 BT_SET(dumpcfg.bitmap, bitnum);
656 }
657 }
658 dump_timeleft = dump_timeout;
659 }
660
661 /*
662 * Dump the <as, va, pfn> information for a given address space.
663 * SEGOP_DUMP() will call dump_addpage() for each page in the segment.
664 */
665 static void
666 dump_as(struct as *as)
667 {
668 struct seg *seg;
669
670 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
671 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
672 if (seg->s_as != as)
673 break;
674 if (seg->s_ops == NULL)
675 continue;
676 SEGOP_DUMP(seg);
677 }
678 AS_LOCK_EXIT(as, &as->a_lock);
679
680 if (seg != NULL)
681 cmn_err(CE_WARN, "invalid segment %p in address space %p",
682 (void *)seg, (void *)as);
683 }
684
685 static int
686 dump_process(pid_t pid)
687 {
688 proc_t *p = sprlock(pid);
689
690 if (p == NULL)
691 return (-1);
692 if (p->p_as != &kas) {
693 mutex_exit(&p->p_lock);
694 dump_as(p->p_as);
695 mutex_enter(&p->p_lock);
696 }
|
643
644 /*
645 * Mark 'pfn' in the bitmap
646 */
647 void
648 dump_page(pfn_t pfn)
649 {
650 pgcnt_t bitnum;
651
652 if ((bitnum = dump_pfn_to_bitnum(pfn)) != (pgcnt_t)-1) {
653 if (!BT_TEST(dumpcfg.bitmap, bitnum)) {
654 dumphdr->dump_npages++;
655 BT_SET(dumpcfg.bitmap, bitnum);
656 }
657 }
658 dump_timeleft = dump_timeout;
659 }
660
661 /*
662 * Dump the <as, va, pfn> information for a given address space.
663 * segop_dump() will call dump_addpage() for each page in the segment.
664 */
665 static void
666 dump_as(struct as *as)
667 {
668 struct seg *seg;
669
670 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
671 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
672 if (seg->s_as != as)
673 break;
674 if (seg->s_ops == NULL)
675 continue;
676 segop_dump(seg);
677 }
678 AS_LOCK_EXIT(as, &as->a_lock);
679
680 if (seg != NULL)
681 cmn_err(CE_WARN, "invalid segment %p in address space %p",
682 (void *)seg, (void *)as);
683 }
684
685 static int
686 dump_process(pid_t pid)
687 {
688 proc_t *p = sprlock(pid);
689
690 if (p == NULL)
691 return (-1);
692 if (p->p_as != &kas) {
693 mutex_exit(&p->p_lock);
694 dump_as(p->p_as);
695 mutex_enter(&p->p_lock);
696 }
|