Skip to content

Commit 5249f3c

Browse files
glevandAlex Shi
authored andcommitted
arm64: Add new asm macro copy_page
Kexec and hibernate need to copy pages of memory, but may not have all of the kernel mapped, and are unable to call copy_page(). Add a simplistic copy_page() macro, that can be inlined in these situations. lib/copy_page.S provides a bigger better version, but uses more registers. Signed-off-by: Geoff Levand <geoff@infradead.org> [Changed asm label to 9998, added commit message] Signed-off-by: James Morse <james.morse@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> (cherry picked from commit 5003dbde45961dd7ab3d8a09ab9ad8bcb604db40) Signed-off-by: Alex Shi <alex.shi@linaro.org>
1 parent 5a13294 commit 5249f3c

1 file changed

Lines changed: 19 additions & 0 deletions

File tree

arch/arm64/include/asm/assembler.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#define __ASM_ASSEMBLER_H
2525

2626
#include <asm/asm-offsets.h>
27+
#include <asm/page.h>
2728
#include <asm/pgtable-hwdef.h>
2829
#include <asm/ptrace.h>
2930
#include <asm/thread_info.h>
@@ -273,6 +274,24 @@ lr .req x30 // link register
273274
9000:
274275
.endm
275276

277+
/*
278+
* copy_page - copy src to dest using temp registers t1-t8
279+
*/
280+
.macro copy_page dest:req src:req t1:req t2:req t3:req t4:req t5:req t6:req t7:req t8:req
281+
9998: ldp \t1, \t2, [\src]
282+
ldp \t3, \t4, [\src, #16]
283+
ldp \t5, \t6, [\src, #32]
284+
ldp \t7, \t8, [\src, #48]
285+
add \src, \src, #64
286+
stnp \t1, \t2, [\dest]
287+
stnp \t3, \t4, [\dest, #16]
288+
stnp \t5, \t6, [\dest, #32]
289+
stnp \t7, \t8, [\dest, #48]
290+
add \dest, \dest, #64
291+
tst \src, #(PAGE_SIZE - 1)
292+
b.ne 9998b
293+
.endm
294+
276295
/*
277296
* Annotate a function as position independent, i.e., safe to be called before
278297
* the kernel virtual mapping is activated.

0 commit comments

Comments
 (0)