asmacros.h revision 1321
1#define ALIGN_DATA	.align	2	/* 4 byte alignment, zero filled */
2#define ALIGN_TEXT	.align	2,0x90	/* 4-byte alignment, nop filled */
3#define SUPERALIGN_TEXT	.align	4,0x90	/* 16-byte alignment (better for 486), nop filled */
4
5#define GEN_ENTRY(name)		ALIGN_TEXT;	.globl name; name:
6#define NON_GPROF_ENTRY(name)	GEN_ENTRY(_/**/name)
7
8/* These three are place holders for future changes to the profiling code */
9#define MCOUNT_LABEL(name)
10#define MEXITCOUNT
11#define FAKE_MCOUNT(caller)
12
13#ifdef GPROF
14/*
15 * ALTENTRY() must be before a corresponding ENTRY() so that it can jump
16 * over the mcounting.
17 */
18#define ALTENTRY(name)	GEN_ENTRY(_/**/name); MCOUNT; jmp 2f
19#define ENTRY(name)	GEN_ENTRY(_/**/name); MCOUNT; 2:
20/*
21 * The call to mcount supports the usual (bad) conventions.  We allocate
22 * some data and pass a pointer to it although the FreeBSD doesn't use
23 * the data.  We set up a frame before calling mcount because that is
24 * the standard convention although it makes work for both mcount and
25 * callers.
26 */
27#define MCOUNT		.data; ALIGN_DATA; 1:; .long 0; .text; \
28			pushl %ebp; movl %esp,%ebp; \
29			movl $1b,%eax; call mcount; popl %ebp
30#else
31/*
32 * ALTENTRY() has to align because it is before a corresponding ENTRY().
33 * ENTRY() has to align to because there may be no ALTENTRY() before it.
34 * If there is a previous ALTENTRY() then the alignment code is empty.
35 */
36#define ALTENTRY(name)	GEN_ENTRY(_/**/name)
37#define ENTRY(name)	GEN_ENTRY(_/**/name)
38#define MCOUNT
39
40#endif
41
42#ifdef DUMMY_NOPS			/* this will break some older machines */
43#define FASTER_NOP
44#define NOP
45#else
46#define FASTER_NOP	pushl %eax ; inb $0x84,%al ; popl %eax
47#define NOP		pushl %eax ; inb $0x84,%al ; inb $0x84,%al ; popl %eax
48#endif
49
50