add port io functions to sys/io.h
based on proposal by Isaac Dunham. nonexistance of bits/io.h will cause inclusion of sys/io.h to produce an error on archs that are not supposed to have it. this is probably the desired behavior, but the error message may be a bit unusual.
This commit is contained in:
parent
f54ac2446a
commit
61aa6324af
5 changed files with 167 additions and 4 deletions
80
arch/i386/bits/io.h
Normal file
80
arch/i386/bits/io.h
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
int iopl(int);
|
||||||
|
int ioperm(unsigned long, unsigned long, int);
|
||||||
|
|
||||||
|
static __inline void outb(unsigned char __val, unsigned short __port)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("outb %0,%1" : : "a" (__val), "dN" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outw(unsigned short __val, unsigned short __port)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("outw %0,%1" : : "a" (__val), "dN" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outl(unsigned int __val, unsigned short __port)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("outl %0,%1" : : "a" (__val), "dN" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned char inb(unsigned short __port)
|
||||||
|
{
|
||||||
|
unsigned char __val;
|
||||||
|
__asm__ volatile ("inb %1,%0" : "=a" (__val) : "dN" (__port));
|
||||||
|
return __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned short inw(unsigned short __port)
|
||||||
|
{
|
||||||
|
unsigned short __val;
|
||||||
|
__asm__ volatile ("inw %1,%0" : "=a" (__val) : "dN" (__port));
|
||||||
|
return __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned int inl(unsigned short __port)
|
||||||
|
{
|
||||||
|
unsigned int __val;
|
||||||
|
__asm__ volatile ("inl %1,%0" : "=a" (__val) : "dN" (__port));
|
||||||
|
return __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outsb(unsigned short __port, const void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; outsb"
|
||||||
|
: "+S" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outsw(unsigned short __port, const void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; outsw"
|
||||||
|
: "+S" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outsl(unsigned short __port, const void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; outsl"
|
||||||
|
: "+S" (__buf), "+c"(__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void insb(unsigned short __port, void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; insb"
|
||||||
|
: "+D" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void insw(unsigned short __port, void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; insw"
|
||||||
|
: "+D" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void insl(unsigned short __port, void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; insl"
|
||||||
|
: "+D" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
80
arch/x86_64/bits/io.h
Normal file
80
arch/x86_64/bits/io.h
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
int iopl(int);
|
||||||
|
int ioperm(unsigned long, unsigned long, int);
|
||||||
|
|
||||||
|
static __inline void outb(unsigned char __val, unsigned short __port)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("outb %0,%1" : : "a" (__val), "dN" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outw(unsigned short __val, unsigned short __port)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("outw %0,%1" : : "a" (__val), "dN" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outl(unsigned int __val, unsigned short __port)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("outl %0,%1" : : "a" (__val), "dN" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned char inb(unsigned short __port)
|
||||||
|
{
|
||||||
|
unsigned char __val;
|
||||||
|
__asm__ volatile ("inb %1,%0" : "=a" (__val) : "dN" (__port));
|
||||||
|
return __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned short inw(unsigned short __port)
|
||||||
|
{
|
||||||
|
unsigned short __val;
|
||||||
|
__asm__ volatile ("inw %1,%0" : "=a" (__val) : "dN" (__port));
|
||||||
|
return __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline unsigned int inl(unsigned short __port)
|
||||||
|
{
|
||||||
|
unsigned int __val;
|
||||||
|
__asm__ volatile ("inl %1,%0" : "=a" (__val) : "dN" (__port));
|
||||||
|
return __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outsb(unsigned short __port, const void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; outsb"
|
||||||
|
: "+S" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outsw(unsigned short __port, const void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; outsw"
|
||||||
|
: "+S" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void outsl(unsigned short __port, const void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; outsl"
|
||||||
|
: "+S" (__buf), "+c"(__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void insb(unsigned short __port, void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; insb"
|
||||||
|
: "+D" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void insw(unsigned short __port, void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; insw"
|
||||||
|
: "+D" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void insl(unsigned short __port, void *__buf, unsigned long __n)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("cld; rep; insl"
|
||||||
|
: "+D" (__buf), "+c" (__n)
|
||||||
|
: "d" (__port));
|
||||||
|
}
|
||||||
|
|
@ -4,8 +4,9 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ioperm(unsigned long, unsigned long, int);
|
#include <features.h>
|
||||||
int iopl(int);
|
|
||||||
|
#include <bits/io.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
#include <sys/io.h>
|
|
||||||
#include "syscall.h"
|
#include "syscall.h"
|
||||||
|
|
||||||
#ifdef SYS_ioperm
|
#ifdef SYS_ioperm
|
||||||
|
#include <sys/io.h>
|
||||||
|
|
||||||
int ioperm(unsigned long from, unsigned long num, int turn_on)
|
int ioperm(unsigned long from, unsigned long num, int turn_on)
|
||||||
{
|
{
|
||||||
return syscall(SYS_ioperm, from, num, turn_on);
|
return syscall(SYS_ioperm, from, num, turn_on);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
#include <sys/io.h>
|
|
||||||
#include "syscall.h"
|
#include "syscall.h"
|
||||||
|
|
||||||
#ifdef SYS_iopl
|
#ifdef SYS_iopl
|
||||||
|
#include <sys/io.h>
|
||||||
|
|
||||||
int iopl(int level)
|
int iopl(int level)
|
||||||
{
|
{
|
||||||
return syscall(SYS_iopl, level);
|
return syscall(SYS_iopl, level);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue