Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.os.msdos.programmer > #387

Re: How to call Int 15h, ax=e881h?

From James Harris <james.harris.1@googlemail.com>
Newsgroups alt.os.development, comp.os.msdos.programmer
Subject Re: How to call Int 15h, ax=e881h?
Date 2011-11-01 12:57 -0700
Organization http://groups.google.com
Message-ID <7a1ef205-0198-49f2-b7e7-c0d712ec7977@g7g2000vbv.googlegroups.com> (permalink)
References <j8n1ll$t95$1@speranza.aioe.org>

Cross-posted to 2 groups.

Show all headers | View raw


On Oct 31, 8:50 pm, "Rod Pemberton" <do_not_h...@noavailemail.cmm>
wrote:
> Does anyone here know how to correctly call Int 15h, ax=e881h?

Great question, Rod. I don't know the answer and haven't tested it but
I'll try to make some comments below.

Isn't e881 documented to provide exactly the same info as e801? If so
it appears to be an effort by Phoenix to make the same info available
in Protected mode.

Of course, in Protected mode int 0x15 is generally unrelated so seems
wrong. Could the reference to an interrupt be the misleading part and
the rest be correct?

On the other hand maybe Phoenix anticipated Mike's pdbios32. :-)

> On two machines, if I call it from 16-bit real mode, it fails, i.e.,
> unsupported.  On one machine, if I call it from 16-bit real mode, the
> machine locks up.  My assumption is that this machine supports this
> function.
>
> RBIL has a note that says e881h is 32-bit.  The machine that locks up has a
> Phoenix BIOS.  The PhoenixBIOS 4.0r6 User's Manual and the PhoenixBIOS
> 4.0v1 Programmer's Guide both say that e881h is for 32-bit protected mode.

I have a couple of Phoenix machines I could also test with in real
mode if you want to post a code snippet.

Of course, it looks like e881 should never be called in real mode. It
is simply not valid in that mode and one should use e801 instead.

> How does one call the BIOS while in 32-bit protected mode?
>
> Neither manual tells the protected mode setup required to call e881.  For
> 32-bit, the manuals only describe how to call BIOS32 Service Directory.

I think you've answered your own question. For comparison, based on
PCI System Architecture - 4th ed - the steps below should determine if
there are any 32-bit protected mode BIOS functions available. Apart
from the PCI bit at the end does this match the Service Directory
finder you mention?

1. Scan 0x000e_0000 to 0x000f_fff0 looking for "_32_" at the start of
a 16-byte block.

2. Checksum all 16 bytes of any block found. Byte total should be
zero.

If protected mode BIOS is available this should locate a record with
these fields

char[4]   "_32_";
uint32    directory_program;
uint8     revision_level;
uint8     structure_size; /* in units of 16 bytes - always 1 */
uint8     checksum;
uint8[5]  padding;

I guess a near call to the directory program is required. Given these
inputs:

  eax = desired service identifier
  ebx = 0

it should report whether certain 32-bit services are available.

I don't know what eax should be for Phoenix' e881 or the family it is
part of. Apparently for the PCI BIOS eax should be set to "$PCI".

> Do I need paging or flat mode or need to use BIOS' call to setup PM?  Is the
> BIOS code for e881h 32-bit protected-mode?  Do I need to setup 16-bit code
> segment selectors for the call to BIOS and do an intersegment jump?  Do I
> call the 16-bit Int 15h vector from 32-bit protected mode?  Do I use BIOS32
> somehow?  Is int 15h, multi-mode code, i.e., 16-bit RM, 16-bit PM, and
> 32-bit PM?  How does calling Int 15h in 32-bit PM affect iret?  Do I need an
> override on the call or simulate call's return values?

This paragraph reminds me of the introduction to 'Soap' from the late
70s or early 80s. :-)

> I've searched for any answer to this via Google, Yahoo, and Usenet archives,
> but I've not found an answer ...  Also, I can't find any use of e881h in
> code that is publicly available.  My guess would be to call the Int 15h RM
> vector directly from PM, but I have some doubts about Int 15h being
> multi-mode code ...

Both e881 and e801 are very limited and to have no way to report holes
in the address space. If they are all that's available what should we
do? Is it too naive to assume that all PCs made back then had simple
memory layouts with no holes and no devices in the memory space these
would report?

If you have a chance to go through real mode then e820 has to be the
best option, and it's been around for a long time, falling back to
e801 and ah=0x88 only in extremis. If being booted I would expect any
decent bootloader would pass-in the memory map. So, is this an
academic question? It's an interesting one nonetheless.

James

Back to comp.os.msdos.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-10-31 16:50 -0400
  Re: How to call Int 15h, ax=e881h? Jim Leonard <mobygamer@gmail.com> - 2011-10-31 15:32 -0700
    Re: How to call Int 15h, ax=e881h? Rugxulo <rugxulo@gmail.com> - 2011-10-31 16:37 -0700
      Re: How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-11-01 05:10 -0400
  Re: How to call Int 15h, ax=e881h? Ross Ridge <rridge@csclub.uwaterloo.ca> - 2011-10-31 20:18 -0400
  Re: How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-11-01 05:09 -0400
    Re: How to call Int 15h, ax=e881h? Ross Ridge <rridge@csclub.uwaterloo.ca> - 2011-11-01 12:23 -0400
  Re: How to call Int 15h, ax=e881h? James Harris <james.harris.1@googlemail.com> - 2011-11-01 12:57 -0700
    Re: How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-11-02 02:49 -0400
      Re: How to call Int 15h, ax=e881h? Ross Ridge <rridge@csclub.uwaterloo.ca> - 2011-11-02 10:33 -0400
      Re: How to call Int 15h, ax=e881h? James Harris <james.harris.1@googlemail.com> - 2011-11-04 14:47 -0700
        Re: How to call Int 15h, ax=e881h? Ross Ridge <rridge@csclub.uwaterloo.ca> - 2011-11-04 17:59 -0400
          Re: How to call Int 15h, ax=e881h? James Harris <james.harris.1@googlemail.com> - 2011-11-04 15:09 -0700
          Re: How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-11-04 20:12 -0400
            Re: How to call Int 15h, ax=e881h? Ross Ridge <rridge@csclub.uwaterloo.ca> - 2011-11-04 23:27 -0400
              Re: How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-11-06 02:46 -0500
        Re: How to call Int 15h, ax=e881h? "Rod Pemberton" <do_not_have@noavailemail.cmm> - 2011-11-04 21:04 -0400
          Re: How to call Int 15h, ax=e881h? "Marven Lee" <marven10@gmail.com> - 2011-11-05 01:12 +0000
            Re: How to call Int 15h, ax=e881h? Nomen Nescio <nobody@dizum.com> - 2011-11-05 19:04 +0100
    Re: How to call Int 15h, ax=e881h? James Harris <james.harris.1@googlemail.com> - 2011-11-04 14:58 -0700

csiph-web