Port-m68k archive

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

Re: MVME177 panic: pmap_enter_ptpage (PR #45915 on 6.x)



Andrew Gillham wrote:

> In trying to boot NetBSD/mvme68k 6.x on an MVME177 (50MHz 68060)
> board,

Wow. I'm really glad that we still have a real mvme68k user!

> I'm running into the panic mentioned in PR45915.  Increasing
> the number of kernel PT pages was the fix for most ports, but there is
> a comment about mvme68k:
> 
> "This panic message is m68k pmap specific and some ports might still have
> the issue. At least mvme68k updates physmem after bootstrap PT page 
> allocation."
> 
> I haven't really looked into this beyond reading the PR.  Does anyone
> know if this is an easy fix?  My MVME177 has 64MB of memory if that
> makes a difference.

nptpage is calculated using physmem in mvme68k/pmap_bootrap.c:
http://nxr.netbsd.org/xref/src/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c?r=1.51#138
but physmem is updated later:
http://nxr.netbsd.org/xref/src/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c?r=1.51#411

With a quick glance, probably we can move physmem (and other)
calculations to the top of the function. (patch attached)

> Meanwhile I've booted 5.2 and it seems to work well.  Also 'netboot'
> from 6.x fails with an illegal instruction message, while the 5.x
> version booted fine.

Probably it's my fault on switching to MI libsa changes after 5.0:
http://mail-index.netbsd.org/source-changes/2011/01/02/msg016539.html

All BUGs binaries are converted to raw binaries by objdump -O binary,
so I guess we explicitly have to link SRT0.o (which has an entry point)
first. (patch attached too)

I've also put compiled binaries:
ftp://ftp.NetBSD.org/pub/NetBSD/misc/tsutsui/mvme68k/netbsd-6_20130917/

Thanks,

---
Index: mvme68k/pmap_bootstrap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c,v
retrieving revision 1.51
diff -u -p -r1.51 pmap_bootstrap.c
--- mvme68k/pmap_bootstrap.c    10 Feb 2012 06:28:39 -0000      1.51
+++ mvme68k/pmap_bootstrap.c    17 Sep 2013 13:07:21 -0000
@@ -100,6 +100,42 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f
 #endif
 
        /*
+        * Initialize the mem_clusters[] array for the crash dump
+        * code.  While we're at it, compute the total amount of
+        * physical memory in the system.
+        */
+       for (i = 0; i < VM_PHYSSEG_MAX; i++) {
+               if (RELOC(phys_seg_list[i].ps_start, paddr_t) ==
+                   RELOC(phys_seg_list[i].ps_end, paddr_t)) {
+                       /*
+                        * No more memory.
+                        */
+                       break;
+               }
+
+               /*
+                * Make sure these are properly rounded.
+                */
+               RELOC(phys_seg_list[i].ps_start, paddr_t) =
+                   m68k_round_page(RELOC(phys_seg_list[i].ps_start,
+                                         paddr_t));
+               RELOC(phys_seg_list[i].ps_end, paddr_t) =
+                   m68k_trunc_page(RELOC(phys_seg_list[i].ps_end,
+                                         paddr_t));
+
+               size = RELOC(phys_seg_list[i].ps_end, paddr_t) -
+                   RELOC(phys_seg_list[i].ps_start, paddr_t);
+
+               RELOC(mem_clusters[i].start, u_quad_t) =
+                   RELOC(phys_seg_list[i].ps_start, paddr_t);
+               RELOC(mem_clusters[i].size, u_quad_t) = size;
+
+               RELOC(physmem, int) += size >> PGSHIFT;
+
+               RELOC(mem_cluster_cnt, int) += 1;
+       }
+
+       /*
         * Calculate important physical addresses:
         *
         *      lwp0upa         lwp0 u-area             UPAGES pages
@@ -409,42 +445,6 @@ pmap_bootstrap(paddr_t nextpa, paddr_t f
        RELOC(lwp0uarea, vaddr_t) = lwp0upa - firstpa;
 
        /*
-        * Initialize the mem_clusters[] array for the crash dump
-        * code.  While we're at it, compute the total amount of
-        * physical memory in the system.
-        */
-       for (i = 0; i < VM_PHYSSEG_MAX; i++) {
-               if (RELOC(phys_seg_list[i].ps_start, paddr_t) ==
-                   RELOC(phys_seg_list[i].ps_end, paddr_t)) {
-                       /*
-                        * No more memory.
-                        */
-                       break;
-               }
-
-               /*
-                * Make sure these are properly rounded.
-                */
-               RELOC(phys_seg_list[i].ps_start, paddr_t) =
-                   m68k_round_page(RELOC(phys_seg_list[i].ps_start,
-                                         paddr_t));
-               RELOC(phys_seg_list[i].ps_end, paddr_t) =
-                   m68k_trunc_page(RELOC(phys_seg_list[i].ps_end,
-                                         paddr_t));
-
-               size = RELOC(phys_seg_list[i].ps_end, paddr_t) -
-                   RELOC(phys_seg_list[i].ps_start, paddr_t);
-
-               RELOC(mem_clusters[i].start, u_quad_t) =
-                   RELOC(phys_seg_list[i].ps_start, paddr_t);
-               RELOC(mem_clusters[i].size, u_quad_t) = size;
-
-               RELOC(physmem, int) += size >> PGSHIFT;
-
-               RELOC(mem_cluster_cnt, int) += 1;
-       }
-
-       /*
         * Scoot the start of available on-board RAM forward to
         * account for:
         *

---
Index: stand/Makefile.booters
===================================================================
RCS file: /cvsroot/src/sys/arch/mvme68k/stand/Makefile.booters,v
retrieving revision 1.22
diff -u -p -r1.22 Makefile.booters
--- stand/Makefile.booters      22 Jan 2011 19:19:20 -0000      1.22
+++ stand/Makefile.booters      17 Sep 2013 13:07:21 -0000
@@ -59,6 +59,8 @@ LIBSA_DIR!=   cd ${LIB_SA_DIR} && ${PRINTO
 LIBSA=         ${LIBSA_DIR}/lib/sa/libsa.a
 LIBKERN=       ${LIBSA_DIR}/lib/kern/libkern.a
 
+SRTOBJ?= ${LIBSA_DIR}/SRT0.o
+
 LIB_BUG_DIR=   ${.CURDIR}/../libbug
 LIBBUG_DIR!=   cd ${LIB_BUG_DIR} && ${PRINTOBJDIR}
 LIBBUG=${LIBBUG_DIR}/libbug.a
Index: stand/libsa/Makefile
===================================================================
RCS file: /cvsroot/src/sys/arch/mvme68k/stand/libsa/Makefile,v
retrieving revision 1.33
diff -u -p -r1.33 Makefile
--- stand/libsa/Makefile        2 Jan 2011 05:30:12 -0000       1.33
+++ stand/libsa/Makefile        17 Sep 2013 13:07:21 -0000
@@ -31,7 +31,9 @@ LIBKERN= ${KERNLIB}
 
 LIBS= ${LIBSA} ${LIBKERN}
 
-all realall: ${LIBS}
+CLEANFILES+= SRT0.o
+
+all realall: ${LIBS} SRT0.o
 
 cleandir distclean: .WAIT cleanlibdir
 
Index: stand/libsa/Makefile.inc
===================================================================
RCS file: /cvsroot/src/sys/arch/mvme68k/stand/libsa/Makefile.inc,v
retrieving revision 1.5
diff -u -p -r1.5 Makefile.inc
--- stand/libsa/Makefile.inc    2 Jan 2011 05:30:12 -0000       1.5
+++ stand/libsa/Makefile.inc    17 Sep 2013 13:07:21 -0000
@@ -9,8 +9,7 @@ SRC_sa=   dev_net.c
 
 SRC_mvme= exec_mvme.c
 
-SRC_here= SRT0.S \
-         bugdev.c \
+SRC_here= bugdev.c \
          chiptotime.c clock.c \
          parse_args.c
 

---
Izumi Tsutsui


Home | Main Index | Thread Index | Old Index