summaryrefslogtreecommitdiff
path: root/stage3/io.h
blob: bca094d705f13f0ad32b9b5205047e43c4ad4e60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#ifndef IO_H
#define IO_H

#include "def.h"

static inline void outb(u16 port, u8 val)
{
	asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
}

static inline u8 inb(u16 port)
{
   	u8 val;
	asm volatile("inb %1, %0" : "=a"(val) : "dN"(port) : "memory");
	return val;
}

static inline void outw(u16 port, u16 val)
{
	asm volatile("outw %0, %1" : : "a"(val), "Nd"(port) : "memory");
}

static inline u16 inw(u16 port)
{
   	u16 val;
	asm volatile("inw %1, %0" : "=a"(val) : "dN"(port) : "memory");
	return val;
}

static inline void outl(u16 port, u32 val)
{
	asm volatile("outl %0, %1" : : "a"(val), "Nd"(port) : "memory");
}

static inline u32 inl(u16 port)
{
   	u32 val;
	asm volatile("inl %1, %0" : "=a"(val) : "dN"(port) : "memory");
	return val;
}

typedef enum {
	IO_PIC1_CTRL = 0x20,
	IO_PIC1_DATA = 0x21,
	IO_PIC2_CTRL = 0xA0,
	IO_PIC2_DATA = 0xA1,
	IO_PS2_DATA = 0x60,
	IO_PS2_CTRL = 0x64,
} io_port;

static inline void io_wait(void)
{
	outb(0x80, 0);
}

#endif