Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
parent
12568ba296
commit
087a00beaa
101
kernel/ioports.h
Normal file
101
kernel/ioports.h
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2015-2019 The University of Notre Dame
|
||||||
|
This software is distributed under the GNU General Public License.
|
||||||
|
See the file LICENSE for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IOPORTS_H
|
||||||
|
#define IOPORTS_H
|
||||||
|
|
||||||
|
#include "kernel/types.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
These are C wrappers around the assembly instruction IN and OUT
|
||||||
|
to move data to and from I/O ports. These variants are historically
|
||||||
|
called inb/inw/inl outb/outw/outl for in/out of byte (8 bits),
|
||||||
|
word (16 bits), and long (32 bits) respectively.
|
||||||
|
Note that some devices requires the "slow" variants that do an
|
||||||
|
extra dummy I/O in order to give the device more time to respond.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline uint8_t inb(int port)
|
||||||
|
{
|
||||||
|
uint8_t result;
|
||||||
|
asm("inb %w1, %b0": "=a"(result):"Nd"(port));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint16_t inw(int port)
|
||||||
|
{
|
||||||
|
uint16_t result;
|
||||||
|
asm("inw %w1, %w0": "=a"(result):"Nd"(port));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint16_t inl(int port)
|
||||||
|
{
|
||||||
|
uint32_t result;
|
||||||
|
asm("inl %w1, %0": "=a"(result):"Nd"(port));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outb(uint8_t value, int port)
|
||||||
|
{
|
||||||
|
asm("outb %b0, %w1": :"a"(value), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outw(uint16_t value, int port)
|
||||||
|
{
|
||||||
|
asm("outw %w0, %w1": :"a"(value), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outl(uint32_t value, int port)
|
||||||
|
{
|
||||||
|
asm("outl %0, %w1": :"a"(value), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void iowait()
|
||||||
|
{
|
||||||
|
outb(0, 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint8_t inb_slow(int port)
|
||||||
|
{
|
||||||
|
uint8_t result = inb(port);
|
||||||
|
iowait();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint16_t inw_slow(int port)
|
||||||
|
{
|
||||||
|
uint16_t result = inw(port);
|
||||||
|
iowait();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t inl_slow(int port)
|
||||||
|
{
|
||||||
|
uint32_t result = inl(port);
|
||||||
|
iowait();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outb_slow(uint8_t value, int port)
|
||||||
|
{
|
||||||
|
outb(value, port);
|
||||||
|
iowait();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outw_slow(uint16_t value, int port)
|
||||||
|
{
|
||||||
|
outw(value, port);
|
||||||
|
iowait();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outl_slow(uint32_t value, int port)
|
||||||
|
{
|
||||||
|
outl(value, port);
|
||||||
|
iowait();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user