2022-12-21 08:29:33 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
uint8_t inportb(uint16_t port)
|
|
|
|
|
{
|
|
|
|
|
uint8_t data;
|
|
|
|
|
__asm__ __volatile__("inb %1, %0" : "=a"(data) : "dN"(port));
|
|
|
|
|
return data;
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
void outportb(uint16_t port, uint8_t data)
|
|
|
|
|
{
|
|
|
|
|
__asm__ __volatile__("outb %1, %0" : : "dN"(port), "a"(data));
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
uint16_t inportw(uint16_t port)
|
|
|
|
|
{
|
|
|
|
|
uint16_t data;
|
|
|
|
|
__asm__ __volatile__("inw %1, %0" : "=a"(data) : "dN"(port));
|
|
|
|
|
return data;
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
void outportw(uint16_t port, uint16_t data)
|
|
|
|
|
{
|
|
|
|
|
__asm__ __volatile__("outw %1, %0" : : "dN"(port), "a"(data));
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
uint32_t inportl(uint16_t port)
|
|
|
|
|
{
|
|
|
|
|
uint32_t data;
|
|
|
|
|
__asm__ __volatile__("inl %%dx, %%eax" : "=a"(data) : "dN"(port));
|
|
|
|
|
return data;
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
void outportl(uint16_t port, uint32_t data)
|
|
|
|
|
{
|
|
|
|
|
__asm__ __volatile__("outl %%eax, %%dx" : : "dN"(port), "a"(data));
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
void outportsw(uint16_t port, void *data, uint32_t size)
|
|
|
|
|
{
|
|
|
|
|
__asm__ __volatile__("rep outsw" : "+S"(data), "+c"(size) : "d"(port));
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-03 21:28:15 +00:00
|
|
|
void inportsw(uint16_t port, unsigned char *data, unsigned long size)
|
|
|
|
|
{
|
|
|
|
|
__asm__ __volatile__("rep insw"
|
|
|
|
|
: "+D"(data), "+c"(size)
|
|
|
|
|
: "d"(port)
|
|
|
|
|
: "memory");
|
2022-12-21 08:29:33 +00:00
|
|
|
}
|