|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 12/44] x86/fixmap: Temporarily add a percpu fixmap range
This is required to implement an opencoded version of map_domain_page() during
context switch. It must fit within l1_fixmap[], which imposes an upper limit
on the NR_CPUS.
The limit is currently 509, but will be lifted after later changes.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/include/asm-x86/fixmap.h | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/xen/include/asm-x86/fixmap.h b/xen/include/asm-x86/fixmap.h
index 89bf6cb..d46939a 100644
--- a/xen/include/asm-x86/fixmap.h
+++ b/xen/include/asm-x86/fixmap.h
@@ -27,6 +27,8 @@
#include <asm/msi.h>
#include <acpi/apei.h>
+#define NR_PERCPU_SLOTS 1
+
/*
* Here we define all the compile-time 'special' virtual
* addresses. The point is to have a constant address at
@@ -45,6 +47,8 @@ enum fixed_addresses {
FIX_COM_BEGIN,
FIX_COM_END,
FIX_EHCI_DBGP,
+ FIX_PERCPU_BEGIN,
+ FIX_PERCPU_END = FIX_PERCPU_BEGIN + (NR_CPUS - 1) * NR_PERCPU_SLOTS,
/* Everything else should go further down. */
FIX_APIC_BASE,
FIX_IO_APIC_BASE_0,
@@ -87,6 +91,32 @@ static inline unsigned long virt_to_fix(const unsigned long
vaddr)
return __virt_to_fix(vaddr);
}
+static inline void *percpu_fix_to_virt(unsigned int cpu, unsigned int slot)
+{
+ return (void *)fix_to_virt(FIX_PERCPU_BEGIN + (slot * NR_CPUS) + cpu);
+}
+
+static inline l1_pgentry_t *percpu_fixmap_l1e(unsigned int cpu, unsigned int
slot)
+{
+ BUILD_BUG_ON(FIX_PERCPU_END >= L1_PAGETABLE_ENTRIES);
+
+ return &l1_fixmap[l1_table_offset((unsigned long)percpu_fix_to_virt(cpu,
slot))];
+}
+
+static inline void set_percpu_fixmap(unsigned int cpu, unsigned int slot,
l1_pgentry_t l1e)
+{
+ l1_pgentry_t *pl1e = percpu_fixmap_l1e(cpu, slot);
+
+ if ( l1e_get_intpte(*pl1e) != l1e_get_intpte(l1e) )
+ {
+ *pl1e = l1e;
+
+ __asm__ __volatile__ ( "invlpg %0"
+ :: "m" (*(char *)percpu_fix_to_virt(cpu, slot))
+ : "memory" );
+ }
+}
+
#endif /* __ASSEMBLY__ */
#endif
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |