18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file IA64syscallstub.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Assembly language file macros
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Bob Montgomery
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* $Id: IA64syscallstub.h,v 1.3 2008/01/21 21:35:17 movement Exp $ */
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define SYSCALLSTUB_POST(name)		\
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.sbss;				\
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 8;			\
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.type .post_saverp_##name, @object;	\
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.size .post_saverp_##name, 8;	\
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.post_saverp_##name:			\
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.skip 8;			\
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.text;				\
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.global post_stub_##name;	\
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 32;			\
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.proc post_stub_##name;		\
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpost_stub_##name:			\
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.L1_##name:				\
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r3=ip;			\
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r16=.L2_##name - .L1_##name, r3;	\
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov b6=r16;			\
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.ret.sptk.many b6;		\
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.L2_##name:				\
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r3=ip;			\
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r15=gp;	/* save kgp */	\
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r17=rp;			\
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r14=.post_fptr_##name - .L2_##name, r3;	\
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	adds r14=8, r14;		\
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 gp=[r14];			\
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r14=@ltoff(old_sys_##name), gp;    \
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r16=@gprel(.post_saverp_##name), gp;	\
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	st8 [r16]=r17;	/* save krp */	\
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov gp=r15;	/* restore kgp */	\
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov b6 = r14;			\
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.call.sptk.many b0=b6;	\
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.L3_##name:				\
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r3=ip;			\
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r15=gp;	/* save kgp */	\
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r14=.post_fptr_##name - .L3_##name, r3;	\
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	adds r14=8, r14;		\
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 gp=[r14];			\
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.call.sptk.many b0=post_call_stub_##name;	\
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r16=@gprel(.post_saverp_##name), gp;	\
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r16];			\
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov b0 = r14;			\
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov gp = r15; /* preserved */	\
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.cond.sptk.many b0;		\
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 16;			\
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.post_fptr_##name:				\
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	data8 @fptr(post_sys_##name);	\
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.endp post_stub_##name;		\
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 16;			\
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.global post_call_stub_##name;	\
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.proc post_call_stub_##name;	\
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpost_call_stub_##name:			\
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	alloc loc1=ar.pfs, 8, 6, 8, 0;	\
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc0=rp;			\
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc2=r15; /* preserve it */	\
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc3=r8;			\
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc4=r10;			\
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc5=gp;			\
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out0 = r8;	/* old rv */	\
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out1 = in0;			\
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out2 = in1;			\
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out3 = in2;			\
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out4 = in3;			\
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out5 = in4;			\
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out6 = in5;			\
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out7 = in6;			\
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.call.sptk.many rp = post_sys_##name;	\
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov ar.pfs = loc1;		\
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov rp = loc0;			\
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r15=loc2;			\
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r8=loc3;			\
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r10=loc4;			\
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov gp=loc5;			\
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.ret.sptk.few	rp;		\
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.endp post_call_stub_##name;
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define SYSCALLSTUB_PRE(name)		\
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.text;				\
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.global pre_stub_##name;	\
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 32;			\
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.proc pre_stub_##name;		\
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpre_stub_##name:			\
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.L4_##name:				\
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r3=ip;			\
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r17=.L5_##name - .L4_##name, r3;	\
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov b6=r17;			\
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.ret.sptk.many b6;		\
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.L5_##name:				\
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r3=ip;			\
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r15=gp;	/* save kgp */	\
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r16=rp;	/* save krp */	\
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r14=.pre_fptr_##name - .L5_##name, r3;	\
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	adds r14=8, r14;		\
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 gp=[r14];			\
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.call.sptk.many b0=pre_call_stub_##name;	\
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* kernel gp still in r15 */	\
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* kernel rp still in r16 */	\
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* module gp in gp */		\
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	addl r14=@ltoff(old_sys_##name), gp;    \
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov gp=r15; /* restore kgp */	\
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ld8 r14=[r14];			\
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov rp=r16; /* restore krp */	\
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov b6 = r14;			\
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* use the saved krp */		\
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.call.sptk.many b6=b6;	\
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 16;			\
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd.pre_fptr_##name:				\
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	data8 @fptr(pre_sys_##name);	\
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.endp pre_stub_##name;		\
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.align 16;			\
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.global pre_call_stub_##name;	\
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.proc pre_call_stub_##name;	\
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpre_call_stub_##name:			\
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	alloc loc1=ar.pfs, 8, 5, 8, 0;	\
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc0=rp;			\
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc2=r15; /* preserve it */	\
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc3=r16; /* preserve it */	\
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov loc4=gp;			\
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out0 = in0;			\
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out1 = in1;			\
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out2 = in2;			\
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out3 = in3;			\
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out4 = in4;			\
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out5 = in5;			\
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out6 = in6;			\
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov out7 = in7;			\
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.call.sptk.many rp = pre_sys_##name;	\
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	;;				\
1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov ar.pfs = loc1;		\
1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov rp = loc0;			\
1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r15=loc2;			\
1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov r16=loc3;			\
1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mov gp=loc4;			\
1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	br.ret.sptk.few	rp;		\
1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	.endp pre_call_stub_##name;
1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198