2005-09-26 13:04:21 +07:00
|
|
|
/*
|
2008-08-22 11:39:00 +07:00
|
|
|
* Copyright (C) 2008 Mark Nelson, IBM Corp.
|
2005-09-26 13:04:21 +07:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version
|
|
|
|
* 2 of the License, or (at your option) any later version.
|
|
|
|
*/
|
2011-05-09 04:18:38 +07:00
|
|
|
#include <asm/page.h>
|
2005-09-26 13:04:21 +07:00
|
|
|
#include <asm/processor.h>
|
|
|
|
#include <asm/ppc_asm.h>
|
2008-08-22 11:39:00 +07:00
|
|
|
#include <asm/asm-offsets.h>
|
2016-01-14 11:33:46 +07:00
|
|
|
#include <asm/export.h>
|
2008-08-22 11:39:00 +07:00
|
|
|
|
|
|
|
.section ".toc","aw"
|
|
|
|
PPC64_CACHES:
|
|
|
|
.tc ppc64_caches[TC],ppc64_caches
|
|
|
|
.section ".text"
|
|
|
|
|
2014-06-05 05:04:39 +07:00
|
|
|
_GLOBAL_TOC(copy_page)
|
2012-05-30 02:33:12 +07:00
|
|
|
BEGIN_FTR_SECTION
|
2011-05-09 04:18:38 +07:00
|
|
|
lis r5,PAGE_SIZE@h
|
2012-05-30 02:33:12 +07:00
|
|
|
FTR_SECTION_ELSE
|
2014-02-04 12:04:35 +07:00
|
|
|
b copypage_power7
|
2012-05-30 02:33:12 +07:00
|
|
|
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
|
2011-05-09 04:18:38 +07:00
|
|
|
ori r5,r5,PAGE_SIZE@l
|
2008-08-22 11:39:00 +07:00
|
|
|
BEGIN_FTR_SECTION
|
|
|
|
ld r10,PPC64_CACHES@toc(r2)
|
2017-01-09 06:31:45 +07:00
|
|
|
lwz r11,DCACHEL1LOGBLOCKSIZE(r10) /* log2 of cache block size */
|
|
|
|
lwz r12,DCACHEL1BLOCKSIZE(r10) /* get cache block size */
|
2008-08-22 11:39:00 +07:00
|
|
|
li r9,0
|
|
|
|
srd r8,r5,r11
|
|
|
|
|
|
|
|
mtctr r8
|
2009-10-18 08:23:28 +07:00
|
|
|
.Lsetup:
|
2008-08-22 11:39:00 +07:00
|
|
|
dcbt r9,r4
|
|
|
|
dcbz r9,r3
|
|
|
|
add r9,r9,r12
|
2009-10-18 08:23:28 +07:00
|
|
|
bdnz .Lsetup
|
2008-08-22 11:39:00 +07:00
|
|
|
END_FTR_SECTION_IFSET(CPU_FTR_CP_USE_DCBTZ)
|
2005-09-26 13:04:21 +07:00
|
|
|
addi r3,r3,-8
|
2008-08-22 11:39:00 +07:00
|
|
|
srdi r8,r5,7 /* page is copied in 128 byte strides */
|
|
|
|
addi r8,r8,-1 /* one stride copied outside loop */
|
|
|
|
|
|
|
|
mtctr r8
|
|
|
|
|
|
|
|
ld r5,0(r4)
|
|
|
|
ld r6,8(r4)
|
|
|
|
ld r7,16(r4)
|
|
|
|
ldu r8,24(r4)
|
|
|
|
1: std r5,8(r3)
|
|
|
|
std r6,16(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r9,8(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r10,16(r4)
|
|
|
|
std r7,24(r3)
|
|
|
|
std r8,32(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r11,24(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r12,32(r4)
|
|
|
|
std r9,40(r3)
|
|
|
|
std r10,48(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r5,40(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r6,48(r4)
|
|
|
|
std r11,56(r3)
|
|
|
|
std r12,64(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r7,56(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r8,64(r4)
|
|
|
|
std r5,72(r3)
|
|
|
|
std r6,80(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r9,72(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r10,80(r4)
|
|
|
|
std r7,88(r3)
|
|
|
|
std r8,96(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r11,88(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r12,96(r4)
|
|
|
|
std r9,104(r3)
|
|
|
|
std r10,112(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r5,104(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r6,112(r4)
|
|
|
|
std r11,120(r3)
|
|
|
|
stdu r12,128(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r7,120(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ldu r8,128(r4)
|
2005-09-26 13:04:21 +07:00
|
|
|
bdnz 1b
|
2008-08-22 11:39:00 +07:00
|
|
|
|
|
|
|
std r5,8(r3)
|
|
|
|
std r6,16(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r9,8(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r10,16(r4)
|
|
|
|
std r7,24(r3)
|
|
|
|
std r8,32(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r11,24(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r12,32(r4)
|
|
|
|
std r9,40(r3)
|
|
|
|
std r10,48(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r5,40(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r6,48(r4)
|
|
|
|
std r11,56(r3)
|
|
|
|
std r12,64(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r7,56(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r8,64(r4)
|
|
|
|
std r5,72(r3)
|
|
|
|
std r6,80(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r9,72(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r10,80(r4)
|
|
|
|
std r7,88(r3)
|
|
|
|
std r8,96(r3)
|
2010-02-11 01:07:54 +07:00
|
|
|
ld r11,88(r4)
|
2008-08-22 11:39:00 +07:00
|
|
|
ld r12,96(r4)
|
|
|
|
std r9,104(r3)
|
|
|
|
std r10,112(r3)
|
|
|
|
std r11,120(r3)
|
|
|
|
std r12,128(r3)
|
2005-09-26 13:04:21 +07:00
|
|
|
blr
|
2016-01-14 11:33:46 +07:00
|
|
|
EXPORT_SYMBOL(copy_page)
|