From: SUGIOKA T. <su...@it...> - 2001-07-13 04:33:00
|
At 11:18 01/07/13 +0900, Masahiro Abe <m-...@aa...> wrote: >Some more reports. >- calling sequence until reboot is > copy_user_page(arch/sh/mm/cache.c) > +-update_mmu_cache(arch/sh/mm/fault.c) > +-copy_page : #defined as memcpy(arch/sh/lib/memcpy.S) > Last two functions are called at line 588 and 589 of cache.c, > respectively. >- most of the time, exception occurs at line 86 of memcpy.S, which is > mov.l r1,@-r0 > at this time, @r0=0xc0002ffc >- TEA has 0xc0002ffc at the time of exception/reboot. So, this is > multiple data TLB hit exception. >- 0xc0002ffc is within the area that p3_cache_init allocated with > remap_area_pages. This area is from 0xc0000000 to 0xc0003fff. Does this patch change your situation ? Index: arch/sh/mm/cache.c =================================================================== RCS file: /cvsroot/linuxsh/kernel/arch/sh/mm/cache.c,v retrieving revision 1.41 diff -u -r1.41 cache.c --- arch/sh/mm/cache.c 2001/07/12 06:27:37 1.41 +++ arch/sh/mm/cache.c 2001/07/13 04:21:45 @@ -18,6 +18,7 @@ #include <asm/cache.h> #include <asm/io.h> #include <asm/uaccess.h> +#include <asm/mmu_context.h> #if defined(__sh3__) #define CCR 0xffffffec /* Address of Cache Control Register */ @@ -519,6 +520,8 @@ /* Page is 4K, OC size is 16K, there are four lines. */ #define CACHE_ALIAS 0x00003000 +extern void __flush_tlb_page(unsigned long asid, unsigned long page); + /* * clear_user_page * @to: P1 address @@ -548,6 +551,7 @@ save_and_cli(flags); entry = mk_pte_phys(phys_addr, pgprot); set_pte(pte, entry); + __flush_tlb_page(get_asid(), p3_addr&PAGE_MASK); update_mmu_cache(NULL, p3_addr, entry); clear_page((void *)p3_addr); restore_flags(flags); @@ -585,6 +589,7 @@ save_and_cli(flags); entry = mk_pte_phys(phys_addr, pgprot); set_pte(pte, entry); + __flush_tlb_page(get_asid(), p3_addr&PAGE_MASK); update_mmu_cache(NULL, p3_addr, entry); copy_page((void *)p3_addr, from); restore_flags(flags); Index: arch/sh/mm/fault.c =================================================================== RCS file: /cvsroot/linuxsh/kernel/arch/sh/mm/fault.c,v retrieving revision 1.40 diff -u -r1.40 fault.c --- arch/sh/mm/fault.c 2001/07/06 13:11:32 1.40 +++ arch/sh/mm/fault.c 2001/07/13 04:21:46 @@ -28,7 +28,7 @@ #include <asm/mmu_context.h> extern void die(const char *,struct pt_regs *,long); -static void __flush_tlb_page(unsigned long asid, unsigned long page); +void __flush_tlb_page(unsigned long asid, unsigned long page); /* * Ugly, ugly, but the goto's result in better assembly.. @@ -322,7 +322,7 @@ restore_flags(flags); } -static void __flush_tlb_page(unsigned long asid, unsigned long page) +void __flush_tlb_page(unsigned long asid, unsigned long page) { unsigned long addr, data; ---- SUGIOKA Toshinobu |