Subject: Re: Some changes for the brave of heart
To: Scott Reynolds <scottr@og.org>
From: Stephen C. Brown <sbrown@shellx.best.com>
List: port-mac68k
Date: 01/02/1997 22:42:23
Hi Scott,

Thanks for the continued effort and it is much appreciated, but...
I tried the patches and get the same results as on the earlier
GENERIC-17.  Even so, the reasoning behind your patch seems to
be sound and I'm not sure that your approach is not right.  I guess
we just need to try some more things...

Also, I had a question about the following part of the patch:

        >  pte_level_three:
        >!       ptestr  #FC_USERD,a0@,#2,a1 | search for logical address

Shouldn't it reference "#3" instead of "#2", or is there something about
the logic that I'm missing???

Looking forward to the next patch and crossing my fingers.....

Steve Brown,
sbrown@best.com

>If all of the following are true
>
>  -  You like to do strange and wonderful things to your kernels;
>  -  Your system is `expendable' -- or at least, can be easily recovered;
>  -  You have a Duo 2x0, Quadra 6x0, Quadra 700, or AV Quadra that works
>     with any kernel;
>
>You could be an alpha tester!  The enclosed patch has been tested on a Mac
>IIx, but since that's an 030-based machine, the 040 changes can't be
>checked out.  What these changes do:
>
>030-based:
>
>  -  Modify get_pte() so that it's not quite so intrusive.  The minimal
>     use of the TT0 register should allow this to work on the Duo 2x0
>     machines, now.  (I'm not sure about ADB, though, and it's late and
>     I'm tired...)
>
>040-based:
>
>  -  Add AV internal video probe
>  -  Get memory mapping from Mac OS page tables, trying the supervisor
>     page tables and falling back to the user page tables (i.e. this
>     might work on both the AV machines and on the Q6x0/Q700).
>
>If you try this, please let me know if they cause problems or get your
>machine to work where it hadn't previously.
>
>Thanks!
>
>--scott
>
>PS - there should be no change for the 030 machines in general, but I'd
>like to hear feedback from someone with a IIci, LC III, or other 030-based
>internal video machine.
>
>Index: mac68k/locore.s
>===================================================================
>RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/locore.s,v
>retrieving revision 1.71
>diff -c -r1.71 locore.s
>*** locore.s    1996/11/06 20:19:35     1.71
>--- locore.s    1996/12/31 06:09:58
>***************
>*** 900,908 ****
>        .long   0x4e7b0005              | movc d0,itt1 ;Disable itt1
>        .long   0x4e7b0006              | movc d0,dtt0 ;Disable dtt0
>        .long   0x4e7b0007              | movc d0,dtt1 ;Disable dtt1
>-       .long   0x4e7b0003              | movc d0,tc   ;Disable MMU
>
>!       movl    #0x0,sp@-               | Fake unenabled MMU
>        jra     do_bootstrap
>
>  Lstartnot040:
>--- 900,910 ----
>        .long   0x4e7b0005              | movc d0,itt1 ;Disable itt1
>        .long   0x4e7b0006              | movc d0,dtt0 ;Disable dtt0
>        .long   0x4e7b0007              | movc d0,dtt1 ;Disable dtt1
>
>!       .long   0x4e7a0003              | movec tc,d0
>!       lea     _macos_tc,a0
>!       movl    d0,a0@
>!       movl    d0,sp@-                 | Save current TC for bootstrap
>        jra     do_bootstrap
>
>  Lstartnot040:
>***************
>*** 939,949 ****
>        cmpl    #MMU_68040, _mmutype
>        jne     Lenablepre040MMU        | if not 040, skip
>        movl    a1,d1
>-       .long   0x4e7b1807              | movc d1,srp
>        .word   0xf4d8                  | cinva bc
>        .word   0xf518                  | pflusha
>        movl    #0x8000,d0
>!       .long   0x4e7b0003              | Enable MMU
>        movl    #0x80008000,d0
>        movc    d0,cacr                 | turn on both caches
>        jra     Lloaddone
>--- 941,951 ----
>        cmpl    #MMU_68040, _mmutype
>        jne     Lenablepre040MMU        | if not 040, skip
>        movl    a1,d1
>        .word   0xf4d8                  | cinva bc
>        .word   0xf518                  | pflusha
>+       .long   0x4e7b1807              | movc d1,srp
>        movl    #0x8000,d0
>!       .long   0x4e7b0003              | movc d0,tc
>        movl    #0x80008000,d0
>        movc    d0,cacr                 | turn on both caches
>        jra     Lloaddone
>***************
>*** 960,966 ****
>        jgt     LnokillTT
>
>        lea     longscratch,a0
>!       movl    #0, a0@
>        .long   0xF0100800              | movl a0@,tt0
>        .long   0xF0100C00              | movl a0@,tt1
>
>--- 962,968 ----
>        jgt     LnokillTT
>
>        lea     longscratch,a0
>!       movl    #0,a0@
>        .long   0xF0100800              | movl a0@,tt0
>        .long   0xF0100C00              | movl a0@,tt1
>
>***************
>*** 1527,1537 ****
>        cmpl    #MMU_68040,_mmutype     | 68040?
>        jne     Lmotommu4               | no, skip
>        movc    dfc,d1
>!       moveq   #FC_USERD, d0           | user space
>!       movc    d0, dfc
>        .word   0xf508                  | pflush a0@
>        moveq   #FC_SUPERD,d0           | supervisor space
>!       movc    d0, dfc
>        .word   0xf508                  | pflush a0@
>        movc    d1,dfc
>        rts
>--- 1529,1539 ----
>        cmpl    #MMU_68040,_mmutype     | 68040?
>        jne     Lmotommu4               | no, skip
>        movc    dfc,d1
>!       moveq   #FC_USERD,d0            | user space
>!       movc    d0,dfc
>        .word   0xf508                  | pflush a0@
>        moveq   #FC_SUPERD,d0           | supervisor space
>!       movc    d0,dfc
>        .word   0xf508                  | pflush a0@
>        movc    d1,dfc
>        rts
>***************
>*** 1874,1886 ****
>        .long   0x4e7a0003              | movec tc,d0
>        andw    #0x8000,d0
>        jeq     Lget_phys1              | MMU is disabled
>!       movc    sfc,d1
>!       movql   #1,d0                   | FC for ptestr
>!       movc    d0,sfc
>        movl    sp@(4),a0               | logical address to look up
>        .word   0xf568                  | ptestr (a0)
>        .long   0x4e7a0805              | movec mmusr,d0
>!       movc    d1,sfc
>        rts
>  Lget_phys1:
>  #endif
>--- 1876,1888 ----
>        .long   0x4e7a0003              | movec tc,d0
>        andw    #0x8000,d0
>        jeq     Lget_phys1              | MMU is disabled
>!       movc    dfc,d1
>!       movl    sp@(8),d0               | FC for ptestr
>!       movc    d0,dfc
>        movl    sp@(4),a0               | logical address to look up
>        .word   0xf568                  | ptestr (a0)
>        .long   0x4e7a0805              | movec mmusr,d0
>!       movc    d1,dfc
>        rts
>  Lget_phys1:
>  #endif
>***************
>*** 1918,1927 ****
>   */
>        .globl  _get_pte
>  _get_pte:
>!       addl    #-4,sp          | make temporary space
>        movl    sp@(8),a0       | logical address to look up
>        movl    #0,a1           | clear in case of failure
>!       ptestr  #1,a0@,#7,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        movl    sp@(16),a0      | where to store the psr
>--- 1920,1934 ----
>   */
>        .globl  _get_pte
>  _get_pte:
>!       subql   #4,sp           | make temporary space
>!
>!       lea     longscratch,a0
>!       movl    #0x00ff8710,a0@ | Set up FC 1 r/w access
>!       .long   0xf0100800      | pmove a0@,tt0
>!
>        movl    sp@(8),a0       | logical address to look up
>        movl    #0,a1           | clear in case of failure
>!       ptestr  #FC_USERD,a0@,#7,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        movl    sp@(16),a0      | where to store the psr
>***************
>*** 1931,1948 ****
>        tstl    a1              | check address we got back
>        jeq     get_pte_fail2   | if 0, then was not set -- fail
>
>-       | enable tt0
>        movl    a1,d0
>        movl    d0,pte_tmp      | save for later
>-       andl    #0xff000000,d0  | keep msb
>-       orl     #0x00008707,d0  | enable tt for reading and writing
>-       movl    d0,longscratch
>-       lea     longscratch,a0
>-       .long   0xf0100800      | pmove a0@,tt0
>
>        | send first long back to user
>        movl    sp@(12),a0      | address of where to put pte
>!       movl    a1@,d0          |
>        movl    d0,a0@          | first long
>
>        andl    #3,d0           | dt bits of pte
>--- 1938,1949 ----
>        tstl    a1              | check address we got back
>        jeq     get_pte_fail2   | if 0, then was not set -- fail
>
>        movl    a1,d0
>        movl    d0,pte_tmp      | save for later
>
>        | send first long back to user
>        movl    sp@(12),a0      | address of where to put pte
>!       movsl   a1@,d0          |
>        movl    d0,a0@          | first long
>
>        andl    #3,d0           | dt bits of pte
>***************
>*** 1979,2010 ****
>        movl    a0@,d0          | load high long
>        jra     pte_got_parent
>  pte_level_one:
>!       ptestr  #1,a0@,#1,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_two:
>!       ptestr  #1,a0@,#2,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_three:
>!       ptestr  #1,a0@,#3,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_four:
>!       ptestr  #1,a0@,#4,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_five:
>!       ptestr  #1,a0@,#5,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_six:
>!       ptestr  #1,a0@,#6,a1    | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>
>--- 1980,2011 ----
>        movl    a0@,d0          | load high long
>        jra     pte_got_parent
>  pte_level_one:
>!       ptestr  #FC_USERD,a0@,#1,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_two:
>!       ptestr  #FC_USERD,a0@,#2,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_three:
>!       ptestr  #FC_USERD,a0@,#2,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_four:
>!       ptestr  #FC_USERD,a0@,#4,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_five:
>!       ptestr  #FC_USERD,a0@,#5,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>        jra     pte_got_it
>  pte_level_six:
>!       ptestr  #FC_USERD,a0@,#6,a1 | search for logical address
>        pmove   psr,sp@         | store processor status register
>        movw    sp@,d1
>
>***************
>*** 2014,2028 ****
>        tstl    a1              | check address we got back
>        jeq     get_pte_fail6   | if 0, then was not set -- fail
>
>!       | change tt0
>!       movl    a1,d0
>!       andl    #0xff000000,d0  | keep msb
>!       orl     #0x00008707,d0  | enable tt for reading and writing
>!       movl    d0,longscratch
>!       lea     longscratch,a0
>!       .long   0xF0100800      | pmove a0@,tt0
>!
>!       movl    a1@,d0          | get pte of parent
>        movl    d0,_macos_tt0   | XXX for later analysis (kill this line)
>  pte_got_parent:
>        andl    #3,d0           | dt bits of pte
>--- 2015,2021 ----
>        tstl    a1              | check address we got back
>        jeq     get_pte_fail6   | if 0, then was not set -- fail
>
>!       movsl   a1@,d0          | get pte of parent
>        movl    d0,_macos_tt0   | XXX for later analysis (kill this line)
>  pte_got_parent:
>        andl    #3,d0           | dt bits of pte
>***************
>*** 2036,2071 ****
>        |  is that the first long might have been the last long of RAM.
>
>        movl    pte_tmp,a1      | get address of our original pte
>!       addl    #4,a1           | address of ite second long
>
>!       | change tt0 back
>!       movl    a1,d0
>!       andl    #0xff000000,d0  | keep msb
>!       orl     #0x00008707,d0  | enable tt for reading and writing
>!       movl    d0,longscratch
>!       lea     longscratch,a0
>!       .long   0xF0100800      | pmove a0@,tt0
>!
>!       movl    sp@(12),a0      | address of return pte
>!       movl    a1@,a0@(4)      | write in second long
>
>!       movl    #1,d0           | return long-format
>        jra     get_pte_success
>
>  short_format:
>!       movl    #0,d0           | return short-format
>        jra     get_pte_success
>
>  get_pte_fail:
>!       movl    #-1,d0          | return failure
>
>  get_pte_success:
>!       clrl    d1              | disable tt
>!       movl    d1,longscratch
>!       lea     longscratch,a0
>!       .long   0xF0100800      | pmove a0@,tt0
>
>!       addl    #4,sp           | return temporary space
>        rts
>
>  get_pte_fail1:
>--- 2029,2057 ----
>        |  is that the first long might have been the last long of RAM.
>
>        movl    pte_tmp,a1      | get address of our original pte
>!       addql   #4,a1           | address of ite second long
>
>!       | send second long back to user
>!       movl    sp@(12),a0      | address of where to put pte
>!       movsl   a1@,d0          |
>!       movl    d0,a0@(4)       | write in second long
>
>!       movql   #1,d0           | return long-format
>        jra     get_pte_success
>
>  short_format:
>!       movql   #0,d0           | return short-format
>        jra     get_pte_success
>
>  get_pte_fail:
>!       movql   #-1,d0          | return failure
>
>  get_pte_success:
>!       lea     longscratch,a0  | disable tt
>!       movl    #0,a0@
>!       .long   0xf0100800      | pmove a0@,tt0
>
>!       addql   #4,sp           | return temporary space
>        rts
>
>  get_pte_fail1:
>Index: mac68k/machdep.c
>===================================================================
>RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/machdep.c,v
>retrieving revision 1.128
>diff -c -r1.128 machdep.c
>*** machdep.c   1996/11/19 07:17:49     1.128
>--- machdep.c   1996/12/31 06:10:07
>***************
>*** 2335,2341 ****
>  {
>        static int firstpass = 1;
>        int setup_mrg_vectors = 0;
>-       u_long phys;
>        struct cpu_model_info *cpui;
>
>        /*
>--- 2335,2340 ----
>***************
>*** 2355,2371 ****
>                return;
>
>        /*
>-        * Get the PA of the console framebuffer, iff we're on an 040.
>-        * We can't call get_physical() on the 851/030 this early, but
>-        * neither can we call it later on the 040; by the time
>-        * we've figured out we have an 851 or 030, we've disabled the
>-        * 040 MMU.  XXX This sucks.
>-        */
>-       if (mmutype == MMU_68040)
>-               mac68k_vidphys = get_physical(videoaddr, &phys) ?
>-                   phys : videoaddr;
>-
>-       /*
>         * Set up any machine specific stuff that we have to before
>         * ANYTHING else happens
>         */
>--- 2354,2359 ----
>***************
>*** 2554,2563 ****
>        3) restore regs
>  */
>
>!       asm("movl a0, sp@-");
>!       asm("movl a1, sp@-");
>!       asm("movl d0, sp@-");
>!       asm("movl d1, sp@-");
>
>  /* check to see if gray bars are turned off */
>        if (mac68k_machine.do_graybars) {
>--- 2542,2551 ----
>        3) restore regs
>  */
>
>!       asm volatile (" movl a0, sp@-;
>!                       movl a1, sp@-;
>!                       movl d0, sp@-;
>!                       movl d1, sp@-");
>
>  /* check to see if gray bars are turned off */
>        if (mac68k_machine.do_graybars) {
>***************
>*** 2568,2582 ****
>                for (i = 0; i < 2 * videorowbytes / 4; i++)
>                        ((u_long *) videoaddr)[gray_nextaddr++] = 0x00000000;
>        }
>!       asm("movl sp@+, d1");
>!       asm("movl sp@+, d0");
>!       asm("movl sp@+, a1");
>!       asm("movl sp@+, a0");
>  }
>  #endif
>
>  /* in locore */
>! extern int ptest040 __P((u_int addr));
>  extern int get_pte __P((u_int addr, u_long pte[2], u_short * psr));
>
>  /*
>--- 2556,2570 ----
>                for (i = 0; i < 2 * videorowbytes / 4; i++)
>                        ((u_long *) videoaddr)[gray_nextaddr++] = 0x00000000;
>        }
>!       asm volatile (" movl sp@+, d1;
>!                       movl sp@+, d0;
>!                       movl sp@+, a1;
>!                       movl sp@+, a0");
>  }
>  #endif
>
>  /* in locore */
>! extern int ptest040 __P((u_int addr, u_int fc));
>  extern int get_pte __P((u_int addr, u_long pte[2], u_short * psr));
>
>  /*
>***************
>*** 2594,2605 ****
>        extern u_int macos_tc;
>
>        if (mmutype == MMU_68040) {
>!               ph = ptest040(addr);
>!               if (!(ph & MMU40_RES))
>!                       return 0;
>
>!               *phys = ph;
>!               mask = 0x00000fff;
>        } else {
>                i = get_pte(addr, pte, &psr);
>
>--- 2582,2596 ----
>        extern u_int macos_tc;
>
>        if (mmutype == MMU_68040) {
>!               ph = ptest040(addr, FC_SUPERD);
>!               if ((ph & MMU40_RES) == 0) {
>!                       ph = ptest040(addr, FC_USERD);
>!                       if ((ph & MMU40_RES) == 0)
>!                               return 0;
>!               }
>
>!               mask = (macos_tc & 0x4000) ? 0x00001fff : 0x00000fff;
>!               ph &= (~mask);
>        } else {
>                i = get_pte(addr, pte, &psr);
>
>***************
>*** 2633,2639 ****
>                 */
>                mask = (1 << (32 - numbits)) - 1;
>        }
>!       *phys = (ph & ~mask) | (addr & mask);
>
>        return 1;
>  }
>--- 2624,2630 ----
>                 */
>                mask = (1 << (32 - numbits)) - 1;
>        }
>!       *phys = ph + (addr & mask);
>
>        return 1;
>  }
>***************
>*** 2811,2816 ****
>--- 2802,2813 ----
>                         */
>                        check_video("LC video (0x50f40000)",
>                                        512 * 1024, 512 * 1024);
>+               } else if (0x50100100 <= videoaddr && videoaddr < 0x50400000) {
>+                       /*
>+                        * Kludge for AV internal video
>+                        */
>+                       check_video("AV video (0x50100100)", 1 * 1024 * 1024,
>+                                               1 * 1024 * 1024);
>                } else {
>                        printf( "  no internal video at address 0 -- "
>                                "videoaddr is 0x%lx.\n", videoaddr);
>***************
>*** 2837,2851 ****
>         * Be careful as we assume that no registers are clobbered
>         * when we call this from assembly.
>         */
>!       asm("movl a0, sp@-");
>!       asm("movl a1, sp@-");
>!       asm("movl d0, sp@-");
>!       asm("movl d1, sp@-");
>
>        /* printf("*"); */
>
>!       asm("movl sp@+, d1");
>!       asm("movl sp@+, d0");
>!       asm("movl sp@+, a1");
>!       asm("movl sp@+, a0");
>  }
>--- 2834,2848 ----
>         * Be careful as we assume that no registers are clobbered
>         * when we call this from assembly.
>         */
>!       asm volatile (" movl a0, sp@-;
>!                       movl a1, sp@-;
>!                       movl d0, sp@-;
>!                       movl d1, sp@-");
>
>        /* printf("*"); */
>
>!       asm volatile (" movl sp@+, d1;
>!                       movl sp@+, d0;
>!                       movl sp@+, a1;
>!                       movl sp@+, a0");
>  }
>Index: mac68k/pmap_bootstrap.c
>===================================================================
>RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/pmap_bootstrap.c,v
>retrieving revision 1.29
>diff -c -r1.29 pmap_bootstrap.c
>*** pmap_bootstrap.c    1996/10/15 06:41:48     1.29
>--- pmap_bootstrap.c    1996/12/31 06:10:09
>***************
>*** 570,576 ****
>        oldROMBase = ROMBase;
>        mac68k_vidphys = videoaddr;
>
>!       if ((tc & 0x80000000) && (mmutype == MMU_68030)) {
>                if (mac68k_machine.do_graybars)
>                        printf("Getting mapping from MMU.\n");
>                (void) get_mapping();
>--- 570,577 ----
>        oldROMBase = ROMBase;
>        mac68k_vidphys = videoaddr;
>
>!       if (((tc & 0x80000000) && (mmutype == MMU_68030)) ||
>!           ((tc & 0x8000) && (mmutype == MMU_68040))) {
>                if (mac68k_machine.do_graybars)
>                        printf("Getting mapping from MMU.\n");
>                (void) get_mapping();