From: Pantelis Antoniou <panto@intracom.gr>
To: Dan Malek <dan@embeddededge.com>,
Tom Rini <trini@kernel.crashing.org>,
Paul Mackerras <paulus@samba.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Linuxppc-Embedded <linuxppc-embedded@lists.linuxppc.org>
Subject: [PATCH] fix TLB handling for 8xx on linuxppc-2.5
Date: Mon, 31 May 2004 17:36:31 +0300 [thread overview]
Message-ID: <40BB42EF.10805@intracom.gr> (raw)
[-- Attachment #1: Type: text/plain, Size: 258 bytes --]
Hi
The following patch fixes the problems of 8xx with the latest
linuxppc-2.5 tree.
With it user space progresses properly.
Lots of gray areas remain and MM handling for 8xx is
mighty inefficient IMO.
Dan could you please take a look?
Regards
Pantelis
[-- Attachment #2: 8xx-mm-fix.patch --]
[-- Type: text/x-patch, Size: 5053 bytes --]
diff -Nur --exclude=RCS --exclude=CVS --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet linuxppc_2.5/arch/ppc/kernel/head_8xx.S linuxppc_2.5-intracom/arch/ppc/kernel/head_8xx.S
--- linuxppc_2.5/arch/ppc/kernel/head_8xx.S Mon May 31 10:52:29 2004
+++ linuxppc_2.5-intracom/arch/ppc/kernel/head_8xx.S Mon May 31 17:24:05 2004
@@ -157,6 +157,24 @@
SAVE_2GPRS(7, r11)
/*
+if ((val & (_PAGE_HWWRITE | _PAGE_RW | _PAGE_DIRTY)) == (_PAGE_RW | _PAGE_DIRTY))
+ val |= _PAGE_HWWRITE;
+else if ((val & (_PAGE_HWWRITE | _PAGE_RW | _PAGE_DIRTY)) == _PAGE_HWWRITE)
+ val &= ~_PAGE_HWWRITE;
+*/
+
+#define LAZY_DTLB_FIX \
+ rlwinm r12,r10,0,23,25; \
+ cmpwi r12,0xc0; \
+ bne+ 0f; \
+ ori r10,r10,0x100; \
+ b 1f; \
+ 0: cmpwi r12,0x100; \
+ bne+ 1f; \
+ rlwinm r10,r10,0,24,22; \
+ 1:
+
+/*
* Note: code which follows this uses cr0.eq (set if from kernel),
* r11, r12 (SRR0), and r9 (SRR1).
*
@@ -348,7 +366,6 @@
mtspr MD_TWC, r11 /* Load pte table base address */
mfspr r11, MD_TWC /* ....and get the pte address */
lwz r10, 0(r11) /* Get the pte */
-
ori r10, r10, _PAGE_ACCESSED
stw r10, 0(r11)
@@ -398,6 +415,7 @@
mfcr r10
stw r10, 0(r0)
stw r11, 4(r0)
+ stw r12, 16(r0)
mfspr r10, M_TWB /* Get level 1 table entry address */
/* If we are faulting a kernel address, we have to use the
@@ -440,6 +458,7 @@
mtspr MD_TWC, r11
mfspr r11, MD_TWC /* get the pte address again */
+ LAZY_DTLB_FIX
ori r10, r10, _PAGE_ACCESSED
stw r10, 0(r11)
@@ -463,6 +482,7 @@
lwz r11, 0(r0)
mtcr r11
lwz r11, 4(r0)
+ lwz r12, 16(r0)
#ifdef CONFIG_8xx_CPU6
lwz r3, 8(r0)
#endif
@@ -472,6 +492,7 @@
lwz r11, 0(r0)
mtcr r11
lwz r11, 4(r0)
+ lwz r12, 16(r0)
#ifdef CONFIG_8xx_CPU6
lwz r3, 8(r0)
#endif
@@ -505,6 +526,7 @@
mfcr r10
stw r10, 0(r0)
stw r11, 4(r0)
+ stw r12, 16(r0)
/* First, make sure this was a store operation.
*/
@@ -574,6 +596,7 @@
*/
ori r10, r10, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE
mfspr r11, MD_TWC /* Get pte address again */
+ LAZY_DTLB_FIX
stw r10, 0(r11) /* and update pte in table */
/* The Linux PTE won't go exactly into the MMU TLB.
@@ -596,6 +619,7 @@
lwz r11, 0(r0)
mtcr r11
lwz r11, 4(r0)
+ lwz r12, 16(r0)
#ifdef CONFIG_8xx_CPU6
lwz r3, 8(r0)
#endif
@@ -605,6 +629,7 @@
lwz r11, 0(r0)
mtcr r11
lwz r11, 4(r0)
+ lwz r12, 16(r0)
#ifdef CONFIG_8xx_CPU6
lwz r3, 8(r0)
#endif
diff -Nur --exclude=RCS --exclude=CVS --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet linuxppc_2.5/arch/ppc/kernel/misc.S linuxppc_2.5-intracom/arch/ppc/kernel/misc.S
--- linuxppc_2.5/arch/ppc/kernel/misc.S Mon May 31 10:52:30 2004
+++ linuxppc_2.5-intracom/arch/ppc/kernel/misc.S Mon May 31 17:24:05 2004
@@ -565,10 +565,12 @@
* flush_icache_range(unsigned long start, unsigned long stop)
*/
_GLOBAL(flush_icache_range)
+#if !defined(CONFIG_8xx)
mfspr r5,PVR
rlwinm r5,r5,16,16,31
cmpi 0,r5,1
beqlr /* for 601, do nothing */
+#endif
li r5,L1_CACHE_LINE_SIZE-1
andc r3,r3,r5
subf r4,r3,r4
@@ -683,10 +685,12 @@
* void __flush_dcache_icache(void *page)
*/
_GLOBAL(__flush_dcache_icache)
+#if !defined(CONFIG_8xx)
mfspr r5,PVR
rlwinm r5,r5,16,16,31
cmpi 0,r5,1
beqlr /* for 601, do nothing */
+#endif
rlwinm r3,r3,0,0,19 /* Get page base address */
li r4,4096/L1_CACHE_LINE_SIZE /* Number of lines in a page */
mtctr r4
@@ -712,10 +716,12 @@
* void __flush_dcache_icache_phys(unsigned long physaddr)
*/
_GLOBAL(__flush_dcache_icache_phys)
+#if !defined(CONFIG_8xx)
mfspr r5,PVR
rlwinm r5,r5,16,16,31
cmpi 0,r5,1
beqlr /* for 601, do nothing */
+#endif
mfmsr r10
rlwinm r0,r10,0,28,26 /* clear DR */
mtmsr r0
diff -Nur --exclude=RCS --exclude=CVS --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet linuxppc_2.5/arch/ppc/mm/init.c linuxppc_2.5-intracom/arch/ppc/mm/init.c
--- linuxppc_2.5/arch/ppc/mm/init.c Mon May 31 10:52:30 2004
+++ linuxppc_2.5-intracom/arch/ppc/mm/init.c Mon May 31 17:24:05 2004
@@ -605,7 +605,6 @@
kunmap(page);
}
-#ifndef update_mmu_cache
/*
* This is called at the end of handling a user page fault, when the
* fault has been handled by updating a PTE in the linux page tables.
@@ -641,6 +640,7 @@
if (!pmd_none(*pmd))
add_hash_page(mm->context, address, pmd_val(*pmd));
}
+#else
+ __tlbia();
#endif
}
-#endif
diff -Nur --exclude=RCS --exclude=CVS --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet linuxppc_2.5/include/asm-ppc/tlbflush.h linuxppc_2.5-intracom/include/asm-ppc/tlbflush.h
--- linuxppc_2.5/include/asm-ppc/tlbflush.h Mon May 31 10:53:26 2004
+++ linuxppc_2.5-intracom/include/asm-ppc/tlbflush.h Mon May 31 17:24:16 2004
@@ -50,7 +50,8 @@
static inline void flush_tlb_kernel_range(unsigned long start,
unsigned long end)
{ __tlbia(); }
-#define update_mmu_cache(vma, addr, pte) do { } while(0)
+/* #define update_mmu_cache(vma, addr, pte) do { } while(0) */
+extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
#else /* 6xx, 7xx, 7xxx cpus */
struct mm_struct;
next reply other threads:[~2004-05-31 14:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-31 14:36 Pantelis Antoniou [this message]
2004-05-31 22:00 ` [PATCH] fix TLB handling for 8xx on linuxppc-2.5 Benjamin Herrenschmidt
2004-05-31 22:05 ` Benjamin Herrenschmidt
2004-06-01 6:10 ` Pantelis Antoniou
2004-06-02 15:13 ` Dan Malek
[not found] <20040601070415.E13F6C109F@atlas.denx.de>
2004-06-01 7:04 ` Pantelis Antoniou
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=40BB42EF.10805@intracom.gr \
--to=panto@intracom.gr \
--cc=benh@kernel.crashing.org \
--cc=dan@embeddededge.com \
--cc=linuxppc-embedded@lists.linuxppc.org \
--cc=paulus@samba.org \
--cc=trini@kernel.crashing.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;
as well as URLs for NNTP newsgroup(s).