1 1.9 nakayama /* $NetBSD: locore.h,v 1.9 2015/10/17 19:29:48 nakayama Exp $ */ 2 1.1 mrg 3 1.1 mrg /* 4 1.1 mrg * Copyright (c) 1996-2002 Eduardo Horvath 5 1.1 mrg * All rights reserved. 6 1.1 mrg * 7 1.1 mrg * Redistribution and use in source and binary forms, with or without 8 1.1 mrg * modification, are permitted provided that the following conditions 9 1.1 mrg * are met: 10 1.1 mrg * 1. Redistributions of source code must retain the above copyright 11 1.1 mrg * notice, this list of conditions and the following disclaimer. 12 1.1 mrg * 13 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND 14 1.1 mrg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 1.1 mrg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 1.1 mrg * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE 17 1.1 mrg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 1.1 mrg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 1.1 mrg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 1.1 mrg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 1.1 mrg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 1.1 mrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 1.1 mrg * SUCH DAMAGE. 24 1.1 mrg * 25 1.1 mrg */ 26 1.1 mrg 27 1.1 mrg #undef CURLWP 28 1.1 mrg #undef CPCB 29 1.1 mrg #undef FPLWP 30 1.1 mrg 31 1.1 mrg #define CURLWP (CPUINFO_VA + CI_CURLWP) 32 1.1 mrg #define CPCB (CPUINFO_VA + CI_CPCB) 33 1.1 mrg #define FPLWP (CPUINFO_VA + CI_FPLWP) 34 1.1 mrg 35 1.4 martin /* A few convenient abbreviations for trapframe fields. */ 36 1.4 martin #define TF_G TF_GLOBAL 37 1.4 martin #define TF_O TF_OUT 38 1.4 martin #define TF_L TF_LOCAL 39 1.4 martin #define TF_I TF_IN 40 1.4 martin 41 1.4 martin /* Let us use same syntax as C code */ 42 1.4 martin #define Debugger() ta 1; nop 43 1.4 martin 44 1.4 martin 45 1.4 martin /* 46 1.4 martin * This macro will clear out a cache line before an explicit 47 1.4 martin * access to that location. It's mostly used to make certain 48 1.4 martin * loads bypassing the D$ do not get stale D$ data. 49 1.4 martin * 50 1.4 martin * It uses a register with the address to clear and a temporary 51 1.4 martin * which is destroyed. 52 1.4 martin */ 53 1.4 martin #ifdef DCACHE_BUG 54 1.4 martin #define DLFLUSH(a,t) \ 55 1.4 martin andn a, 0x3f, t; \ 56 1.4 martin stxa %g0, [ t ] ASI_DCACHE_TAG; \ 57 1.4 martin membar #Sync 58 1.4 martin /* The following can be used if the pointer is 32-byte aligned */ 59 1.4 martin #define DLFLUSH2(t) \ 60 1.4 martin stxa %g0, [ t ] ASI_DCACHE_TAG; \ 61 1.4 martin membar #Sync 62 1.4 martin #else 63 1.4 martin #define DLFLUSH(a,t) 64 1.4 martin #define DLFLUSH2(t) 65 1.4 martin #endif 66 1.4 martin 67 1.4 martin 68 1.4 martin /* 69 1.4 martin * A handy macro for maintaining instrumentation counters. 70 1.4 martin * Note that this clobbers %o0, %o1 and %o2. Normal usage is 71 1.4 martin * something like: 72 1.4 martin * foointr: 73 1.4 martin * TRAP_SETUP(...) ! makes %o registers safe 74 1.4 martin * INCR(_C_LABEL(cnt)+V_FOO) ! count a foo 75 1.4 martin */ 76 1.4 martin #define INCR(what) \ 77 1.4 martin sethi %hi(what), %o0; \ 78 1.4 martin or %o0, %lo(what), %o0; \ 79 1.4 martin 99: \ 80 1.4 martin lduw [%o0], %o1; \ 81 1.4 martin add %o1, 1, %o2; \ 82 1.4 martin casa [%o0] ASI_P, %o1, %o2; \ 83 1.4 martin cmp %o1, %o2; \ 84 1.4 martin bne,pn %icc, 99b; \ 85 1.4 martin nop 86 1.4 martin 87 1.4 martin /* 88 1.4 martin * A couple of handy macros to save and restore globals to/from 89 1.4 martin * locals. Since udivrem uses several globals, and it's called 90 1.4 martin * from vsprintf, we need to do this before and after doing a printf. 91 1.4 martin */ 92 1.4 martin #define GLOBTOLOC \ 93 1.4 martin mov %g1, %l1; \ 94 1.4 martin mov %g2, %l2; \ 95 1.4 martin mov %g3, %l3; \ 96 1.4 martin mov %g4, %l4; \ 97 1.4 martin mov %g5, %l5; \ 98 1.4 martin mov %g6, %l6; \ 99 1.4 martin mov %g7, %l7 100 1.4 martin 101 1.4 martin #define LOCTOGLOB \ 102 1.4 martin mov %l1, %g1; \ 103 1.4 martin mov %l2, %g2; \ 104 1.4 martin mov %l3, %g3; \ 105 1.4 martin mov %l4, %g4; \ 106 1.4 martin mov %l5, %g5; \ 107 1.4 martin mov %l6, %g6; \ 108 1.4 martin mov %l7, %g7 109 1.4 martin 110 1.4 martin /* Load strings address into register; NOTE: hidden local label 99 */ 111 1.4 martin #define LOAD_ASCIZ(reg, s) \ 112 1.4 martin set 99f, reg ; \ 113 1.4 martin .data ; \ 114 1.4 martin 99: .asciz s ; \ 115 1.4 martin _ALIGN ; \ 116 1.4 martin .text 117 1.4 martin 118 1.4 martin /* 119 1.4 martin * Handy stack conversion macros. 120 1.4 martin * They correctly switch to requested stack type 121 1.4 martin * regardless of the current stack. 122 1.4 martin */ 123 1.4 martin 124 1.4 martin #define TO_STACK64(size) \ 125 1.4 martin save %sp, size, %sp; \ 126 1.4 martin add %sp, -BIAS, %o0; /* Convert to 64-bits */ \ 127 1.4 martin andcc %sp, 1, %g0; /* 64-bit stack? */ \ 128 1.4 martin movz %icc, %o0, %sp 129 1.4 martin 130 1.4 martin #define TO_STACK32(size) \ 131 1.4 martin save %sp, size, %sp; \ 132 1.4 martin add %sp, +BIAS, %o0; /* Convert to 32-bits */ \ 133 1.4 martin andcc %sp, 1, %g0; /* 64-bit stack? */ \ 134 1.4 martin movnz %icc, %o0, %sp 135 1.4 martin 136 1.4 martin #ifdef _LP64 137 1.4 martin #define STACKFRAME(size) TO_STACK64(size) 138 1.4 martin #else 139 1.4 martin #define STACKFRAME(size) TO_STACK32(size) 140 1.4 martin #endif 141 1.4 martin 142 1.4 martin /* 143 1.4 martin * Primitives 144 1.4 martin */ 145 1.4 martin #ifdef ENTRY 146 1.4 martin #undef ENTRY 147 1.4 martin #endif 148 1.4 martin 149 1.4 martin #ifdef GPROF 150 1.4 martin .globl _mcount 151 1.4 martin #define ENTRY(x) \ 152 1.8 joerg .globl _C_LABEL(x); .type _C_LABEL(x),@function; \ 153 1.4 martin _C_LABEL(x): ; \ 154 1.4 martin .data; \ 155 1.4 martin .align 8; \ 156 1.7 joerg 0: .word 0; .word 0; \ 157 1.4 martin .text; \ 158 1.4 martin save %sp, -CC64FSZ, %sp; \ 159 1.4 martin sethi %hi(0b), %o0; \ 160 1.4 martin call _mcount; \ 161 1.4 martin or %o0, %lo(0b), %o0; \ 162 1.4 martin restore 163 1.4 martin #else 164 1.8 joerg #define ENTRY(x) .globl _C_LABEL(x); .type _C_LABEL(x),@function; \ 165 1.8 joerg _C_LABEL(x): 166 1.4 martin #endif 167 1.4 martin #define ALTENTRY(x) .globl _C_LABEL(x); _C_LABEL(x): 168 1.4 martin 169 1.4 martin 170