VirtualBox

source: vbox/trunk/src/VBox/Runtime/r3/solaris/coredumper-solaris.h@ 39091

Last change on this file since 39091 was 37631, checked in by vboxsync, 13 years ago

coredumper-solaris.*,tstRTCoreDump: Don't use RTFile*; rewrote testcase to use RTTest and not crash.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.2 KB
Line 
1/* $Id: coredumper-solaris.h 37631 2011-06-24 13:25:07Z vboxsync $ */
2/** @file
3 * IPRT - Custom Core Dumper, Solaris.
4 */
5
6/*
7 * Copyright (C) 2010-2011 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#include <iprt/types.h>
28
29#ifdef RT_OS_SOLARIS
30# if defined(RT_ARCH_X86) && _FILE_OFFSET_BITS==64
31/*
32 * Solaris' procfs cannot be used with large file environment in 32-bit.
33 */
34# undef _FILE_OFFSET_BITS
35# define _FILE_OFFSET_BITS 32
36# include <procfs.h>
37# include <sys/procfs.h>
38# include <sys/old_procfs.h>
39# undef _FILE_OFFSET_BITS
40# define _FILE_OFFSET_BITS 64
41#else
42# include <procfs.h>
43# include <sys/procfs.h>
44# include <sys/old_procfs.h>
45#endif
46# include <limits.h>
47# include <thread.h>
48# include <sys/auxv.h>
49# include <sys/lwp.h>
50# include <sys/zone.h>
51# include <sys/utsname.h>
52
53#ifdef RT_ARCH_AMD64
54# define _ELF64
55# undef _ELF32_COMPAT
56#endif
57# include <sys/corectl.h>
58#endif
59
60
61#ifdef RT_OS_SOLARIS
62/**
63 * Memory mapping descriptor employed by the solaris core dumper.
64 */
65typedef struct RTSOLCOREMAPINFO
66{
67 prmap_t pMap; /**< Proc description of this mapping */
68 int fError; /**< Any error reading this mapping (errno) */
69 struct RTSOLCOREMAPINFO *pNext; /**< Pointer to the next mapping */
70} RTSOLCOREMAPINFO;
71/** Pointer to a solaris memory mapping descriptor. */
72typedef RTSOLCOREMAPINFO *PRTSOLCOREMAPINFO;
73
74/**
75 * Whether this is an old or new style solaris core.
76 */
77typedef enum RTSOLCORETYPE
78{
79 enmOldEra = 0x01d, /**< old */
80 enmNewEra = 0x5c1f1 /**< sci-fi */
81} RTSOLCORETYPE;
82
83/**
84 * Per-Thread information employed by the solaris core dumper.
85 */
86typedef struct RTSOLCORETHREADINFO
87{
88 lwpsinfo_t Info; /**< Proc description of this thread */
89 lwpstatus_t *pStatus; /**< Proc description of this thread's status (can be NULL, zombie lwp) */
90 struct RTSOLCORETHREADINFO *pNext; /**< Pointer to the next thread */
91} RTSOLCORETHREADINFO;
92typedef RTSOLCORETHREADINFO *PRTSOLCORETHREADINFO;
93#endif
94
95
96/**
97 * Current (also the core target) process information.
98 */
99typedef struct RTSOLCOREPROCESS
100{
101 RTPROCESS Process; /**< The pid of the process */
102 char szExecPath[PATH_MAX]; /**< Path of the executable */
103 char *pszExecName; /**< Name of the executable file */
104#ifdef RT_OS_SOLARIS
105 psinfo_t ProcInfo; /**< Process info. */
106 prpsinfo_t ProcInfoOld; /**< Process info. Older version (for GDB compat.) */
107 pstatus_t ProcStatus; /**< Process status info. */
108 thread_t hCurThread; /**< The current thread */
109 ucontext_t *pCurThreadCtx; /**< Context info. of current thread before starting to dump */
110 int fdAs; /**< proc/pid/as file handle */
111 auxv_t *pAuxVecs; /**< Aux vector of process */
112 int cAuxVecs; /**< Number of aux vector entries */
113 PRTSOLCOREMAPINFO pMapInfoHead; /**< Pointer to the head of list of mappings */
114 uint32_t cMappings; /**< Number of mappings (count of pMapInfoHead list) */
115 PRTSOLCORETHREADINFO pThreadInfoHead; /**< Pointer to the head of list of threads */
116 uint64_t cThreads; /**< Number of threads (count of pThreadInfoHead list) */
117 char szPlatform[SYS_NMLN]; /**< Platform name */
118 char szZoneName[ZONENAME_MAX]; /**< Zone name */
119 struct utsname UtsName; /**< UTS name */
120 void *pvCred; /**< Process credential info. */
121 size_t cbCred; /**< Size of process credential info. */
122 void *pvLdt; /**< Process LDT info. */
123 size_t cbLdt; /**< Size of the LDT info. */
124 prpriv_t *pPriv; /**< Process privilege info. */
125 size_t cbPriv; /**< Size of process privilege info. */
126 const priv_impl_info_t *pcPrivImpl; /**< Process privilege implementation info. (opaque handle) */
127 core_content_t CoreContent; /**< What information goes in the core */
128#else
129# error Port Me!
130#endif
131
132} RTSOLCOREPROCESS;
133typedef RTSOLCOREPROCESS *PRTSOLCOREPROCESS;
134
135typedef int (*PFNRTCOREREADER)(int fdFile, void *pv, size_t cb);
136typedef int (*PFNRTCOREWRITER)(int fdhFile, const void *pcv, size_t cb);
137
138/**
139 * The solaris core file object.
140 */
141typedef struct RTSOLCORE
142{
143 char szCorePath[PATH_MAX]; /**< Path of the core file */
144 RTSOLCOREPROCESS SolProc; /**< Current process information */
145 void *pvCore; /**< Pointer to memory area during dumping */
146 size_t cbCore; /**< Size of memory area during dumping */
147 void *pvFree; /**< Pointer to base of free range in preallocated memory area */
148 bool fIsValid; /**< Whether core information has been fully collected */
149 PFNRTCOREREADER pfnReader; /**< Reader function */
150 PFNRTCOREWRITER pfnWriter; /**< Writer function */
151 int fdCoreFile; /**< Core file (used only while writing the core) */
152 RTFOFF offWrite; /**< Segment/section offset (used only while writing the core) */
153} RTSOLCORE;
154typedef RTSOLCORE *PRTSOLCORE;
155
156typedef int (*PFNRTSOLCOREACCUMULATOR)(PRTSOLCORE pSolCore);
157typedef int (*PFNRTSOLCORETHREADWORKER)(PRTSOLCORE pSolCore, void *pvThreadInfo);
158
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette