diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-12-14 03:54:39 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-12-14 03:54:39 +0000 |
commit | f12226068d16673eea9adafe99388f1061d3309f (patch) | |
tree | 90cb542d279e793d072ffc6e9f1f1add1f07179e /sys/arch/alpha/include/profile.h | |
parent | 470d0389b66fade522060561cc0c6ba36e01e7cb (diff) |
update to netbsd
Diffstat (limited to 'sys/arch/alpha/include/profile.h')
-rw-r--r-- | sys/arch/alpha/include/profile.h | 190 |
1 files changed, 183 insertions, 7 deletions
diff --git a/sys/arch/alpha/include/profile.h b/sys/arch/alpha/include/profile.h index d3ba252db6f..08cebcd3359 100644 --- a/sys/arch/alpha/include/profile.h +++ b/sys/arch/alpha/include/profile.h @@ -1,4 +1,4 @@ -/* $NetBSD: profile.h,v 1.2 1995/03/28 18:13:57 jtc Exp $ */ +/* $NetBSD: profile.h,v 1.3 1995/11/23 02:36:28 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -27,13 +27,189 @@ * rights to redistribute these changes. */ -/* XXX XXX XXX XXX XXX */ +#define _MCOUNT_DECL void mcount -#define MCOUNT \ -extern void mcount() /* XXX asm("mcount") */; void mcount() { \ -} +#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, 1f +1: 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 gp, OFFSET_GP(sp) + ldq ra, OFFSET_RA(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; \ + .ent _mcount 0; \ +_mcount:; \ + .frame $30,0,$26; \ + .set noat; \ + .set noreorder; \ + \ + lda $30, -192($30); \ + \ + stq $28, 0($30); \ + stq $0, 8($30); \ + stq $1, 16($30); \ + stq $2, 24($30); \ + stq $3, 32($30); \ + stq $4, 40($30); \ + stq $5, 48($30); \ + stq $6, 56($30); \ + stq $7, 64($30); \ + stq $8, 72($30); \ + stq $15, 80($30); \ + stq $16, 88($30); \ + stq $17, 96($30); \ + stq $18, 104($30); \ + stq $19, 112($30); \ + stq $20, 120($30); \ + stq $21, 128($30); \ + stq $22, 136($30); \ + stq $23, 144($30); \ + stq $24, 152($30); \ + stq $25, 160($30); \ + stq $26, 168($30); \ + stq $27, 176($30); \ + stq $29, 184($30); \ + \ + br $27, 1f; \ +1: ldgp $29,0($27); \ + mov $26, $16; \ + mov $28, $17; \ + jsr $26,mcount; \ + ldgp $29,0($26); \ + \ + ldq $0, 8($30); \ + ldq $1, 16($30); \ + ldq $2, 24($30); \ + ldq $3, 32($30); \ + ldq $4, 40($30); \ + ldq $5, 48($30); \ + ldq $6, 56($30); \ + ldq $7, 64($30); \ + ldq $8, 72($30); \ + ldq $15, 80($30); \ + ldq $16, 88($30); \ + ldq $17, 96($30); \ + ldq $18, 104($30); \ + ldq $19, 112($30); \ + ldq $20, 120($30); \ + ldq $21, 128($30); \ + ldq $22, 136($30); \ + ldq $23, 144($30); \ + ldq $24, 152($30); \ + ldq $25, 160($30); \ + ldq $29, 184($30); \ + ldq $26, 168($30); \ + \ + ldq $28, 0($30); \ + \ + lda $30, 192($30); \ + ret $31, ($28), 1; \ + \ + .end _mcount"); #ifdef _KERNEL -#define MCOUNT_ENTER -#define MCOUNT_EXIT +/* + * The following two macros do splhigh and splx respectively. + * profile_swpipl is a special version of pal_swpipl which + * doesn't include profiling support. + * + * XXX These macros should probably use inline assembly. + */ +#define MCOUNT_ENTER \ + s = profile_swpipl(PSL_IPL_HIGH) +#define MCOUNT_EXIT \ + (void)profile_swpipl(s); #endif |