home *** CD-ROM | disk | FTP | other *** search
/ Hacks & Cracks / Hacks_and_Cracks.iso / vol1 / 686.zip / 6X86OPT.TXT < prev    next >
Text File  |  1997-03-18  |  25KB  |  504 lines

  1.                         
  2.                     =====================================
  3.                                    6x86opt
  4.                     Cyrix/IBM/ST 6x86 processor optimizer
  5.                     =====================================
  6.                        v0.77 (c) Mikael Johansson 1997
  7.                        Unregistered ShareWare version!
  8.  
  9.     
  10.     *WHAT THIS PROGRAM DOES*
  11.     ------------------------
  12.     This program optimizes the Cyrix/IBM/ST 6x86 (M1) processor.
  13.  
  14.     
  15.     *HOW IT DOES IT*
  16.     ----------------
  17.     By setting the appropriate configuration bits on the CPU to their
  18.     appropriate values.
  19.         Details on which bits are set are (very surprisingly) found in the
  20.     section *WHICH BITS ARE SET*
  21.  
  22.     It can also set up a special address region configuration for the Linear
  23.     Frame Buffer. When enabling Write Gathering for the LFB, writes to it get
  24.     sped up from 2 to 8 times.
  25.  
  26.  
  27.     *USING THE PROGRAM*
  28.     -------------------
  29.     6x86opt can be invoked without any parameters for default optimization.
  30.  
  31.     You can also define fourteen different command line parameters:
  32.  
  33.         -config (-c) ; Execute the configuration file 6x86opt.cfg instead of
  34.                        then default optimization.
  35.  
  36.         -x           ; Set bit 1 in DBR0. See the topic *REDUCED PERFORMANCE*
  37.  
  38.         -FLOP   (-F) ; Fast Loop. Will unset the SLOP bit (CCR5:1).
  39.  
  40.         -linbuf (-l) ; Searches for a Linear Frame Buffer and tries to define
  41.                        an ARR/RCR for it allowing Write Gathering.
  42.  
  43.         -manbuf (-m) ; Same as above, but the LFB address and size must be
  44.                        given like -manbuf:ADDR,SIZE. ADDR and SIZE in MB.
  45.  
  46.         -killbuf(-k) ; Clears the ARR and RCR that previously has been set up
  47.                        for the LFB. You can either let 6x86opt find the LFB
  48.                        itself, or tell it the address or ARR nr. manually:
  49.                        -killbuf or -killbuf:ADDR or -killbuf:ARR
  50.  
  51.         -justbuf(-j) ; When defined, only LFB related parameters are checked,
  52.                        and no optimization is done. Doesn't do anything on
  53.                        itself.
  54.  
  55.         -ARR0+1 (-A) ; Set up ARR/RCR 0 and 1 to recommended values, i.e
  56.                        video buffer and device/system ROM space. 
  57.  
  58.         -nowb   (-n) ; Do not enable caching and WriteBack. Note that this
  59.                        parameter doesn't disable these, just leaves them be.
  60.  
  61.         -defbtb (-d) ; Do not change the BTB configuration.
  62.  
  63.         -susphlt(-s) ; Set the SUSP_HLT bit (CCR2:3).
  64.  
  65.         -verbose(-v) ; Missä mennään. Shows what the program does during
  66.                        execution.
  67.  
  68.         -peek   (-p) ; Does not change anything, just shows the bit states,
  69.                        and the LFB and Video Memory size.
  70.  
  71.         -force  (-f) ; Forces execution of the program even if 6x86opt does
  72.                        not detect a 6x86 CPU. Can cause undefined behaviour.
  73.  
  74.         The parameters in parentheses are abbreviations for the parameters.
  75.     If an unknown parameter is defined on the command line, 6x86opt will show
  76.     some info about itself.
  77.  
  78.         NOTE! The processor is restored to default state on system reset. So 
  79.     it is probably a good idea to invoke 6x86opt from your AUTOEXEC.BAT file,
  80.     or your Startup Folder.
  81.  
  82.  
  83.     *THE LINEAR FRAME BUFFER AND THE -linbuf AND -manbuf PARAMETERS*
  84.     ----------------------------------------------------------------
  85.     As the Linear Frame Buffer defined by the VESA 2.0 standard is located
  86.     outside the area of physical memory, the 6x86 has all memory access to
  87.     this area defaulted at poorest performance. To increase the performance
  88.     of the LFB, an ARR and a corresponding RCR can be set up for it, allowing
  89.     Write Gathering. When WG is enabled, multiple writes to sequential 
  90.     addresses are gathered and issued in one write cycle. The buffer is 64
  91.     bits wide, so for example 4 word writes are written in one cycle instead 
  92.     of four. Of course only applications that use the LFB, like Quake, get 
  93.     a performance increase from this.
  94.  
  95.         When the -linbuf parameter is defined, 6x86opt will automatically
  96.     search for the LFB and the size of your Video Card memory, which also
  97.     is the size of the LFB. It will then search the ARR:s to see if an ARR 
  98.     already is set at this address. If not, it will try to find an empty
  99.     (zero-size) ARR. When it has decided what ARR to program it will do this.
  100.     The RCR will be set with the bits WG and RCD (Region Cache Disable).
  101.  
  102.         If 6x86opt has problems setting up an ARR, a warning message will be
  103.     shown. The optimization process will continue, but the exit code will be
  104.     2.
  105.  
  106.         If 6x86opt fails to detect your LFB or Video Memory correctly, or if
  107.     you for example want to define a region before loading a VESA 2.0 driver,
  108.     you can manually define it with the parameter -manbuf. The format is:
  109.     -manbuf:ADDR,SIZE where ADDR and SIZE must be given in megabytes. If your
  110.     Video Card has less than 1 MB of memory, you still must give this as a 
  111.     minimum size. This should not cause any problems. If your LFB is located
  112.     at 3584 MB and you have a video card with 2 MB of RAM, the -manbuf
  113.     declaration would be: -manbuf:3584,2 (or -m:3584,2).
  114.  
  115.         If you get a warning message complaining that the Address is not a
  116.     multiple of the Block Size, you should reconfigure the LFB Address so 
  117.     that it is. This is a requirement of the 6x86 CPU.
  118.  
  119.         If -linbuf fails in detecting the environment correctly, tell me
  120.     about it!
  121.         
  122.         NOTE 1: If you have several -manbuf parameters on the command line,
  123.     only the _last_ will be processed. 
  124.  
  125.         NOTE 2: -linbuf is executed before -manbuf, so if -manbuf defines the
  126.     same address, but different size, the -manbuf definition will prevail.
  127.  
  128.         NOTE 3: Only so much checking of the ADDR and SIZE definitions of
  129.     -manbuf is done so that 6x86opt will not (should not:) crash. Be careful
  130.     in defining the right values for these.
  131.     
  132.     
  133.     *REMOVING THE LINEAR FRAME BUFFER SPEED UP WITH THE -killbuf PARAMETER*
  134.     -----------------------------------------------------------------------
  135.     You might want to remove the LFB speed up settings, if you for example
  136.     remove your VESA 2.0 driver, or are going to use Windows 3 (Sometimes
  137.     problems occur with this combination!). -killbuf is here to help you.
  138.  
  139.         Invoke 6x86opt with the -killbuf parameter to reset the ARR/RCR that
  140.     was setup for LFB space. You have 2 main alternatives:
  141.  
  142.         1) Use the automatic -killbuf. To do this, you must still have the
  143.            LFB enabled. 6x86opt will detect it, and clear the ARR/RCR. Just
  144.            write -killbuf (or -k) on the command line.
  145.  
  146.         2) Use the manual -killbuf. If you already have disabled the LFB, or
  147.            if 6x86opt just won't detect it correctly, you can either specify
  148.            the Starting Address of the LFB, or what ARR/RCR was setup for the
  149.            LFB. Use the parameter format -killbuf:ADDR (ADDR in MB) or then
  150.            -killbuf:ARR. 6x86opt will interpret a value after the ':' as the
  151.            ARR if the value is below 7, otherwise as the Starting Address.
  152.  
  153.         If some problems are encountered, you will see a WARNING! message
  154.     materializing on your screen.
  155.  
  156.  
  157.     *THE -ARR0+1 PARAMETER*
  158.     -----------------------
  159.     When the parameter -ARR0+1 (or -A) is defined on the command line,
  160.     6x86opt will set up these registers to the recommended values, so that
  161.     ARR/RCR0 defines the VGA video buffer, and ARR/RCR1 defines device/system
  162.     ROM space.
  163.  
  164.         The reason why this is not set by default, is that some BIOS might
  165.     already have set up these regions, but at other addresses, and now uses
  166.     ARR0 and ARR1 for other purposes. I recommend that you try this switch
  167.     and see if you can detect a speed increase.
  168.         For exact definition on how these are set, see 6X86SET.TXT.
  169.  
  170.  
  171.     *USING THE 6X86OPT.CFG CONFIGURATION FILE WITH -config*
  172.     -------------------------------------------------------
  173.     You can instead of the default optimization let 6x86opt execute a config
  174.     file generated by 6x86set. Just define the -config (or -c) parameter at
  175.     the command line. The config file holds information on how to set all
  176.     the bits on the system, that 6x86set can handle.
  177.  
  178.         Note that the config file _must_ be named 6x86opt.cfg, and be in the
  179.     same directory as 6x86opt. (Actually the name of the config file must be
  180.     *.cfg, where * is the name of 6x86opt). If 6x86opt can not find the
  181.     configuration file, or detects that the file is damaged, it will show
  182.     a Warning! message. A damaged file will not be processed to any extent.
  183.     
  184.         For more info on creating a config file, use 6x86set:s on-line help.
  185.     Also see the file 6X86SET.TXT
  186.  
  187.  
  188.     *REDUCED PERFORMANCE AND THE -x PARAMETER*
  189.     ------------------------------------------
  190.     If running 6x86opt gives a decrease in performance you should give the
  191.     -x command line parameter to 6x86opt when executing it. When defined,
  192.     bit 1 of DBR0 will be set, and a performance increase should result.
  193.         Some systems need to have this parameter defined. Also other systems
  194.     can benefit from setting this bit. But as the documentation for the bit 
  195.     (along with other whole registers) is only available to specific OEM 
  196.     partners of Cyrix and IBM, I do not (yet) know exactly what it does. 
  197.     Therefore it is not included in the default optimization process.
  198.         Feedback of experiences with this is very welcome!
  199.         
  200.     
  201.     *WINBENCH PROCESSOR SCORES*
  202.     ---------------------------
  203.     The processor suites in WinBench gives different results every test run, 
  204.     and the second run is usually poorer than the first. To get reliable 
  205.     results, run these (and other) testsuites right after booting the system
  206.     with either unoptimized or optimized configuration. You will find that
  207.     the processor tests are not affected noticeably, as these tests 
  208.     apparently has no use of the optimized settings. Graphics scores should
  209.     increase. So, the performance increase is dependent on the application. 
  210.         The performance increase is also dependent on how the BIOS sets the
  211.     bits on boot. If the BIOS "sets'em all" itself there can of course be no
  212.     improvement. I have not heard of any such systems. BIOS:es that does not
  213.     support the 6x86 very well will have the highest improvement. In no case
  214.     should 6x86 decrease overall performance (see previous topic).
  215.         And to my knowledge there is no way that the speed up of the LFB
  216.     would have opposite effect. So if you for some reason only want to use
  217.     this, you can define the -justbuf parameter on the command line.
  218.  
  219.  
  220.     *SHAREWARE*
  221.     -----------
  222.     As from v0.76, the 6x86opt package is ShareWare. This is mainly because
  223.     I thought I would see if I can get enough registrees so that I can go
  224.     and support Microsoft by buing some NT development tools. By now I have
  225.     also improved 6x86opt way beyond my original need to have two bits on my
  226.     CPU set. So if you like the package (or some parts of it :-), please
  227.     register!
  228.         For detailed information on this, see the file REGISTER.NOW
  229.  
  230.         The files included in this package are:
  231.  
  232.         6X86OPT.EXE 34000 bytes  6x86opt, the optimizer
  233.         6X86OPT.TXT 24917 bytes  This textfile
  234.         6X86SET.EXE 87840 bytes  6x86set, the setup utility
  235.         6X86SET.TXT  3995 bytes  Info on 6x86set
  236.         CPUIDEN.EXE  7024 bytes  CPUID instruction enabler/disabler/toggler
  237.        REGISTER.NOW  3512 bytes  Information on registering the software
  238.         
  239.     
  240.     *CPUIDEN.EXE*
  241.     -------------
  242.     This program toggles/sets/unsets the state of the CPUIDEN bit in CCR4:7.
  243.     When set, the CPUID instruction can be executed. Programs that understand
  244.     this can get additional information about the processor through this
  245.     instruction.
  246.  
  247.         Some programs misinterpret this information, and it might be better
  248.     if these programs are left without the additional info.
  249.  
  250.         Setting the bit causes for example Win95 (before OSR2 == Win95b)
  251.     to identify the CPU as a Pentium (which is not necessarily a bad thing).
  252.     For this CPUIDEN.EXE should be run from the AUTOEXEC.BAT file.
  253.  
  254.         You could encounter problems by enabling the CPUID instruction, as
  255.     some badly written software could get tempted to execute some Pentium
  256.     specific instructions or functions if they misidentify the 6x86.
  257.  
  258.         When invoked without parameters CPUIDEN toggles the state of the bit.
  259.     The following command line parameters are recognized:
  260.  
  261.         -set   (-s) ; Sets the bit (enables CPUID instruction)
  262.         -unset (-u) ; Unsets the bit
  263.         -force (-f) ; Forces execution even when CPUIDEN does not detect a
  264.                       6x86 CPU.
  265.  
  266.     
  267.     *CONTACTING THE AUTHOR*
  268.     -----------------------
  269.     If you encounter any bugs in the program, have some suggestions, or 
  270.     especially if you know of any other optimization tricks for the 6x86, I 
  271.     would like to receive mail from you. All info about the undocumented
  272.     registers is greatly appreciated (performance affecting or not)!
  273.         
  274.         e-mail:
  275.             mpjohans@kumpu.helsinki.fi
  276.             or:
  277.             Mikael.Johansson@helsinki.fi
  278.  
  279.         Postman Pat employing mail:
  280.             Mikael Johansson
  281.             Kitarakuja 3C 220
  282.             00420 Helsinki
  283.             FINLAND
  284.  
  285.  
  286.     *WHICH BITS ARE SET*
  287.     --------------------
  288.     The following bits are set:
  289.  
  290.     bit     | reg:bit | why
  291.     ------------------------------------------------------------------------
  292.     NO_LOCK | CCR1:4  | "With NO_LOCK set, previously noncacheable locked
  293.             |         |  cycles are executed as unlocked cycles and,
  294.             |         |  therefore, may be cached. This results in higher 
  295.             |         |  CPU performance."
  296.             |         | The reason the bit is not set as default is because
  297.             |         | software that requires locked cycles might exist. I
  298.             |         | have never had any problems with this. 
  299.     ------------------------------------------------------------------------
  300.     WL      | RCR7:2  | This one is related to the one above. It enables 
  301.             |         | weak locking for the memory region specified by  
  302.             |         | ARR7, i.e. all memory. I am not sure if this is
  303.             |         | necessary, as my benchmark results vary. It does no
  304.             |         | harm however.
  305.     ------------------------------------------------------------------------
  306.     DTE_EN  | CCR4:4  | "DTE_EN allows Directory Table Entries (DTE) to be
  307.             |         |  cached on the 6x86 microprocessor. This provides a
  308.             |         |  performance improvement for some applications that
  309.             |         |  access and modify the page table frequently."
  310.     ------------------------------------------------------------------------
  311.     WT_ALLOC| CCR5:0  | "Write Allocate (WT_ALLOC) allows L1 cache write 
  312.             |         |  misses to cause a cache line allocation. This
  313.             |         |  feature improves the L1 cache hit rate resulting
  314.             |         |  in higher performance especially for Windows
  315.             |         |  applications."
  316.     ------------------------------------------------------------------------
  317.     IORT2-0 | CCR4:2-0| I/O Recovery Time. Defines the minimum time between
  318.             |         | I/O port accesses. Set to 111 == no delay.
  319.     ------------------------------------------------------------------------
  320.     SUSP_HLT| CCR2:3  | If this bit is set, the HLT instruction causes the
  321.             |         | CPU to enter low power suspend mode. This works OK
  322.             |         | at least running Linux, doesn't affect DOS. Maybe
  323.             |         | also OS/2 can make use of it. Doesn't affect
  324.             |         | performance. Only set when -susphlt is defined!
  325.     ------------------------------------------------------------------------
  326.         All quotations above are taken from the "IBM 6x86 Microprocessor 
  327.         BIOS Writer's Guide", Document #40205
  328.     
  329.  
  330.     The following bits are unset:
  331.  
  332.     bit | reg:bit | why 
  333.     ------------------------------------------------------------------------
  334.     CD  | CR0:30  | When 'Cache Disable' is set, the cache is disabled(!) 
  335.         |         | Naturally the cache should be enabled. I do not believe 
  336.         |         | that this bit is ever set, but you never know.
  337.     ------------------------------------------------------------------------
  338.     NW  | CR0:29  | When 'No Write Back' is set, the L1 cache operates in 
  339.         |         | Write Through mode. By unsetting the bit the cache 
  340.         |         | strategy will be set to Write Back.
  341.     ------------------------------------------------------------------------
  342.         The above bits are not affected if the -nowb parameter is defined
  343.  
  344.     bit  | reg:bit | why
  345.     ------------------------------------------------------------------------
  346.     SLOP | CCR5:1  | Unset to disable the slowdown of the LOOP instruction.
  347.          |         | Only unset if the -FLOP parameter is defined.
  348.     ------------------------------------------------------------------------
  349.  
  350.  
  351.     The following bits are also modified:
  352.  
  353.     bit(s) | reg:bit | what and why
  354.     ------------------------------------------------------------------------
  355.     MAPEN  | CCR3:7-4| Set to 0001 during execution to get access to all
  356.            |         | register indexes. Set to 0000 after optimization.
  357.     ------------------------------------------------------------------------
  358.     LOCK_NW| CCR2:2  | Unset so that the NW bit in CR0 can be modified. 
  359.            |         | After optimization it's value is restored.
  360.     ------------------------------------------------------------------------
  361.     ARREN  | CCR5:5  | Unset during execution so that the RCR7 can be safely
  362.            |         | programmed. Restored after optimization.
  363.     ------------------------------------------------------------------------
  364.         
  365.         6x86opt enables the Branch Target Buffer (BTB), configures it to 
  366.     store target addresses for both near and far Change-Of-Flow instructions
  367.     (COFs), and enables it's return stack. See below:
  368.     
  369.  
  370.     The following undocumented bits are modified :
  371.     
  372.     bit(s)  | reg:bit | what and comment
  373.     ------------------------------------------------------------------------
  374.     unknown | DBR0:1  | Will be set if the -x parameter is defined.
  375.     ------------------------------------------------------------------------
  376.     D_FWDBYP| DBR0:5  | Data Forwarding/Bypassing enable
  377.     ------------------------------------------------------------------------
  378.     BTBTR_EN| DBR0:6  | Set to 1 to get access to Test Registers below TR3.
  379.             |         | Unset after optimization. 
  380.     ------------------------------------------------------------------------
  381.     unknown | TR2i5:4 | If set, reduces performance -> will be unset.
  382.     BTB_DIS?| TR2i5:3 | BTB Disable(?) Will be unset.
  383.     RSTK_DIS| TR2i5:2 | BTB Return Stack Disable. Will be unset
  384.     FARH_DIS| TR2i5:1 | BTB Far Hits Disable. Will be unset.
  385.     BTB_DIS | TR2i5:0 | BTB Disable(!) Will be unset.
  386.     ------------------------------------------------------------------------
  387.         If the -defbtb parameter is defined, no BTB related registers are 
  388.         affected. Only bits that I know exactly what they do are explained.
  389.  
  390.     When the -linbuf or -manbuf parameters are defined, 6x86opt tries to set
  391.     up an ARR and RCR for the Linear Frame Buffer, allowing Write Gathering
  392.     for this memory area. See the topic *LINEAR FRAME BUFFER*
  393.     
  394.  
  395.     *FURTHER OPTIMIZATION*
  396.     ----------------------
  397.     It is possible that your system could be sped up even more by toggling
  398.     the right bits to the right states. Mess around with your 6x86 with
  399.     6x86set. But remember that your system might crash by setting the "wrong"
  400.     bits!
  401.  
  402.         You might also want to check some bits that when in the "wrong" state
  403.     decreases performance of your CPU, but that 6x86opt doesn't correct. One
  404.     such bit is SLOP (CCR5:1), which should be 0, but could have been set by
  405.     your system for some reason. 6x86opt doesn't unset it as default, as 
  406.     there could be a very good reason for it to be set. You must define the
  407.     -FLOP parameter for it to be unset. See what happens.
  408.         Also, why not check the ARRs and RCRs with 6x86set.
  409.         Another thing that an interested person might want to check, is that
  410.     if disabling SMM would affect performance (if it does, contact me!).
  411.         And then, just go through the registers with 6x86set, and search for
  412.     bits with comments like "reduces performance if set" and check them.
  413.  
  414.         For more information, see the file 6X86SET.TXT!
  415.  
  416.         And of course, I'm always interested in a setup that outperforms the
  417.     default one!
  418.  
  419.  
  420.     *EXIT CODES*
  421.     ------------
  422.     The following exit codes can be generated:
  423.         0 : 6x86opt (at least thinks it) encountered no problems 
  424.         1 : 6x86opt was invoked with some unknown (or misdefined) parameter
  425.         2 : 6x86opt issued a warning of some kind
  426.         3 : 6x86opt detected a load error while processing the config file
  427.         4 : 6x86opt did not detect a 6x86 CPU
  428.     Any other codes _should_ never be generated.
  429.     
  430.  
  431.     *VERSION HISTORY*
  432.     -----------------
  433.         v0.64 : First released version. (5.11.1996)
  434.  
  435.         v0.64b: Some comments added to the document. (22.11.96)
  436.  
  437.         v0.72 : Command line parameters added.
  438.                 The program now unsets the CD and NW bits in CR0.
  439.                 The document was clarified. (3.12.1996)
  440.  
  441.         v0.73 : Added the -x and -verbose parameters.
  442.                 Some undocumented bits are now modified.
  443.                 Better code. (18.12.1996)
  444.  
  445.         v0.74 : Added the -linbuf, -manbuf and -peek parameters. (15.1.1997)
  446.  
  447.         v0.76 : Added the 6x86set utility.
  448.                 Added the -config, -killbuf -justbuf and -susphlt parameters.
  449.                 Now can set up ARR0 and ARR1 properly with the -ARR0+1 param.
  450.                 Does not set SUSP_HLT as a default anymore. Use -susphlt.
  451.                 Now sets IORT and TR2i5:4 OK.
  452.                 The exit codes got revised.
  453.                 Changed the distribution format from PD to SW. (15.3.1997)
  454.  
  455.         v0.77 : Corrected a bug that set SLOP instead of IORT. (I knew it was
  456.                 a bad idea to have 13 different parameters...)
  457.                 Added the -FLOP parameter.
  458.                 Some typos corrected.
  459.                 
  460.     
  461.     *WHY THIS PROGRAM EXISTS*
  462.     -------------------------
  463.     Because I could find no good optimizer for the processor anywhere. The
  464.     only one I found was IBM:s M1OPT. This program however changes every
  465.     bit in the CCR:s and everywhere else according to some model machine
  466.     of their own. For example all Power Management features are disabled
  467.     even if they are set before. This program also does not set NO_LOCK.
  468.  
  469.  
  470.     *TO BE DONE*
  471.     ------------
  472.     Windows NT support: On hold for now, as the NT development tools were
  473.                         way too expensive for my current budget :-(
  474.                         However, Olivier Gilloire has written a nice tool
  475.                         for all NT owners, 6x86cfg :-) You can get it for
  476.                         example from Bryan Davis very good Cyrix page at
  477.                         www.ionet.net/~rbdavis. 
  478.                             Contact Olivier at: ftiw186420@wanadoo.fr 
  479.                         for more information!
  480.     
  481.     Anything else that sounds good.
  482.     
  483.     
  484.     *SPECIAL THANKS*
  485.     ----------------
  486.     Rich "Doc" Colley. For testing that helped deliver the -x parameter.
  487.     
  488.     Barry Shilliday for finding the SLOP bug so soon.
  489.  
  490.     All that replied to my IDDump project.
  491.  
  492.     Everyone who has sent me mail that helped improve 6x86opt.
  493.  
  494.     
  495.     *THE ULTIMATE HEAVY METAL BAND*
  496.     -------------------------------
  497.     Mercyful Fate
  498.  
  499.     
  500.     *THINGS*
  501.     --------
  502.     You use all files in this package entirely at your own risk.   
  503.     Cyrix and IBM and everyone else have copyright on what they have.
  504.