diff options
author | dfr <dfr@FreeBSD.org> | 2001-10-11 13:31:55 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2001-10-11 13:31:55 +0000 |
commit | 0d5aa1a03bc88b93be17cf7df4ff95b81e800487 (patch) | |
tree | bcddfded1918b1dbe29f39feb983d7aabb915ca2 /sys/ia64/include | |
parent | f075c7df77137ca0e07add5b10ac3aa165cef4fa (diff) | |
download | FreeBSD-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.h | 178 |
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; |