From: monstr@monstr.eu
To: linux-kernel@vger.kernel.org
Cc: john.williams@petalogix.com, Michal Simek <monstr@monstr.eu>
Subject: [PATCH 10/30] microblaze_mmu_v1: Context handling - mmu_context.c/h
Date: Mon, 27 Apr 2009 10:31:59 +0200 [thread overview]
Message-ID: <1240821139-7247-11-git-send-email-monstr@monstr.eu> (raw)
In-Reply-To: <1240821139-7247-10-git-send-email-monstr@monstr.eu>
From: Michal Simek <monstr@monstr.eu>
Signed-off-by: Michal Simek <monstr@monstr.eu>
---
arch/microblaze/include/asm/mmu_context.h | 134 +++++++++++++++++++++++++++++
arch/microblaze/mm/mmu_context.c | 70 +++++++++++++++
2 files changed, 204 insertions(+), 0 deletions(-)
create mode 100644 arch/microblaze/mm/mmu_context.c
diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h
index 150ca01..2f49649 100644
--- a/arch/microblaze/include/asm/mmu_context.h
+++ b/arch/microblaze/include/asm/mmu_context.h
@@ -1,4 +1,6 @@
/*
+ * Copyright (C) 2008-2009 Michal Simek <monstr@monstr.eu>
+ * Copyright (C) 2008-2009 PetaLogix
* Copyright (C) 2006 Atmark Techno, Inc.
*
* This file is subject to the terms and conditions of the GNU General Public
@@ -9,6 +11,7 @@
#ifndef _ASM_MICROBLAZE_MMU_CONTEXT_H
#define _ASM_MICROBLAZE_MMU_CONTEXT_H
+# ifndef CONFIG_MMU
# define init_new_context(tsk, mm) ({ 0; })
# define enter_lazy_tlb(mm, tsk) do {} while (0)
@@ -18,4 +21,135 @@
# define switch_mm(prev, next, tsk) do {} while (0)
# define activate_mm(prev, next) do {} while (0)
+# else /* CONFIG_MMU */
+
+# include <asm/atomic.h>
+# include <asm/bitops.h>
+# include <asm/mmu.h>
+# include <asm-generic/mm_hooks.h>
+
+# ifdef __KERNEL__
+/*
+ * This function defines the mapping from contexts to VSIDs (virtual
+ * segment IDs). We use a skew on both the context and the high 4 bits
+ * of the 32-bit virtual address (the "effective segment ID") in order
+ * to spread out the entries in the MMU hash table. Note, if this
+ * function is changed then arch/ppc/mm/hashtable.S will have to be
+ * changed to correspond.
+ */
+# define CTX_TO_VSID(ctx, va) (((ctx) * (897 * 16) + ((va) >> 28) * 0x111) \
+ & 0xffffff)
+
+/*
+ MicroBlaze has 256 contexts, so we can just rotate through these
+ as a way of "switching" contexts. If the TID of the TLB is zero,
+ the PID/TID comparison is disabled, so we can use a TID of zero
+ to represent all kernel pages as shared among all contexts.
+ */
+
+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
+{
+}
+
+# define NO_CONTEXT 256
+# define LAST_CONTEXT 255
+# define FIRST_CONTEXT 1
+
+/*
+ * Set the current MMU context.
+ * This is done byloading up the segment registers for the user part of the
+ * address space.
+ *
+ * Since the PGD is immediately available, it is much faster to simply
+ * pass this along as a second parameter, which is required for 8xx and
+ * can be used for debugging on all processors (if you happen to have
+ * an Abatron).
+ */
+extern void set_context(mm_context_t context, pgd_t *pgd);
+
+/*
+ * Bitmap of contexts in use.
+ * The size of this bitmap is LAST_CONTEXT + 1 bits.
+ */
+extern unsigned long context_map[];
+
+/*
+ * This caches the next context number that we expect to be free.
+ * Its use is an optimization only, we can't rely on this context
+ * number to be free, but it usually will be.
+ */
+extern mm_context_t next_mmu_context;
+
+/*
+ * Since we don't have sufficient contexts to give one to every task
+ * that could be in the system, we need to be able to steal contexts.
+ * These variables support that.
+ */
+extern atomic_t nr_free_contexts;
+extern struct mm_struct *context_mm[LAST_CONTEXT+1];
+extern void steal_context(void);
+
+/*
+ * Get a new mmu context for the address space described by `mm'.
+ */
+static inline void get_mmu_context(struct mm_struct *mm)
+{
+ mm_context_t ctx;
+
+ if (mm->context != NO_CONTEXT)
+ return;
+ while (atomic_dec_if_positive(&nr_free_contexts) < 0)
+ steal_context();
+ ctx = next_mmu_context;
+ while (test_and_set_bit(ctx, context_map)) {
+ ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
+ if (ctx > LAST_CONTEXT)
+ ctx = 0;
+ }
+ next_mmu_context = (ctx + 1) & LAST_CONTEXT;
+ mm->context = ctx;
+ context_mm[ctx] = mm;
+}
+
+/*
+ * Set up the context for a new address space.
+ */
+# define init_new_context(tsk, mm) (((mm)->context = NO_CONTEXT), 0)
+
+/*
+ * We're finished using the context for an address space.
+ */
+static inline void destroy_context(struct mm_struct *mm)
+{
+ if (mm->context != NO_CONTEXT) {
+ clear_bit(mm->context, context_map);
+ mm->context = NO_CONTEXT;
+ atomic_inc(&nr_free_contexts);
+ }
+}
+
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
+ struct task_struct *tsk)
+{
+ tsk->thread.pgdir = next->pgd;
+ get_mmu_context(next);
+ set_context(next->context, next->pgd);
+}
+
+/*
+ * After we have set current->mm to a new value, this activates
+ * the context for the new mm so we see the new mappings.
+ */
+static inline void activate_mm(struct mm_struct *active_mm,
+ struct mm_struct *mm)
+{
+ current->thread.pgdir = mm->pgd;
+ get_mmu_context(mm);
+ set_context(mm->context, mm->pgd);
+}
+
+extern void mmu_context_init(void);
+
+# endif /* __KERNEL__ */
+# endif /* CONFIG_MMU */
#endif /* _ASM_MICROBLAZE_MMU_CONTEXT_H */
diff --git a/arch/microblaze/mm/mmu_context.c b/arch/microblaze/mm/mmu_context.c
new file mode 100644
index 0000000..26ff82f
--- /dev/null
+++ b/arch/microblaze/mm/mmu_context.c
@@ -0,0 +1,70 @@
+/*
+ * This file contains the routines for handling the MMU.
+ *
+ * Copyright (C) 2007 Xilinx, Inc. All rights reserved.
+ *
+ * Derived from arch/ppc/mm/4xx_mmu.c:
+ * -- paulus
+ *
+ * Derived from arch/ppc/mm/init.c:
+ * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *
+ * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au)
+ * and Cort Dougan (PReP) (cort@cs.nmt.edu)
+ * Copyright (C) 1996 Paul Mackerras
+ * Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk).
+ *
+ * Derived from "arch/i386/mm/init.c"
+ * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ */
+
+#include <linux/mm.h>
+#include <linux/init.h>
+
+#include <asm/tlbflush.h>
+#include <asm/mmu_context.h>
+
+mm_context_t next_mmu_context;
+unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
+atomic_t nr_free_contexts;
+struct mm_struct *context_mm[LAST_CONTEXT+1];
+
+/*
+ * Initialize the context management stuff.
+ */
+void __init mmu_context_init(void)
+{
+ /*
+ * The use of context zero is reserved for the kernel.
+ * This code assumes FIRST_CONTEXT < 32.
+ */
+ context_map[0] = (1 << FIRST_CONTEXT) - 1;
+ next_mmu_context = FIRST_CONTEXT;
+ atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1);
+}
+
+/*
+ * Steal a context from a task that has one at the moment.
+ *
+ * This isn't an LRU system, it just frees up each context in
+ * turn (sort-of pseudo-random replacement :). This would be the
+ * place to implement an LRU scheme if anyone were motivated to do it.
+ */
+void steal_context(void)
+{
+ struct mm_struct *mm;
+
+ /* free up context `next_mmu_context' */
+ /* if we shouldn't free context 0, don't... */
+ if (next_mmu_context < FIRST_CONTEXT)
+ next_mmu_context = FIRST_CONTEXT;
+ mm = context_mm[next_mmu_context];
+ flush_tlb_mm(mm);
+ destroy_context(mm);
+}
--
1.5.5.1
next prev parent reply other threads:[~2009-04-27 9:55 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-27 8:31 Microblaze MMU patches monstr
2009-04-27 8:31 ` [PATCH 01/30] microblaze_mmu_v1: Makefiles monstr
2009-04-27 8:31 ` [PATCH 02/30] microblaze_mmu_v1: Kconfig update monstr
2009-04-27 8:31 ` [PATCH 03/30] microblaze_mmu_v1: Add mmu_defconfig monstr
2009-04-27 8:31 ` [PATCH 04/30] microblaze_mmu_v1: MMU update for startup code monstr
2009-04-27 8:31 ` [PATCH 05/30] microblaze_mmu_v1: Alocate TLB for early console monstr
2009-04-27 8:31 ` [PATCH 06/30] microblaze_mmu_v1: TLB low level code monstr
2009-04-27 8:31 ` [PATCH 07/30] microblaze_mmu_v1: MMU initialization monstr
2009-04-27 8:31 ` [PATCH 08/30] microblaze_mmu_v1: mmu.h update monstr
2009-04-27 8:31 ` [PATCH 09/30] microblaze_mmu_v1: Page fault handling high level - fault.c monstr
2009-04-27 8:31 ` monstr [this message]
2009-04-27 8:32 ` [PATCH 11/30] microblaze_mmu_v1: Page table - ioremap - pgtable.c/h, section update monstr
2009-04-27 8:32 ` [PATCH 12/30] microblaze_mmu_v1: io.h MMU update monstr
2009-04-27 8:32 ` [PATCH 13/30] microblaze_mmu_v1: pgalloc.h and page.h monstr
2009-04-27 8:32 ` [PATCH 14/30] microblaze_mmu_v1: Update process creation for MMU monstr
2009-04-27 8:32 ` [PATCH 15/30] microblaze_mmu_v1: Update tlb.h and tlbflush.h monstr
2009-04-27 8:32 ` [PATCH 16/30] microblaze_mmu_v1: MMU asm offset update monstr
2009-04-27 8:32 ` [PATCH 17/30] microblaze_mmu_v1: Add CURRENT_TASK for entry.S monstr
2009-04-27 8:32 ` [PATCH 18/30] microblaze_mmu_v1: entry.S, entry.h monstr
2009-04-27 8:32 ` [PATCH 19/30] microblaze_mmu_v1: Update exception handling - MMU exception monstr
2009-04-27 8:32 ` [PATCH 20/30] microblaze_mmu_v1: uaccess MMU update monstr
2009-04-27 8:32 ` [PATCH 21/30] microblaze_mmu_v1: Add MMU related exceptions handling monstr
2009-04-27 8:32 ` [PATCH 22/30] microblaze_mmu_v1: Update linker script for MMU monstr
2009-04-27 8:32 ` [PATCH 23/30] microblaze_mmu_v1: Enable fork syscall for MMU and add fork as vfork for noMMU monstr
2009-04-27 8:32 ` [PATCH 24/30] microblaze_mmu_v1: Traps MMU update monstr
2009-04-27 8:32 ` [PATCH 25/30] microblaze_mmu_v1: Update signal returning address monstr
2009-04-27 8:32 ` [PATCH 26/30] microblaze_mmu_v1: Update cacheflush.h monstr
2009-04-27 8:32 ` [PATCH 27/30] microblaze_mmu_v1: Update dma.h for MMU monstr
2009-04-27 8:32 ` [PATCH 28/30] microblaze_mmu_v1: Elf update monstr
2009-04-27 8:32 ` [PATCH 29/30] microblaze_mmu_v1: stat.h MMU update monstr
2009-04-27 8:32 ` [PATCH 30/30] microblaze_mmu_v1: fcntl.h " monstr
2009-04-27 9:59 ` Christoph Hellwig
2009-04-27 10:05 ` John Williams
2009-04-27 10:56 ` Michal Simek
2009-04-27 9:58 ` [PATCH 29/30] microblaze_mmu_v1: stat.h " Christoph Hellwig
2009-04-27 10:35 ` Michal Simek
2009-04-27 11:30 ` Christoph Hellwig
2009-04-27 11:43 ` Michal Simek
2009-04-27 11:57 ` Arnd Bergmann
2009-04-27 12:15 ` Sam Ravnborg
2009-04-27 12:37 ` Arnd Bergmann
2009-04-27 12:48 ` Sam Ravnborg
2009-04-27 12:55 ` Arnd Bergmann
2009-04-27 12:31 ` Michal Simek
2009-04-27 12:42 ` Arnd Bergmann
2009-04-27 12:44 ` Michal Simek
2009-04-27 12:47 ` Arnd Bergmann
2009-04-27 12:48 ` Michal Simek
2009-04-30 13:53 ` Arnd Bergmann
2009-04-30 14:10 ` Michal Simek
2009-04-30 14:40 ` Arnd Bergmann
2009-04-30 14:51 ` Michal Simek
2009-04-27 12:53 ` Arnd Bergmann
2009-04-27 13:03 ` Michal Simek
2009-04-27 13:13 ` Arnd Bergmann
2009-04-27 11:43 ` [PATCH 23/30] microblaze_mmu_v1: Enable fork syscall for MMU and add fork as vfork for noMMU John Williams
2009-04-29 10:16 ` Michal Simek
2009-04-29 11:31 ` Arnd Bergmann
2009-04-29 11:27 ` [PATCH 22/30] microblaze_mmu_v1: Update linker script for MMU Arnd Bergmann
2009-04-29 11:39 ` Michal Simek
2009-04-29 5:54 ` [PATCH 21/30] microblaze_mmu_v1: Add MMU related exceptions handling Andrew Morton
2009-04-29 9:36 ` Michal Simek
2009-04-29 5:53 ` [PATCH 20/30] microblaze_mmu_v1: uaccess MMU update Andrew Morton
2009-04-29 10:12 ` Michal Simek
2009-04-29 10:58 ` Arnd Bergmann
2009-04-29 15:19 ` Michal Simek
2009-04-29 15:35 ` Arnd Bergmann
2009-04-29 15:43 ` Michal Simek
2009-04-29 15:55 ` Arnd Bergmann
2009-04-29 11:26 ` Arnd Bergmann
2009-04-27 10:55 ` [PATCH 10/30] microblaze_mmu_v1: Context handling - mmu_context.c/h Arnd Bergmann
2009-04-27 11:18 ` Geert Uytterhoeven
2009-04-29 5:46 ` [PATCH 09/30] microblaze_mmu_v1: Page fault handling high level - fault.c Andrew Morton
2009-04-29 9:30 ` Michal Simek
2009-04-29 5:44 ` [PATCH 08/30] microblaze_mmu_v1: mmu.h update Andrew Morton
2009-04-29 9:28 ` Michal Simek
2009-04-29 5:42 ` [PATCH 07/30] microblaze_mmu_v1: MMU initialization Andrew Morton
2009-04-29 7:02 ` Michal Simek
2009-04-29 8:42 ` Michal Simek
2009-04-27 10:50 ` [PATCH 01/30] microblaze_mmu_v1: Makefiles Arnd Bergmann
2009-04-27 10:54 ` Michal Simek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1240821139-7247-11-git-send-email-monstr@monstr.eu \
--to=monstr@monstr.eu \
--cc=john.williams@petalogix.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®