diff mbox

[Xen-devel,v3,15/17] xen: arm64: optimised clear_page

Message ID 1396455795.4211.7.camel@kazak.uk.xensource.com
State Accepted
Commit 856468788a62a37060d9b9d67c24de8fd1a4c24d
Headers show

Commit Message

Ian Campbell April 2, 2014, 4:23 p.m. UTC
> > +#ifdef CONFIG_ARM_32
> > +#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
> > +#else
> > +extern void clear_page(void *to);
> > +#endif
> > +
> 
> I would prefer if you move the defined in arm{32,64}/page.h.

Ack. Just resending this one:

------------<8------------------


From f679cbc3a191c43aa303b4e74f241e8755430ba0 Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Wed, 19 Mar 2014 17:19:56 +0000
Subject: [PATCH] xen: arm64: optimised clear_page

Taken from Linux v3.14-rc7.

The clear_page header now needs to be within the !__ASSEMBLY__

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
---
v3: Move prototypes to arm{32,64}/page.h
---
 xen/arch/arm/arm64/lib/Makefile     |    1 +
 xen/arch/arm/arm64/lib/clear_page.S |   36 +++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/arm32/page.h    |    2 ++
 xen/include/asm-arm/arm64/page.h    |    2 ++
 xen/include/asm-arm/page.h          |    2 --
 5 files changed, 41 insertions(+), 2 deletions(-)
 create mode 100644 xen/arch/arm/arm64/lib/clear_page.S

Comments

Julien Grall April 2, 2014, 4:26 p.m. UTC | #1
On 04/02/2014 05:23 PM, Ian Campbell wrote:
> 
>>> +#ifdef CONFIG_ARM_32
>>> +#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
>>> +#else
>>> +extern void clear_page(void *to);
>>> +#endif
>>> +
>>
>> I would prefer if you move the defined in arm{32,64}/page.h.
> 
> Ack. Just resending this one:

Thanks!

> ------------<8------------------
> 
> 
> From f679cbc3a191c43aa303b4e74f241e8755430ba0 Mon Sep 17 00:00:00 2001
> From: Ian Campbell <ian.campbell@citrix.com>
> Date: Wed, 19 Mar 2014 17:19:56 +0000
> Subject: [PATCH] xen: arm64: optimised clear_page
> 
> Taken from Linux v3.14-rc7.
> 
> The clear_page header now needs to be within the !__ASSEMBLY__
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> Acked-by: Tim Deegan <tim@xen.org>
Acked-by: Julien Grall <julien.grall@linaro.org>
> ---
> v3: Move prototypes to arm{32,64}/page.h
> ---
>  xen/arch/arm/arm64/lib/Makefile     |    1 +
>  xen/arch/arm/arm64/lib/clear_page.S |   36 +++++++++++++++++++++++++++++++++++
>  xen/include/asm-arm/arm32/page.h    |    2 ++
>  xen/include/asm-arm/arm64/page.h    |    2 ++
>  xen/include/asm-arm/page.h          |    2 --
>  5 files changed, 41 insertions(+), 2 deletions(-)
>  create mode 100644 xen/arch/arm/arm64/lib/clear_page.S
> 
> diff --git a/xen/arch/arm/arm64/lib/Makefile b/xen/arch/arm/arm64/lib/Makefile
> index 9f3b236..b895afa 100644
> --- a/xen/arch/arm/arm64/lib/Makefile
> +++ b/xen/arch/arm/arm64/lib/Makefile
> @@ -1,3 +1,4 @@
>  obj-y += memcpy.o memmove.o memset.o memchr.o
> +obj-y += clear_page.o
>  obj-y += bitops.o find_next_bit.o
>  obj-y += strchr.o strrchr.o
> diff --git a/xen/arch/arm/arm64/lib/clear_page.S b/xen/arch/arm/arm64/lib/clear_page.S
> new file mode 100644
> index 0000000..8d5cadb
> --- /dev/null
> +++ b/xen/arch/arm/arm64/lib/clear_page.S
> @@ -0,0 +1,36 @@
> +/*
> + * Copyright (C) 2012 ARM Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <xen/config.h>
> +
> +/*
> + * Clear page @dest
> + *
> + * Parameters:
> + *	x0 - dest
> + */
> +ENTRY(clear_page)
> +	mrs	x1, dczid_el0
> +	and	w1, w1, #0xf
> +	mov	x2, #4
> +	lsl	x1, x2, x1
> +
> +1:	dc	zva, x0
> +	add	x0, x0, x1
> +	tst	x0, #(PAGE_SIZE - 1)
> +	b.ne	1b
> +	ret
> +ENDPROC(clear_page)
> diff --git a/xen/include/asm-arm/arm32/page.h b/xen/include/asm-arm/arm32/page.h
> index 191a108..a4c1a1a 100644
> --- a/xen/include/asm-arm/arm32/page.h
> +++ b/xen/include/asm-arm/arm32/page.h
> @@ -111,6 +111,8 @@ static inline uint64_t gva_to_ipa_par(vaddr_t va)
>      return par;
>  }
>  
> +#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
> +
>  #endif /* __ASSEMBLY__ */
>  
>  #endif /* __ARM_ARM32_PAGE_H__ */
> diff --git a/xen/include/asm-arm/arm64/page.h b/xen/include/asm-arm/arm64/page.h
> index 20b4c5a..91e1914 100644
> --- a/xen/include/asm-arm/arm64/page.h
> +++ b/xen/include/asm-arm/arm64/page.h
> @@ -105,6 +105,8 @@ static inline uint64_t gva_to_ipa_par(vaddr_t va)
>      return par;
>  }
>  
> +extern void clear_page(void *to);
> +
>  #endif /* __ASSEMBLY__ */
>  
>  #endif /* __ARM_ARM64_PAGE_H__ */
> diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h
> index d18ec2a..c77ba85 100644
> --- a/xen/include/asm-arm/page.h
> +++ b/xen/include/asm-arm/page.h
> @@ -382,8 +382,6 @@ static inline int gva_to_ipa(vaddr_t va, paddr_t *paddr)
>  #define third_table_offset(va)  TABLE_OFFSET(third_linear_offset(va))
>  #define zeroeth_table_offset(va)  TABLE_OFFSET(zeroeth_linear_offset(va))
>  
> -#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
> -
>  #define PAGE_ALIGN(x) (((x) + PAGE_SIZE - 1) & PAGE_MASK)
>  
>  #endif /* __ARM_PAGE_H__ */
>
diff mbox

Patch

diff --git a/xen/arch/arm/arm64/lib/Makefile b/xen/arch/arm/arm64/lib/Makefile
index 9f3b236..b895afa 100644
--- a/xen/arch/arm/arm64/lib/Makefile
+++ b/xen/arch/arm/arm64/lib/Makefile
@@ -1,3 +1,4 @@ 
 obj-y += memcpy.o memmove.o memset.o memchr.o
+obj-y += clear_page.o
 obj-y += bitops.o find_next_bit.o
 obj-y += strchr.o strrchr.o
diff --git a/xen/arch/arm/arm64/lib/clear_page.S b/xen/arch/arm/arm64/lib/clear_page.S
new file mode 100644
index 0000000..8d5cadb
--- /dev/null
+++ b/xen/arch/arm/arm64/lib/clear_page.S
@@ -0,0 +1,36 @@ 
+/*
+ * Copyright (C) 2012 ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <xen/config.h>
+
+/*
+ * Clear page @dest
+ *
+ * Parameters:
+ *	x0 - dest
+ */
+ENTRY(clear_page)
+	mrs	x1, dczid_el0
+	and	w1, w1, #0xf
+	mov	x2, #4
+	lsl	x1, x2, x1
+
+1:	dc	zva, x0
+	add	x0, x0, x1
+	tst	x0, #(PAGE_SIZE - 1)
+	b.ne	1b
+	ret
+ENDPROC(clear_page)
diff --git a/xen/include/asm-arm/arm32/page.h b/xen/include/asm-arm/arm32/page.h
index 191a108..a4c1a1a 100644
--- a/xen/include/asm-arm/arm32/page.h
+++ b/xen/include/asm-arm/arm32/page.h
@@ -111,6 +111,8 @@  static inline uint64_t gva_to_ipa_par(vaddr_t va)
     return par;
 }
 
+#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __ARM_ARM32_PAGE_H__ */
diff --git a/xen/include/asm-arm/arm64/page.h b/xen/include/asm-arm/arm64/page.h
index 20b4c5a..91e1914 100644
--- a/xen/include/asm-arm/arm64/page.h
+++ b/xen/include/asm-arm/arm64/page.h
@@ -105,6 +105,8 @@  static inline uint64_t gva_to_ipa_par(vaddr_t va)
     return par;
 }
 
+extern void clear_page(void *to);
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __ARM_ARM64_PAGE_H__ */
diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h
index d18ec2a..c77ba85 100644
--- a/xen/include/asm-arm/page.h
+++ b/xen/include/asm-arm/page.h
@@ -382,8 +382,6 @@  static inline int gva_to_ipa(vaddr_t va, paddr_t *paddr)
 #define third_table_offset(va)  TABLE_OFFSET(third_linear_offset(va))
 #define zeroeth_table_offset(va)  TABLE_OFFSET(zeroeth_linear_offset(va))
 
-#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
-
 #define PAGE_ALIGN(x) (((x) + PAGE_SIZE - 1) & PAGE_MASK)
 
 #endif /* __ARM_PAGE_H__ */