patch-2.1.126 linux/include/asm-mips/mmu_context.h
Next file: linux/include/asm-mips/offset.h
Previous file: linux/include/asm-mips/mipsregs.h
Back to the patch index
Back to the overall index
- Lines: 117
- Date:
Tue Oct 20 13:52:53 1998
- Orig file:
v2.1.125/linux/include/asm-mips/mmu_context.h
- Orig date:
Thu Aug 6 14:06:33 1998
diff -u --recursive --new-file v2.1.125/linux/include/asm-mips/mmu_context.h linux/include/asm-mips/mmu_context.h
@@ -1,4 +1,4 @@
-/* $Id: mmu_context.h,v 1.4 1998/05/07 00:40:04 ralf Exp $
+/* $Id: mmu_context.h,v 1.3 1998/10/16 19:22:54 ralf Exp $
*
* Switch a MMU context.
*
@@ -11,29 +11,61 @@
#ifndef __ASM_MIPS_MMU_CONTEXT_H
#define __ASM_MIPS_MMU_CONTEXT_H
-#define MAX_ASID 255
-
+/* Fuck. The f-word is here so you can grep for it :-) */
extern unsigned long asid_cache;
-#define ASID_VERSION_SHIFT 16
-#define ASID_VERSION_MASK ((~0UL) << ASID_VERSION_SHIFT)
-#define ASID_FIRST_VERSION (1UL << ASID_VERSION_SHIFT)
-
-extern inline void get_new_mmu_context(struct mm_struct *mm, unsigned long asid)
-{
- /* check if it's legal.. */
- if ((asid & ~ASID_VERSION_MASK) > MAX_ASID) {
- /* start a new version, invalidate all old asid's */
- flush_tlb_all();
- asid = (asid & ASID_VERSION_MASK) + ASID_FIRST_VERSION;
- if (!asid)
+/* I patch, therefore I am ... */
+#define ASID_INC(asid) \
+ ({ unsigned long __asid = asid; \
+ __asm__("1:\taddiu\t%0,0\t\t\t\t# patched\n\t" \
+ ".section\t__asid_inc,\"a\"\n\t" \
+ ".word\t1b\n\t" \
+ ".previous" \
+ :"=r" (__asid) \
+ :"0" (__asid)); \
+ __asid; })
+#define ASID_MASK(asid) \
+ ({ unsigned long __asid = asid; \
+ __asm__("1:\tandi\t%0,%1,0\t\t\t# patched\n\t" \
+ ".section\t__asid_mask,\"a\"\n\t" \
+ ".word\t1b\n\t" \
+ ".previous" \
+ :"=r" (__asid) \
+ :"r" (__asid)); \
+ __asid; })
+#define ASID_VERSION_MASK \
+ ({ unsigned long __asid; \
+ __asm__("1:\tli\t%0,0\t\t\t\t# patched\n\t" \
+ ".section\t__asid_version_mask,\"a\"\n\t" \
+ ".word\t1b\n\t" \
+ ".previous" \
+ :"=r" (__asid)); \
+ __asid; })
+#define ASID_FIRST_VERSION \
+ ({ unsigned long __asid = asid; \
+ __asm__("1:\tli\t%0,0\t\t\t\t# patched\n\t" \
+ ".section\t__asid_first_version,\"a\"\n\t" \
+ ".word\t1b\n\t" \
+ ".previous" \
+ :"=r" (__asid)); \
+ __asid; })
+
+#define ASID_FIRST_VERSION_R3000 0x1000
+#define ASID_FIRST_VERSION_R4000 0x100
+
+extern inline void
+get_new_mmu_context(struct mm_struct *mm, unsigned long asid)
+{
+ if (!ASID_MASK((asid = ASID_INC(asid)))) {
+ flush_tlb_all(); /* start new asid cycle */
+ if (!asid) /* fix version if needed */
asid = ASID_FIRST_VERSION;
}
- asid_cache = asid + 1;
- mm->context = asid; /* full version + asid */
+ mm->context = asid_cache = asid;
}
-extern inline void get_mmu_context(struct task_struct *p)
+extern inline void
+get_mmu_context(struct task_struct *p)
{
struct mm_struct *mm = p->mm;
@@ -72,5 +104,31 @@
get_mmu_context(tsk);
set_entryhi(tsk->mm->context);
}
+
+extern void __asid_setup(unsigned int inc, unsigned int mask,
+ unsigned int version_mask, unsigned int first_version);
+
+extern inline void r3000_asid_setup(void)
+{
+ __asid_setup(0x40, 0xfc0, 0xf000, ASID_FIRST_VERSION_R3000);
+}
+
+extern inline void r6000_asid_setup(void)
+{
+ panic("r6000_asid_setup: implement me"); /* No idea ... */
+}
+
+extern inline void tfp_asid_setup(void)
+{
+ panic("tfp_asid_setup: implement me"); /* No idea ... */
+}
+
+extern inline void r4xx0_asid_setup(void)
+{
+ __asid_setup(1, 0xff, 0xff00, ASID_FIRST_VERSION_R4000);
+}
+
+/* R10000 has the same ASID mechanism as the R4000. */
+#define andes_asid_setup r4xx0_asid_setup
#endif /* __ASM_MIPS_MMU_CONTEXT_H */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov