[PATCH 2/4] include/asm-x86/paravirt.h: x86_64 mmu operations

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <linux-kernel@...>
Cc: <akpm@...>, <glommer@...>, <tglx@...>, <mingo@...>, <ehabkost@...>, <jeremy@...>, <avi@...>, <anthony@...>, <virtualization@...>, <rusty@...>, <ak@...>, <chrisw@...>, <rostedt@...>, <hpa@...>, <zach@...>, <roland@...>, <mtosatti@...>
Date: Monday, January 21, 2008 - 5:48 pm

Add .set_pgd field to pv_mmu_ops.

Implement pud_val(), __pud(), set_pgd(), pud_clear(), pgd_clear().

pud_clear() and pgd_clear() are implemented simply using set_pud()
and set_pmd(). They don't have a field at pv_mmu_ops.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/asm-x86/paravirt.h |   55 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h
index 62cecb7..9f9ff57 100644
--- a/include/asm-x86/paravirt.h
+++ b/include/asm-x86/paravirt.h
@@ -259,6 +259,8 @@ struct pv_mmu_ops {
 #if PAGETABLE_LEVELS == 4
 	pudval_t (*pud_val)(pud_t);
 	pud_t (*make_pud)(pudval_t pud);
+
+	void (*set_pgd)(pgd_t *pudp, pgd_t pgdval);
 #endif	/* PAGETABLE_LEVELS == 4 */
 #endif	/* PAGETABLE_LEVELS >= 3 */
 
@@ -1065,6 +1067,59 @@ static inline void set_pud(pud_t *pudp, pud_t pud)
 		PVOP_VCALL2(pv_mmu_ops.set_pud, pudp,
 			    val);
 }
+#if PAGETABLE_LEVELS == 4
+static inline pud_t __pud(pudval_t val)
+{
+	pudval_t ret;
+
+	if (sizeof(pudval_t) > sizeof(long))
+		ret = PVOP_CALL2(pudval_t, pv_mmu_ops.make_pud,
+				 val, (u64)val >> 32);
+	else
+		ret = PVOP_CALL1(pudval_t, pv_mmu_ops.make_pud,
+				 val);
+
+	return (pud_t) { ret };
+}
+
+static inline pudval_t pud_val(pud_t pud)
+{
+	pudval_t ret;
+
+	if (sizeof(pudval_t) > sizeof(long))
+		ret =  PVOP_CALL2(pudval_t, pv_mmu_ops.pud_val,
+				  pud.pud, (u64)pud.pud >> 32);
+	else
+		ret =  PVOP_CALL1(pudval_t, pv_mmu_ops.pud_val,
+				  pud.pud);
+
+	return ret;
+}
+
+static inline void set_pgd(pgd_t *pgdp, pgd_t pgd)
+{
+	pgdval_t val = native_pgd_val(pgd);
+
+	if (sizeof(pgdval_t) > sizeof(long))
+		PVOP_VCALL3(pv_mmu_ops.set_pgd, pgdp,
+			    val, (u64)val >> 32);
+	else
+		PVOP_VCALL2(pv_mmu_ops.set_pgd, pgdp,
+			    val);
+}
+
+static inline void pgd_clear(pgd_t *pgdp)
+{
+	set_pgd(pgdp, __pgd(0));
+}
+
+static inline void pud_clear(pud_t *pudp)
+{
+	set_pud(pudp, __pud(0));
+}
+
+#endif	/* PAGETABLE_LEVELS == 4 */
+
 #endif	/* PAGETABLE_LEVELS >= 3 */
 
 #ifdef CONFIG_X86_PAE
-- 
1.5.3.4

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/4] paravirt_ops-64 compile fixes, Eduardo Habkost, (Mon Jan 21, 5:48 pm)
Re: [PATCH 0/4] paravirt_ops-64 compile fixes, Ingo Molnar, (Tue Jan 22, 8:02 am)
Re: [PATCH 0/4] paravirt_ops-64 compile fixes, Eduardo Pereira Habkost, (Tue Jan 22, 8:34 am)
Re: [PATCH 0/4] paravirt_ops-64 compile fixes, Jeremy Fitzhardinge, (Tue Jan 22, 1:55 pm)
Re: [PATCH 0/4] paravirt_ops-64 compile fixes, Ingo Molnar, (Tue Jan 22, 3:47 pm)
Re: [PATCH 0/4] paravirt_ops-64 compile fixes, Jeremy Fitzhardinge, (Tue Jan 22, 4:05 pm)
[PATCH 1/2] Allow enabling PARAVIRT without any guest implem..., Eduardo Pereira Habkost, (Tue Jan 22, 2:50 pm)
[PATCH 2/2] Remove depends on X86_32 from PARAVIRT &amp; PAR..., Eduardo Pereira Habkost, (Tue Jan 22, 2:52 pm)
[PATCH 1/4] Add missing semicolon to SWAPGS macro, Eduardo Habkost, (Mon Jan 21, 5:48 pm)
[PATCH 2/4] include/asm-x86/paravirt.h: x86_64 mmu operations, Eduardo Habkost, (Mon Jan 21, 5:48 pm)