| <HTML> |
| |
| <HEAD> |
| <TITLE>INT 15h, AX=E820h - Query System Address Map</TITLE> |
| </HEAD> |
| |
| <BODY> |
| |
| <H1>INT 15h, AX=E820h - Query System Address Map</H1> |
| <HR> |
| |
| Real mode only.<P> |
| |
| This call returns a memory map of all the installed RAM, and of physical |
| memory ranges reserved by the BIOS. The address map is returned by making |
| successive calls to this API, each returning one "run" of physical address |
| information. Each run has a type which dictates how this run of physical |
| address range should be treated by the operating system.<P> |
| |
| If the information returned from INT 15h, AX=E820h in some way differs from |
| <A HREF="#int15e801">INT 15h, AX=E801h</A> or |
| <A HREF="#int1588">INT 15h AH=88h</A>, |
| then the information returned from E820h |
| supersedes what is returned from these older interfaces. |
| This allows the BIOS |
| to return whatever information it wishes to for compatibility reasons.<P> |
| |
| <HR> |
| |
| Input:<P> |
| |
| <pre> |
| EAX Function Code E820h |
| EBX Continuation Contains the "continuation value" to get the |
| next run of physical memory. This is the |
| value returned by a previous call to this |
| routine. If this is the first call, EBX |
| must contain zero. |
| ES:DI Buffer Pointer Pointer to an Address Range Descriptor |
| structure which the BIOS is to fill in. |
| ECX Buffer Size The length in bytes of the structure passed |
| to the BIOS. The BIOS will fill in at most |
| ECX bytes of the structure or however much |
| of the structure the BIOS implements. The |
| minimum size which must be supported by both |
| the BIOS and the caller is 20 bytes. Future |
| implementations may extend this structure. |
| EDX Signature 'SMAP' - Used by the BIOS to verify the |
| caller is requesting the system map |
| information to be returned in ES:DI. |
| </pre> |
| |
| Output:<P> |
| |
| <pre> |
| CF Carry Flag Non-Carry - indicates no error |
| EAX Signature 'SMAP' - Signature to verify correct BIOS |
| revision. |
| ES:DI Buffer Pointer Returned Address Range Descriptor pointer. |
| Same value as on input. |
| ECX Buffer Size Number of bytes returned by the BIOS in the |
| address range descriptor. The minimum size |
| structure returned by the BIOS is 20 bytes. |
| EBX Continuation Contains the continuation value to get the |
| next address descriptor. The actual |
| significance of the continuation value is up |
| to the discretion of the BIOS. The caller |
| must pass the continuation value unchanged |
| as input to the next iteration of the E820 |
| call in order to get the next Address Range |
| Descriptor. A return value of zero means that |
| this is the last descriptor. Note that the |
| BIOS indicate that the last valid descriptor |
| has been returned by either returning a zero |
| as the continuation value, or by returning |
| carry. |
| </pre> |
| |
| <HR> |
| |
| <H3>Address Range Descriptor Structure</H3> |
| |
| <pre> |
| Offset in Bytes Name Description |
| 0 BaseAddrLow Low 32 Bits of Base Address |
| 4 BaseAddrHigh High 32 Bits of Base Address |
| 8 LengthLow Low 32 Bits of Length in Bytes |
| 12 LengthHigh High 32 Bits of Length in Bytes |
| 16 Type Address type of this range. |
| </pre> |
| |
| The <I>BaseAddrLow</I> and <I>BaseAddrHigh</I> together are the 64 bit |
| <I>BaseAddress</I> of this range. The <I>BaseAddress</I> |
| is the physical address of the |
| start of the range being specified.<P> |
| |
| The <I>LengthLow</I> and <I>LengthHigh</I> together are the 64 bit |
| <I>Length</I> of this range. |
| The <I>Length</I> is the physical contiguous length in bytes of a range being |
| specified.<P> |
| |
| The <I>Type</I> field describes the usage of the described address range as |
| defined in the table below.<P> |
| |
| <pre> |
| Value Pneumonic Description |
| 1 AddressRangeMemory This run is available RAM usable by the |
| operating system. |
| 2 AddressRangeReserved This run of addresses is in use or reserved |
| by the system, and must not be used by the |
| operating system. |
| Other Undefined Undefined - Reserved for future use. Any |
| range of this type must be treated by the |
| OS as if the type returned was |
| AddressRangeReserved. |
| </pre> |
| |
| The BIOS can use the AddressRangeReserved address range type to block out |
| various addresses as "not suitable" for use by a programmable device.<P> |
| |
| Some of the reasons a BIOS would do this are:<P> |
| |
| <UL> |
| <LI>The address range contains system ROM. |
| <LI>The address range contains RAM in use by the ROM. |
| <LI>The address range is in use by a memory mapped system device. |
| <LI>The address range is for whatever reason are unsuitable for a |
| standard device to use as a device memory space. |
| </UL> |
| |
| <HR> |
| |
| <H3>Assumptions and Limitations</H3> |
| |
| <UL> |
| <LI><B>1.</B> The BIOS will return address ranges describing base board |
| memory and ISA or PCI memory that is contiguous with that baseboard memory. |
| <LI><B>2.</B> The BIOS WILL NOT return a range description for the memory |
| mapping of PCI devices, ISA Option ROM's, and ISA plug & play cards. This |
| is because the OS has mechanisms available to detect them. |
| <LI><B>3.</B> The BIOS will return chipset defined address holes that are not |
| being used by devices as reserved. |
| <LI><B>4.</B> Address ranges defined for base board memory mapped I/O devices |
| (for example APICs) will be returned as reserved. |
| <LI><B>5.</B> All occurrences of the system BIOS will be mapped as reserved. |
| This includes the area below 1 MB, at 16 MB (if present) and at |
| end of the address space (4 gig). |
| <LI><B>6.</B> Standard PC address ranges will not be reported. Example video |
| memory at A0000 to BFFFF physical will not be described by this |
| function. The range from E0000 to EFFFF is base board specific |
| and will be reported as suits the bas board. |
| <LI><B>7.</B> All of lower memory is reported as normal memory. It is OS's |
| responsibility to handle standard RAM locations reserved for |
| specific uses, for example: the interrupt vector table(0:0) and |
| the BIOS data area(40:0). |
| </UL> |
| |
| <HR> |
| |
| <H3>Example address map</H3> |
| |
| This sample address map describes a machine which has 128 MB RAM, 640K |
| of base memory and 127 MB extended. The base memory has 639K |
| available for the user and 1K for an extended BIOS data area. There |
| is a 4 MB Linear Frame Buffer (LFB) based at 12 MB. The memory hole |
| created by the chipset is from 8 M to 16 M. There are memory mapped |
| APIC devices in the system. The IO Unit is at FEC00000 and the Local |
| Unit is at FEE00000. The system BIOS is remapped to 4G - 64K.<P> |
| |
| Note that the 639K endpoint of the first memory range is also the base |
| memory size reported in the BIOS data segment at 40:13.<P> |
| |
| Key to types: "ARM" is AddressRangeMemory, "ARR" is AddressRangeReserved.<P> |
| |
| <pre> |
| Base (Hex) Length Type Description |
| 0000 0000 639K ARM Available Base memory - typically the same |
| value as is returned via the INT 12 function. |
| 0009 FC00 1K ARR Memory reserved for use by the BIOS(s). |
| This area typically includes the Extended |
| BIOS data area. |
| 000F 0000 64K ARR System BIOS |
| 0010 0000 7M ARM Extended memory, this is not limited to |
| the 64 MB address range. |
| 0080 0000 8M ARR Chipset memory hole required to support the |
| LFB mapping at 12 MB. |
| 0100 0000 120M ARM Base board RAM relocated above a chipset |
| memory hole. |
| FEC0 0000 4K ARR IO APIC memory mapped I/O at FEC00000. Note |
| the range of addresses required for an APIC |
| device may vary from base OEM to OEM. |
| FEE0 0000 4K ARR Local APIC memory mapped I/O at FEE00000. |
| FFFF 0000 64K ARR Remapped System BIOS at end of address space. |
| </pre> |
| |
| <HR> |
| |
| <H3>Sample operating system usage</H3> |
| |
| The following code segment is intended to describe the algorithm needed when |
| calling the Query System Address Map function. It is an implementation |
| example and uses non standard mechanisms.<P> |
| |
| <pre> |
| E820Present = FALSE; |
| Regs.ebx = 0; |
| do { |
| Regs.eax = 0xE820; |
| Regs.es = SEGMENT (&Descriptor); |
| Regs.di = OFFSET (&Descriptor); |
| Regs.ecx = sizeof (Descriptor); |
| Regs.edx = 'SMAP'; |
| |
| _int( 0x15, Regs ); |
| |
| if ((Regs.eflags & EFLAG_CARRY) || Regs.eax != 'SMAP') { |
| break; |
| } |
| |
| if (Regs.ecx < 20 || Regs.ecx > sizeof (Descriptor) ) { |
| // bug in bios - all returned descriptors must be |
| // at least 20 bytes long, and can not be larger then |
| // the input buffer. |
| |
| break; |
| } |
| |
| E820Present = TRUE; |
| . |
| . |
| . |
| Add address range Descriptor.BaseAddress through |
| Descriptor.BaseAddress + Descriptor.Length |
| as type Descriptor.Type |
| . |
| . |
| . |
| |
| } while (Regs.ebx != 0); |
| |
| if (!E820Present) { |
| . |
| . |
| . |
| call INT 15h, AX=E801h and/or INT 15h, AH=88h to obtain old style |
| memory information |
| . |
| . |
| . |
| } |
| </pre> |
| |
| <HR> |
| |
| <A NAME="int15e801"><H1>INT 15h, AX=E801h - Get Memory Size for |
| Large Configurations</H1></A> |
| |
| <HR> |
| |
| Real mode only (as far as I know).<P> |
| |
| Originally defined for EISA servers, this interface is capable of |
| reporting up to 4 GB of RAM. While not nearly as flexible as E820h, it |
| is present in many more systems.<P> |
| |
| Input:<P> |
| |
| <pre> |
| AX Function Code E801h |
| </pre> |
| |
| Output:<P> |
| |
| <pre> |
| CF Carry Flag Non-Carry - indicates no error |
| AX Extended 1 Number of contiguous KB between 1 and 16 MB, |
| maximum 0x3C00 = 15 MB. |
| BX Extended 2 Number of contiguous 64 KB blocks between |
| 16 MB and 4 GB. |
| CX Configured 1 Number of contiguous KB between 1 and 16 MB, |
| maximum 0x3C00 = 15 MB. |
| DX Configured 2 Number of contiguous 64 KB blocks between |
| 16 MB and 4 GB. |
| </pre> |
| |
| Not sure what this difference between the "Extended" and "Configured" |
| numbers are, but they appear to be identical, as reported from the BIOS.<P> |
| |
| NOTE: It is possible for a machine using this interface to report a memory |
| hole just under 16 MB (Count 1 is less than 15 MB, but Count 2 is |
| non-zero).<P> |
| |
| <HR> |
| |
| <A NAME="int1588"><H1>INT 15h, AH=88h - Get Extended Memory Size</H1></A> |
| |
| <HR> |
| |
| Real mode only.<P> |
| |
| This interface is quite primitive. It returns a single value for |
| contiguous memory above 1 MB. The biggest |
| limitation is that the value returned is a 16-bit value, in KB, |
| so it has a maximum saturation of just under 64 MB even presuming |
| it returns as much as it can. On some systems, it won't return |
| anything above the 16 MB boundary.<P> |
| |
| The one useful point is that it works on every PC available.<P> |
| |
| Input:<P> |
| |
| <pre> |
| AH Function Code 88h |
| </pre> |
| |
| Output:<P> |
| |
| <pre> |
| CF Carry Flag Non-Carry - indicates no error |
| AX Memory Count Number of contiguous KB above 1 MB. |
| </pre> |
| |
| <HR> |
| |
| <A HREF=mailto:erich@uruk.org><I>erich@uruk.org</I></A><P> |
| |
| </BODY> |
| </HTML> |
| |