Port-amiga archive

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

Re: [PATCH] Fixup for Amigas with memory at 0x200000



Hi,

here's my version of the patch, which reorders the DRACO section to be
unsplit, making the code better readable IMO.


Index: amiga_init.c
===================================================================
RCS file: /cvsroot/src/sys/arch/amiga/amiga/amiga_init.c,v
retrieving revision 1.77.4.1
diff -u -r1.77.4.1 amiga_init.c
--- amiga_init.c        2002/06/05 09:38:01     1.77.4.1
+++ amiga_init.c        2003/01/10 21:19:11
@@ -117,6 +117,8 @@
 int use_z2_mem = 1;                    /* XXX */
 
 u_long boot_fphystart, boot_fphysize, boot_cphysize;
+static u_int start_c_fphystart;
+static u_int start_c_pstart;
 
 static u_long boot_flags;
 
@@ -136,7 +138,7 @@
 extern void kernel_reload(char *, u_long, u_long, u_long, u_long,
        u_long, u_long, u_long, u_long, u_long, u_long);
 extern void etext(void);
-void start_c_cleanup(void);
+void start_c_finish(void);
 
 void *
 chipmem_steal(long amount)
@@ -212,13 +214,9 @@
        u_int Sysptmap_pa;
        register st_entry_t sg_proto, *sg, *esg;
        register pt_entry_t pg_proto, *pg;
-       u_int tc, end_loaded, ncd, i;
+       u_int end_loaded, ncd, i;
        struct boot_memlist *ml;
        u_int loadbase = 0;     /* XXXXXXXXXXXXXXXXXXXXXXXXXXXX */
-       u_int *shadow_pt = 0;   /* XXXXXXXXXXXXXXXXXXXXXXXXXXXX */
-#ifdef P5PPC68KBOARD
-        struct cfdev *cdp, *ecdp;
-#endif
 
 #ifdef DEBUG_KERNEL_START
        /* XXX this only is valid if Altais is in slot 0 */
@@ -383,14 +381,6 @@
 #endif
        ptextra = NCHIPMEMPG + NCIAPG + NZTWOROMPG + RELOC(NZTWOMEMPG, u_int) +
            btoc(RELOC(ZBUSAVAIL, u_int)) + NPCMCIAPG;
-       /*
-        * if kernel shadow mapping will overlap any initial mapping
-        * of Zorro I/O space or the page table map, we need to
-        * adjust things to remove the overlap.
-        */
-       if (loadbase != 0) {
-               /* What to do, what to do? */
-       }
 
        ptsize = (RELOC(Sysptsize, u_int) +
            howmany(ptextra, NPTEPG)) << PGSHIFT;
@@ -447,9 +437,6 @@
                 */
                i = ((ptsize >> PGSHIFT) + 1) * (NPTEPG / SG4_LEV3SIZE);
                sg = &((u_int *)(RELOC(Sysseg_pa, u_int)))[SG4_LEV1SIZE];
-               if (loadbase != 0)
-                       /* start of next L2 table */
-                       shadow_pt = &sg[roundup(i, SG4_LEV2SIZE)];
                esg = &sg[i];
                sg_proto = ptpa | SG_U | SG_RW | SG_V;
                while (sg < esg) {
@@ -471,44 +458,6 @@
                        *sg++ = sg_proto;
                        sg_proto += (SG4_LEV2SIZE * sizeof(st_entry_t));
                }
-               if (loadbase != 0) {
-                       sg = (u_int *)RELOC(Sysseg_pa, u_int);
-                       if (sg[loadbase >> SG4_SHIFT1] == 0) {
-                               /* allocate another level 2 table */
-                               sg[loadbase >> SG4_SHIFT1] =
-                                   (u_int)shadow_pt | SG_U | SG_RW | SG_V;
-                               shadow_pt = NULL;
-                               RELOC(protostfree, u_int) =
-                                   RELOC(protostfree, u_int) << 1;
-                       }
-                       sg = (u_int *)(sg[loadbase >> SG4_SHIFT1] & SG4_ADDR1);
-                       if (sg[(loadbase & SG4_MASK2) >> SG4_SHIFT2] == 0) {
-                               /* no page table exists, need to allocate it */
-                               sg_proto = pstart | SG_U | SG_RW | SG_V;
-                               sg = &sg[(loadbase & SG4_MASK2) >> SG4_SHIFT2];
-                               sg = (u_int *)((int)sg & ~(NBPG / SG4_LEV3SIZE 
- 1));
-                               esg = &sg[NPTEPG / SG4_LEV3SIZE];
-                               while (sg < esg) {
-                                       *sg++ = sg_proto;
-                                       sg_proto += SG4_LEV3SIZE * sizeof 
(st_entry_t);
-                               }
-                               pg = (u_int *) pstart;
-                               esg = (u_int *)&pg[NPTEPG];
-                               while (pg < esg)
-                                       *pg++ = PG_NV;
-                               pstart += NBPG;
-                               vstart += NBPG;
-                               avail -= NBPG;
-                               /* ptmap??? */
-                       }
-                       sg = (u_int *)RELOC(Sysseg_pa, u_int);
-                       sg = (u_int *)(sg[loadbase >> SG4_SHIFT1] & SG4_ADDR1);
-                       shadow_pt =
-                           ((u_int *)(sg[(loadbase & SG4_MASK2) >> SG4_SHIFT2]
-                               & SG4_ADDR1)) +
-                           ((loadbase & SG4_MASK3) >> SG4_SHIFT3); /* XXX is */
-
-               }
                /*
                 * Initialize Sysptmap
                 */
@@ -552,28 +501,6 @@
                        *sg++ = SG_NV;
                        *pg++ = PG_NV;
                }
-
-               if (loadbase != 0) {
-                       sg = (u_int *)RELOC(Sysseg_pa, u_int);
-                       if (sg[loadbase >> SG_ISHIFT] == 0) {
-                               /* no page table exists, need to allocate it */
-                               sg[loadbase >> SG_ISHIFT] =
-                                   pstart | SG_RW | SG_V;
-                               pg = (u_int *)Sysptmap_pa;
-                               pg[loadbase >> SG_ISHIFT] =
-                                   pstart | PG_RW | PG_CI | PG_V;
-                               pg = (u_int *) pstart;
-                               esg = (u_int *)&pg[NPTEPG];
-                               while (pg < esg)
-                                       *pg++ = PG_NV;
-                               pstart += NBPG;
-                               vstart += NBPG;
-                               avail -= NBPG;
-                       }
-                       shadow_pt =
-                           ((u_int *)(sg[loadbase >> SG_ISHIFT] & 0xffffff00))
-                           + ((loadbase & SG_PMASK) >> SG_PSHIFT);
-               }
        }
 
        /*
@@ -689,23 +616,6 @@
        }
 
        /*
-        * Initial any "shadow" mapping of the kernel
-        */
-       if (loadbase != 0 && shadow_pt != 0) {
-               RELOC(amigashdwaddr, vaddr_t) = (u_int)shadow_pt - loadbase;
-               RELOC(namigashdwpg, u_int) = (vstart + USPACE) >> PGSHIFT;
-               pg_proto = fphystart | PG_RO | PG_V;
-               pg = shadow_pt;
-               *pg++ = PG_NV;                  /* Make page 0 invalid */
-               pg_proto += NBPG;
-               for (i = NBPG; i < (u_int)etext; i += NBPG, pg_proto += NBPG)
-                       *pg++ = pg_proto;
-               pg_proto = (pg_proto & PG_FRAME) | PG_RW | PG_V;
-               for (; i < vstart + USPACE; i += NBPG, pg_proto += NBPG)
-                       *pg++ = pg_proto;
-       }
-
-       /*
         *[ following page tables MAY be allocated to ZORRO3 space,
         * but they're then later mapped in autoconf.c ]
         */
@@ -839,9 +749,6 @@
                /*
                 * movel Sysseg_pa,a0;
                 * movec a0,SRP;
-                * pflusha;
-                * movel #$0xc000,d0;
-                * movec d0,TC
                 */
 
                if (id & AMIGA_68060) {
@@ -864,9 +771,6 @@
                } else
 ((volatile struct Custom *)0xdff000)->color[0] = 0xA70;                /* 
ORANGE */
 #endif
-
-               asm volatile ("movel #0xc000,%%d0; .word 0x4e7b,0x0003"
-                   : : :"d0" );
        } else
 #endif
        {
@@ -877,14 +781,20 @@
                 */
                (RELOC(protorp[0], u_int)) = 0x80000202;
                asm volatile ("pmove %0@,%%srp":: "a" (&RELOC(protorp, u_int)));
-               /*
-                * setup and load TC register.
-                * enable_cpr, enable_srp, pagesize=8k,
-                * A = 8 bits, B = 11 bits
-                */
-               tc = 0x82d08b00;
-               asm volatile ("pmove %0@,%%tc" : : "a" (&tc));
        }
+
+       RELOC(start_c_fphystart, u_int) = fphystart;
+       RELOC(start_c_pstart, u_int) = pstart;
+}
+
+void
+start_c_finish()
+{
+       extern u_int32_t delaydivisor;
+#ifdef P5PPC68KBOARD
+        struct cfdev *cdp, *ecdp;
+#endif
+
 #ifdef DEBUG_KERNEL_START
 #ifdef DRACO
        if ((id >> 24) == 0x7D) { /* mapping on, is_draco() is valid */
@@ -903,8 +813,8 @@
 ((volatile struct Custom *)CUSTOMADDR)->color[0] = 0x0a0;      /* GREEN */
 #endif
 
-       bzero ((u_char *)proc0paddr, USPACE);   /* XXXXXXXXXXXXXXXXXXXXX */
-       pmap_bootstrap(pstart, fphystart);      /* XXXXXXXXXXXXXXXXXXXXXXx*/
+       bzero ((u_char *)proc0paddr, USPACE);
+       pmap_bootstrap(start_c_pstart, start_c_fphystart);
 
        /*
         * to make life easier in locore.s, set these addresses explicitly
@@ -937,8 +847,10 @@
                z2mem_start = ZTWOMEMADDR;
        }
 
+#if 0
        i = *(int *)proc0paddr;
        *(volatile int *)proc0paddr = i;
+#endif
 
        /*
         * disable all interupts but enable allow them to be enabled
@@ -1014,24 +926,6 @@
                        }
         }
 #endif
-}
-
-void
-start_c_cleanup()
-{
-       u_int *sg, *esg;
-       extern u_int32_t delaydivisor;
-
-       /*
-        * remove shadow mapping of kernel?
-        */
-       if (amigashdwaddr == 0)
-               return;
-       sg = (u_int *) amigashdwaddr;
-       esg = (u_int *)&sg[namigashdwpg];
-       while (sg < esg)
-               *sg++ = PG_NV;
-
        /*
         * preliminary delay divisor value
         */
Index: locore.s
===================================================================
RCS file: /cvsroot/src/sys/arch/amiga/amiga/locore.s,v
retrieving revision 1.131
diff -u -r1.131 locore.s
--- locore.s    2002/02/13 16:34:05     1.131
+++ locore.s    2003/01/10 21:19:11
@@ -918,16 +918,69 @@
        movc    %d0,%sfc                |   as source
        movc    %d0,%dfc                |   and destination of transfers
 
-/* let the C function initialize everything and enable the MMU */
+/* let the C function initialize everything */
        RELOC(start_c, %a0)
        jbsr    %a0@
        addl    #28,%sp
+
+#ifdef DRACO
+       RELOC(machineid,%a0)
+       cmpb    #0x7d,%a0@
+       jne     LAmiga_enable_MMU
+
+       lea     %pc@(0),%a0
+       movl    %a0,%d0
+       andl    #0xff000000,%d0
+       orl     #0x0000c044,%d0         | 16 MB, ro,cache inhibited
+       .word   0x4e7b,0x0004           | movc %d0,%itt0
+       .word   0xf518                  | pflusha
+       movl    #0xc000,%d0             | enable MMU
+       .word   0x4e7b, 0x0003          | movec %d0,%tc
+       jmp     Lcleanitt0:l
+Lcleanitt0:
+       movq    #0,%d0
+       .word   0x4e7b,0x0004           | movc %d0,%itt0
+       bra     LMMUenable_end:l
+
+LAmiga_enable_MMU:
+#endif /* DRACO */
+
+/* Copy just the code to enable the MMU into chip memory */
+       lea     LMMUenable_start,%a0
+       movl    #LMMUenable_start:l,%a1
+       lea     LMMUenable_end,%a2
+Lcopy_MMU_enabler:
+       movl    %a0@+,%a1@+
+       cmpl    %a0,%a2
+       jgt     Lcopy_MMU_enabler
+
+       jmp     LMMUenable_start:l
+
+LMMUenable_start:
+
+/* enable the MMU */
+#if defined(M68040) || defined(M68060)
+       RELOC(mmutype, %a0)
+       cmpl    #MMU_68040,%a0@
+       jne     Lenable030
+       .word   0xf518                  | pflusha
+       movl    #0xc000,%d0
+       .word   0x4e7b, 0x0003          | movec %d0,%tc
        jmp     Lunshadow:l
+#endif /* M68040 || M68060 */
+/* ENABLE, SRP_ENABLE, 8K pages, 8bit A-level, 11bit B-level */
+Ltc:   .long   0x82d08b00
+Lenable030:
+       lea     Ltc,%a0
+       pmove   %a0@,%tc
+       jmp     Lunshadow:l
+
+LMMUenable_end:
 
 Lunshadow:
 
        lea     _ASM_LABEL(tmpstk),%sp  | give ourselves a temporary stack
-       jbsr    _C_LABEL(start_c_cleanup)
+       jbsr    _C_LABEL(start_c_finish)
 
 /* set kernel stack, user SP, and initial pcb */
        movl    _C_LABEL(proc0paddr),%a1        | proc0 kernel stack

-- 
seal your e-mail: http://www.gnupg.org/

Attachment: pgpZ0noLQNjGk.pgp
Description: PGP signature



Home | Main Index | Thread Index | Old Index