asmacros.h (ed83a56181ae1994e038e75b086e4a193e8419e5) asmacros.h (aa3ea612be3659881392251e91912682b038ce78)
1/* -*- mode: asm -*- */
2/*-
3 * SPDX-License-Identifier: BSD-3-Clause
4 *
5 * Copyright (c) 1993 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 34 unchanged lines hidden (view full) ---

43 * CNAME is used to manage the relationship between symbol names in C
44 * and the equivalent assembly language names. CNAME is given a name as
45 * it would be used in a C program. It expands to the equivalent assembly
46 * language name.
47 */
48#define CNAME(csym) csym
49
50#define ALIGN_DATA .p2align 2 /* 4 byte alignment, zero filled */
1/* -*- mode: asm -*- */
2/*-
3 * SPDX-License-Identifier: BSD-3-Clause
4 *
5 * Copyright (c) 1993 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 34 unchanged lines hidden (view full) ---

43 * CNAME is used to manage the relationship between symbol names in C
44 * and the equivalent assembly language names. CNAME is given a name as
45 * it would be used in a C program. It expands to the equivalent assembly
46 * language name.
47 */
48#define CNAME(csym) csym
49
50#define ALIGN_DATA .p2align 2 /* 4 byte alignment, zero filled */
51#ifdef GPROF
52#define ALIGN_TEXT .p2align 4,0x90 /* 16-byte alignment, nop filled */
53#else
54#define ALIGN_TEXT .p2align 2,0x90 /* 4-byte alignment, nop filled */
51#define ALIGN_TEXT .p2align 2,0x90 /* 4-byte alignment, nop filled */
55#endif
56#define SUPERALIGN_TEXT .p2align 4,0x90 /* 16-byte alignment, nop filled */
57
58#define GEN_ENTRY(name) ALIGN_TEXT; .globl CNAME(name); \
59 .type CNAME(name),@function; CNAME(name):
52#define SUPERALIGN_TEXT .p2align 4,0x90 /* 16-byte alignment, nop filled */
53
54#define GEN_ENTRY(name) ALIGN_TEXT; .globl CNAME(name); \
55 .type CNAME(name),@function; CNAME(name):
60#define NON_GPROF_ENTRY(name) GEN_ENTRY(name)
61#define NON_GPROF_RET .byte 0xc3 /* opcode for `ret' */
62
56#define ENTRY(name) GEN_ENTRY(name)
57#define ALTENTRY(name) GEN_ENTRY(name)
63#define END(name) .size name, . - name
64
58#define END(name) .size name, . - name
59
65#ifdef GPROF
66/*
67 * __mcount is like [.]mcount except that doesn't require its caller to set
68 * up a frame pointer. It must be called before pushing anything onto the
69 * stack. gcc should eventually generate code to call __mcount in most
70 * cases. This would make -pg in combination with -fomit-frame-pointer
71 * useful. gcc has a configuration variable PROFILE_BEFORE_PROLOGUE to
72 * allow profiling before setting up the frame pointer, but this is
73 * inadequate for good handling of special cases, e.g., -fpic works best
74 * with profiling after the prologue.
75 *
76 * [.]mexitcount is a new function to support non-statistical profiling if an
77 * accurate clock is available. For C sources, calls to it are generated
78 * by the FreeBSD extension `-mprofiler-epilogue' to gcc. It is best to
79 * call [.]mexitcount at the end of a function like the MEXITCOUNT macro does,
80 * but gcc currently generates calls to it at the start of the epilogue to
81 * avoid problems with -fpic.
82 *
83 * [.]mcount and __mcount may clobber the call-used registers and %ef.
84 * [.]mexitcount may clobber %ecx and %ef.
85 *
86 * Cross-jumping makes non-statistical profiling timing more complicated.
87 * It is handled in many cases by calling [.]mexitcount before jumping. It
88 * is handled for conditional jumps using CROSSJUMP() and CROSSJUMP_LABEL().
89 * It is handled for some fault-handling jumps by not sharing the exit
90 * routine.
91 *
92 * ALTENTRY() must be before a corresponding ENTRY() so that it can jump to
93 * the main entry point. Note that alt entries are counted twice. They
94 * have to be counted as ordinary entries for gprof to get the call times
95 * right for the ordinary entries.
96 *
97 * High local labels are used in macros to avoid clashes with local labels
98 * in functions.
99 *
100 * Ordinary `ret' is used instead of a macro `RET' because there are a lot
101 * of `ret's. 0xc3 is the opcode for `ret' (`#define ret ... ret' can't
102 * be used because this file is sometimes preprocessed in traditional mode).
103 * `ret' clobbers eflags but this doesn't matter.
104 */
105#define ALTENTRY(name) GEN_ENTRY(name) ; MCOUNT ; MEXITCOUNT ; jmp 9f
106#define CROSSJUMP(jtrue, label, jfalse) \
107 jfalse 8f; MEXITCOUNT; jmp __CONCAT(to,label); 8:
108#define CROSSJUMPTARGET(label) \
109 ALIGN_TEXT; __CONCAT(to,label): ; MCOUNT; jmp label
110#define ENTRY(name) GEN_ENTRY(name) ; 9: ; MCOUNT
111#define FAKE_MCOUNT(caller) pushl caller ; call *__mcountp ; popl %ecx
112#define MCOUNT call *__mcountp
113#define MCOUNT_LABEL(name) GEN_ENTRY(name) ; nop ; ALIGN_TEXT
114#ifdef GUPROF
115#define MEXITCOUNT call *__mexitcountp
116#define ret MEXITCOUNT ; NON_GPROF_RET
117#else
118#define MEXITCOUNT
119#endif
120
121#else /* !GPROF */
122/*
123 * ALTENTRY() has to align because it is before a corresponding ENTRY().
124 * ENTRY() has to align to because there may be no ALTENTRY() before it.
125 * If there is a previous ALTENTRY() then the alignment code for ENTRY()
126 * is empty.
127 */
128#define ALTENTRY(name) GEN_ENTRY(name)
129#define CROSSJUMP(jtrue, label, jfalse) jtrue label
130#define CROSSJUMPTARGET(label)
131#define ENTRY(name) GEN_ENTRY(name)
132#define FAKE_MCOUNT(caller)
133#define MCOUNT
134#define MCOUNT_LABEL(name)
135#define MEXITCOUNT
136#endif /* GPROF */
137
138#ifdef LOCORE
139
140#define GSEL_KPL 0x0020 /* GSEL(GCODE_SEL, SEL_KPL) */
141#define SEL_RPL_MASK 0x0003
142
143/*
144 * Convenience macro for declaring interrupt entry points.
145 */

--- 116 unchanged lines hidden ---
60#ifdef LOCORE
61
62#define GSEL_KPL 0x0020 /* GSEL(GCODE_SEL, SEL_KPL) */
63#define SEL_RPL_MASK 0x0003
64
65/*
66 * Convenience macro for declaring interrupt entry points.
67 */

--- 116 unchanged lines hidden ---