Machine Check exception during bootup
Neelkanth Natu
neelnatu at yahoo.com
Thu Jul 2 03:49:02 UTC 2009
Hi Warner,
Here is the unified diff:
==== //depot/user/neelnatu/freebsd_sibyte/src/sys/mips/mips/genassym.c#1 - /u/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/genassym.c ====
@@ -91,6 +91,7 @@
ASSYM(SIGF_UC, offsetof(struct sigframe, sf_uc));
ASSYM(SIGFPE, SIGFPE);
ASSYM(PGSHIFT, PGSHIFT);
+ASSYM(PAGE_SHIFT, PAGE_SHIFT);
ASSYM(NBPG, NBPG);
ASSYM(SEGSHIFT, SEGSHIFT);
ASSYM(NPTEPG, NPTEPG);
==== //depot/user/neelnatu/freebsd_sibyte/src/sys/mips/mips/tlb.S#1 - /u/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/tlb.S ====
@@ -81,14 +81,12 @@
#define _MFC0 dmfc0
#define _MTC0 dmtc0
#define WIRED_SHIFT 34
-#define PAGE_SHIFT 34
#else
#define _SLL sll
#define _SRL srl
#define _MFC0 mfc0
#define _MTC0 mtc0
#define WIRED_SHIFT 2
-#define PAGE_SHIFT 2
#endif
.set noreorder # Noreorder is default style!
#if defined(ISA_MIPS32)
@@ -232,22 +230,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 + 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
/*
* Align the starting value (t1) and the upper bound (a0).
*/
1:
mtc0 t1, COP_0_TLB_INDEX # Set the index register.
ITLBNOPFIX
- _MTC0 t0, COP_0_TLB_HI # Restore the PID
+ _MTC0 v0, COP_0_TLB_HI # Mark entry high as invalid
addu t1, t1, 1 # Increment index.
- addu t0, t0, 8 * 1024
+ addu v0, v0, 8 * 1024
MIPS_CPU_NOP_DELAY
tlbwi # Write the TLB entry.
MIPS_CPU_NOP_DELAY
@@ -289,12 +295,12 @@
tlbp # Probe for the entry.
MIPS_CPU_NOP_DELAY
mfc0 v0, COP_0_TLB_INDEX # See what we got
- li t1, MIPS_KSEG0_START + 0x0fff0000
+ li t1, MIPS_KSEG0_START
bltz v0, 1f # index < 0 => !found
nop
# 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;
+ # MIPS_KSEG0_START + 2 * i * PAGE_SIZE;
# One bogus value for every TLB entry might cause MCHECK exception
sll v0, PAGE_SHIFT + 1
addu t1, v0
@@ -473,7 +479,17 @@
_MFC0 t4, COP_0_TLB_HI # Get current PID
move t2, a0
mfc0 t1, COP_0_TLB_WIRED
- 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
+
mfc0 t3, COP_0_TLB_PG_MASK # save current pgMask
# do {} while (t1 < t2)
==== //depot/user/neelnatu/freebsd_sibyte/src/sys/mips/mips/swtch.S#1 - /u/neelnatu/p4/freebsd_sibyte/src/sys/mips/mips/swtch.S ====
@@ -81,14 +81,12 @@
#define _MFC0 dmfc0
#define _MTC0 dmtc0
#define WIRED_SHIFT 34
-#define PAGE_SHIFT 34
#else
#define _SLL sll
#define _SRL srl
#define _MFC0 mfc0
#define _MTC0 mtc0
#define WIRED_SHIFT 2
-#define PAGE_SHIFT 2
#endif
.set noreorder # Noreorder is default style!
#if defined(ISA_MIPS32)
@@ -361,7 +359,7 @@
nop
pgm:
bltz s0, entry0set
- li t1, MIPS_KSEG0_START + 0x0fff0000 # invalidate tlb entry
+ li t1, MIPS_KSEG0_START # invalidate tlb entry
sll s0, PAGE_SHIFT + 1
addu t1, s0
mtc0 t1, COP_0_TLB_HI
--- On Wed, 7/1/09, M. Warner Losh <imp at bsdimp.com> wrote:
> From: M. Warner Losh <imp at bsdimp.com>
> Subject: Re: Machine Check exception during bootup
> To: neelnatu at yahoo.com
> Cc: freebsd-mips at freebsd.org
> Date: Wednesday, July 1, 2009, 8:39 PM
> In message: <646809.32414.qm at web34401.mail.mud.yahoo.com>
> Neelkanth Natu
> <neelnatu at yahoo.com>
> writes:
> :
> : 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.
>
> Yes. You fixed the real bug, I think, when you moved
> from KSEG3 to
> KSEG0. I think there's still some things wrong with
> some of these
> routines. I'll send what I have, if I have something
> better, in a
> few. I think this is an excellent start.
>
> : 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
>
> Can you resend as a unified diff?
>
> Warner
>
>
> : 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 at bsdimp.com>
> wrote:
> :
> : > From: M. Warner Losh <imp at bsdimp.com>
> : > Subject: Re: Machine Check exception during bootup
> : > To: neelnatu at yahoo.com
> : > Cc: freebsd-mips at freebsd.org
> : > Date: Wednesday, July 1, 2009, 7:39 AM
> : > In message: <14584.70267.qm at web34403.mail.mud.yahoo.com>
> : >
> Neelkanth Natu
> : > <neelnatu at 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
> : >
> :
> :
> :
> :
> :
>
More information about the freebsd-mips
mailing list