/* ----------------------------------------------------------------------- *
 *
 *   Copyright 2004 H. Peter Anvin - All Rights Reserved
 *
 *   Permission is hereby granted, free of charge, to any person
 *   obtaining a copy of this software and associated documentation
 *   files (the "Software"), to deal in the Software without
 *   restriction, including without limitation the rights to use,
 *   copy, modify, merge, publish, distribute, sublicense, and/or
 *   sell copies of the Software, and to permit persons to whom
 *   the Software is furnished to do so, subject to the following
 *   conditions:
 *
 *   The above copyright notice and this permission notice shall
 *   be included in all copies or substantial portions of the Software.
 *
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *   OTHER DEALINGS IN THE SOFTWARE.
 *
 * ----------------------------------------------------------------------- */

/*
 * sys/io.h for the i386 architecture
 *
 * Basic I/O macros
 */

#ifndef _SYS_IO_H
#define _SYS_IO_H 1

/* I/O-related system calls */

int iopl(int);
int ioperm(unsigned long, unsigned long, int);

/* Basic I/O macros */

static __inline__ void outb(unsigned char __v, unsigned short __p)
{
	asm volatile ("outb %0,%1" : : "a" (__v), "dN" (__p));
}

static __inline__ void outw(unsigned short __v, unsigned short __p)
{
	asm volatile ("outw %0,%1" : : "a" (__v), "dN" (__p));
}

static __inline__ void outl(unsigned int __v, unsigned short __p)
{
	asm volatile ("outl %0,%1" : : "a" (__v), "dN" (__p));
}

static __inline__ unsigned char inb(unsigned short __p)
{
	unsigned char __v;
	asm volatile ("inb %1,%0" : "=a" (__v) : "dN" (__p));
	return __v;
}

static __inline__ unsigned short inw(unsigned short __p)
{
	unsigned short __v;
	asm volatile ("inw %1,%0" : "=a" (__v) : "dN" (__p));
	return __v;
}

static __inline__ unsigned int inl(unsigned short __p)
{
	unsigned int __v;
	asm volatile ("inl %1,%0" : "=a" (__v) : "dN" (__p));
	return __v;
}

/* String I/O macros */

static __inline__ void
outsb(unsigned short __p, const void *__d, unsigned long __n)
{
	asm volatile ("cld; rep; outsb"
		      : "+S" (__d), "+c" (__n)
		      : "d" (__p));
}

static __inline__ void
outsw(unsigned short __p, const void *__d, unsigned long __n)
{
	asm volatile ("cld; rep; outsw"
		      : "+S" (__d), "+c" (__n)
		      : "d" (__p));
}

static __inline__ void
outsl(unsigned short __p, const void *__d, unsigned long __n)
{
	asm volatile ("cld; rep; outsl"
		      : "+S" (__d), "+c"(__n)
		      : "d" (__p));
}

static __inline__ void insb(unsigned short __p, void *__d, unsigned long __n)
{
	asm volatile ("cld; rep; insb"
		      : "+D" (__d), "+c" (__n)
		      : "d" (__p));
}

static __inline__ void insw(unsigned short __p, void *__d, unsigned long __n)
{
	asm volatile ("cld; rep; insw"
		      : "+D" (__d), "+c" (__n)
		      : "d" (__p));
}

static __inline__ void insl(unsigned short __p, void *__d, unsigned long __n)
{
	asm volatile ("cld; rep; insl"
		      : "+D" (__d), "+c" (__n)
		      : "d" (__p));
}

#endif				/* _SYS_IO_H */
