Jump to content

DevHelp PhysToVirt: Difference between revisions

From EDM2
Created page with "This service converts a 32-bit address to a valid selector:offset pair. ==Syntax== ===C=== <PRE> USHORT APIENTRY DevHelp_PhysToVirt( ULONG PhysAddr, ..."
 
No edit summary
 
Line 1: Line 1:
{{DISPLAYTITLE:DevHelp_PhysToVirt}}
This service converts a 32-bit address to a valid selector:offset pair.  
This service converts a 32-bit address to a valid selector:offset pair.  



Latest revision as of 03:24, 23 May 2025

This service converts a 32-bit address to a valid selector:offset pair.

Syntax

C

USHORT APIENTRY DevHelp_PhysToVirt( ULONG   PhysAddr,
                                    USHORT  usLength,
                                    PVOID   SelOffset,
                                    PUSHORT ModeFlag)

Assembler

MOV   AX,address_high         ; 32-bit physical address
MOV   BX,address_low          ;
MOV   CX,length               ; Length of segment
MOV   DH,result               ; Leave result...
                              ; 0 = in DS:SI
                              ; 1 = in ES:DI
MOV   DL,DevHlp_PhysToVirt

CALL  [Device_Help]

Parameters

C

PhysAddr (ULONG)
32-bit physical address
usLength (USHORT)
Length of segment
SelOffset (PVOID)
Converted virtual address returned if the address of data segment of the device driver is provided in the input.
ModeFlag (PUSHORT)
Returns if mode switch occurred. Ignored for OS/2 2.X.

Assembler

MOV   AX,address_high         ; 32-bit physical address
MOV   BX,address_low          ;
MOV   CX,length               ; Length of segment
MOV   DH,result               ; Leave result...
                              ; 0 = in DS:SI
                              ; 1 = in ES:DI

Return Code

C

Success Indicator: 0

Assembler

   'C' Clear if successful.
       If DH was set to 0 on input:
            DS:SI = Converted virtual address.
            ES      No mode switch, ES is preserved.
                    Mode switch, if ES contains the address of the
                    device driver data segment on input, it will
                    be converted to a valid virtual address.
                    Otherwise, it is set to zero.
       If DH was set to 1 on input:
            ES:DI = Converted virtual address.
            DS      No mode switch, DS is preserved.
                    Mode switch, if DS contains the address of the
                    device driver data segment on input, it will
                    be converted to a valid virtual address.
                    Otherwise, it is set to zero.

   'C' Set if error.
       AX = Error code.

   'Z'  Clear if no change in addressing mode.

   'Z'  Set if addressing mode has changed;
        (previously stored addresses must be recalculated).

Remarks

This function leaves its result in ES:DI or DS:SI, giving the physical device driver the ability to move strings in either direction. The returned virtual address does not remain valid if the device driver blocks or yields control. The returned virtual address can also be destroyed if the physical device driver routine that issues the DevHlp_PhysToVirt calls another routine.

While pointers generated by this routine are in use, the device driver can call only another PhysToVirt request. No other DevHlp routines can be called because they might not preserve the special DS or ES values created by the call to PhysToVirt. The performance characteristics of PhysToVirt are highly variable.

PhysToVirt preserves the registers CS, SS, SP, and DS, if called with DH=1, or the ES register, if called with DH=0. The pool of temporary selectors used by PhysToVirt in the OS/2 mode is not dynamically extendable. The converted addresses are valid as long as the physical device driver does not relinquish control (ProcBlock, Yield, or RET). An interrupt handler can use converted addresses prior to its EOI, with interrupts enabled. If an interrupt handler needs to use converted addresses after its EOI, it must protect the converted addresses by running with interrupts disabled.

The virtual mapping produced by the DevHlp_PhysToVirt is invalidated by calls to the DevHlp services PageListToLin and PhysToVirt.

The task-time strategy routine of a physical device driver can run enabled on a PS/2 system.

The Segment Length parameter must be set to the length of the transfer.

Example Code

C

#include  "dhcalls.h"

USHORT APIENTRY DevHelp_PhysToVirt( ULONG   PhysAddr,
                                    USHORT  usLength,
                                    PVOID   SelOffset,
                                    PUSHORT ModeFlag)

Related Functions