windows-nt/Source/XPSP1/NT/base/ntos/rtl/i386/ioaccess.asm
2020-09-26 16:20:57 +08:00

424 lines
8.9 KiB
NASM

title "ioaccess"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; ioaccess.asm
;
; Abstract:
;
; Procedures to correctly touch I/O registers.
;
; Author:
;
; Bryan Willman (bryanwi) 16 May 1990
;
; Environment:
;
; User or Kernel, although privledge (IOPL) may be required.
;
; Revision History:
;
;--
.386p
.xlist
include ks386.inc
include callconv.inc ; calling convention macros
.list
_TEXT SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; I/O memory space read and write functions.
;
; These have to be actual functions on the 386, because we need
; to use assembler, but cannot return a value if we inline it.
;
; This set of functions manipulates I/O registers in MEMORY space.
; (Uses x86 mov instructions)
;
;--
;++
;
; UCHAR
; READ_REGISTER_UCHAR(
; PUCHAR Register
; )
;
; Memory space references will use lock prefix to force real access,
; flush through posted write buffers, and so forth.
;
; Arguments:
; (esp+4) = Register
;
; Returns:
; Value in register.
;
;--
cPublicProc _READ_REGISTER_UCHAR ,1
cPublicFpo 1,0
mov edx,[esp+4] ; (edx) = Register
mov al,[edx] ; (al) = byte, lock forces real access
stdRET _READ_REGISTER_UCHAR
stdENDP _READ_REGISTER_UCHAR
;++
;
; USHORT
; READ_REGISTER_USHORT(
; PUSHORT Register
; )
;
; Memory space references will use lock prefix to force real access,
; flush through posted write buffers, and so forth.
;
; Arguments:
; (esp+4) = Register
;
; Returns:
; Value in register.
;
;--
cPublicProc _READ_REGISTER_USHORT ,1
cPublicFpo 1,0
mov edx,[esp+4] ; (edx) = Register
mov ax,[edx] ; (ax) = word, lock forces real access
stdRET _READ_REGISTER_USHORT
stdENDP _READ_REGISTER_USHORT
;++
;
; ULONG
; READ_REGISTER_ULONG(
; PULONG Register
; )
;
; Memory space references will use lock prefix to force real access,
; flush through posted write buffers, and so forth.
;
; Arguments:
; (esp+4) = Register
;
; Returns:
; Value in register.
;
;--
cPublicProc _READ_REGISTER_ULONG ,1
cPublicFpo 1,0
mov edx,[esp+4] ; (edx) = Register
mov eax,[edx] ; (eax) = dword, lock forces real access
stdRET _READ_REGISTER_ULONG
stdENDP _READ_REGISTER_ULONG
;++
;
; VOID
; READ_REGISTER_BUFFER_UCHAR(
; PUCHAR Register,
; PUCHAR Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _READ_REGISTER_BUFFER_UCHAR ,3
cPublicFpo 3,0
mov eax, esi
mov edx, edi ; Save esi, edi
mov ecx,[esp+12] ; (ecx) = transfer count
mov esi,[esp+4] ; (edx) = Register
mov edi,[esp+8] ; (edi) = buffer
rep movsb
mov edi, edx
mov esi, eax
stdRET _READ_REGISTER_BUFFER_UCHAR
stdENDP _READ_REGISTER_BUFFER_UCHAR
;++
;
; VOID
; READ_REGISTER_BUFFER_USHORT(
; PUSHORT Register,
; PUSHORT Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _READ_REGISTER_BUFFER_USHORT ,3
cPublicFpo 3,0
mov eax, esi
mov edx, edi ; Save esi, edi
mov ecx,[esp+12] ; (ecx) = transfer count
mov esi,[esp+4] ; (edx) = Register
mov edi,[esp+8] ; (edi) = buffer
rep movsw
mov edi, edx
mov esi, eax
stdRET _READ_REGISTER_BUFFER_USHORT
stdENDP _READ_REGISTER_BUFFER_USHORT
;++
;
; VOID
; READ_REGISTER_BUFFER_ULONG(
; PULONG Register,
; PULONG Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _READ_REGISTER_BUFFER_ULONG ,3
cPublicFpo 3,0
mov eax, esi
mov edx, edi ; Save esi, edi
mov ecx,[esp+12] ; (ecx) = transfer count
mov esi,[esp+4] ; (edx) = Register
mov edi,[esp+8] ; (edi) = buffer
rep movsd
mov edi, edx
mov esi, eax
stdRET _READ_REGISTER_BUFFER_ULONG
stdENDP _READ_REGISTER_BUFFER_ULONG
;++
;
; VOID
; WRITE_REGISTER_UCHAR(
; PUCHAR Register,
; UCHAR Value
; )
;
; Memory space references will use lock prefix to force real access,
; flush through posted write buffers, and so forth.
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Value
;
;--
cPublicProc _WRITE_REGISTER_UCHAR ,2
cPublicFpo 2,0
mov edx,[esp+4] ; (edx) = Register
mov al,[esp+8] ; (al) = Value
mov [edx],al ; do write
lock or [esp+4],edx ; flush processors posted-write buffers
stdRET _WRITE_REGISTER_UCHAR
stdENDP _WRITE_REGISTER_UCHAR
;++
;
; VOID
; WRITE_REGISTER_USHORT(
; PUSHORT Register,
; USHORT Value
; )
;
; Memory space references will use lock prefix to force real access,
; flush through posted write buffers, and so forth.
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Value
;
;--
cPublicProc _WRITE_REGISTER_USHORT ,2
cPublicFpo 2,0
mov edx,[esp+4] ; (edx) = Register
mov eax,[esp+8] ; (ax) = Value
mov [edx],ax ; do write
lock or [esp+4],edx ; flush processors posted-write buffers
stdRET _WRITE_REGISTER_USHORT
stdENDP _WRITE_REGISTER_USHORT
;++
;
; VOID
; WRITE_REGISTER_ULONG(
; PULONG Register,
; ULONG Value
; )
;
; Memory space references will use lock prefix to force real access,
; flush through posted write buffers, and so forth.
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Value
;
;--
cPublicProc _WRITE_REGISTER_ULONG ,2
cPublicFpo 2,0
mov edx,[esp+4] ; (edx) = Register
mov eax,[esp+8] ; (eax) = Value
mov [edx],eax ; do write
lock or [esp+4],edx ; flush processors posted-write buffers
stdRET _WRITE_REGISTER_ULONG
stdENDP _WRITE_REGISTER_ULONG
;++
;
; VOID
; WRITE_REGISTER_BUFFER_UCHAR(
; PUCHAR Register,
; PUCHAR Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _WRITE_REGISTER_BUFFER_UCHAR ,3
cPublicFpo 3,0
mov eax, esi
mov edx, edi ; Save esi, edi
mov ecx,[esp+12] ; (ecx) = transfer count
mov esi,[esp+8] ; (edi) = buffer
mov edi,[esp+4] ; (edx) = Register
rep movsb
lock or [esp+4],ecx ; flush processors posted-write buffers
mov edi, edx
mov esi, eax
stdRET _WRITE_REGISTER_BUFFER_UCHAR
stdENDP _WRITE_REGISTER_BUFFER_UCHAR
;++
;
; VOID
; WRITE_REGISTER_BUFFER_USHORT(
; PUSHORT Register,
; PUSHORT Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _WRITE_REGISTER_BUFFER_USHORT ,3
cPublicFpo 3,0
mov eax, esi
mov edx, edi ; Save esi, edi
mov ecx,[esp+12] ; (ecx) = transfer count
mov esi,[esp+8] ; (edi) = buffer
mov edi,[esp+4] ; (edx) = Register
rep movsw
lock or [esp+4],ecx ; flush processors posted-write buffers
mov edi, edx
mov esi, eax
stdRET _WRITE_REGISTER_BUFFER_USHORT
stdENDP _WRITE_REGISTER_BUFFER_USHORT
;++
;
; VOID
; WRITE_REGISTER_BUFFER_ULONG(
; PULONG Register,
; PULONG Buffer,
; ULONG Count
; )
;
; Arguments:
; (esp+4) = Register
; (esp+8) = Buffer address
; (esp+12) = Count
;
;--
cPublicProc _WRITE_REGISTER_BUFFER_ULONG ,3
cPublicFpo 0, 3
;FPO ( 0, 3, 0, 0, 0, 0 )
mov eax, esi
mov edx, edi ; Save esi, edi
mov ecx,[esp+12] ; (ecx) = transfer count
mov esi,[esp+8] ; (edi) = buffer
mov edi,[esp+4] ; (edx) = Register
rep movsd
lock or [esp+4],ecx ; flush processors posted-write buffers
mov edi, edx
mov esi, eax
stdRET _WRITE_REGISTER_BUFFER_ULONG
stdENDP _WRITE_REGISTER_BUFFER_ULONG
_TEXT ends
end