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();