/**
* @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;