Port-atari archive

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

Re: Current kernel with http://gnats.netbsd.org/39965 and pmap patches



David Ross wrote:

> The ATARITT kernel does not load, regardless of if anything is plugged into 
> a serial port or not.  Just a blank screen after running loadbsd.ttp.

Okay, with a quick glance, reloc operation for options RELOC_KERNEL
is done after all necessary bootstrap STEs and PTEs are initialized,
so we have to carefully use the following three types of addresses
in the start_c() function:

(1) physicall address before relocation
  This should be used to fetch global variables in start_c()
  before relocation (including page table addresses initialized
  during bootstrap).

(2) physicall address after relocation
  This should be used for physical address pointers
  which will be used after MMU is enabled.
  (including PA values stored into STEs and PTEs)

(3) kernel virtual address
  This should be used for virtual address pointers
  which will be used after MMU is enabled, and
  for virtual address to calculate STE/PTE indexes during bootstrap.

On the other hand, (1) and (3) have the same values
(at least in kernel text/data/bss) and some variables
used in start_c() have both meanings.
It actually confuses readers...

I've cleaned up various variables in atari_init.c (attached)
(BTW that means it's no longer sync'ed with amiga ;-p).

Summary of changes are:

- use independent variables for (1) and (3) (pstart and vstart etc.)
  even if they have the same values (since they have different meanings)

- only global Sysseg_pa and Sysptmap_pa belong (2),
  so initialize them as (1) first and
  use explicit address reloc conversion for PTE and STE values,
  then update these global variables as (2)
  after all bootstrap initialization is complete

- make mmu0[34]0_setup() (and cpu_init_kcorehdr()) take
  Sysseg_pa (before relocation) as an arg, to avoid reference of
  global Sysseg_pa (it could be changed at some point as noted above)

- use properly variable types (st_entry_t, pt_entry_t etc) for readability
  (XXX: we should also use paddr_t/vaddr_t/psize_t/vsize_t properly)

- don't map Sysptmap and kernel page tables with PG_CI
  but only do so for Sysseg on 040/060
  (amiga pmap seems to have the same bug, though
   those KVA ranges seem used only for debug printfs)

- misc style nits

...I'm afraid I'd put various botches, though.
(it's really hard to implement without real hardware ;-)

I've also put new kernels with this change:
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-ATARITT-HEAD-20081230.gz
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-BOOT-HEAD-20081230.gz
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-FALCON-HEAD-20081230.gz

> But the BOOT kernel does boot.  And I successfully installed the sets via 
> CD-ROM!  The install completes successfully, but when the system is rebooted 
> I just get "Halting..." after the memory test.  This is probably from the 
> very first stage of the netbsd bootloader but I'm not really sure.  I didn't 
> try doing a complete zero of the disk before the install -- it's conceivable 
> that might help.

Well, we should begin to track a new problem after existing ones
are resolved ;-)

> One issue that is probably minor...  When "/bin/sh MAKEDEV all" is running, 
> I get "df: not found".  This does not stop the install though.  Probably the 
> df binary just needs to be dropped onto the sysinst floppy.

This looks used to check if /dev/fd is an independent file system or not.
Maybe the erorr is harmless during installation, but it might be better
to add df(1) to miniroot if there is no size restriction.
---
Izumi Tsutsui


--- atari/atari_init.c.0        2008-12-28 14:40:20.000000000 +0900
+++ atari/atari_init.c  2008-12-31 01:33:48.000000000 +0900
@@ -80,16 +80,14 @@
 
 void start_c __P((int, u_int, u_int, u_int, char *));
 static void atari_hwinit __P((void));
-static void cpu_init_kcorehdr __P((u_long));
+static void cpu_init_kcorehdr __P((u_long, u_int));
 static void initcpu __P((void));
-static void mmu030_setup __P((u_int, pt_entry_t *, u_int,
-                             u_int, u_int));
-static void map_io_areas __P((pt_entry_t *, u_int, u_int));
+static void mmu030_setup __P((u_int, u_int, u_int, u_int, u_int, u_int));
+static void map_io_areas __P((u_int, u_int, u_int));
 static void set_machtype __P((void));
 
 #if defined(M68040) || defined(M68060)
-static void mmu040_setup __P((u_int, pt_entry_t *, u_int,
-                             u_int, u_int));
+static void mmu040_setup __P((u_int, u_int, u_int, u_int, u_int, u_int));
 #endif
 
 /*
@@ -188,13 +186,14 @@
        extern char     end[];
        extern void     etext __P((void));
        extern u_long   protorp[2];
-       u_int           pstart;         /* Next available physical address*/
+       u_int           pstart;         /* Next available physical address */
        u_int           vstart;         /* Next available virtual address */
        u_int           avail;
-       pt_entry_t      *pt;
-       u_int           ptsize, ptextra;
+       u_int           ptpa;
+       vsize_t         ptsize, ptextra;
+       u_int           kva;
        u_int           tc, i;
-       u_int           *pg;
+       pt_entry_t      *pg, *epg;
        u_int           pg_proto;
        u_int           end_loaded;
        u_long          kbase;
@@ -246,7 +245,8 @@
         */
        if((reloc_kernel != 0) && (ttphysize >= end_loaded))
                kbase = ttphystart;
-       else kbase = 0;
+       else
+               kbase = 0;
 
        /*
         * Determine the type of machine we are running on. This needs
@@ -265,15 +265,17 @@
         * pstart: start of usable ST memory
         * avail : size of ST memory available.
         */
-       pstart = (u_int)end_loaded;
-       pstart = m68k_round_page(pstart);
+       vstart = (u_int)end_loaded;
+       vstart = m68k_round_page(vstart);
+       pstart = vstart;                /* pre-reloc PA == kernel VA here */
        avail  = stphysize - pstart;
 
        /*
         * Save KVA of proc0 user-area and allocate it
         */
-       proc0paddr = pstart;
+       proc0paddr = vstart;
        pstart    += USPACE;
+       vstart    += USPACE;
        avail     -= USPACE;
 
        /*
@@ -293,16 +295,18 @@
        /*
         * allocate the kernel segment table
         */
-       Sysseg     = (st_entry_t *)pstart;
-       Sysseg_pa  = (u_int)Sysseg + kbase;
+       Sysseg_pa  = pstart;                    /* pre-reloc PA to init STEs */
+       Sysseg     = (st_entry_t *)vstart;
+       vstart    += kstsize * PAGE_SIZE;
        pstart    += kstsize * PAGE_SIZE;
        avail     -= kstsize * PAGE_SIZE;
 
        /*
         * allocate kernel page table map
         */
-       Sysptmap = (pt_entry_t *)pstart;
-       Sysptmap_pa = pstart;
+       Sysptmap_pa = pstart;                   /* pre-reloc PA to init PTEs */
+       Sysptmap = (pt_entry_t *)vstart;
+       vstart  += PAGE_SIZE;
        pstart  += PAGE_SIZE;
        avail   -= PAGE_SIZE;
 
@@ -326,8 +330,9 @@
         * the I/O areas. The various I/O areas are mapped (virtually) at
         * the top of the address space mapped by 'pt' (ie. just below Sysmap).
         */
-       pt      = (pt_entry_t *)pstart;
+       ptpa    = pstart;                       /* pre-reloc PA to init PTEs */
        ptsize  = (Sysptsize + howmany(ptextra, NPTEPG)) << PGSHIFT;
+       vstart += ptsize;
        pstart += ptsize;
        avail  -= ptsize;
 
@@ -335,17 +340,19 @@
         * We want Sysmap to be the first address mapped by Sysptmap.
         * Sysmap is now placed at the end of Supervisor virtual address space.
         */
-       Sysmap = (u_int *) ((u_int *)-(NPTEPG * PAGE_SIZE));
+       Sysmap = (pt_entry_t *)-(NPTEPG * PAGE_SIZE);
 
        /*
         * Initialize segment tables
         */
 #if defined(M68040) || defined(M68060)
        if (mmutype == MMU_68040)
-               mmu040_setup(kstsize, pt, ptsize, Sysptmap_pa, kbase);
+               mmu040_setup(Sysseg_pa, kstsize, ptpa, ptsize, Sysptmap_pa,
+                   kbase);
        else
 #endif /* defined(M68040) || defined(M68060) */
-               mmu030_setup(kstsize, pt, ptsize, Sysptmap_pa, kbase);
+               mmu030_setup(Sysseg_pa, kstsize, ptpa, ptsize, Sysptmap_pa,
+                   kbase);
 
        /*
         * initialize kernel page table page(s).
@@ -353,13 +360,15 @@
         * - Text pages are RO
         * - Page zero is invalid
         */
-       pg_proto = (0 + kbase) | PG_RO | PG_V;
-       pg       = pt;
-       *pg++ = PG_NV;
+       pg_proto = (0 + kbase) /* relocated PA */ | PG_RO | PG_V;
+       pg       = (pt_entry_t *)ptpa;
+       *pg++    = PG_NV;
+
        pg_proto += PAGE_SIZE;
-       for(i = PAGE_SIZE; i < (u_int)etext;
-           i += PAGE_SIZE, pg_proto += PAGE_SIZE)
+       for (kva = PAGE_SIZE; kva < (u_int)etext; kva += PAGE_SIZE) {
                *pg++ = pg_proto;
+               pg_proto += PAGE_SIZE;
+       }
 
        /* 
         * data, bss and dynamic tables are read/write
@@ -374,19 +383,23 @@
         */
        if (mmutype == MMU_68040) {
 
-           if (kernel_copyback)
-               pg_proto |= PG_CCB;
+               if (kernel_copyback)
+                       pg_proto |= PG_CCB;
 
-           for (; i < (u_int)Sysseg; i += PAGE_SIZE, pg_proto += PAGE_SIZE)
-               *pg++ = pg_proto;
+               for (; kva < (u_int)Sysseg; kva += PAGE_SIZE) {
+                       *pg++ = pg_proto;
+                       pg_proto += PAGE_SIZE;
+               }
 
-           pg_proto = (pg_proto & ~PG_CCB) | PG_CI;
-           for (; i < pstart; i += PAGE_SIZE, pg_proto += PAGE_SIZE)
-               *pg++ = pg_proto;
+               pg_proto = (pg_proto & ~PG_CCB) | PG_CI;
+               for (; kva < (u_int)Sysptmap; kva += PAGE_SIZE) {
+                       *pg++ = pg_proto;
+                       pg_proto += PAGE_SIZE;
+               }
 
-           pg_proto = (pg_proto & ~PG_CI);
-           if (kernel_copyback)
-               pg_proto |= PG_CCB;
+               pg_proto = (pg_proto & ~PG_CI);
+               if (kernel_copyback)
+                       pg_proto |= PG_CCB;
        }
 #endif /* defined(M68040) || defined(M68060) */
 
@@ -394,24 +407,23 @@
         * go till end of data allocated so far
         * plus proc0 u-area (to be allocated)
         */
-       for (; i < pstart; i += PAGE_SIZE, pg_proto += PAGE_SIZE)
+       for (; kva < vstart; kva += PAGE_SIZE) {
                *pg++ = pg_proto;
+               pg_proto += PAGE_SIZE;
+       }
 
        /*
         * invalidate remainder of kernel PT
         */
-       while((pt_entry_t *)pg < &pt[ptsize/sizeof(pt_entry_t)])
+       epg = (pt_entry_t *)ptpa;
+       epg = &epg[ptsize / sizeof(pt_entry_t)];
+       while (pg < epg)
                *pg++ = PG_NV;
 
        /*
         * Map various I/O areas
         */
-       map_io_areas(pt, ptsize, ptextra);
-
-       /*
-        * At this point, virtual and physical allocation starts to divert.
-        */
-       vstart     = pstart;
+       map_io_areas(ptpa, ptsize, ptextra);
 
        /*
         * Map the allocated space in ST-ram now. In the contig-case, there
@@ -420,7 +432,8 @@
         * Physcal space is already reserved!
         */
        st_pool_virt = vstart;
-       pg           = &pt[vstart / PAGE_SIZE];
+       pg           = (pt_entry_t *)ptpa;
+       pg           = &pg[vstart / PAGE_SIZE];
        pg_proto     = st_pool_phys | PG_RW | PG_CI | PG_V;
        vstart      += st_pool_size;
        while(pg_proto < (st_pool_phys + st_pool_size)) {
@@ -435,12 +448,22 @@
         * copying there....).
         */
        page_zero  = vstart;
-       pg         = &pt[vstart / PAGE_SIZE];
+       pg         = (pt_entry_t *)ptpa;
+       pg         = &pg[vstart / PAGE_SIZE];
        *pg++      = PG_RW | PG_CI | PG_V;
        vstart    += PAGE_SIZE;
        *pg        = PG_RW | PG_CI | PG_V | PAGE_SIZE;
        vstart    += PAGE_SIZE;
 
+       /*
+        * All necessary STEs and PTEs have been initialized.
+        * Update Sysseg_pa and Sysptmap_pa to point relocated PA.
+        */
+       if (kbase) {
+               Sysseg_pa   += kbase;
+               Sysptmap_pa += kbase;
+       }
+
        lowram  = 0 >> PGSHIFT; /* XXX */
 
        /*
@@ -463,7 +486,8 @@
                usable_segs[0].start  = PAGE_SIZE;
                usable_segs[1].start += pstart;
        }
-       else usable_segs[0].start += pstart;
+       else
+               usable_segs[0].start += pstart;
 
        /*
         * As all segment sizes are now valid, calculate page indexes and
@@ -489,10 +513,9 @@
         * Setup and load SRP nolimit, share global, 4 byte PTE's
         */
        protorp[0] = 0x80000202;
-       protorp[1] = (u_int)Sysseg + kbase;     /* + segtable address */
-       Sysseg_pa  = (u_int)Sysseg + kbase;
+       protorp[1] = Sysseg_pa;         /* + segtable address */
 
-       cpu_init_kcorehdr(kbase);
+       cpu_init_kcorehdr(kbase, Sysseg_pa);
 
        /*
         * copy over the kernel (and all now initialized variables) 
@@ -697,17 +720,18 @@
  * All I/O areas are virtually mapped at the end of the pt-table.
  */
 static void
-map_io_areas(pt, ptsize, ptextra)
-pt_entry_t     *pt;
+map_io_areas(ptpa, ptsize, ptextra)
+u_int          ptpa;
 u_int          ptsize;         /* Size of 'pt' in bytes        */
 u_int          ptextra;        /* #of additional I/O pte's     */
 {
        extern void     bootm_init __P((vaddr_t, pt_entry_t *, u_long));
        vaddr_t         ioaddr;
-       pt_entry_t      *pg, *epg;
+       pt_entry_t      *pt, *pg, *epg;
        pt_entry_t      pg_proto;
        u_long          mask;
 
+       pt = (pt_entry_t *)ptpa;
        ioaddr = ((ptsize / sizeof(pt_entry_t)) - ptextra) * PAGE_SIZE;
 
        /*
@@ -833,8 +857,9 @@
  * Initialize the cpu_kcore_header.
  */
 static void
-cpu_init_kcorehdr(kbase)
+cpu_init_kcorehdr(kbase, sysseg_pa)
 u_long kbase;
+u_int  sysseg_pa;
 {
        cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
        struct m68k_kcore_hdr *m = &h->un._m68k;
@@ -871,7 +896,7 @@
        /*
         * Initialize pointer to kernel segment table.
         */
-       m->sysseg_pa = (u_int)Sysseg + kbase;
+       m->sysseg_pa = sysseg_pa;               /* PA after relocation */
 
        /*
         * Initialize relocation value such that:
@@ -893,26 +918,27 @@
 }
 
 void
-mmu030_setup(kstsize, pt, ptsize, sysptmap_pa, kbase)
+mmu030_setup(sysseg_pa, kstsize, ptpa, ptsize, sysptmap_pa, kbase)
+       u_int           sysseg_pa;      /* System segment table         */
        u_int           kstsize;        /* size of 'sysseg' in pages    */
-       pt_entry_t      *pt;            /* Kernel page table            */
+       u_int           ptpa;           /* Kernel page table            */
        u_int           ptsize;         /* size of 'pt' in bytes        */
        u_int           sysptmap_pa;    /* System page table            */
        u_int           kbase;
 {
-       st_entry_t      sg_proto, *sg;
+       st_entry_t      sg_proto, *sg, *esg;
        pt_entry_t      pg_proto, *pg, *epg;
 
        /*
         * Map the page table pages in both the HW segment table
         * and the software Sysptmap.
         */
-       sg  = (u_int *)Sysseg_pa;
-       pg  = (u_int *)sysptmap_pa;
+       sg  = (st_entry_t *)sysseg_pa;
+       pg  = (pt_entry_t *)sysptmap_pa;
        epg = &pg[ptsize >> PGSHIFT];
-       sg_proto = ((u_int)pt + kbase) | SG_RW | SG_V;
-       pg_proto = ((u_int)pt + kbase) | PG_RW | PG_CI | PG_V;
-       while(pg < epg) {
+       sg_proto = (ptpa + kbase) /* relocated PA */ | SG_RW | SG_V;
+       pg_proto = (ptpa + kbase) /* relocated PA */ | PG_RW | PG_CI | PG_V;
+       while (pg < epg) {
                *sg++ = sg_proto;
                *pg++ = pg_proto;
                sg_proto += PAGE_SIZE;
@@ -920,36 +946,47 @@
        }
 
        /* 
-        * invalidate the remainder of the tables
+        * Invalidate the remainder of the tables
         */
-       /* XXX PAGE_SIZE dependent constant: 256 or 1024 */
-       epg = (u_int *)(sysptmap_pa + (256 - 1) * sizeof(st_entry_t));
-       while(pg < epg) {
+       esg = (st_entry_t *)sysseg_pa;
+       esg = &esg[256];                        /* XXX should be TIA_SIZE */
+       while (sg < esg)
                *sg++ = SG_NV;
+       epg = (pt_entry_t *)sysptmap_pa;
+       epg = &epg[NPTEPG];                     /* XXX should be TIB_SIZE */
+       while (pg < epg)
                *pg++ = PG_NV;
-       }
-       *sg = sysptmap_pa | SG_RW | SG_V;
-       *pg = sysptmap_pa | PG_RW | PG_CI | PG_V;
+
+       /*
+        * Initialize the PTE for the last one to point Sysptmap.
+        */
+       sg = (st_entry_t *)sysseg_pa;
+       sg = &sg[256 - 1];                      /* XXX should be TIA_SIZE */
+       pg = (pt_entry_t *)sysptmap_pa;
+       pg = &pg[256 - 1];                      /* XXX should be TIA_SIZE */
+       *sg = (sysptmap_pa + kbase) /* relocated PA */ | SG_RW | SG_V;
+       *pg = (sysptmap_pa + kbase) /* relocated PA */ | PG_RW | PG_CI | PG_V;
 }
 
 #if defined(M68040) || defined(M68060)
 void
-mmu040_setup(kstsize, pt, ptsize, sysptmap_pa, kbase)
+mmu040_setup(sysseg_pa, kstsize, ptpa, ptsize, sysptmap_pa, kbase)
+       u_int           sysseg_pa;      /* System segment table         */
        u_int           kstsize;        /* size of 'sysseg' in pages    */
-       pt_entry_t      *pt;            /* Kernel page table            */
+       u_int           ptpa;           /* Kernel page table            */
        u_int           ptsize;         /* size of 'pt' in bytes        */
        u_int           sysptmap_pa;    /* System page table            */
        u_int           kbase;
 {
        int             i;
        st_entry_t      sg_proto, *sg, *esg;
-       pt_entry_t      pg_proto;
+       pt_entry_t      pg_proto, *pg, *epg;
 
        /*
         * First invalidate the entire "segment table" pages
         * (levels 1 and 2 have the same "invalid" values).
         */
-       sg  = (u_int *)Sysseg_pa;
+       sg  = (st_entry_t *)sysseg_pa;
        esg = &sg[kstsize * NPTEPG];
        while (sg < esg)
                *sg++ = SG_NV;
@@ -964,9 +1001,10 @@
         * now to save the HW the expense of doing it.
         */
        i   = (ptsize >> PGSHIFT) * (NPTEPG / SG4_LEV3SIZE);
-       sg  = &((u_int *)Sysseg_pa)[SG4_LEV1SIZE];
+       sg  = (st_entry_t *)sysseg_pa;
+       sg  = &sg[SG4_LEV1SIZE];
        esg = &sg[i];
-       sg_proto = ((u_int)pt + kbase) | SG_U | SG_RW | SG_V;
+       sg_proto = (ptpa + kbase) /* relocated PA */ | SG_U | SG_RW | SG_V;
        while (sg < esg) {
                *sg++     = sg_proto;
                sg_proto += (SG4_LEV3SIZE * sizeof (st_entry_t));
@@ -977,19 +1015,20 @@
         *      roundup(num, SG4_LEV2SIZE) / SG4_LEVEL2SIZE
         * level 1 descriptors to map the 'num' level 2's.
         */
-       i = roundup(i, SG4_LEV2SIZE) / SG4_LEV2SIZE;
+       i   = roundup(i, SG4_LEV2SIZE) / SG4_LEV2SIZE;
        protostfree = (-1 << (i + 2)) /* & ~(-1 << MAXKL2SIZE) */;
-       sg  = (u_int *)Sysseg_pa;
+       sg  = (st_entry_t *)sysseg_pa;
        esg = &sg[i];
-       sg_proto = ((u_int)&sg[SG4_LEV1SIZE] + kbase) | SG_U | SG_RW |SG_V;
+       sg_proto = ((u_int)&sg[SG4_LEV1SIZE] + kbase) /* relocated PA */
+           | SG_U | SG_RW | SG_V;
        while (sg < esg) {
                *sg++     = sg_proto;
                sg_proto += (SG4_LEV2SIZE * sizeof(st_entry_t));
        }
 
        /* Sysmap is last entry in level 1 */
-       sg = (u_int *)Sysseg_pa;
-       sg = &sg[SG4_LEV1SIZE - 1];
+       sg  = (st_entry_t *)sysseg_pa;
+       sg  = &sg[SG4_LEV1SIZE - 1];
        *sg = sg_proto;
 
        /*
@@ -997,9 +1036,11 @@
         */
        /* XXX fix calculations XXX */
        i = ((((ptsize >> PGSHIFT) + 3) & -2) - 1) * (NPTEPG / SG4_LEV3SIZE);
-       sg = &((u_int *)Sysseg_pa)[SG4_LEV1SIZE + i];
+       sg  = (st_entry_t *)sysseg_pa;
+       sg  = &sg[SG4_LEV1SIZE + i];
        esg = &sg[NPTEPG / SG4_LEV3SIZE];
-       sg_proto = sysptmap_pa | SG_U | SG_RW | SG_V;
+       sg_proto = (sysptmap_pa + kbase) /* relocated PA */
+           | SG_U | SG_RW | SG_V;
        while (sg < esg) {
                *sg++ = sg_proto;
                sg_proto += (SG4_LEV3SIZE * sizeof (st_entry_t));
@@ -1008,23 +1049,28 @@
        /*
         * Initialize Sysptmap
         */
-       sg = (u_int *) sysptmap_pa;
-       esg = &sg[ptsize >> PGSHIFT];
-       pg_proto = ((u_int)pt + kbase) | PG_RW | PG_CI | PG_V;
-       while (sg < esg) {
-               *sg++ = pg_proto;
+       pg = (pt_entry_t *)sysptmap_pa;
+       epg = &pg[ptsize >> PGSHIFT];
+       pg_proto = (ptpa + kbase) /* relocated PA */ | PG_RW | PG_CI | PG_V;
+       while (pg < epg) {
+               *pg++ = pg_proto;
                pg_proto += PAGE_SIZE;
        }
 
        /*
         * Invalidate rest of Sysptmap page
         */
-       esg = (u_int *)(sysptmap_pa + PAGE_SIZE - sizeof(st_entry_t));
-       while (sg < esg)
-               *sg++ = SG_NV;
-       sg = (u_int *) Sysptmap;
-       sg = &sg[256 - 1];              /* XXX */
-       *sg = sysptmap_pa | PG_RW | PG_CI | PG_V;
+       epg = (pt_entry_t *)sysptmap_pa;
+       epg = &epg[NPTEPG];             /* XXX: should be TIB_SIZE */
+       while (pg < epg)
+               *pg++ = PG_NV;
+
+       /*
+        * Initialize the PTE for the last one to point Sysptmap.
+        */
+       pg = (pt_entry_t *)sysptmap_pa;
+       pg = &pg[256 - 1];              /* XXX: should be TIA_SIZE */
+       *pg = (sysptmap_pa + kbase) /* relocated PA */ | PG_RW | PG_CI | PG_V;
 }
 #endif /* M68040 */
 


Home | Main Index | Thread Index | Old Index