[comp.os.os2.programmer] IOPL in 2.0

ericsa@microsoft.UUCP (Eric Sassaman) (09/18/90)

> I recently tried to experience the IOPL segment in OS/2 2.0. By
> setting IOPL=YES in the config.sys file. By declairing SEGMENTS
> IO_TEXT IOPL in the definition file. Writting an IO_TEXT segment with
> priviledge instruction in assembly routine. Made a dummy c file which
> essencially calls the assembly routine. Generated an EXE file to run.
> The executable always give me a page fault error. Does anybody knows
> if the IOPL segment exist and runs reliablly in the OS/2 2.0
> environment(386 CPU). It will be appreciated that if you can tell me
> how to write such program.

The problem is that port I/O from an OS/2 2.0 32-bit application is
only allowed in a ring zero code segment. An IOPL segment runs at ring
2; at this level port I/O is not allowed in a 32-bit application. In
order for you to do direct port I/O under OS/2 2.0, you will need to
either write your application as 16-bit or write a device driver that
runs at ring 0. This device driver can be either 16 bit or 32 bit.

Eric Sassaman
Microsoft OS/2 Systems Support

n8840371@unicorn.wwu.edu (Todd Crowe) (09/21/90)

ericsa@microsoft.UUCP (Eric Sassaman) writes:
>The problem is that port I/O from an OS/2 2.0 32-bit application is
>only allowed in a ring zero code segment. An IOPL segment runs at ring
>2; at this level port I/O is not allowed in a 32-bit application. In
>order for you to do direct port I/O under OS/2 2.0, you will need to
>either write your application as 16-bit or write a device driver that
>runs at ring 0. This device driver can be either 16 bit or 32 bit.

I won't deny that any of this is true, but I *think* it omits an important
point.  About 6(?) monthes ago in either Computer Language or DR Dobbs there
was an article on using IOPL segments to read/write the I/O ports.  It
mentioned that there was a function that enabled/disabled port access (even
to IOPL segments).  In OS/2 1.x this function didn't do anything, since the
286 is not able to offer individual I/O ports (and disallow others).  But
according to the article there were supposed to be required in OS/2 2.0.

I think the name of the function was DosEnablePortAccess (or something
similar).  If this isn't enough information let me know and I can look
up the article.

      +++++++++++++++        "Dont get your hair in an uproar!!!"
+++++ +@+++++++++++++  +-----------------------------------------------------+
+++++ +++Western+++++  |                   Todd Crowe                        |
 +++++++Washington+++  |  n8840371@unicorn.wwu.edu or TODDC@nessie.wwu.edu   |
 +++++++University+++  |             (Finally a real .sig!)                  |
  +++++++++++++++++++  +-----------------------------------------------------+
     ++++++++++           "There's more than one way to skin a cat..."
-- 
      +++++++++++++++        "Dont get your hair in an uproar!!!"
+++++ +@+++++++++++++  +-----------------------------------------------------+
+++++ +++Western+++++  |                   Todd Crowe                        |
 +++++++Washington+++  |  n8840371@unicorn.wwu.edu or TODDC@nessie.wwu.edu   |