LOADALL

LOADALL is the common name for two different, undocumented machine instructions of Intel 80286 and Intel 80386 processors, which allow access to areas normally outside of the IA-32 API scope, like descriptor cache registers. The LOADALL for 286 processors is encoded 0Fh 05h, while the LOADALL for 386 processors is 0Fh 07h.[1]

Both variants – as the name implies – load all CPU internal registers in one operation. LOADALL had the unique ability to set up the visible part of the segment registers (selector) independently of their corresponding cached part, allowing the programmer to bring the CPU into states not otherwise allowed by the official programming model.

As an example of the usefulness of these techniques, LOADALL can set up the CPU to allow access to all memory from real mode, without having to switch it into protected mode (the so-called "unreal mode"). Programs such as the RAMDRIVE and HIMEM drivers in MS-DOS, AboveDisk (a commercial package by Above Software that converted hard disk or extended memory into expanded memory), and OS/2 used LOADALL. Examination of the virtual-machine monitor code in Windows/386 2.1 shows that it uses both the 286 and the even less known 386 variant. Microsoft's HIMEM.SYS version 2.06[2] also used LOADALL to quickly copy to and from extended memory on 286 systems.

Another interesting usage of LOADALL, laid out in the book The Design of OS/2,[3] would have been to allow running former real-mode programs in 16-bit protected mode, as utilized by Digital Research's Concurrent DOS 286 since 1985,[4] as well as FlexOS 286 and IBM 4680 OS since 1986/1987. Marking all the descriptor caches in the GDT and LDTs "not present" would allow the operating system to trap segment-register reloads, as well as attempts at performing real-mode–specific "segment arithmetic" and emulate the desired behavior by updating the segment descriptors (LOADALL again). This "virtual 8086 mode" for the 80286 was, however, too slow to be practical. The idea had to be mostly discarded, furthermore, due to errata in some early Intel 80286 processors before the E-2 stepping.[4][5] As a result, OS/2 1.x – and Windows in "standard" mode as well – had to run DOS programs in real mode. Nevertheless, the idea was not lost; it led Intel to introduce the virtual mode of the 80386, allowing the implementation of "DOS boxes" at last in a relatively efficient and documented way.

Because LOADALL did not perform any checks on the validity of the data loaded into processor registers, it was possible to load a processor state that could not be normally entered, such as using real mode (PE=0) together with paging (PG=1) on 386-class CPUs.[6]

As the two LOADALL instructions were never documented and do not exist on later processors, the opcodes were reused in the AMD64 architecture.[7] The opcode for the 286 LOADALL instruction, 0F05, became the AMD64 instruction SYSCALL; the 386 LOADALL instruction, 0F07, became the SYSRET instruction. These definitions were cemented even on Intel CPUs with the introduction of the Intel 64 implementation of AMD64.[8]

In-circuit emulator (ICE) is a tool used for low-level debugging. On Intel 80386, asserting the undocumented pin at location B6 causes the microprocessor to halt execution and enter ICE mode. The microprocessor saves its entire state to an area of memory isolated from normal system memory. The layout of this area is suitable for LOADALL instruction, and this instruction is used by ICE code to return to normal execution.

In later processors, this evolved into System Management Mode. In SMM mode, the RSM instruction is used to load a full CPU state from a memory area. The layout of this memory area is similar to one used by the LOADALL instruction.[9] 386-style LOADALL instruction can be executed on 486 too, but only in SMM mode. In later processors, RSM instruction, with a different encoding, took its role.

80286

Opcode 0F05. The instruction reads data from addresses 00800–00866, whatever the content of the segment registers.

Addressnumber of bytesregisterregisterregisterregister
008006not used
008062MSW (machine status word)
0080814not used
008162TR (task register)
008182flags
0081A2IP (instruction pointer)
0081C2LDTR (local descriptor table register)
0081E4x2DS (data segment)SS (stack segment)CS (code segment)ES (extra segment)
008264x2DI (destination index)SI (source index)BP (base pointer)SP (stack pointer)
0082E4x2BXDXCXAX
008364x6ES segment descriptorCS segment descriptorSS segment descriptorDS segment descriptor
0084E4x6GDT, global descriptor tableLDT, local descriptor tableIDT, interrupt descriptor tableTSS, task state segment

Note that the 80286 LOADALL instruction can not be used to switch from protected back to real mode[10] (it can't clear the PE bit in the MSW). However, use of the LOADALL instruction can avoid the need to switch to protected mode altogether.

80386

Opcode 0F07. The instruction loads data from address ES:EDI. It actually uses ES, not the ES descriptor.

Addressnumber of bytesregisterregisterregisterregister
ES:EDI+004CR0, control register 0
ES:EDI+044EFLAGS
ES:EDI+084EIP, instruction pointer
ES:EDI+0C4x4EDI, destination indexESI, source index EBP, byte pointerESP, stack pointer
ES:EDI+1C4x4EBXEDXECXEAX
ES:EDI+2C2x4DR6DR7
ES:EDI+344TR, task state selector
ES:EDI+384LDTR, local descriptor table
ES:EDI+3C4x2GS, extra segmentnot usedFS, extra segmentnot used
ES:EDI+444x2DS, data segmentnot usedSS, stack segmentnot used
ES:EDI+4C4x2CS, code segmentnot usedES, extra segmentnot used
ES:EDI+544x12TSS descriptor, task state selectorIDT descriptor, interrupt descriptor table GDT descriptor, global descriptor table LDT descriptor, local descriptor table
ES:EDI+844x12GS segment descriptorFS segment descriptorDS segment descriptorSS segment descriptor
ES:EDI+B42x12CS segment descriptorES segment descriptor

See also

References

  1. Frank Van Gilluwe, The Undocumented PC, 1994, pages 62–70, ISBN 0-201-62277-7.
  2. "Microsoft HIMEM.sys 2.06 source code".
  3. Deitel, H. M. (1992). The Design of OS/2. Addison-Wesley. ISBN 0-201-54889-5.
  4. 1 2 Edward Foster (13 May 1985). "Super DOS awaits new 80286 – Concurrent DOS 286 – delayed until Intel upgrades chip – offers Xenix's power and IBM PC compatibility". InfoWorld. InfoWorld Media Group. 7 (19): 17–18. ISSN 0199-6649.
  5. Edward Foster (26 August 1985). "Intel shows new 80286 chip – Future of DRI's Concurrent DOS 286 still unclear after processor fixed". InfoWorld. InfoWorld Media Group. 7 (34): 21. ISSN 0199-6649.
  6. Frank Van Gilluwe, The Undocumented PC, 1994, page 69, ISBN 0-201-62277-7.
  7. "LOADALL Strikes Again". OS/2 Museum. 18 October 2013. Retrieved 27 January 2016.
  8. "Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2B" (PDF). Intel Corporation. December 2015. Retrieved 27 January 2016.
  9. "Intel's System Management Mode".
  10. Slater, Michael (October 1987). "Secret 286 LOADALL instruction allows access to extended memory in real mode". Microprocessor Report.
This article is issued from Wikipedia - version of the 11/8/2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.