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 */
|