| /** |
| * @file IA64syscallstub.h |
| * Assembly language file macros |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Bob Montgomery |
| */ |
| |
| /* $Id: IA64syscallstub.h,v 1.3 2008/01/21 21:35:17 movement Exp $ */ |
| |
| #define SYSCALLSTUB_POST(name) \ |
| .sbss; \ |
| .align 8; \ |
| .type .post_saverp_##name, @object; \ |
| .size .post_saverp_##name, 8; \ |
| .post_saverp_##name: \ |
| .skip 8; \ |
| .text; \ |
| .global post_stub_##name; \ |
| .align 32; \ |
| .proc post_stub_##name; \ |
| post_stub_##name: \ |
| .L1_##name: \ |
| mov r3=ip; \ |
| ;; \ |
| addl r16=.L2_##name - .L1_##name, r3; \ |
| ;; \ |
| mov b6=r16; \ |
| ;; \ |
| br.ret.sptk.many b6; \ |
| ;; \ |
| .L2_##name: \ |
| mov r3=ip; \ |
| mov r15=gp; /* save kgp */ \ |
| mov r17=rp; \ |
| ;; \ |
| addl r14=.post_fptr_##name - .L2_##name, r3; \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| ;; \ |
| adds r14=8, r14; \ |
| ;; \ |
| ld8 gp=[r14]; \ |
| ;; \ |
| addl r14=@ltoff(old_sys_##name), gp; \ |
| addl r16=@gprel(.post_saverp_##name), gp; \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| st8 [r16]=r17; /* save krp */ \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| mov gp=r15; /* restore kgp */ \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| ;; \ |
| mov b6 = r14; \ |
| ;; \ |
| br.call.sptk.many b0=b6; \ |
| ;; \ |
| .L3_##name: \ |
| mov r3=ip; \ |
| mov r15=gp; /* save kgp */ \ |
| ;; \ |
| addl r14=.post_fptr_##name - .L3_##name, r3; \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| ;; \ |
| adds r14=8, r14; \ |
| ;; \ |
| ld8 gp=[r14]; \ |
| br.call.sptk.many b0=post_call_stub_##name; \ |
| ;; \ |
| addl r16=@gprel(.post_saverp_##name), gp; \ |
| ;; \ |
| ld8 r14=[r16]; \ |
| ;; \ |
| mov b0 = r14; \ |
| mov gp = r15; /* preserved */ \ |
| br.cond.sptk.many b0; \ |
| .align 16; \ |
| .post_fptr_##name: \ |
| data8 @fptr(post_sys_##name); \ |
| .endp post_stub_##name; \ |
| .align 16; \ |
| .global post_call_stub_##name; \ |
| .proc post_call_stub_##name; \ |
| post_call_stub_##name: \ |
| alloc loc1=ar.pfs, 8, 6, 8, 0; \ |
| mov loc0=rp; \ |
| mov loc2=r15; /* preserve it */ \ |
| mov loc3=r8; \ |
| mov loc4=r10; \ |
| mov loc5=gp; \ |
| mov out0 = r8; /* old rv */ \ |
| mov out1 = in0; \ |
| mov out2 = in1; \ |
| mov out3 = in2; \ |
| mov out4 = in3; \ |
| mov out5 = in4; \ |
| mov out6 = in5; \ |
| mov out7 = in6; \ |
| ;; \ |
| br.call.sptk.many rp = post_sys_##name; \ |
| ;; \ |
| mov ar.pfs = loc1; \ |
| mov rp = loc0; \ |
| mov r15=loc2; \ |
| mov r8=loc3; \ |
| mov r10=loc4; \ |
| mov gp=loc5; \ |
| br.ret.sptk.few rp; \ |
| .endp post_call_stub_##name; |
| |
| #define SYSCALLSTUB_PRE(name) \ |
| .text; \ |
| .global pre_stub_##name; \ |
| .align 32; \ |
| .proc pre_stub_##name; \ |
| pre_stub_##name: \ |
| .L4_##name: \ |
| mov r3=ip; \ |
| ;; \ |
| addl r17=.L5_##name - .L4_##name, r3; \ |
| ;; \ |
| mov b6=r17; \ |
| ;; \ |
| br.ret.sptk.many b6; \ |
| ;; \ |
| .L5_##name: \ |
| mov r3=ip; \ |
| mov r15=gp; /* save kgp */ \ |
| mov r16=rp; /* save krp */ \ |
| ;; \ |
| addl r14=.pre_fptr_##name - .L5_##name, r3; \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| ;; \ |
| adds r14=8, r14; \ |
| ;; \ |
| ld8 gp=[r14]; \ |
| ;; \ |
| br.call.sptk.many b0=pre_call_stub_##name; \ |
| ;; \ |
| /* kernel gp still in r15 */ \ |
| /* kernel rp still in r16 */ \ |
| /* module gp in gp */ \ |
| ;; \ |
| addl r14=@ltoff(old_sys_##name), gp; \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| mov gp=r15; /* restore kgp */ \ |
| ;; \ |
| ld8 r14=[r14]; \ |
| mov rp=r16; /* restore krp */ \ |
| ;; \ |
| mov b6 = r14; \ |
| ;; \ |
| /* use the saved krp */ \ |
| br.call.sptk.many b6=b6; \ |
| ;; \ |
| .align 16; \ |
| .pre_fptr_##name: \ |
| data8 @fptr(pre_sys_##name); \ |
| .endp pre_stub_##name; \ |
| .align 16; \ |
| .global pre_call_stub_##name; \ |
| .proc pre_call_stub_##name; \ |
| pre_call_stub_##name: \ |
| alloc loc1=ar.pfs, 8, 5, 8, 0; \ |
| mov loc0=rp; \ |
| mov loc2=r15; /* preserve it */ \ |
| mov loc3=r16; /* preserve it */ \ |
| mov loc4=gp; \ |
| mov out0 = in0; \ |
| mov out1 = in1; \ |
| mov out2 = in2; \ |
| mov out3 = in3; \ |
| mov out4 = in4; \ |
| mov out5 = in5; \ |
| mov out6 = in6; \ |
| mov out7 = in7; \ |
| ;; \ |
| br.call.sptk.many rp = pre_sys_##name; \ |
| ;; \ |
| mov ar.pfs = loc1; \ |
| mov rp = loc0; \ |
| mov r15=loc2; \ |
| mov r16=loc3; \ |
| mov gp=loc4; \ |
| br.ret.sptk.few rp; \ |
| .endp pre_call_stub_##name; |
| |
| |