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 --- |