| 
									
										
										
										
											2006-09-26 10:52:32 +02:00
										 |  |  | #include <linux/linkage.h> | 
					
						
							|  |  |  | #include <asm/dwarf2.h> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Zero a page. 	 | 
					
						
							|  |  |  |  * rdi	page | 
					
						
							|  |  |  |  */			 | 
					
						
							| 
									
										
										
										
											2006-09-26 10:52:32 +02:00
										 |  |  | 	ALIGN | 
					
						
							|  |  |  | clear_page_c: | 
					
						
							|  |  |  | 	CFI_STARTPROC | 
					
						
							|  |  |  | 	movl $4096/8,%ecx | 
					
						
							|  |  |  | 	xorl %eax,%eax | 
					
						
							|  |  |  | 	rep stosq | 
					
						
							|  |  |  | 	ret | 
					
						
							|  |  |  | 	CFI_ENDPROC | 
					
						
							|  |  |  | ENDPROC(clear_page) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENTRY(clear_page) | 
					
						
							|  |  |  | 	CFI_STARTPROC | 
					
						
							| 
									
										
										
										
											2006-02-03 21:51:02 +01:00
										 |  |  | 	xorl   %eax,%eax | 
					
						
							|  |  |  | 	movl   $4096/64,%ecx | 
					
						
							|  |  |  | 	.p2align 4
 | 
					
						
							|  |  |  | .Lloop: | 
					
						
							|  |  |  | 	decl	%ecx | 
					
						
							|  |  |  | #define PUT(x) movq %rax,x*8(%rdi) | 
					
						
							|  |  |  | 	movq %rax,(%rdi) | 
					
						
							|  |  |  | 	PUT(1) | 
					
						
							|  |  |  | 	PUT(2) | 
					
						
							|  |  |  | 	PUT(3) | 
					
						
							|  |  |  | 	PUT(4) | 
					
						
							|  |  |  | 	PUT(5) | 
					
						
							|  |  |  | 	PUT(6) | 
					
						
							|  |  |  | 	PUT(7) | 
					
						
							|  |  |  | 	leaq	64(%rdi),%rdi | 
					
						
							|  |  |  | 	jnz	.Lloop | 
					
						
							|  |  |  | 	nop | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2006-09-26 10:52:32 +02:00
										 |  |  | 	CFI_ENDPROC | 
					
						
							|  |  |  | .Lclear_page_end: | 
					
						
							|  |  |  | ENDPROC(clear_page) | 
					
						
							| 
									
										
										
										
											2006-02-03 21:51:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Some CPUs run faster using the string instructions. | 
					
						
							|  |  |  | 	   It is also a lot simpler. Use this when possible */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/cpufeature.h> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-26 10:52:32 +02:00
										 |  |  | 	.section .altinstr_replacement,"ax" | 
					
						
							|  |  |  | 1:	.byte 0xeb					/* jmp <disp8> */ | 
					
						
							|  |  |  | 	.byte (clear_page_c - clear_page) - (2f - 1b)	/* offset */ | 
					
						
							|  |  |  | 2: | 
					
						
							|  |  |  | 	.previous | 
					
						
							| 
									
										
										
										
											2006-02-03 21:51:02 +01:00
										 |  |  | 	.section .altinstructions,"a" | 
					
						
							|  |  |  | 	.align 8
 | 
					
						
							| 
									
										
										
										
											2006-09-26 10:52:32 +02:00
										 |  |  | 	.quad clear_page
 | 
					
						
							|  |  |  | 	.quad 1b
 | 
					
						
							|  |  |  | 	.byte X86_FEATURE_REP_GOOD
 | 
					
						
							|  |  |  | 	.byte .Lclear_page_end - clear_page | 
					
						
							|  |  |  | 	.byte 2b - 1b | 
					
						
							| 
									
										
										
										
											2006-02-03 21:51:02 +01:00
										 |  |  | 	.previous |