memclear: non-temporal memory clean (arm64)
Change-Id: I8f80ff20e98bc01088450282e1790c27c67c16eb
This commit is contained in:
committed by
Masamichi Takagi
parent
201f5ce500
commit
e056cb799f
@@ -10,4 +10,13 @@ extern void *__inline_memcpy(void *to, const void *from, size_t t);
|
|||||||
|
|
||||||
extern void *__inline_memset(void *s, unsigned long c, size_t count);
|
extern void *__inline_memset(void *s, unsigned long c, size_t count);
|
||||||
|
|
||||||
|
#define ARCH_MEMCLEAR
|
||||||
|
|
||||||
|
extern void __memclear(void *addr, unsigned long len, void *tmp);
|
||||||
|
inline static void memclear(void *addr, unsigned long len)
|
||||||
|
{
|
||||||
|
uint64_t q0q1[4];
|
||||||
|
__memclear(addr, len, (void *)&q0q1);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __HEADER_ARM64_COMMON_ARCH_TIMER_H */
|
#endif /* __HEADER_ARM64_COMMON_ARCH_TIMER_H */
|
||||||
|
|||||||
@@ -218,3 +218,41 @@ ENTRY(__inline_memset)
|
|||||||
ret
|
ret
|
||||||
ENDPIPROC(__inline_memset)
|
ENDPIPROC(__inline_memset)
|
||||||
ENDPROC(____inline_memset)
|
ENDPROC(____inline_memset)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-temporal vector memory clear
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* x0 - buf (assumed to be aligned to page size)
|
||||||
|
* x1 - n (assumed to be at least page size)
|
||||||
|
*/
|
||||||
|
ENTRY(__memclear)
|
||||||
|
stp q0, q1, [x2] /* Preserve two 128 bit vector regs */
|
||||||
|
eor v0.16B, v0.16B, v0.16B
|
||||||
|
eor v1.16B, v1.16B, v1.16B
|
||||||
|
1:
|
||||||
|
stnp q0, q1, [x0, #32 * 0]
|
||||||
|
stnp q0, q1, [x0, #32 * 1]
|
||||||
|
stnp q0, q1, [x0, #32 * 2]
|
||||||
|
stnp q0, q1, [x0, #32 * 3]
|
||||||
|
stnp q0, q1, [x0, #32 * 4]
|
||||||
|
stnp q0, q1, [x0, #32 * 5]
|
||||||
|
stnp q0, q1, [x0, #32 * 6]
|
||||||
|
stnp q0, q1, [x0, #32 * 7]
|
||||||
|
stnp q0, q1, [x0, #32 * 8]
|
||||||
|
stnp q0, q1, [x0, #32 * 9]
|
||||||
|
stnp q0, q1, [x0, #32 * 10]
|
||||||
|
stnp q0, q1, [x0, #32 * 11]
|
||||||
|
stnp q0, q1, [x0, #32 * 12]
|
||||||
|
stnp q0, q1, [x0, #32 * 13]
|
||||||
|
stnp q0, q1, [x0, #32 * 14]
|
||||||
|
stnp q0, q1, [x0, #32 * 15]
|
||||||
|
add x0, x0, #512
|
||||||
|
subs x1, x1, #512
|
||||||
|
cmp x1, #0
|
||||||
|
b.ne 1b
|
||||||
|
|
||||||
|
ldp q0, q1, [x2] /* Restore vector regs */
|
||||||
|
ret
|
||||||
|
ENDPROC(__memclear)
|
||||||
|
|||||||
@@ -1466,17 +1466,14 @@ int add_process_memory_range(struct process_vm *vm,
|
|||||||
/* Clear content! */
|
/* Clear content! */
|
||||||
if (phys != NOPHYS && !(flag & (VR_REMOTE | VR_DEMAND_PAGING))
|
if (phys != NOPHYS && !(flag & (VR_REMOTE | VR_DEMAND_PAGING))
|
||||||
&& ((flag & VR_PROT_MASK) != VR_PROT_NONE)) {
|
&& ((flag & VR_PROT_MASK) != VR_PROT_NONE)) {
|
||||||
#if 1
|
|
||||||
memset((void *)phys_to_virt(phys), 0, end - start);
|
if (!zero_at_free) {
|
||||||
|
#ifdef ARCH_MEMCLEAR
|
||||||
|
memclear((void *)phys_to_virt(phys), end - start);
|
||||||
#else
|
#else
|
||||||
if (end - start < (1024*1024)) {
|
memset((void *)phys_to_virt(phys), 0, end - start);
|
||||||
memset((void*)phys_to_virt(phys), 0, end - start);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memset_smp(&cpu_local_var(current)->cpu_set,
|
|
||||||
(void *)phys_to_virt(phys), 0, end - start);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return range object if requested */
|
/* Return range object if requested */
|
||||||
|
|||||||
Reference in New Issue
Block a user