1 /** 2 * @file IA64syscallstub.h 3 * Assembly language file macros 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author Bob Montgomery 9 */ 10 11 /* $Id: IA64syscallstub.h,v 1.3 2008/01/21 21:35:17 movement Exp $ */ 12 13 #define SYSCALLSTUB_POST(name) \ 14 .sbss; \ 15 .align 8; \ 16 .type .post_saverp_##name, @object; \ 17 .size .post_saverp_##name, 8; \ 18 .post_saverp_##name: \ 19 .skip 8; \ 20 .text; \ 21 .global post_stub_##name; \ 22 .align 32; \ 23 .proc post_stub_##name; \ 24 post_stub_##name: \ 25 .L1_##name: \ 26 mov r3=ip; \ 27 ;; \ 28 addl r16=.L2_##name - .L1_##name, r3; \ 29 ;; \ 30 mov b6=r16; \ 31 ;; \ 32 br.ret.sptk.many b6; \ 33 ;; \ 34 .L2_##name: \ 35 mov r3=ip; \ 36 mov r15=gp; /* save kgp */ \ 37 mov r17=rp; \ 38 ;; \ 39 addl r14=.post_fptr_##name - .L2_##name, r3; \ 40 ;; \ 41 ld8 r14=[r14]; \ 42 ;; \ 43 adds r14=8, r14; \ 44 ;; \ 45 ld8 gp=[r14]; \ 46 ;; \ 47 addl r14=@ltoff(old_sys_##name), gp; \ 48 addl r16=@gprel(.post_saverp_##name), gp; \ 49 ;; \ 50 ld8 r14=[r14]; \ 51 st8 [r16]=r17; /* save krp */ \ 52 ;; \ 53 ld8 r14=[r14]; \ 54 mov gp=r15; /* restore kgp */ \ 55 ;; \ 56 ld8 r14=[r14]; \ 57 ;; \ 58 mov b6 = r14; \ 59 ;; \ 60 br.call.sptk.many b0=b6; \ 61 ;; \ 62 .L3_##name: \ 63 mov r3=ip; \ 64 mov r15=gp; /* save kgp */ \ 65 ;; \ 66 addl r14=.post_fptr_##name - .L3_##name, r3; \ 67 ;; \ 68 ld8 r14=[r14]; \ 69 ;; \ 70 adds r14=8, r14; \ 71 ;; \ 72 ld8 gp=[r14]; \ 73 br.call.sptk.many b0=post_call_stub_##name; \ 74 ;; \ 75 addl r16=@gprel(.post_saverp_##name), gp; \ 76 ;; \ 77 ld8 r14=[r16]; \ 78 ;; \ 79 mov b0 = r14; \ 80 mov gp = r15; /* preserved */ \ 81 br.cond.sptk.many b0; \ 82 .align 16; \ 83 .post_fptr_##name: \ 84 data8 @fptr(post_sys_##name); \ 85 .endp post_stub_##name; \ 86 .align 16; \ 87 .global post_call_stub_##name; \ 88 .proc post_call_stub_##name; \ 89 post_call_stub_##name: \ 90 alloc loc1=ar.pfs, 8, 6, 8, 0; \ 91 mov loc0=rp; \ 92 mov loc2=r15; /* preserve it */ \ 93 mov loc3=r8; \ 94 mov loc4=r10; \ 95 mov loc5=gp; \ 96 mov out0 = r8; /* old rv */ \ 97 mov out1 = in0; \ 98 mov out2 = in1; \ 99 mov out3 = in2; \ 100 mov out4 = in3; \ 101 mov out5 = in4; \ 102 mov out6 = in5; \ 103 mov out7 = in6; \ 104 ;; \ 105 br.call.sptk.many rp = post_sys_##name; \ 106 ;; \ 107 mov ar.pfs = loc1; \ 108 mov rp = loc0; \ 109 mov r15=loc2; \ 110 mov r8=loc3; \ 111 mov r10=loc4; \ 112 mov gp=loc5; \ 113 br.ret.sptk.few rp; \ 114 .endp post_call_stub_##name; 115 116 #define SYSCALLSTUB_PRE(name) \ 117 .text; \ 118 .global pre_stub_##name; \ 119 .align 32; \ 120 .proc pre_stub_##name; \ 121 pre_stub_##name: \ 122 .L4_##name: \ 123 mov r3=ip; \ 124 ;; \ 125 addl r17=.L5_##name - .L4_##name, r3; \ 126 ;; \ 127 mov b6=r17; \ 128 ;; \ 129 br.ret.sptk.many b6; \ 130 ;; \ 131 .L5_##name: \ 132 mov r3=ip; \ 133 mov r15=gp; /* save kgp */ \ 134 mov r16=rp; /* save krp */ \ 135 ;; \ 136 addl r14=.pre_fptr_##name - .L5_##name, r3; \ 137 ;; \ 138 ld8 r14=[r14]; \ 139 ;; \ 140 adds r14=8, r14; \ 141 ;; \ 142 ld8 gp=[r14]; \ 143 ;; \ 144 br.call.sptk.many b0=pre_call_stub_##name; \ 145 ;; \ 146 /* kernel gp still in r15 */ \ 147 /* kernel rp still in r16 */ \ 148 /* module gp in gp */ \ 149 ;; \ 150 addl r14=@ltoff(old_sys_##name), gp; \ 151 ;; \ 152 ld8 r14=[r14]; \ 153 ;; \ 154 ld8 r14=[r14]; \ 155 mov gp=r15; /* restore kgp */ \ 156 ;; \ 157 ld8 r14=[r14]; \ 158 mov rp=r16; /* restore krp */ \ 159 ;; \ 160 mov b6 = r14; \ 161 ;; \ 162 /* use the saved krp */ \ 163 br.call.sptk.many b6=b6; \ 164 ;; \ 165 .align 16; \ 166 .pre_fptr_##name: \ 167 data8 @fptr(pre_sys_##name); \ 168 .endp pre_stub_##name; \ 169 .align 16; \ 170 .global pre_call_stub_##name; \ 171 .proc pre_call_stub_##name; \ 172 pre_call_stub_##name: \ 173 alloc loc1=ar.pfs, 8, 5, 8, 0; \ 174 mov loc0=rp; \ 175 mov loc2=r15; /* preserve it */ \ 176 mov loc3=r16; /* preserve it */ \ 177 mov loc4=gp; \ 178 mov out0 = in0; \ 179 mov out1 = in1; \ 180 mov out2 = in2; \ 181 mov out3 = in3; \ 182 mov out4 = in4; \ 183 mov out5 = in5; \ 184 mov out6 = in6; \ 185 mov out7 = in7; \ 186 ;; \ 187 br.call.sptk.many rp = pre_sys_##name; \ 188 ;; \ 189 mov ar.pfs = loc1; \ 190 mov rp = loc0; \ 191 mov r15=loc2; \ 192 mov r16=loc3; \ 193 mov gp=loc4; \ 194 br.ret.sptk.few rp; \ 195 .endp pre_call_stub_##name; 196 197 198