summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/include/smp.h
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2002-05-20 16:30:47 +0000
committerjake <jake@FreeBSD.org>2002-05-20 16:30:47 +0000
commit21ef14008dc1909f2d550dbfa458459af8309a14 (patch)
treec75b635014cf1b383a72b992175309d588806e0f /sys/sparc64/include/smp.h
parent8505e0103326e229cfab395ad3119a58861138cd (diff)
downloadFreeBSD-src-21ef14008dc1909f2d550dbfa458459af8309a14.zip
FreeBSD-src-21ef14008dc1909f2d550dbfa458459af8309a14.tar.gz
Add SMP aware cache flushing functions, which operate on a single physical
page. These send IPIs if necessary in order to keep the caches in sync on all cpus.
Diffstat (limited to 'sys/sparc64/include/smp.h')
-rw-r--r--sys/sparc64/include/smp.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h
index 958fa0c..03fbc04 100644
--- a/sys/sparc64/include/smp.h
+++ b/sys/sparc64/include/smp.h
@@ -57,6 +57,11 @@ struct cpu_start_args {
struct tte csa_ttes[PCPU_PAGES];
};
+struct ipi_cache_args {
+ u_int ica_mask;
+ u_long ica_pa;
+};
+
struct ipi_tlb_args {
u_int ita_mask;
u_long ita_tlb;
@@ -80,6 +85,7 @@ void ipi_all_but_self(u_int ipi);
vm_offset_t mp_tramp_alloc(void);
+extern struct ipi_cache_args ipi_cache_args;
extern struct ipi_level_args ipi_level_args;
extern struct ipi_tlb_args ipi_tlb_args;
@@ -91,6 +97,8 @@ extern u_long mp_tramp_func;
extern void mp_startup(void);
+extern char tl_ipi_dcache_page_inval[];
+extern char tl_ipi_icache_page_inval[];
extern char tl_ipi_level[];
extern char tl_ipi_test[];
extern char tl_ipi_tlb_context_demap[];
@@ -99,6 +107,36 @@ extern char tl_ipi_tlb_range_demap[];
#ifdef SMP
+static __inline void *
+ipi_dcache_page_inval(vm_offset_t pa)
+{
+ struct ipi_cache_args *ica;
+
+ if (smp_cpus == 1)
+ return (NULL);
+ ica = &ipi_cache_args;
+ ica->ica_mask = all_cpus;
+ ica->ica_pa = pa;
+ cpu_ipi_selected(all_cpus, 0, (u_long)tl_ipi_dcache_page_inval,
+ (u_long)ica);
+ return (&ica->ica_mask);
+}
+
+static __inline void *
+ipi_icache_page_inval(vm_offset_t pa)
+{
+ struct ipi_cache_args *ica;
+
+ if (smp_cpus == 1)
+ return (NULL);
+ ica = &ipi_cache_args;
+ ica->ica_mask = all_cpus;
+ ica->ica_pa = pa;
+ cpu_ipi_selected(all_cpus, 0, (u_long)tl_ipi_icache_page_inval,
+ (u_long)ica);
+ return (&ica->ica_mask);
+}
+
#ifdef _MACHINE_PMAP_H_
static __inline void *
@@ -174,6 +212,18 @@ ipi_wait(void *cookie)
#else
static __inline void *
+ipi_dcache_page_inval(vm_offset_t pa)
+{
+ return (NULL);
+}
+
+static __inline void *
+ipi_icache_page_inval(vm_offset_t pa)
+{
+ return (NULL);
+}
+
+static __inline void *
ipi_tlb_context_demap(struct pmap *pm)
{
return (NULL);
OpenPOWER on IntegriCloud