Microkernel thing OS experiment (Zig ⚡)
1pub fn out(comptime T: type, port: u16, value: T) void {
2 switch (T) {
3 u8 => outb(port, value),
4 u16 => outw(port, value),
5 u32 => outl(port, value),
6 else => @compileError("Bad I/O port out size!"),
7 }
8}
9
10pub fn in(comptime T: type, port: u16) T {
11 return switch (T) {
12 u8 => inb(port),
13 u16 => inw(port),
14 u32 => inl(port),
15 else => @compileError("Bad I/O port in size!"),
16 };
17}
18
19pub fn outb(port: u16, val: u8) void {
20 asm volatile ("outb %[val], %[port]"
21 :
22 : [val] "{al}" (val),
23 [port] "N{dx}" (port),
24 );
25}
26
27pub fn outw(port: u16, val: u16) void {
28 asm volatile ("outw %[val], %[port]"
29 :
30 : [val] "{ax}" (val),
31 [port] "N{dx}" (port),
32 );
33}
34
35pub fn outl(port: u16, val: u32) void {
36 asm volatile ("outl %[val], %[port]"
37 :
38 : [val] "{eax}" (val),
39 [port] "N{dx}" (port),
40 );
41}
42
43pub fn inb(port: u16) u8 {
44 return asm volatile ("inb %[port], %[result]"
45 : [result] "={al}" (-> u8),
46 : [port] "N{dx}" (port),
47 );
48}
49
50fn inw(port: u16) u16 {
51 return asm volatile ("inw %[port], %[result]"
52 : [result] "={ax}" (-> u16),
53 : [port] "N{dx}" (port),
54 );
55}
56
57pub fn inl(port: u16) u32 {
58 return asm volatile ("inl %[port], %[result]"
59 : [result] "={eax}" (-> u32),
60 : [port] "N{dx}" (port),
61 );
62}