summaryrefslogtreecommitdiffstats
path: root/sys/ia64/include
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2001-10-11 13:31:55 +0000
committerdfr <dfr@FreeBSD.org>2001-10-11 13:31:55 +0000
commit0d5aa1a03bc88b93be17cf7df4ff95b81e800487 (patch)
treebcddfded1918b1dbe29f39feb983d7aabb915ca2 /sys/ia64/include
parentf075c7df77137ca0e07add5b10ac3aa165cef4fa (diff)
downloadFreeBSD-src-0d5aa1a03bc88b93be17cf7df4ff95b81e800487.zip
FreeBSD-src-0d5aa1a03bc88b93be17cf7df4ff95b81e800487.tar.gz
Implement mcount trampoline (untested).
Diffstat (limited to 'sys/ia64/include')
-rw-r--r--sys/ia64/include/profile.h178
1 files changed, 64 insertions, 114 deletions
diff --git a/sys/ia64/include/profile.h b/sys/ia64/include/profile.h
index 70a9cf7..038c805 100644
--- a/sys/ia64/include/profile.h
+++ b/sys/ia64/include/profile.h
@@ -34,126 +34,76 @@
typedef u_long fptrdiff_t;
-#if 0
-/*
- * XXX The definition of MCOUNT below is really the following code, run
- * XXX through cpp, since the inline assembly isn't preprocessed.
- */
-#define OFFSET_AT 0
-#define OFFSET_V0 8
-#define OFFSET_T0 16
-#define OFFSET_T1 24
-#define OFFSET_T2 32
-#define OFFSET_T3 40
-#define OFFSET_T4 48
-#define OFFSET_T5 56
-#define OFFSET_T6 64
-#define OFFSET_T7 72
-#define OFFSET_S6 80
-#define OFFSET_A0 88
-#define OFFSET_A1 96
-#define OFFSET_A2 104
-#define OFFSET_A3 112
-#define OFFSET_A4 120
-#define OFFSET_A5 128
-#define OFFSET_T8 136
-#define OFFSET_T9 144
-#define OFFSET_T10 152
-#define OFFSET_T11 160
-#define OFFSET_RA 168
-#define OFFSET_T12 176
-#define OFFSET_GP 184
-#define FRAME_SIZE 192
-
-LEAF(_mcount,0) /* XXX */
- .set noat
- .set noreorder
-
- lda sp, -FRAME_SIZE(sp)
-
- stq at_reg, OFFSET_AT(sp)
- stq v0, OFFSET_V0(sp)
- stq t0, OFFSET_T0(sp)
- stq t1, OFFSET_T1(sp)
- stq t2, OFFSET_T2(sp)
- stq t3, OFFSET_T3(sp)
- stq t4, OFFSET_T4(sp)
- stq t5, OFFSET_T5(sp)
- stq t6, OFFSET_T6(sp)
- stq t7, OFFSET_T7(sp)
- stq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */
- stq a0, OFFSET_A0(sp)
- stq a1, OFFSET_A1(sp)
- stq a2, OFFSET_A2(sp)
- stq a3, OFFSET_A3(sp)
- stq a4, OFFSET_A4(sp)
- stq a5, OFFSET_A5(sp)
- stq t8, OFFSET_T8(sp)
- stq t9, OFFSET_T9(sp)
- stq t10, OFFSET_T10(sp)
- stq t11, OFFSET_T11(sp)
- stq ra, OFFSET_RA(sp)
- stq t12, OFFSET_T12(sp)
- stq gp, OFFSET_GP(sp)
-
- br pv, LX99
-LX99: SETGP(pv)
- mov ra, a0
- mov at_reg, a1
- CALL(mcount)
-
- ldq v0, OFFSET_V0(sp)
- ldq t0, OFFSET_T0(sp)
- ldq t1, OFFSET_T1(sp)
- ldq t2, OFFSET_T2(sp)
- ldq t3, OFFSET_T3(sp)
- ldq t4, OFFSET_T4(sp)
- ldq t5, OFFSET_T5(sp)
- ldq t6, OFFSET_T6(sp)
- ldq t7, OFFSET_T7(sp)
- ldq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */
- ldq a0, OFFSET_A0(sp)
- ldq a1, OFFSET_A1(sp)
- ldq a2, OFFSET_A2(sp)
- ldq a3, OFFSET_A3(sp)
- ldq a4, OFFSET_A4(sp)
- ldq a5, OFFSET_A5(sp)
- ldq t8, OFFSET_T8(sp)
- ldq t9, OFFSET_T9(sp)
- ldq t10, OFFSET_T10(sp)
- ldq t11, OFFSET_T11(sp)
- ldq ra, OFFSET_RA(sp)
- stq t12, OFFSET_T12(sp)
- ldq gp, OFFSET_GP(sp)
-
- ldq at_reg, OFFSET_AT(sp)
-
- lda sp, FRAME_SIZE(sp)
- ret zero, (at_reg), 1
-
- END(_mcount)
-#endif /* 0 */
-
-#define MCOUNT __asm (" \
- .globl _mcount; \
- .proc _mcount; \
-_mcount:; \
- \
+#define MCOUNT __asm (" \n\
+ .globl _mcount \n\
+ .proc _mcount \n\
+_mcount: \n\
+ alloc loc0=ar.pfs,8,7,2,0 // space to save r8-r11,rp,b7 \n\
+ add sp=-8*16,sp // space to save f8-f15 \n\
+ mov loc1=rp // caller's return address \n\
+ mov loc2=b7 // our return back to caller \n\
+ ;; \n\
+ add r17=16,sp // leave 16 bytes for mcount \n\
+ add r18=32,sp \n\
+ ;; \n\
+ mov loc3=r8 // structure return address \n\
+ mov loc4=r9 // language specific \n\
+ mov loc5=r10 // language specific \n\
+ mov loc6=r11 // language specific \n\
+ ;; \n\
+ stf.spill [r17]=f8,32 // save float arguments \n\
+ stf.spill [r18]=f9,32 \n\
+ mov out0=rp // frompc \n\
+ ;; \n\
+ stf.spill [r17]=f10,32 \n\
+ stf.spill [r18]=f11,32 \n\
+ mov out1=b7 // selfpc \n\
+ ;; \n\
+ stf.spill [r17]=f12,32 \n\
+ stf.spill [r18]=f13,32 \n\
+ ;; \n\
+ stf.spill [r17]=f14,32 \n\
+ stf.spill [r18]=f15,32 \n\
+ ;; \n\
+ br.call.sptk.many rp=mcount \n\
+ ;; \n\
+ add r17=16,sp \n\
+ add r18=32,sp \n\
+ ;; \n\
+ ldf.fill f8=[r17],32 \n\
+ ldf.fill f9=[r18],32 \n\
+ mov r8=loc3 // restore structure pointer \n\
+ ;; \n\
+ ldf.fill f10=[r17],32 // restore float arguments \n\
+ ldf.fill f11=[r18],32 \n\
+ mov r9=loc4 \n\
+ ;; \n\
+ ldf.fill f12=[r17],32 // etc. \n\
+ ldf.fill f13=[r18],32 \n\
+ mov r10=loc5 \n\
+ ;; \n\
+ ldf.fill f14=[r17],32 \n\
+ ldf.fill f15=[r18],32 \n\
+ mov r11=loc6 \n\
+ ;; \n\
+ mov b7=loc2 // clean up \n\
+ mov rp=loc1 \n\
+ mov ar.pfs=loc0 \n\
+ ;; \n\
+ alloc r14=ar.pfs,0,0,8,0 // drop our register frame \n\
+ br.sptk.many b7 // back to caller \n\
+ \n\
.end _mcount");
#ifdef _KERNEL
/*
* The following two macros do splhigh and splx respectively.
- * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which
- * doesn't include profiling support.
- *
- * XXX These macros should probably use inline assembly.
*/
-#define MCOUNT_ENTER(s) \
- s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
-#define MCOUNT_EXIT(s) \
- (void)_alpha_pal_swpipl(s);
-#define MCOUNT_DECL(s) u_long s;
+#define MCOUNT_ENTER(s) \n\
+ _c = critical_enter()
+#define MCOUNT_EXIT(s) \n\
+ (void)critical_exit(_c)
+#define MCOUNT_DECL(s) critical_t c;
#ifdef GUPROF
struct gmonparam;
OpenPOWER on IntegriCloud