//
// No Check-in Source Code.
//
// Do not make this code available to non-Microsoft personnel
// 	without Intel's express permission
//
/**
***  Copyright  (C) 1996-97 Intel Corporation. All rights reserved.
***
*** The information and source code contained herein is the exclusive
*** property of Intel Corporation and may not be disclosed, examined
*** or reproduced in whole or in part without explicit written authorization
*** from the company.
**/

/*++

Copyright (c) 1995  Intel Corporation

Module Name:

    simio.c

Abstract:

    This module implements the I/O port access routines.

Author:

    14-Apr-1995

Environment:

    Kernel mode

Revision History:


--*/

#include "halp.h"



UCHAR
READ_PORT_UCHAR (
    PUCHAR Port
    )
{
    return (*(volatile UCHAR * const)(Port));
}

USHORT
READ_PORT_USHORT (
    PUSHORT Port
    )
{
    return (*(volatile USHORT * const)(Port));
}

ULONG
READ_PORT_ULONG (
    PULONG Port
    )
{
    return (*(volatile ULONG * const)(Port));
}

VOID
WRITE_PORT_UCHAR (
    PUCHAR Port,
    UCHAR  Value
    )
{
    *(volatile UCHAR * const)(Port) = Value;
    KeFlushWriteBuffer();
}

VOID
WRITE_PORT_USHORT (
    PUSHORT Port,
    USHORT  Value
    )
{
    *(volatile USHORT * const)(Port) = Value;
    KeFlushWriteBuffer();
}

VOID
WRITE_PORT_ULONG (
    PULONG Port,
    ULONG  Value
    )
{
    *(volatile ULONG * const)(Port) = Value;
    KeFlushWriteBuffer();
}

VOID
READ_PORT_BUFFER_UCHAR (
    PUCHAR Port,
    PUCHAR Buffer,
    ULONG Count
    )
{
    PUCHAR ReadBuffer = Buffer;
    ULONG ReadCount;

    for (ReadCount = 0; ReadCount < Count; ReadCount++, ReadBuffer++) {
        *ReadBuffer = *(volatile UCHAR * const)(Port);
    }
}

VOID
READ_PORT_BUFFER_USHORT (
    PUSHORT Port,
    PUSHORT Buffer,
    ULONG Count
    )
{
    PUSHORT ReadBuffer = Buffer;
    ULONG ReadCount;

    for (ReadCount = 0; ReadCount < Count; ReadCount++, ReadBuffer++) {
        *ReadBuffer = *(volatile USHORT * const)(Port);
    }
}

VOID
READ_PORT_BUFFER_ULONG (
    PULONG Port,
    PULONG Buffer,
    ULONG Count
    )
{
    PULONG ReadBuffer = Buffer;
    ULONG ReadCount;

    for (ReadCount = 0; ReadCount < Count; ReadCount++, ReadBuffer++) {
        *ReadBuffer = *(volatile ULONG * const)(Port);
    }
}

VOID
WRITE_PORT_BUFFER_UCHAR (
    PUCHAR Port,
    PUCHAR Buffer,
    ULONG   Count
    )
{
    PUCHAR WriteBuffer = Buffer;
    ULONG WriteCount;

    for (WriteCount = 0; WriteCount < Count; WriteCount++, WriteBuffer++) {
        *(volatile UCHAR * const)(Port) = *WriteBuffer;
        KeFlushWriteBuffer();
    }
}

VOID
WRITE_PORT_BUFFER_USHORT (
    PUSHORT Port,
    PUSHORT Buffer,
    ULONG   Count
    )
{
    PUSHORT WriteBuffer = Buffer;
    ULONG WriteCount;

    for (WriteCount = 0; WriteCount < Count; WriteCount++, WriteBuffer++) {
        *(volatile USHORT * const)(Port) = *WriteBuffer;
        KeFlushWriteBuffer();
    }
}

VOID
WRITE_PORT_BUFFER_ULONG (
    PULONG Port,
    PULONG Buffer,
    ULONG   Count
    )
{
    PULONG WriteBuffer = Buffer;
    ULONG WriteCount;

    for (WriteCount = 0; WriteCount < Count; WriteCount++, WriteBuffer++) {
        *(volatile ULONG * const)(Port) = *WriteBuffer;
        KeFlushWriteBuffer();
    }
}

VOID
HalHandleNMI(
    IN OUT PVOID NmiInfo
    )
{
}