Source-Changes-HG archive

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

[src/trunk]: src/sys/arch - Simplify early initialisation so we do most of it...



details:   https://anonhg.NetBSD.org/src/rev/8577b3f7412d
branches:  trunk
changeset: 538533:8577b3f7412d
user:      scw <scw%NetBSD.org@localhost>
date:      Tue Oct 22 09:30:26 2002 +0000

description:
- Simplify early initialisation so we do most of it in C.
- Call allocsys() much earlier so we can use uvm_pageboot_alloc() to
  steal KSEG0 pages for system tables.

diffstat:

 sys/arch/evbsh5/evbsh5/locore.S  |  37 ++-----------------------
 sys/arch/evbsh5/evbsh5/machdep.c |  58 ++++++++++++++++++---------------------
 sys/arch/evbsh5/evbsh5/machdep.h |   7 +---
 sys/arch/sh5/include/pmap.h      |   4 ++-
 sys/arch/sh5/sh5/pmap.c          |   3 +-
 5 files changed, 36 insertions(+), 73 deletions(-)

diffs (219 lines):

diff -r 6fe9123035fe -r 8577b3f7412d sys/arch/evbsh5/evbsh5/locore.S
--- a/sys/arch/evbsh5/evbsh5/locore.S   Tue Oct 22 07:22:19 2002 +0000
+++ b/sys/arch/evbsh5/evbsh5/locore.S   Tue Oct 22 09:30:26 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: locore.S,v 1.8 2002/10/14 14:19:29 scw Exp $   */
+/*     $NetBSD: locore.S,v 1.9 2002/10/22 09:30:27 scw Exp $   */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -123,42 +123,11 @@
        /* Now safe to call C code */
 
        /*
-        * Do basic pre-pmap initialisation. This is mostly to do with
-        * sizing physical memory.
+        * Do basic initialisation, including setting up the pmap.
         *
-        * vaddr_t evbsh5_memory_init(vaddr_t endkernel, struct mem_region *mr);
+        * void evbsh5_init(vaddr_t endkernel)
         */
        LEA(_C_LABEL(end), r2)
-       LEA(Lmem_regions, r3)
-       LEAF(_C_LABEL(evbsh5_memory_init), r0)
-       ptabs/l r0, tr0
-       blink   tr0, r18
-
-       /*
-        * Bootstrap the pmap:
-        *
-        * void pmap_bootstrap(vaddr_t avail, paddr_t kseg0base,
-        *                     struct mem_region *mr);
-        */
-       LDUC32(0x80000000, r3)
-       LEA(Lmem_regions, r4)
-       LEAF(_C_LABEL(pmap_bootstrap), r0)
-       ptabs/l r0, tr0
-       blink   tr0, r18
-
-       /*
-        * We can now deal with exceptions, particularly TLB misses
-        */
-       getcon  sr, r1
-       movi    1, r0
-       shlli   r0, SH5_CONREG_SR_BL_SHIFT, r0
-       andc    r1, r0, r1
-       putcon  r1, sr
-
-       /*
-        * Secondary initialisation. The pmap has been set up enough
-        * to map device register into kernel virtual address space.
-        */
        LEAF(_C_LABEL(evbsh5_init), r0)
        ptabs/l r0, tr0
        blink   tr0, r18
diff -r 6fe9123035fe -r 8577b3f7412d sys/arch/evbsh5/evbsh5/machdep.c
--- a/sys/arch/evbsh5/evbsh5/machdep.c  Tue Oct 22 07:22:19 2002 +0000
+++ b/sys/arch/evbsh5/evbsh5/machdep.c  Tue Oct 22 09:30:26 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: machdep.c,v 1.9 2002/10/14 14:21:35 scw Exp $  */
+/*     $NetBSD: machdep.c,v 1.10 2002/10/22 09:30:27 scw Exp $ */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -105,11 +105,21 @@
 bus_space_handle_t _evbsh5_bh_pbridge;
 bus_space_handle_t _evbsh5_bh_sysfpga;
 
+static struct mem_region mr[2];
 
-vaddr_t
-evbsh5_memory_init(vaddr_t endkernel, struct mem_region *mr)
+void
+evbsh5_init(vaddr_t endkernel)
 {
+       extern char sh5_panic_stack[];
+#if NDTFCONS > 0
+       extern char *_dtf_buffer;
+       extern void _dtf_trap_frob(void);
+       vaddr_t dtfbuf;
+       paddr_t frob_p;
+#endif
        u_long ksize;
+       vsize_t size;
+       caddr_t v;
 
        endkernel = sh5_round_page(endkernel);
 
@@ -121,19 +131,9 @@
        mr[1].mr_start = 0;
        mr[1].mr_size = 0;
 
-       return (endkernel);
-}
+       pmap_bootstrap(endkernel, EVBSH5_RAM_START_PHYS, mr);
 
-void
-evbsh5_init(void)
-{
-       extern char sh5_panic_stack[];
-#if NDTFCONS > 0
-       extern char *_dtf_buffer;
-       extern void _dtf_trap_frob(void);
-       vaddr_t dtfbuf;
-       paddr_t frob_p;
-#endif
+       __asm __volatile("putcon %0, sr" :: "r"(SH5_CONREG_SR_IMASK_ALL));
 
        /* XXX: Will need to be revisited for SMP */
        curcpu()->ci_panicstkphys = EVBSH5_RAM_START_PHYS +
@@ -184,6 +184,15 @@
 #endif
 
        boothowto = RB_SINGLE | RB_KDB;
+
+       /*
+        * Call allocsys() now so we can steal pages from KSEG0.
+        */
+       size = (vsize_t)allocsys(NULL, NULL);
+       if ((v = (caddr_t)uvm_pageboot_alloc(round_page(size))) == 0)
+               panic("startup: no room for tables");
+       if ((allocsys(v, NULL) - v) != size)
+               panic("startup: table size inconsistency");
 }
 
 #ifndef SH5_CPU_SPEED
@@ -245,26 +254,13 @@
 void
 cpu_startup(void)
 {
-       caddr_t v;
        u_int i, base, residual;
        vaddr_t minaddr, maxaddr;
        vsize_t size;
        char pbuf[16];
 
        /*
-        * Find out how much space we need, allocate it,
-        * and then give everything true virtual addresses.
-        */
-       size = (vsize_t)allocsys(NULL, NULL);
-       if ((v = (caddr_t)uvm_km_zalloc(kernel_map, round_page(size))) == 0)
-               panic("startup: no room for tables");
-       if ((allocsys(v, NULL) - v) != size)
-               panic("startup: table size inconsistency");
-
-
-       /*
-        * Now allocate buffers proper.  They are different than the above
-        * in that they usually occupy more virtual memory than physical.
+        * Now allocate buffers proper.
         */
        size = MAXBSIZE * nbuf;
        if (uvm_map(kernel_map, (vaddr_t *) &buffers, round_page(size),
@@ -323,8 +319,8 @@
 
        strcpy(cpu_model, "SuperH SH5");
 
-       printf("%s%s running at %dMHz\n", version, cpu_model,
-           (u_int)_sh5_ctc_ticks_per_us);
+       printf("%s%s running in %d-bit mode at %dMHz\n", version, cpu_model,
+           (sizeof(void *) == 8) ? 64 : 32, (u_int)_sh5_ctc_ticks_per_us);
        format_bytes(pbuf, sizeof(pbuf), ctob(physmem));
        printf("total memory = %s\n", pbuf);
        format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free));
diff -r 6fe9123035fe -r 8577b3f7412d sys/arch/evbsh5/evbsh5/machdep.h
--- a/sys/arch/evbsh5/evbsh5/machdep.h  Tue Oct 22 07:22:19 2002 +0000
+++ b/sys/arch/evbsh5/evbsh5/machdep.h  Tue Oct 22 09:30:26 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: machdep.h,v 1.1 2002/07/05 13:31:40 scw Exp $  */
+/*     $NetBSD: machdep.h,v 1.2 2002/10/22 09:30:27 scw Exp $  */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -41,9 +41,6 @@
 extern bus_space_handle_t _evbsh5_bh_pbridge;
 extern bus_space_handle_t _evbsh5_bh_sysfpga;
 
-struct mem_region;
-
-extern vaddr_t evbsh5_memory_init(vaddr_t, struct mem_region *);
-extern void evbsh5_init(void);
+extern void evbsh5_init(vaddr_t);
 
 #endif /* _EVBSH5_MACHDEP_H */
diff -r 6fe9123035fe -r 8577b3f7412d sys/arch/sh5/include/pmap.h
--- a/sys/arch/sh5/include/pmap.h       Tue Oct 22 07:22:19 2002 +0000
+++ b/sys/arch/sh5/include/pmap.h       Tue Oct 22 09:30:26 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.h,v 1.11 2002/10/04 09:17:57 scw Exp $    */
+/*     $NetBSD: pmap.h,v 1.12 2002/10/22 09:30:26 scw Exp $    */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -112,6 +112,8 @@
 }
 
 /* Private pmap data and functions */
+struct mem_region;
+extern void    pmap_bootstrap(vaddr_t, paddr_t, struct mem_region *);
 extern int     pmap_initialized;
 extern u_int   pmap_ipt_hash(vsid_t vsid, vaddr_t va);  /* See exception.S */
 extern vaddr_t pmap_map_device(paddr_t, u_int);
diff -r 6fe9123035fe -r 8577b3f7412d sys/arch/sh5/sh5/pmap.c
--- a/sys/arch/sh5/sh5/pmap.c   Tue Oct 22 07:22:19 2002 +0000
+++ b/sys/arch/sh5/sh5/pmap.c   Tue Oct 22 09:30:26 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.19 2002/10/12 12:02:16 scw Exp $    */
+/*     $NetBSD: pmap.c,v 1.20 2002/10/22 09:30:27 scw Exp $    */
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -389,7 +389,6 @@
        pmap_pool_ualloc, pmap_pool_ufree, 0,
 };
 
-void pmap_bootstrap(vaddr_t, paddr_t, struct mem_region *);
 volatile pte_t *pmap_pte_spill(u_int, vsid_t, vaddr_t);
 
 static void pmap_copyzero_page_dpurge(paddr_t, struct evcnt *);



Home | Main Index | Thread Index | Old Index