Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/arch/i386/i386/locore.S,v retrieving revision 1.49 retrieving revision 1.50 diff -u -p -r1.49 -r1.50 --- src/sys/arch/i386/i386/locore.S 2007/08/16 17:00:05 1.49 +++ src/sys/arch/i386/i386/locore.S 2007/08/29 23:38:04 1.50 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.49 2007/08/16 17:00:05 ad Exp $ */ +/* $NetBSD: locore.S,v 1.50 2007/08/29 23:38:04 ad Exp $ */ /*- * Copyright (c) 1998, 2000, 2004, 2006, 2007 The NetBSD Foundation, Inc. @@ -937,3 +937,65 @@ NENTRY(npx586bug1) popl %eax ret #endif /* NNPX > 0 */ + +/* + * void sse2_zero_page(void *pg) + * + * Zero a page without polluting the cache. + */ +ENTRY(sse2_zero_page) + pushl %ebp + movl %esp,%ebp + movl 8(%esp), %edx + movl $PAGE_SIZE, %ecx + xorl %eax, %eax + .align 16 +1: + movnti %eax, 0(%edx) + movnti %eax, 4(%edx) + movnti %eax, 8(%edx) + movnti %eax, 12(%edx) + movnti %eax, 16(%edx) + movnti %eax, 20(%edx) + movnti %eax, 24(%edx) + movnti %eax, 28(%edx) + subl $32, %ecx + leal 32(%edx), %edx + jnz 1b + sfence + pop %ebp + ret + +/* + * void sse2_copy_page(void *src, void *dst) + * + * Copy a page without polluting the cache. + */ +ENTRY(sse2_copy_page) + pushl %ebp + pushl %ebx + pushl %esi + pushl %edi + movl 20(%esp), %esi + movl 24(%esp), %edi + movl $PAGE_SIZE, %ebp + .align 16 +1: + movl 0(%esi), %eax + movl 4(%esi), %ebx + movl 8(%esi), %ecx + movl 12(%esi), %edx + movnti %eax, 0(%edi) + movnti %ebx, 4(%edi) + movnti %ecx, 8(%edi) + movnti %edx, 12(%edi) + subl $16, %ebp + leal 16(%esi), %esi + leal 16(%edi), %edi + jnz 1b + sfence + popl %edi + popl %esi + popl %ebx + popl %ebp + ret