Print this page
patch as-lock-macro-simplification


1735         } *bigwad;
1736         size_t bigsize;
1737         size_t phdrsz, shdrsz;
1738         Ehdr *ehdr;
1739         Phdr *v;
1740         caddr_t brkbase;
1741         size_t brksize;
1742         caddr_t stkbase;
1743         size_t stksize;
1744         int ntries = 0;
1745         klwp_t *lwp = ttolwp(curthread);
1746 
1747 top:
1748         /*
1749          * Make sure we have everything we need (registers, etc.).
1750          * All other lwps have already stopped and are in an orderly state.
1751          */
1752         ASSERT(p == ttoproc(curthread));
1753         prstop(0, 0);
1754 
1755         AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
1756         nphdrs = prnsegs(as, 0) + 2;            /* two CORE note sections */
1757 
1758         /*
1759          * Count the number of section headers we're going to need.
1760          */
1761         nshdrs = 0;
1762         if (content & (CC_CONTENT_CTF | CC_CONTENT_SYMTAB)) {
1763                 (void) process_scns(content, p, credp, NULL, NULL, NULL, 0,
1764                     NULL, &nshdrs);
1765         }
1766         AS_LOCK_EXIT(as, &as->a_lock);
1767 
1768         ASSERT(nshdrs == 0 || nshdrs > 1);
1769 
1770         /*
1771          * The core file contents may required zero section headers, but if
1772          * we overflow the 16 bits allotted to the program header count in
1773          * the ELF header, we'll need that program header at index zero.
1774          */
1775         if (nshdrs == 0 && nphdrs >= PN_XNUM)
1776                 nshdrs = 1;
1777 
1778         phdrsz = nphdrs * sizeof (Phdr);
1779         shdrsz = nshdrs * sizeof (Shdr);
1780 
1781         bigsize = MAX(sizeof (*bigwad), MAX(phdrsz, shdrsz));
1782         bigwad = kmem_alloc(bigsize, KM_SLEEP);
1783 
1784         ehdr = &bigwad->ehdr;
1785         bzero(ehdr, sizeof (*ehdr));
1786 


1862         bzero(v, phdrsz);
1863 
1864         setup_old_note_header(&v[0], p);
1865         v[0].p_offset = doffset = roundup(doffset, sizeof (Word));
1866         doffset += v[0].p_filesz;
1867 
1868         setup_note_header(&v[1], p);
1869         v[1].p_offset = doffset = roundup(doffset, sizeof (Word));
1870         doffset += v[1].p_filesz;
1871 
1872         mutex_enter(&p->p_lock);
1873 
1874         brkbase = p->p_brkbase;
1875         brksize = p->p_brksize;
1876 
1877         stkbase = p->p_usrstack - p->p_stksize;
1878         stksize = p->p_stksize;
1879 
1880         mutex_exit(&p->p_lock);
1881 
1882         AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
1883         i = 2;
1884         for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
1885                 caddr_t eaddr = seg->s_base + pr_getsegsize(seg, 0);
1886                 caddr_t saddr, naddr;
1887                 void *tmp = NULL;
1888                 extern struct seg_ops segspt_shmops;
1889 
1890                 for (saddr = seg->s_base; saddr < eaddr; saddr = naddr) {
1891                         uint_t prot;
1892                         size_t size;
1893                         int type;
1894                         vnode_t *mvp;
1895 
1896                         prot = pr_getprot(seg, 0, &tmp, &saddr, &naddr, eaddr);
1897                         prot &= PROT_READ | PROT_WRITE | PROT_EXEC;
1898                         if ((size = (size_t)(naddr - saddr)) == 0)
1899                                 continue;
1900                         if (i == nphdrs) {
1901                                 overflow++;
1902                                 continue;


1962                                         goto exclude;
1963 
1964                         } else if (prot == PROT_READ) {
1965                                 if (!(content & CC_CONTENT_RODATA))
1966                                         goto exclude;
1967 
1968                         } else {
1969                                 if (!(content & CC_CONTENT_DATA))
1970                                         goto exclude;
1971                         }
1972 
1973                         doffset = roundup(doffset, sizeof (Word));
1974                         v[i].p_offset = doffset;
1975                         v[i].p_filesz = size;
1976                         doffset += size;
1977 exclude:
1978                         i++;
1979                 }
1980                 ASSERT(tmp == NULL);
1981         }
1982         AS_LOCK_EXIT(as, &as->a_lock);
1983 
1984         if (overflow || i != nphdrs) {
1985                 if (ntries++ == 0) {
1986                         kmem_free(bigwad, bigsize);
1987                         overflow = 0;
1988                         goto top;
1989                 }
1990                 cmn_err(CE_WARN, "elfcore: core dump failed for "
1991                     "process %d; address space is changing", p->p_pid);
1992                 error = EIO;
1993                 goto done;
1994         }
1995 
1996         if ((error = core_write(vp, UIO_SYSSPACE, poffset,
1997             v, phdrsz, rlimit, credp)) != 0)
1998                 goto done;
1999 
2000         if ((error = write_old_elfnotes(p, sig, vp, v[0].p_offset, rlimit,
2001             credp)) != 0)
2002                 goto done;


2111                     poffset + sizeof (v[i]) * i, &v[i],
2112                     sizeof (v[i]) * (nphdrs - i), rlimit, credp)) != 0)
2113                         goto done;
2114 
2115                 break;
2116         }
2117 
2118         if (nshdrs > 0) {
2119                 bzero(&bigwad->shdr[0], shdrsz);
2120 
2121                 if (nshdrs >= SHN_LORESERVE)
2122                         bigwad->shdr[0].sh_size = nshdrs;
2123 
2124                 if (nshdrs - 1 >= SHN_LORESERVE)
2125                         bigwad->shdr[0].sh_link = nshdrs - 1;
2126 
2127                 if (nphdrs >= PN_XNUM)
2128                         bigwad->shdr[0].sh_info = nphdrs;
2129 
2130                 if (nshdrs > 1) {
2131                         AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
2132                         if ((error = process_scns(content, p, credp, vp,
2133                             &bigwad->shdr[0], nshdrs, rlimit, &doffset,
2134                             NULL)) != 0) {
2135                                 AS_LOCK_EXIT(as, &as->a_lock);
2136                                 goto done;
2137                         }
2138                         AS_LOCK_EXIT(as, &as->a_lock);
2139                 }
2140 
2141                 if ((error = core_write(vp, UIO_SYSSPACE, soffset,
2142                     &bigwad->shdr[0], shdrsz, rlimit, credp)) != 0)
2143                         goto done;
2144         }
2145 
2146 done:
2147         kmem_free(bigwad, bigsize);
2148         return (error);
2149 }
2150 
2151 #ifndef _ELF32_COMPAT
2152 
2153 static struct execsw esw = {
2154 #ifdef  _LP64
2155         elf64magicstr,
2156 #else   /* _LP64 */
2157         elf32magicstr,
2158 #endif  /* _LP64 */




1735         } *bigwad;
1736         size_t bigsize;
1737         size_t phdrsz, shdrsz;
1738         Ehdr *ehdr;
1739         Phdr *v;
1740         caddr_t brkbase;
1741         size_t brksize;
1742         caddr_t stkbase;
1743         size_t stksize;
1744         int ntries = 0;
1745         klwp_t *lwp = ttolwp(curthread);
1746 
1747 top:
1748         /*
1749          * Make sure we have everything we need (registers, etc.).
1750          * All other lwps have already stopped and are in an orderly state.
1751          */
1752         ASSERT(p == ttoproc(curthread));
1753         prstop(0, 0);
1754 
1755         AS_LOCK_ENTER(as, RW_WRITER);
1756         nphdrs = prnsegs(as, 0) + 2;            /* two CORE note sections */
1757 
1758         /*
1759          * Count the number of section headers we're going to need.
1760          */
1761         nshdrs = 0;
1762         if (content & (CC_CONTENT_CTF | CC_CONTENT_SYMTAB)) {
1763                 (void) process_scns(content, p, credp, NULL, NULL, NULL, 0,
1764                     NULL, &nshdrs);
1765         }
1766         AS_LOCK_EXIT(as);
1767 
1768         ASSERT(nshdrs == 0 || nshdrs > 1);
1769 
1770         /*
1771          * The core file contents may required zero section headers, but if
1772          * we overflow the 16 bits allotted to the program header count in
1773          * the ELF header, we'll need that program header at index zero.
1774          */
1775         if (nshdrs == 0 && nphdrs >= PN_XNUM)
1776                 nshdrs = 1;
1777 
1778         phdrsz = nphdrs * sizeof (Phdr);
1779         shdrsz = nshdrs * sizeof (Shdr);
1780 
1781         bigsize = MAX(sizeof (*bigwad), MAX(phdrsz, shdrsz));
1782         bigwad = kmem_alloc(bigsize, KM_SLEEP);
1783 
1784         ehdr = &bigwad->ehdr;
1785         bzero(ehdr, sizeof (*ehdr));
1786 


1862         bzero(v, phdrsz);
1863 
1864         setup_old_note_header(&v[0], p);
1865         v[0].p_offset = doffset = roundup(doffset, sizeof (Word));
1866         doffset += v[0].p_filesz;
1867 
1868         setup_note_header(&v[1], p);
1869         v[1].p_offset = doffset = roundup(doffset, sizeof (Word));
1870         doffset += v[1].p_filesz;
1871 
1872         mutex_enter(&p->p_lock);
1873 
1874         brkbase = p->p_brkbase;
1875         brksize = p->p_brksize;
1876 
1877         stkbase = p->p_usrstack - p->p_stksize;
1878         stksize = p->p_stksize;
1879 
1880         mutex_exit(&p->p_lock);
1881 
1882         AS_LOCK_ENTER(as, RW_WRITER);
1883         i = 2;
1884         for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
1885                 caddr_t eaddr = seg->s_base + pr_getsegsize(seg, 0);
1886                 caddr_t saddr, naddr;
1887                 void *tmp = NULL;
1888                 extern struct seg_ops segspt_shmops;
1889 
1890                 for (saddr = seg->s_base; saddr < eaddr; saddr = naddr) {
1891                         uint_t prot;
1892                         size_t size;
1893                         int type;
1894                         vnode_t *mvp;
1895 
1896                         prot = pr_getprot(seg, 0, &tmp, &saddr, &naddr, eaddr);
1897                         prot &= PROT_READ | PROT_WRITE | PROT_EXEC;
1898                         if ((size = (size_t)(naddr - saddr)) == 0)
1899                                 continue;
1900                         if (i == nphdrs) {
1901                                 overflow++;
1902                                 continue;


1962                                         goto exclude;
1963 
1964                         } else if (prot == PROT_READ) {
1965                                 if (!(content & CC_CONTENT_RODATA))
1966                                         goto exclude;
1967 
1968                         } else {
1969                                 if (!(content & CC_CONTENT_DATA))
1970                                         goto exclude;
1971                         }
1972 
1973                         doffset = roundup(doffset, sizeof (Word));
1974                         v[i].p_offset = doffset;
1975                         v[i].p_filesz = size;
1976                         doffset += size;
1977 exclude:
1978                         i++;
1979                 }
1980                 ASSERT(tmp == NULL);
1981         }
1982         AS_LOCK_EXIT(as);
1983 
1984         if (overflow || i != nphdrs) {
1985                 if (ntries++ == 0) {
1986                         kmem_free(bigwad, bigsize);
1987                         overflow = 0;
1988                         goto top;
1989                 }
1990                 cmn_err(CE_WARN, "elfcore: core dump failed for "
1991                     "process %d; address space is changing", p->p_pid);
1992                 error = EIO;
1993                 goto done;
1994         }
1995 
1996         if ((error = core_write(vp, UIO_SYSSPACE, poffset,
1997             v, phdrsz, rlimit, credp)) != 0)
1998                 goto done;
1999 
2000         if ((error = write_old_elfnotes(p, sig, vp, v[0].p_offset, rlimit,
2001             credp)) != 0)
2002                 goto done;


2111                     poffset + sizeof (v[i]) * i, &v[i],
2112                     sizeof (v[i]) * (nphdrs - i), rlimit, credp)) != 0)
2113                         goto done;
2114 
2115                 break;
2116         }
2117 
2118         if (nshdrs > 0) {
2119                 bzero(&bigwad->shdr[0], shdrsz);
2120 
2121                 if (nshdrs >= SHN_LORESERVE)
2122                         bigwad->shdr[0].sh_size = nshdrs;
2123 
2124                 if (nshdrs - 1 >= SHN_LORESERVE)
2125                         bigwad->shdr[0].sh_link = nshdrs - 1;
2126 
2127                 if (nphdrs >= PN_XNUM)
2128                         bigwad->shdr[0].sh_info = nphdrs;
2129 
2130                 if (nshdrs > 1) {
2131                         AS_LOCK_ENTER(as, RW_WRITER);
2132                         if ((error = process_scns(content, p, credp, vp,
2133                             &bigwad->shdr[0], nshdrs, rlimit, &doffset,
2134                             NULL)) != 0) {
2135                                 AS_LOCK_EXIT(as);
2136                                 goto done;
2137                         }
2138                         AS_LOCK_EXIT(as);
2139                 }
2140 
2141                 if ((error = core_write(vp, UIO_SYSSPACE, soffset,
2142                     &bigwad->shdr[0], shdrsz, rlimit, credp)) != 0)
2143                         goto done;
2144         }
2145 
2146 done:
2147         kmem_free(bigwad, bigsize);
2148         return (error);
2149 }
2150 
2151 #ifndef _ELF32_COMPAT
2152 
2153 static struct execsw esw = {
2154 #ifdef  _LP64
2155         elf64magicstr,
2156 #else   /* _LP64 */
2157         elf32magicstr,
2158 #endif  /* _LP64 */