[ros-diffs] [ion] 24699: - Remove WRITE/READ_REG_XXX functions written in C and write them in optimized assembly (no stack usage). - Also flush posted write buffers during WRITE_XXX operations.
ion at svn.reactos.org
ion at svn.reactos.org
Tue Nov 7 15:44:33 CET 2006
Author: ion
Date: Tue Nov 7 17:44:32 2006
New Revision: 24699
URL: http://svn.reactos.org/svn/reactos?rev=24699&view=rev
Log:
- Remove WRITE/READ_REG_XXX functions written in C and write them in optimized assembly (no stack usage).
- Also flush posted write buffers during WRITE_XXX operations.
Added:
trunk/reactos/ntoskrnl/ex/i386/ioport.S
Removed:
trunk/reactos/ntoskrnl/rtl/regio.c
Modified:
trunk/reactos/ntoskrnl/ntoskrnl.rbuild
Added: trunk/reactos/ntoskrnl/ex/i386/ioport.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/ioport.S?rev=24699&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/ex/i386/ioport.S (added)
+++ trunk/reactos/ntoskrnl/ex/i386/ioport.S Tue Nov 7 17:44:32 2006
@@ -1,0 +1,220 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/ex/i386/ioport.S
+ * PURPOSE: FASTCALL Interlocked Functions
+ * PROGRAMMERS: Alex Ionescu (alex at relsoft.net)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <ndk/asm.h>
+.intel_syntax noprefix
+
+/* GLOBALS *******************************************************************/
+
+.globl _READ_REGISTER_UCHAR at 4
+.globl _READ_REGISTER_USHORT at 4
+.globl _READ_REGISTER_ULONG at 4
+.globl _READ_REGISTER_BUFFER_UCHAR at 12
+.globl _READ_REGISTER_BUFFER_USHORT at 12
+.globl _READ_REGISTER_BUFFER_ULONG at 12
+.globl _WRITE_REGISTER_UCHAR at 8
+.globl _WRITE_REGISTER_USHORT at 8
+.globl _WRITE_REGISTER_ULONG at 8
+.globl _WRITE_REGISTER_BUFFER_UCHAR at 12
+.globl _WRITE_REGISTER_BUFFER_USHORT at 12
+.globl _WRITE_REGISTER_BUFFER_ULONG at 12
+
+/* FUNCTIONS *****************************************************************/
+
+.func READ_REGISTER_UCHAR at 4
+_READ_REGISTER_UCHAR at 4:
+
+ /* Return the requested memory location */
+ mov edx, [esp+4]
+ mov al, [edx]
+ ret 4
+.endfunc
+
+.func READ_REGISTER_USHORT at 4
+_READ_REGISTER_USHORT at 4:
+
+ /* Return the requested memory location */
+ mov edx, [esp+4]
+ mov ax, [edx]
+ ret 4
+.endfunc
+
+.func READ_REGISTER_ULONG at 4
+_READ_REGISTER_ULONG at 4:
+
+ /* Return the requested memory location */
+ mov edx, [esp+4]
+ mov eax, [edx]
+ ret 4
+.endfunc
+
+.func READ_REGISTER_BUFFER_UCHAR at 12
+_READ_REGISTER_BUFFER_UCHAR at 12:
+
+ /* Save volatiles */
+ mov eax, esi
+ mov edx, edi
+
+ /* Do the transfer */
+ mov ecx, [esp+12]
+ mov esi, [esp+4]
+ mov edi, [esp+8]
+ rep movsb
+
+ /* Restore volatiles and return */
+ mov edi, edx
+ mov esi, eax
+ ret 12
+.endfunc
+
+.func READ_REGISTER_BUFFER_USHORT at 12
+_READ_REGISTER_BUFFER_USHORT at 12:
+
+ /* Save volatiles */
+ mov eax, esi
+ mov edx, edi
+
+ /* Do the transfer */
+ mov ecx, [esp+12]
+ mov esi, [esp+4]
+ mov edi, [esp+8]
+ rep movsw
+
+ /* Restore volatiles and return */
+ mov edi, edx
+ mov esi, eax
+ ret 12
+.endfunc
+
+.func READ_REGISTER_BUFFER_ULONG at 12
+_READ_REGISTER_BUFFER_ULONG at 12:
+
+ /* Save volatiles */
+ mov eax, esi
+ mov edx, edi
+
+ /* Do the transfer */
+ mov ecx, [esp+12]
+ mov esi, [esp+4]
+ mov edi, [esp+8]
+ rep movsd
+
+ /* Restore volatiles and return */
+ mov edi, edx
+ mov esi, eax
+ ret 12
+.endfunc
+
+.func WRITE_REGISTER_UCHAR at 8
+_WRITE_REGISTER_UCHAR at 8:
+
+ /* Write to memory */
+ mov edx, [esp+4]
+ mov al, [esp+8]
+ mov [edx], al
+
+ /* Flush posted write buffers and return */
+ lock or [esp+4], edx
+ ret 8
+.endfunc
+
+.func WRITE_REGISTER_USHORT at 8
+_WRITE_REGISTER_USHORT at 8:
+
+ /* Write to memory */
+ mov edx, [esp+4]
+ mov eax, [esp+8]
+ mov [edx], ax
+
+ /* Flush posted write buffers and return */
+ lock or [esp+4], edx
+ ret 8
+.endfunc
+
+.func WRITE_REGISTER_ULONG at 8
+_WRITE_REGISTER_ULONG at 8:
+
+ /* Write to memory */
+ mov edx, [esp+4]
+ mov eax, [esp+8]
+ mov [edx], eax
+
+ /* Flush posted write buffers and return */
+ lock or [esp+4], edx
+ ret 8
+.endfunc
+
+.func WRITE_REGISTER_BUFFER_UCHAR at 12
+_WRITE_REGISTER_BUFFER_UCHAR at 12:
+
+ /* Save volatiles */
+ mov eax, esi
+ mov edx, edi
+
+ /* Do the transfer */
+ mov ecx, [esp+12]
+ mov esi, [esp+8]
+ mov edi, [esp+4]
+ rep movsb
+
+ /* Flush posted write buffers */
+ lock or [esp+4], ecx
+
+ /* Restole volatiles and return */
+ mov edi, edx
+ mov esi, eax
+ ret 12
+.endfunc
+
+.func WRITE_REGISTER_BUFFER_USHORT at 12
+_WRITE_REGISTER_BUFFER_USHORT at 12:
+
+ /* Save volatiles */
+ mov eax, esi
+ mov edx, edi
+
+ /* Do the transfer */
+ mov ecx, [esp+12]
+ mov esi, [esp+8]
+ mov edi, [esp+4]
+ rep movsw
+
+ /* Flush posted write buffers */
+ lock or [esp+4], ecx
+
+ /* Restole volatiles and return */
+ mov edi, edx
+ mov esi, eax
+ ret 12
+.endfunc
+
+.func WRITE_REGISTER_BUFFER_ULONG at 12
+_WRITE_REGISTER_BUFFER_ULONG at 12:
+
+ /* Save volatiles */
+ mov eax, esi
+ mov edx, edi
+
+ /* Do the transfer */
+ mov ecx, [esp+12]
+ mov esi, [esp+8]
+ mov edi, [esp+4]
+ rep movsd
+
+ /* Flush posted write buffers */
+ lock or [esp+4], ecx
+
+ /* Restole volatiles and return */
+ mov edi, edx
+ mov esi, eax
+ ret 12
+.endfunc
+
+/* EOF */
Modified: trunk/reactos/ntoskrnl/ntoskrnl.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl.rbuild?rev=24699&r1=24698&r2=24699&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl.rbuild (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl.rbuild Tue Nov 7 17:44:32 2006
@@ -125,6 +125,7 @@
<directory name="i386">
<file>interlck_asm.S</file>
<file>fastinterlck_asm.S</file>
+ <file>ioport.S</file>
</directory>
</if>
<file>atom.c</file>
@@ -333,7 +334,6 @@
</if>
<file>libsupp.c</file>
<file>misc.c</file>
- <file>regio.c</file>
<file>strtok.c</file>
</directory>
<directory name="se">
Removed: trunk/reactos/ntoskrnl/rtl/regio.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/rtl/regio.c?rev=24698&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/rtl/regio.c (original)
+++ trunk/reactos/ntoskrnl/rtl/regio.c (removed)
@@ -1,190 +1,0 @@
-/* $Id$
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/rtl/regio.c
- * PURPOSE: Register io functions
- *
- * PROGRAMMERS: Eric Kohl (ekohl at abo.rhein-zeitung.de)
- */
-
-#include <ntoskrnl.h>
-
-
-/* FUNCTIONS ***************************************************************/
-
-UCHAR
-STDCALL
-READ_REGISTER_UCHAR (
- PUCHAR Register
- )
-{
- return *Register;
-}
-
-/*
- * @implemented
- */
-USHORT
-STDCALL
-READ_REGISTER_USHORT (
- PUSHORT Register
- )
-{
- return *Register;
-}
-
-/*
- * @implemented
- */
-ULONG
-STDCALL
-READ_REGISTER_ULONG (
- PULONG Register
- )
-{
- return *Register;
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-READ_REGISTER_BUFFER_UCHAR (
- PUCHAR Register,
- PUCHAR Buffer,
- ULONG Count
- )
-{
- while (Count--)
- {
- *Buffer++ = *Register++;
- }
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-READ_REGISTER_BUFFER_USHORT (
- PUSHORT Register,
- PUSHORT Buffer,
- ULONG Count
- )
-{
- while (Count--)
- {
- *Buffer++ = *Register++;
- }
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-READ_REGISTER_BUFFER_ULONG (
- PULONG Register,
- PULONG Buffer,
- ULONG Count
- )
-{
- while (Count--)
- {
- *Buffer++ = *Register++;
- }
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-WRITE_REGISTER_UCHAR (
- PUCHAR Register,
- UCHAR Value
- )
-{
- *Register = Value;
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-WRITE_REGISTER_USHORT (
- PUSHORT Register,
- USHORT Value
- )
-{
- *Register = Value;
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-WRITE_REGISTER_ULONG (
- PULONG Register,
- ULONG Value
- )
-{
- *Register = Value;
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-WRITE_REGISTER_BUFFER_UCHAR (
- PUCHAR Register,
- PUCHAR Buffer,
- ULONG Count
- )
-{
- while (Count--)
- {
- *Register++ = *Buffer++;
- }
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-WRITE_REGISTER_BUFFER_USHORT (
- PUSHORT Register,
- PUSHORT Buffer,
- ULONG Count
- )
-{
- while (Count--)
- {
- *Register++ = *Buffer++;
- }
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-WRITE_REGISTER_BUFFER_ULONG (
- PULONG Register,
- PULONG Buffer,
- ULONG Count
-)
-{
- while (Count--)
- {
- *Register++ = *Buffer++;
- }
-}
-
-/* EOF */
More information about the Ros-diffs
mailing list