I recently came across hints suggesting that in the 1987 timeframe, Microsoft contemplated the use of the 386 LOADALL instruction in OS/2. As far as I know, no released version of OS/2 (including the SDK betas) utilized the 386 LOADALL.
But it got me wondering. Did anyone use it in commercial software? And which 386 CPUs support LOADALL?
To be clear, the 386 LOADALL instruction is very similar to its infamous 286 sibling but it’s not compatible (even the opcode is different). On the 286, LOADALL could accomplish things that were not otherwise possible, but on the 386 there is little that LOADALL can do that can’t be done using documented interfaces (and that retail software would want to do).
Robert Collins has an excellent writeup on both LOADALL flavors with lots of details and test programs. The article contains the following rather interesting statement: “Very few people at Intel will acknowledge that LOADALL even exists in the 80386 mask. The official Intel line is that, due to U.S. Military pressure, LOADALL was removed from the 80386 mask over a year ago. However, running the program in Listing-2 demonstrates that LOADALL is alive, well, and still available on the latest stepping of the 80386.”
So LOADALL was supposedly removed from 386s… except it maybe wasn’t. And it was top secret? Further searching revealed a surprising fact: The existence of 386 LOADALL instruction became a matter of public record no later than September 1, 1992 when Compaq’s U.S patent 5,144,551 was published.
The patent contains the following text: “In 1988, Intel announced that it was discontinuing support for the 80386 LOADALL instruction and was going to remove it from the 80386 instruction set. This 80386 instruction was used to emulate the 80286 LOADALL instruction. Like the 80286 LOADALL instruction the 386 LOADALL was undocumented. However, it has not been widely used in application or operating system software.”
Presumably the 1988 Intel announcement wasn’t exactly public. The 1992 patent certainly was. But the obvious questions are: Why would anyone want to use 386 LOADALL, and what CPUs support it?
The answer to the first question can largely be found here. Some versions of OS/2 1.0 and 1.1 unconditionally executed the 286 LOADALL instruction in real mode on AT compatible system. To support OS/2, such systems had to emulate 286 LOADALL in the BIOS. Using 386 LOADALL for the purpose seems obvious, as noted in the quote from the patent. What’s more, a BIOS for a 386 system does not typically worry about non-386 CPUs.
As to the other question, there is no reason to doubt that any older 386s didn’t support LOADALL. But what about the newer ones? Robert Collins claims that “latest steppings” of the 386 (as of 1991?) still support LOADALL.
386 LOADALL Support
The OS/2 Museum tested a selection of Intel and AMD 386DX processors (using Mr. Collins’ utility) and found that indeed, every CPU tested supported LOADALL. That included old B1-step 386s from 1987, various AMD 386s (25/33/40 MHz parts), and it also covered Intel 386s manufactured in 1998 (that’s 98, not 88). 386SX parts were not tested but—lacking evidence to the contrary—are assumed to support LOADALL.
The C&T Super386 also implements LOADALL. It does not quite pass the tests devised by Mr. Collins, but it very likely does enough to support the emulation of 286 LOADALL via 386 LOADALL.
Intel 486 and newer CPUs do not support LOADALL (tested on a old B-step 486 SX308 as well as several newer chips). Perhaps Intel’s 1988 announcement about removing the LOADALL instruction referred to the i486 (1989) and not actual 386 processors. For system software writers it didn’t matter if LOADALL was removed from 386s or not supported in 486s, they just couldn’t use it.
Cyrix 386 upgrades (486DLC) likewise do not support LOADALL. Since these were sold as upgrades for 386 boards, it is more or less a given that the 386 LOADALL instruction was not used in any kind of volume software.
On the other hand, the IBM 486DLC aka Blue Lightning (and presumably 386/486SLC) does support LOADALL, and passes all of the torture tests with flying colors. That’s a proof as good as any that IBM’s clock-tripled DLC is indeed the world’s fastest 386. This was tested on a clock-tripled part.
So far the only 486-socket processor found to support LOADALL is the UMC U5S. Like the Super386, the U5S does not behave quite like a 386 but probably does enough to support typical usage scenarios. Why UMC thought it was worth implementing at all is a question that will probably never be answered.
Compaq’s patent deals with emulating the 286 LOADALL instruction on 386 compatible processors without utilizing 386 LOADALL. It works by switching to protected mode, loading appropriate descriptor values, and switching back to real mode. It is an improvement on the method reportedly suggested by Intel, probably in a confidential document. The LOADALL emulation is not perfect but it is sufficient for all practical purposes.
It should be noted that the original suggestion to use 386 LOADALL to emulate 286 LOADALL also came from Intel in an earlier confidential document (undated).
The whole mess is a consequence of a 286 design defect—the inability to switch from protected back to real mode. It’s something the 286 designers probably considered a feature, but reality disagreed.