Changeset 3593
- Timestamp:
- Sep 30, 2007, 11:41:15 PM (18 years ago)
- Location:
- trunk/kStuff/kProfiler2
- Files:
-
- 1 added
- 4 edited
-
Makefile.kmk (modified) (1 diff)
-
prfamd64msc.asm (modified) (2 diffs)
-
prfcore.cpp.h (modified) (5 diffs)
-
prfcore.h.h (modified) (2 diffs)
-
tstlongjmp.c (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/kStuff/kProfiler2/Makefile.kmk
r3591 r3593 142 142 $(PATH_kPrf2)/kPrf2.lib 143 143 144 145 146 147 148 149 150 144 151 # Generate the rules 145 152 include $(PATH_KBUILD)/subfooter.kmk -
trunk/kStuff/kProfiler2/prfamd64msc.asm
r3592 r3593 91 91 or r8, rax ; param 3 - the timestamp 92 92 mov [rsp + 20h], r8 ; save the tsc for later use. 93 lea rdx, [rsp + 8*8 + 28h] ; Param 2 - frame pointer (pointer to the return address of the function calling us)93 lea rdx, [rsp + 8*8 + 28h] ; Param 2 - 94 94 mov rcx, [rdx] ; Param 1 - The function address 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 95 118 call KPRF_ENTER 96 119 jmp common_return_path … … 135 158 or r8, rax ; param 3 - the timestamp 136 159 mov [rsp + 20h], r8 ; save the tsc for later use. 137 lea rdx, [rsp + 8*8 + 28h] ; Param 2 - frame pointer (pointer to the return address of the function calling us)160 lea rdx, [rsp + 8*8 + 28h] ; Param 2 - frame pointer 138 161 mov rcx, [rdx] ; Param 1 - The function address 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 139 182 call KPRF_LEAVE 140 183 jmp common_return_path -
trunk/kStuff/kProfiler2/prfcore.cpp.h
r3566 r3593 141 141 /** 142 142 * Unwinds the stack. 143 144 143 145 */ 144 146 static KU64* KPRF_NAME(UnwindInt)(KPRF_TYPE(P,HDR) pHdr, KPRF_TYPE(P,STACK) pStack, KPRF_TYPE(,UPTR) uPC, KPRF_TYPE(,UPTR) uFramePtr, KU64 TS) … … 151 153 KI32 iFrame = pStack->cFrames - 1; 152 154 KPRF_TYPE(P,FRAME) pFrame = &pStack->aFrames[iFrame]; 155 153 156 /* the most frequent case first. */ 157 158 159 160 161 162 163 154 164 if (uFramePtr == pFrame->uFramePtr) 155 165 return KPRF_NAME(UnwindOne)(pHdr, pStack, uPC, TS); 166 156 167 157 168 /* none? */ … … 161 172 /* one or more, possibly all */ 162 173 KU64 *pCurOverheadTicks = KPRF_NAME(UnwindOne)(pHdr, pStack, uPC, TS); 163 pFrame ++;174 pFrame; 164 175 if ( iFrame > 0 176 177 178 179 165 180 && pFrame->uFramePtr <= uFramePtr) 181 166 182 { 167 183 KPRF_TYPE(P,THREAD) pThread = KPRF_OFF2PTR(P,THREAD, pStack->offThread, pHdr); … … 170 186 pCurOverheadTicks = KPRF_NAME(UnwindOne)(pHdr, pStack, uPC, TS); 171 187 iFrame -= 2; 172 pFrame++; 188 pFrame--; 189 #if K_OS == K_OS_WINDOWS && K_ARCH == K_ARCH_AMD64 190 while ( iFrame > 0 191 && pFrame->uFramePtr <= uFramePtr 192 && pFrame[-1].uFramePtr > uFramePtr) 193 #else 173 194 while ( iFrame >= 0 174 195 && pFrame->uFramePtr <= uFramePtr) 196 175 197 { 176 198 pCurOverheadTicks = KPRF_NAME(UnwindOne)(pHdr, pStack, uPC, TS); 177 199 iFrame--; 178 pFrame ++;200 pFrame; 179 201 } 180 202 } … … 255 277 KPRF_TYPE(P,FRAME) pFrame = &pStack->aFrames[iFrame]; 256 278 if ( iFrame 279 280 281 257 282 && pThread->uStackBasePtr >= uFramePtr /* ASSUMES stack direction */ 258 283 && pFrame[-1].uFramePtr + (KPRF_BITS - 8) / 8 < uFramePtr) /* ASSUMES stack direction */ 284 259 285 { 260 286 KPRF_NAME(UnwindInt)(pHdr, pStack, uPC, uFramePtr, TS); -
trunk/kStuff/kProfiler2/prfcore.h.h
r3566 r3593 270 270 /** Stack address of this frame. 271 271 * This is used to detect throw and longjmp, and is also used to deal with overflow. (relative address) */ 272 KPRF_TYPE(,UPTR) uFramePtr;272 KPRF_TYPE(,UPTR) uFramePtr; 273 273 /** Offset (relative to the profiler header) to the function record. 274 274 * This is 0 if we're out of function space. */ … … 293 293 /** The stack frames. 294 294 * The actual size of this array is specified in the header. */ 295 KPRF_TYPE(,FRAME) aFrames[1];295 KPRF_TYPE(,FRAME) aFrames[1]; 296 296 } KPRF_TYPE(,STACK); 297 297 /** Pointer to a stack. */
Note:
See TracChangeset
for help on using the changeset viewer.
