NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-i386/38289 (a possible problem in x86 pmap_update)



> Synopsis: a possible problem in x86 pmap_update
> 
> State-Changed-From-To: open->feedback
> State-Changed-By: ad%NetBSD.org@localhost
> State-Changed-When: Sat, 29 Mar 2008 14:17:43 +0000
> State-Changed-Why:
> pmap_deactivate() does the equivalent of pmap_update(). It's kind of ugly,
> but it's an existing 'hook' in from the context switch code. Do you see
> another problem?

hm, it seems enough.  i haven't noticed the call in pmap_deactivate.

i used to have the following debug code in my local tree while ago.
sometimes it dropped into Debugger().  do you have any idea how it can happen?

YAMAMOTO Takashi


Index: i386/i386/genassym.cf
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/i386/genassym.cf,v
retrieving revision 1.61
diff -u -p -r1.61 genassym.cf
--- i386/i386/genassym.cf       11 Jan 2008 20:00:13 -0000      1.61
+++ i386/i386/genassym.cf       20 Jan 2008 22:02:19 -0000
@@ -309,6 +309,7 @@ define      TLBSTATE_VALID          TLBSTATE_VALID
 define TLBSTATE_LAZY           TLBSTATE_LAZY
 define TLBSTATE_STALE          TLBSTATE_STALE
 define CPU_INFO_TLB_EVCNT      offsetof(struct cpu_info, ci_tlb_evcnt)
+define CPU_INFO_NEED_TLBWAIT   offsetof(struct cpu_info, ci_need_tlbwait)
 define CPU_INFO_CURLWP         offsetof(struct cpu_info, ci_curlwp)
 define CPU_INFO_IDLELWP        offsetof(struct cpu_info, ci_data.cpu_idlelwp)
 define CPU_INFO_PMAP           offsetof(struct cpu_info, ci_pmap)
Index: i386/i386/locore.S
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/i386/locore.S,v
retrieving revision 1.64
diff -u -p -r1.64 locore.S
--- i386/i386/locore.S  20 Jan 2008 12:43:00 -0000      1.64
+++ i386/i386/locore.S  20 Jan 2008 22:02:19 -0000
@@ -941,6 +941,12 @@ ENTRY(cpu_switchto)
        testl   %edx,%edx
        jnz     4f
 
+       movl    CPUVAR(NEED_TLBWAIT),%eax
+       orl     %eax,%eax
+       jz,pn   .Ltlbwait_done
+       call    _C_LABEL(pmap_tlb_shootwait2)
+.Ltlbwait_done:
+
 #ifdef XEN
        pushl   %edi
        call    _C_LABEL(i386_switch_context)
Index: x86/x86/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/pmap.c,v
retrieving revision 1.40
diff -u -p -r1.40 pmap.c
--- x86/x86/pmap.c      20 Jan 2008 21:56:11 -0000      1.40
+++ x86/x86/pmap.c      20 Jan 2008 22:02:20 -0000
@@ -4364,6 +4388,15 @@ pmap_tlb_shootdown(struct pmap *pm, vadd
  * => must be called with preemption disabled
  */
 
+int shootwait2;
+void pmap_tlb_shootwait2(void);
+void
+pmap_tlb_shootwait2(void)
+{
+       shootwait2++;
+       Debugger();
+       pmap_tlb_shootwait();
+}
 void
 pmap_tlb_shootwait(void)
 {


Home | Main Index | Thread Index | Old Index