Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Jul 2009 20:28:10 -0700 (PDT)
From:      Neelkanth Natu <neelnatu@yahoo.com>
To:        "M. Warner Losh" <imp@bsdimp.com>
Cc:        freebsd-mips@freebsd.org
Subject:   Re: Machine Check exception during bootup
Message-ID:  <646809.32414.qm@web34401.mail.mud.yahoo.com>

next in thread | raw e-mail | index | archive | help

Hi Warner,

Thanks for reviewing the diff.

I have made the changes you suggested in the review. The new diffs are
at the end of this email.

- No need to have redefine PAGE_SIZE in tlb.S. I am now generating
  this macro via genassym.c

- Remove the offset 0x0fff0000 used when invalidating tlb entries. I have
  tested this on MALTA as well as SWARM and it seems to work fine.

best
Neel

==== //depot/user/neelnatu/freebsd_sibyte/src/sys/mips/mips/genassym.c#1 - /amd/svlusr02.eng.netapp.com/vol/home24/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/genassym.c ====
93a94
> ASSYM(PAGE_SHIFT, PAGE_SHIFT);
==== //depot/user/neelnatu/freebsd_sibyte/src/sys/mips/mips/tlb.S#1 - /amd/svlusr02.eng.netapp.com/vol/home24/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/tlb.S ====
84d83
< #define PAGE_SHIFT 34
91d89
< #define PAGE_SHIFT 2
235d232
< 	li	v0, MIPS_KSEG3_START + 0x0fff0000 # invalid address
238d234
< 	_MTC0	v0, COP_0_TLB_HI		# Mark entry high as invalid
241a238,247
> 
> 	#
> 	# Load invalid entry, each TLB entry should have it's own bogus 
> 	# address calculated by following expression:
> 	# MIPS_KSEG0_START + 2 * i * PAGE_SIZE;
> 	# One bogus value for every TLB entry might cause MCHECK exception
> 	#
> 	sll	t3, t1, PAGE_SHIFT + 1
> 	li	v0, MIPS_KSEG0_START		# invalid address
> 	addu	v0, t3
248c254
< 	_MTC0	t0, COP_0_TLB_HI		# Restore the PID
---
> 	_MTC0	v0, COP_0_TLB_HI		# Mark entry high as invalid
250c256
< 	addu	t0, t0, 8 * 1024
---
> 	addu	v0, v0, 8 * 1024
292c298
< 	li	t1, MIPS_KSEG0_START + 0x0fff0000
---
> 	li	t1, MIPS_KSEG0_START
297c303
< 	# MIPS_KSEG0_START + 0x0fff0000 + 2 * i * PAGE_SIZE;
---
> 	# MIPS_KSEG0_START + 2 * i * PAGE_SIZE;
476c482,492
< 	li	v0, MIPS_KSEG0_START + 0x0fff0000	# invalid address
---
> 
> 	#
> 	# Load invalid entry, each TLB entry should have it's own bogus 
> 	# address calculated by following expression:
> 	# MIPS_KSEG0_START + 2 * i * PAGE_SIZE;
> 	# One bogus value for every TLB entry might cause MCHECK exception
> 	#
> 	sll	t3, t1, PAGE_SHIFT + 1
> 	li	v0, MIPS_KSEG0_START		# invalid address
> 	addu	v0, t3
> 
==== //depot/user/neelnatu/freebsd_sibyte/src/sys/mips/mips/swtch.S#1 - /amd/svlusr02.eng.netapp.com/vol/home24/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/swtch.S ====
84d83
< #define PAGE_SHIFT 34
91d89
< #define PAGE_SHIFT 2
364c362
< 	li	t1, MIPS_KSEG0_START + 0x0fff0000	# invalidate tlb entry
---
> 	li	t1, MIPS_KSEG0_START		# invalidate tlb entry


--- On Wed, 7/1/09, M. Warner Losh <imp@bsdimp.com> wrote:

> From: M. Warner Losh <imp@bsdimp.com>
> Subject: Re: Machine Check exception during bootup
> To: neelnatu@yahoo.com
> Cc: freebsd-mips@freebsd.org
> Date: Wednesday, July 1, 2009, 7:39 AM
> In message: <14584.70267.qm@web34403.mail.mud.yahoo.com>
>             Neelkanth Natu
> <neelnatu@yahoo.com>
> writes:
> :
> r02.eng.netapp.com/vol/home24/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/tlb.S
> ====
> : @@ -81,14 +81,14 @@
> :  #define    _MFC0   
> dmfc0
> :  #define    _MTC0   
> dmtc0
> :  #define WIRED_SHIFT 34
> : -#define PAGE_SHIFT 34
> : +#define PAGE_SHIFT 12
> :  #else
> :  #define _SLL    sll
> :  #define    _SRL   
> srl
> :  #define    _MFC0   
> mfc0
> :  #define    _MTC0   
> mtc0
> :  #define WIRED_SHIFT 2
> : -#define PAGE_SHIFT 2
> : +#define PAGE_SHIFT 12
> :  #endif
> 
> These are wrong.  PAGE_SHIFT is supposed to be the bit
> position in the
> TLB, not the size of the page for multiplication.  At
> least in thoery,
> but looking at the manual doesn't even bear that out...
> 
> However, it appears it isn't used that way at all in the
> rest of the
> code.  This means we should move it outside of the
> #ifdef, since it
> has nothing to do with ISA we're compiling for.
> 
> :      .set   
> noreorder       
>     # Noreorder is default style!
> :  #if defined(ISA_MIPS32)
> : @@ -232,22 +232,30 @@
> :      mtc0    zero,
> COP_0_STATUS_REG        #
> Disable interrupts
> :      ITLBNOPFIX
> :      mfc0    t1,
> COP_0_TLB_WIRED
> : -    li    v0,
> MIPS_KSEG3_START + 0x0fff0000 # invalid address
> :      _MFC0    t0,
> COP_0_TLB_HI        # Save the
> PID
> :  
> : -    _MTC0    v0,
> COP_0_TLB_HI        # Mark
> entry high as invalid
> :      _MTC0    zero,
> COP_0_TLB_LO0        # Zero
> out low entry0.
> :      _MTC0    zero,
> COP_0_TLB_LO1        # Zero
> out low entry1.
> :      mtc0    zero,
> COP_0_TLB_PG_MASK     # Zero out mask entry.
> : +
> : +    #
> : +    # Load invalid entry, each TLB entry
> should have it's own bogus 
> : +    # address calculated by following
> expression:
> : +    # MIPS_KSEG0_START + 0x0fff0000 + 2 *
> i * PAGE_SIZE;
> : +    # One bogus value for every TLB entry
> might cause MCHECK exception
> : +    #
> : +    sll    t3, t1,
> PAGE_SHIFT + 1
> : +    li    v0,
> MIPS_KSEG0_START + 0x0fff0000    # invalid
> address
> : +    addu    v0, t3
> 
> I'll note that NetBSD doesn't add the 0x0fff0000 on the end
> here.  I
> don't understand why we do it, even though I likely added
> this to the
> port.  Does it work without it?
> 
> Warner
> 


      



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?646809.32414.qm>