| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* 
 | 
					
						
							|  |  |  |  * Some macros to handle stack frames in assembly. | 
					
						
							|  |  |  |  */  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define R15 0
 | 
					
						
							|  |  |  | #define R14 8
 | 
					
						
							|  |  |  | #define R13 16
 | 
					
						
							|  |  |  | #define R12 24
 | 
					
						
							|  |  |  | #define RBP 32
 | 
					
						
							|  |  |  | #define RBX 40
 | 
					
						
							|  |  |  | /* arguments: interrupts/non tracing syscalls only save upto here*/ | 
					
						
							|  |  |  | #define R11 48
 | 
					
						
							|  |  |  | #define R10 56	
 | 
					
						
							|  |  |  | #define R9 64
 | 
					
						
							|  |  |  | #define R8 72
 | 
					
						
							|  |  |  | #define RAX 80
 | 
					
						
							|  |  |  | #define RCX 88
 | 
					
						
							|  |  |  | #define RDX 96
 | 
					
						
							|  |  |  | #define RSI 104
 | 
					
						
							|  |  |  | #define RDI 112
 | 
					
						
							|  |  |  | #define ORIG_RAX 120       /* + error_code */ 
 | 
					
						
							|  |  |  | /* end of arguments */ 	 | 
					
						
							|  |  |  | /* cpu exception frame or undefined in case of fast syscall. */ | 
					
						
							|  |  |  | #define RIP 128
 | 
					
						
							|  |  |  | #define CS 136
 | 
					
						
							|  |  |  | #define EFLAGS 144
 | 
					
						
							|  |  |  | #define RSP 152
 | 
					
						
							|  |  |  | #define SS 160
 | 
					
						
							|  |  |  | #define ARGOFFSET R11
 | 
					
						
							|  |  |  | #define SWFRAME ORIG_RAX
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.macro SAVE_ARGS addskip=0,norcx=0,nor891011=0 | 
					
						
							|  |  |  | 	subq  $9*8+\addskip,%rsp | 
					
						
							|  |  |  | 	CFI_ADJUST_CFA_OFFSET	9*8+\addskip | 
					
						
							|  |  |  | 	movq  %rdi,8*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rdi,8*8 | 
					
						
							|  |  |  | 	movq  %rsi,7*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rsi,7*8 | 
					
						
							|  |  |  | 	movq  %rdx,6*8(%rsp) | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rdx,6*8 | 
					
						
							|  |  |  | 	.if \norcx | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq  %rcx,5*8(%rsp) | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rcx,5*8 | 
					
						
							|  |  |  | 	.endif | 
					
						
							|  |  |  | 	movq  %rax,4*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rax,4*8 | 
					
						
							|  |  |  | 	.if \nor891011 | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq  %r8,3*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r8,3*8 | 
					
						
							|  |  |  | 	movq  %r9,2*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r9,2*8 | 
					
						
							|  |  |  | 	movq  %r10,1*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r10,1*8 | 
					
						
							|  |  |  | 	movq  %r11,(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r11,0*8 | 
					
						
							|  |  |  | 	.endif | 
					
						
							|  |  |  | 	.endm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ARG_SKIP 9*8
 | 
					
						
							|  |  |  | 	.macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0,skipr11=0,skipr8910=0,skiprdx=0 | 
					
						
							|  |  |  | 	.if \skipr11 | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq (%rsp),%r11 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r11 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.endif | 
					
						
							|  |  |  | 	.if \skipr8910 | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq 1*8(%rsp),%r10 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r10 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 2*8(%rsp),%r9 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r9 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 3*8(%rsp),%r8 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r8 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.endif | 
					
						
							|  |  |  | 	.if \skiprax | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq 4*8(%rsp),%rax | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rax | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.endif | 
					
						
							|  |  |  | 	.if \skiprcx | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq 5*8(%rsp),%rcx | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rcx | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.endif | 
					
						
							|  |  |  | 	.if \skiprdx | 
					
						
							|  |  |  | 	.else | 
					
						
							|  |  |  | 	movq 6*8(%rsp),%rdx | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rdx | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.endif | 
					
						
							|  |  |  | 	movq 7*8(%rsp),%rsi | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rsi | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 8*8(%rsp),%rdi | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rdi | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.if ARG_SKIP+\addskip > 0 | 
					
						
							|  |  |  | 	addq $ARG_SKIP+\addskip,%rsp | 
					
						
							|  |  |  | 	CFI_ADJUST_CFA_OFFSET	-(ARG_SKIP+\addskip) | 
					
						
							|  |  |  | 	.endif | 
					
						
							|  |  |  | 	.endm	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.macro LOAD_ARGS offset | 
					
						
							|  |  |  | 	movq \offset(%rsp),%r11 | 
					
						
							|  |  |  | 	movq \offset+8(%rsp),%r10 | 
					
						
							|  |  |  | 	movq \offset+16(%rsp),%r9 | 
					
						
							|  |  |  | 	movq \offset+24(%rsp),%r8 | 
					
						
							|  |  |  | 	movq \offset+40(%rsp),%rcx | 
					
						
							|  |  |  | 	movq \offset+48(%rsp),%rdx | 
					
						
							|  |  |  | 	movq \offset+56(%rsp),%rsi | 
					
						
							|  |  |  | 	movq \offset+64(%rsp),%rdi | 
					
						
							|  |  |  | 	movq \offset+72(%rsp),%rax | 
					
						
							|  |  |  | 	.endm | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | #define REST_SKIP 6*8			
 | 
					
						
							|  |  |  | 	.macro SAVE_REST | 
					
						
							|  |  |  | 	subq $REST_SKIP,%rsp | 
					
						
							|  |  |  | 	CFI_ADJUST_CFA_OFFSET	REST_SKIP | 
					
						
							|  |  |  | 	movq %rbx,5*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rbx,5*8 | 
					
						
							|  |  |  | 	movq %rbp,4*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	rbp,4*8 | 
					
						
							|  |  |  | 	movq %r12,3*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r12,3*8 | 
					
						
							|  |  |  | 	movq %r13,2*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r13,2*8 | 
					
						
							|  |  |  | 	movq %r14,1*8(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r14,1*8 | 
					
						
							|  |  |  | 	movq %r15,(%rsp)  | 
					
						
							|  |  |  | 	CFI_REL_OFFSET	r15,0*8 | 
					
						
							|  |  |  | 	.endm		 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.macro RESTORE_REST | 
					
						
							|  |  |  | 	movq (%rsp),%r15 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r15 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 1*8(%rsp),%r14 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r14 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 2*8(%rsp),%r13 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r13 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 3*8(%rsp),%r12 | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE r12 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 4*8(%rsp),%rbp | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rbp | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	movq 5*8(%rsp),%rbx | 
					
						
							| 
									
										
										
										
											2005-09-12 18:49:24 +02:00
										 |  |  | 	CFI_RESTORE rbx | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	addq $REST_SKIP,%rsp | 
					
						
							|  |  |  | 	CFI_ADJUST_CFA_OFFSET	-(REST_SKIP) | 
					
						
							|  |  |  | 	.endm | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	.macro SAVE_ALL | 
					
						
							|  |  |  | 	SAVE_ARGS | 
					
						
							|  |  |  | 	SAVE_REST | 
					
						
							|  |  |  | 	.endm | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	.macro RESTORE_ALL addskip=0 | 
					
						
							|  |  |  | 	RESTORE_REST | 
					
						
							|  |  |  | 	RESTORE_ARGS 0,\addskip | 
					
						
							|  |  |  | 	.endm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.macro icebp | 
					
						
							|  |  |  | 	.byte 0xf1 | 
					
						
							|  |  |  | 	.endm |