1/* $NetBSD: _mcount.S,v 1.2 2005/12/21 18:11:11 christos Exp $ */
2
3/*
4 * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
5 * All rights reserved.
6 *
7 * Author: Chris G. Demetriou
8 *
9 * Permission to use, copy, modify and distribute this software and
10 * its documentation is hereby granted, provided that both the copyright
11 * notice and this permission notice appear in all copies of the
12 * software, derivative works or modified versions, and any portions
13 * thereof, and that both notices appear in supporting documentation.
14 *
15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 *
19 * Carnegie Mellon requests users of this software to return to
20 *
21 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
22 *  School of Computer Science
23 *  Carnegie Mellon University
24 *  Pittsburgh PA 15213-3890
25 *
26 * any improvements or extensions that they make and grant Carnegie the
27 * rights to redistribute these changes.
28 */
29
30#if defined(GPROF) && !defined(_STANDALONE)
31
32#include <machine/asm.h>
33#include <machine/profile.h>
34
35#define   OFFSET_AT (0 * 8)
36#define OFFSET_V0   (1 * 8)
37#define OFFSET_T0   (2 * 8)
38#define OFFSET_T1   (3 * 8)
39#define OFFSET_T2   (4 * 8)
40#define OFFSET_T3   (5 * 8)
41#define OFFSET_T4   (6 * 8)
42#define OFFSET_T5   (7 * 8)
43#define OFFSET_T6   (8 * 8)
44#define OFFSET_T7   (9 * 8)
45#define OFFSET_S6   (10 * 8)
46#define OFFSET_A0   (11 * 8)
47#define OFFSET_A1   (12 * 8)
48#define OFFSET_A2   (13 * 8)
49#define OFFSET_A3   (14 * 8)
50#define OFFSET_A4   (15 * 8)
51#define OFFSET_A5   (16 * 8)
52#define OFFSET_T8   (17 * 8)
53#define OFFSET_T9   (18 * 8)
54#define OFFSET_T10  (19 * 8)
55#define OFFSET_T11  (20 * 8)
56#define OFFSET_RA   (21 * 8)
57#define OFFSET_T12  (22 * 8)
58#define OFFSET_GP   (23 * 8)
59#define   FRAME_SIZE          (24 * 8)
60
61LEAF_NOPROFILE(_mcount,0)               /* XXX */
62          .set noat
63          .set noreorder
64
65          lda       sp, -FRAME_SIZE(sp)
66
67          stq       at_reg, OFFSET_AT(sp)
68          stq       v0, OFFSET_V0(sp)
69          stq       t0, OFFSET_T0(sp)
70          stq       t1, OFFSET_T1(sp)
71          stq       t2, OFFSET_T2(sp)
72          stq       t3, OFFSET_T3(sp)
73          stq       t4, OFFSET_T4(sp)
74          stq       t5, OFFSET_T5(sp)
75          stq       t6, OFFSET_T6(sp)
76          stq       t7, OFFSET_T7(sp)
77          stq       s6, OFFSET_S6(sp)   /* XXX because run _after_ prologue. */
78          stq       a0, OFFSET_A0(sp)
79          stq       a1, OFFSET_A1(sp)
80          stq       a2, OFFSET_A2(sp)
81          stq       a3, OFFSET_A3(sp)
82          stq       a4, OFFSET_A4(sp)
83          stq       a5, OFFSET_A5(sp)
84          stq       t8, OFFSET_T8(sp)
85          stq       t9, OFFSET_T9(sp)
86          stq       t10, OFFSET_T10(sp)
87          stq       t11, OFFSET_T11(sp)
88          stq       ra, OFFSET_RA(sp)
89          stq       t12, OFFSET_T12(sp)
90          stq       gp, OFFSET_GP(sp)
91
92          br        pv, 1f
931:        LDGP(pv)
94          mov       ra, a0
95          mov       at_reg, a1
96          CALL(_MCOUNT_FUNC)
97
98          ldq       v0, OFFSET_V0(sp)
99          ldq       t0, OFFSET_T0(sp)
100          ldq       t1, OFFSET_T1(sp)
101          ldq       t2, OFFSET_T2(sp)
102          ldq       t3, OFFSET_T3(sp)
103          ldq       t4, OFFSET_T4(sp)
104          ldq       t5, OFFSET_T5(sp)
105          ldq       t6, OFFSET_T6(sp)
106          ldq       t7, OFFSET_T7(sp)
107          ldq       s6, OFFSET_S6(sp)   /* XXX because run _after_ prologue. */
108          ldq       a0, OFFSET_A0(sp)
109          ldq       a1, OFFSET_A1(sp)
110          ldq       a2, OFFSET_A2(sp)
111          ldq       a3, OFFSET_A3(sp)
112          ldq       a4, OFFSET_A4(sp)
113          ldq       a5, OFFSET_A5(sp)
114          ldq       t8, OFFSET_T8(sp)
115          ldq       t9, OFFSET_T9(sp)
116          ldq       t10, OFFSET_T10(sp)
117          ldq       t11, OFFSET_T11(sp)
118          ldq       ra, OFFSET_RA(sp)
119          ldq       t12, OFFSET_T12(sp)
120          ldq       gp, OFFSET_GP(sp)
121
122          ldq       at_reg, OFFSET_AT(sp)
123
124          lda       sp, FRAME_SIZE(sp)
125          ret       zero, (at_reg), 1
126
127          END(_mcount)
128#endif
129