ô iAPX; Show CPU/NPX Profile and test 'em õ Copyright 1986-94 by Chris Lueders Version 1.22 For noncommercial use and distribution See file LICENSE.DOC for license info This doc file and related material (at least the IAPX.COM file) was written by Chris Lueders. Feel free to contact me whenever you like to. Try one of the following ways: via FidoNet : Chris Lueders @ 2:2453/30 via Internet : chris@rhein.de via Support BBS : Zaphods BBS, +49-228-262894 V32b/HST +49-228-9111041 ISDN X75 Please call me if you have problems with special items or special boards you used for running this software. Please call me if you have further suggestions for future versions, too. *** WARRANTY *** Absolutely none. THE AUTHOR AND HIS ACCOCCIATES SHALL NOT BE HELD RESPONSIBLE FOR ANY DAMAGES, LIABILITY, OR LOSS OF REVENUE DUE TO THE USE OR INABILITY TO USE THIS PROGRAM. THIS INCLUDES, BUT IS NOT LIMITED TO, ANY INTERRUPTION OF SERVICE, LOSS OF BUSINESS OR ANTICIPATORY PROFITS, OR CONSEQUENTIAL DAMAGE RESULTING FROM THE USE OF THIS PROGRAM. IN AREAS WERE SUCH LIMITATIONS ARE NOT LEGAL THIS PROGRAM IS NOT LICENSED FOR USE. *** DISCLAIMER *** This program is a processor testing tool. Therefore it messes around with the CPU as it likes. PLEASE BE AWARE THAT THIS CAN TRASH YOUR SYSTEM. To prevent loss of data, ENSURE DISK CACHES TO BE WRITTEN TO DISK PRIOR TO START THIS PROGRAM! We tried to take any precaution, but we can take NO WARRANTY that this tool will run correctly and won't crash your machine. Herewith you have been warned ... ====== 1 - What's that small program for? Do I need it? =================== OF COURSE ! You may think "What program may this be with it's dox four times as big as the executable?". I'll try to tell you. iAPX is a program designed for showing you some data and internals of your computer. You may use it in case you buy or sell a computer to check the CPU and/or NPX for type, clock ratings and known bugs. The "normal" use may be one of the following: 1. You meet a friend, who has a new machine, but doesn't know anything about it. You like to get some infos, but forgot your computer hardware technician service kit. So, just run this small program instead of working on the hardware. Some folks won't let you open their computer, so this method is much more "user friendly" It's not only faster; it's even more neat and will discover some results that you can't get staring at the hardware yourself. 2. You want to buy a new computer (or only a board). You neither trust the company that sells the boards, nor the chips themselves. As you intend to run Novell Netware 386 on this machine, you want to know if this CPU has some of the known errors even Netware checks for. Solution: simply start iAPX and it'll test the CPU for all known (at least to me) bugs. If all is correct, you may (more) safely purchase this board. If not, I highly recommend not to buy this board. iAPX has 3 commandline switches (say: "Wow!"): ô iAPX; Show CPU/NPX Profile and test 'em; MS-DOS Vsn for IBM/PC õ V1.22, chris@rhein.de 86-94; S/N 941011:1135; DOS 2.00; ... Commandline syntax : iAPX [?][p][r] ? - This screen P - Pause after each page of screen output R - Reset to get CPU ID/Rev; use with caution! This option is somewhat nasty; ENSURE DISK CACHES TO BE WRITTEN TO DISK !! Thanx to Bob Smith from Qualitas, Inc. I got some help from ... Refer to the documentation for more information. This is the output of the "?" switch. The "P" switch will pause the output before it scrolls off your screen. The "R" switch enables CPU RESET to kick the ID/Rev value out of it ... See later chapters in this doc on this topic. A typical call of iAPX looks like this (done on one of my machines with the "R" option enabled): ô iAPX; Show CPU/NPX Profile and test 'em; MS-DOS Vsn for IBM/PC õ V1.22, chris@rhein.de 86-94; S/N 941011:1135; DOS 2.00; ... - Main Processor : Intel 386 DX Clock rate 1 : 40.1 MHz Clock rate 2 : 40.4 MHz - Check CPU bugs : POPA : FAILED - Int_Desc_Table : Limit=03ff, Base=00000000 Glob_Desc_Table : Limit=0010, Base=000de828 Flags : PE MP EM IOPL ET 0 0 0 3 1 - Number Cruncher : none - BIOS CPU ID/Rev : not supported Reset ID/Rev : 0308 that is : 386 DX, Step D1 See the next section for details on every single line. (I'd like to mention, that this machine is the only type of 386 based computer i've ever met, that had NO bug. ;-)) ====== 2 - What do these lines of output suggest to me? ==================== Ok, we'll look at each line seperately and i'll try to explain the contents and meaning of each of them. ------ 2.1 - Main Processor ------------------------------------------------ Guess what - this is the type of CPU you use. iAPX has the ability to check for the following types: - Intel 8088 - Intel 80286 - Intel 8086 - Intel 80386 SX - NEC V20 - Intel 80386 DX - NEC V30 - Intel 80486 SX - Intel 80188 - Intel 80486 DX - Intel 80186 The measurements of clock rating, the selection of appropriate CPU tests, and the display of CPU infos is based on this type check. If there were an error in these routines it would likely mess up all other parts of the output (and possibly your whole system as well). Note, that iAPX cannot determine if you're using a 486 DX or a 486 SX with 487 SX attached. This is because the 487 SX is a full 486 DX, and the 486 SX is disabled if a 487 SX is active and running. (You can plug it out (at your own risk, buddy) and the system is still running !!). If iAPX mentions you were using an 486 SX, the NPX failed responding. ------ 2.2 - Clock ratings ------------------------------------------------- iAPX tries to measure the rating of the clock that drives your CPU and/or NPX. This is, unfortunately, not an easy task, so I decided to implement two indepentent tests to check for this value. Don't be worried about *two* rates; they both describe the same clock. I personally think that test no. 1 is the better method of measurement, and I intend to remove the second test in future versions. If you discover big differences between these two values, please let me know; and please tell me further, what type of CPU you are running and what environment was active while testing (QEMM, DV, Windows (what mode?), OS/2 (version? mode?), &c). The measurement of the clocks is VERY nasty if you use one of the newer clone CPUs by AMD, C&T or something like that, because these CPUs look like an Intel, work like an Intel, but they're faster. So *IF* you're using such an CPU i'd appreciate an output of iAPX to get the timings of these newer releases. ------ 2.3 - Test CPU for known bugs --------------------------------------- There are several known bugs in the Intel CPU's running in the computers of the world (and even in the clones such as them coming from AMD). I thought it could be very interesting (e.g. if you buy a board or a whole machine, see above) if the processor is one of the many buggy versions still for sale today. For example, three of four tested 386 machines in my office had the POPA bug. Hopefully the most compilers will generate "CPU bug tolerant" code, but if not.. it might hang! The errors I try to diagnose mostly relate to a special CPU type (e.g. 80386), but I'm testing every CPU for proper operation if the intruction set gives me the possibility to do so. 2.3.1 - IDIV [mem] This was a bug in an early version of the 80186. The processor faulted, if you tried to IDIV with a negative divisor in memory (and not in a register). So far, I never discovered a CPU that messed up with this test (I must admit I never met a 80186 in person :-). 2.3.2 - REP [instr] This was also a bug in one of the early versions of the 80186 pro- cessor. If the CPU got a HOLD signal while working in a REP [instr] cycle, it served the HOLD and afterwards "forgot" to take up it's work with the REP again. Never found a faulty CPU till now. 2.3.3 - POPA Very common bug in 386 machines. I've tested that on 12 machines, 10 of which were faulty! It seems this bug has been fixed only in recentl 386SX versions (all 386DX i got sofar are bad; even AMD chips). Symptoms: Sometimes the processor messes up the AX register after a POPA instruction, which depends on the next opcode you give it to eat. To fix any problems with this instruction, simply put a NOP instruction after the POPA. After that it'll work out fine. If you try this one on a buggy CPU, it will mess up your AX register: mov ax,1234h mov bx,0 mov di,0 pusha popa mov cx,[bx+di] That's by no means an odd or unusual sequence of instructions. What's more, the 'mov cx, ...' operation is done correctly. It's the 'popa' which fails. See IAPX.DAT for the original data i based my tests on. It seems to me, that not only 32-bit but also 16-bit operations will cause this problem. iAPX only checks for this bug using the 16-Bit version to be also able to test 186/286 CPUs. 2.3.4 - 16-Bit MUL and 32-Bit MUL Less common error, but may encounter. This was a bug in the early versions of the 386 DX processor. I never got one of these buggy units, but even Novell does this kindo check and won't operate if it's discovered. See IAPX.DAT for further information. 2.3.5 - 32 Bit STOSB I heard that the 32bit STOSB instruction has some problems sometimes. It may not correctly increment the high word of the EDI register. Until now i didn't find a faulty CPU. 2.3.6 - BSWAP In one of the german computer magazines it was rumoured that the BSWAP instruction on 486 does not work correctly and only would swap one half down but forget to swap the other half down. So we check this as well. 2.3.7 - CMPXCHG I read about the CMPXCHG instruction yielding an INT 6 (invalid opcode) on some CPU's. ------ 2.4 - Further information on some CPU registers --------------------- It may be interesting for you (e.g. if you intend to write some nasty .ASM programs like this one), where some system tables are hidden and how the setting of the CPU flags is. This output shows them: Int_Desc_Table : Limit=07ff, Base=00115c48 This is the adress and length of the Interrupt-Descriptor-Table. Most users think it's located at 0:0 even if they use QEMM or something similar, but that's wrong. Glob_Desc_Table : Limit=028f, Base=00116448 Address and Length of the Global-Descriptor-Table. Flags : PE MP EM IOPL ET 0 0 0 3 1 Some of the "static" system flags. It may be useful to take a look at these if you have problems with some sort of programs, e.g. NPX sensitive software. - PE bit: Protect Enable. If set, the processor is in protected mode. Though DOS doesn't run in 80286 protected mode, this means a supervisor task (such as QEMM, 386max) has switched the CPU (386 or above) to the V86 (virtual 8086) mode. This mode can emulate various 8086 lookalike tasks at the same time. Normally, only one task is active and this task is DOS. But the V86 mode lets the supervisor task shadow RAM, swap memory and so on. - MP bit: Monitor coProcessor. If set (and TS=1) an exception will be generated if the CPU encounters a WAIT instruction. - EM bit: EMulate coprocessor. If set an exception will be generated each time a coprocessor instruction is going to be executed. With aid of this bit, you can enable a floating point emu- lation. If EM=1, no coprocessor timings will be performed. - ET bit: Extension Type. In former versions of this documentation i mentioned not to know about this bit. Now i got the correct meaning. If set to 0, it means the attached NPX is 16-bit, if set to 1 it's 32-bit. It is (was) used to be able to run 80287 NPX on a 80386 CPU. - IOPL: I/O Privilege Level. Used to control the use of special instructions, memory areas and other protection scemes. Will be 3 under most circumstances, even when PE=0. ------ 2.5 - Numerix Processor --------------------------------------------- This will show you the type of coprocessor the CPU has attached (if any). Note: it's not that easy you might think. You can, for example, use an 80287 together with an 80386, so it may be interesting if there is the "right" coprocessor active. The clock rating of the coprocessor may be interesting too. You can obtain a "fast socket" for your 80287 running on an 80286. This will alter the clock rating of the NPX while retaining the clock rating of the main processor. iAPX also detects NPX software emulations but does not check, if the emulator tries to be 387 compatible or not. ------ 2.6 - Computing the CPU ID and revision ----------------------------- At RESET the DX register of the 386 SX/DX or above will hold a value indicating the type of processor and it's revision. It is not easy to get this data. As described above, you have to issue a RESET to get this info. Unfortunately, RESET is the hardest hit you can do to a CPU. So please be alarmed NOT TO MESS AROUND with this option. I have taken some precautions to prevent system hangs or data corruption. This includes flushing the chache buffers of e.g. HyperDisk 4.50 and above. I, myself, never had problems with this option, but i was told of crashes with e.g. the Intel Inboard. To prevent you and your system from spurious hangs, this test will only be executed if the option "R" (=RESET) is stated at the command line. The output looks like this: - Reset ID/Rev : 2308 that is : 386 SX, Step C I added all decodings I could find for the ID/Rev word and implemented them, but maybe you'll get unknown values. The revisions and steps in Intel processor design usually increase with time. Therefore, higher Revisions (lower byte of DX) indicate newer releases. The known IDs are: 03 - 386 DX 23 - 386 SX 43 - 386 SL 04 - 486 DX/SX AS far as I know, at least all 386 SX before the step C and all 386 DX before step D1 are faulty. If you intend to buy a computer, I suggest not to buy a machine with this CPU revisions. ====== 3 - Program messages ================================================ "!!! Incorrect DOS version." The DOS version is lower than 2.00. This is at least required to run iAPX. "!!! System malfunction." Indicates something unusual went wrong, such as unseccessful memory allocation. " ? WARNING : DesqView detected; ratings are most likely incorrect." " ? WARNING : Windows 3 in 386 enhanced mode detected; ..." If DesqView or Windows 3 in enhanced mode is active, the timings are very incorrect. Kick the multitasker out of your memory and start the program again to get exact results. "Stand by ..." System timings and measurements are performed. Should only last about 0.2 seconds. If it hangs, please let me know. Tell me *ALL* about your system (type, speed, software, OS ...) " ? WARNING : 8253 not responding correctly or interrupt failure; no timings performed." The test on the presence of the 8253 timer chip and the timer tick interrupt failed. Should not occur on proper boards. Check your setup and hardware. "Timer Interrupt in loop ?" While in a timing loop, an interrupt occured. This will abort iAPX immediately. Try to reboot your system as soon as possible to ensure stable operation. "Press key to continue ..." You're prompted to press any key you like to start screen scrolling again. After that, the message will disappear. "Overflow" An register overflow was detected. Suggests a fault in this program. Please inform the author about this and include the register dump iAPX produces in such occasions and the version of iAPX. " ? WARNING : CPU is in protected mode; cannot reset." This indicates that the CPU may not be tested at this time, because a supervisor task has full control over the CPU. Remove supervisory software (QEMM386, 386MAX, etc.), reboot and try again. "Reset ..." If you're able to read this message, your mashine is already dead. It will be cleared immedeately after the RESET operation has succeeded. " ? WARNING : A20 gate activation failed; cannot reset." To issue a RESET to get the CPU ID/Rev the A20 gate must be active (that is, memory above 1Mb must be adressable). The attempt to active this gate failed. " ? WARNING : A20 reinitialization failure; REBOOT ASAP!" After RESET iAPX was unable to reset the A20 gate to the old setting. THIS MAY BE VERY DANGEROUS! Reboot your machine as soon as possible! ====== 4 - Technical notes ================================================= iAPX was (you guessed it) written in Assembler, compiled with Micro- soft's MASM 5.10, linked with MS-LINK 5.10 and edited with M 1.00. Debugging was performed with NU-MEGA's Soft-ICE 2.50, CodeView and AFD-Pro. By now it consists of 3000 lines handmade assembler code (and is only about 6kb big after assembly! Try this with Windows SDK!) WARNING! The program may fault on machines that are not 100% IBM- compatible. Very important are the ports for the 8259 (interrupt- controller) and 8253 (timer-chip). ====== 5 - Epilogue ======================================================== Thanx a lot to the following people for their assistance, wise advices and betasites: Martin Winkler, Uwe Engelmann, Stefan Rieck, Torsten Harling, Kalle Braun, Ralf Pradella, Lars Bergengruen, Bjoern Schoof, Alexander Bell, Mario Gongolsky, Yousuf Khan, vg@sai1.stollmann.de (Volkmar Grote), harald.feldmann@almac.co.uk (Harald Feldmann) and all people, which I forgot to mention. Beta testing was performed at the following sites: - The Ultimate Collection - Freak Out - The most down point in Germany - Dr. Clone's human experimental lab (hit by a 'HOLD MAIL' spell) - Anthem - comma GmbH, Bonn/FRG The latest non-beta versions of this program may be obtained using a file request with magic 'IAPX' at 2:2453/30 @ fidonet. ====== 6 - End of file ===================================================== Thanx for using iAPX and for reading this. Please distribute and share it with others! /chris/