summaryrefslogtreecommitdiffstats
path: root/private/ntos/rtl/i386/ioaccess.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/rtl/i386/ioaccess.asm')
-rw-r--r--private/ntos/rtl/i386/ioaccess.asm423
1 files changed, 423 insertions, 0 deletions
diff --git a/private/ntos/rtl/i386/ioaccess.asm b/private/ntos/rtl/i386/ioaccess.asm
new file mode 100644
index 000000000..17dbd1e36
--- /dev/null
+++ b/private/ntos/rtl/i386/ioaccess.asm
@@ -0,0 +1,423 @@
+ 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