summaryrefslogtreecommitdiffstats
path: root/arch/x86/port
diff options
context:
space:
mode:
authorAlexey Gavrilov <90127298+rebovas@users.noreply.github.com>2024-05-24 14:33:19 +0700
committerGitHub <noreply@github.com>2024-05-24 14:33:19 +0700
commitdc0b89fa63a181bd4add318bfd7a46344702f4e7 (patch)
tree48e25b199ae3459e12c7202f7b18a37cd087bf9b /arch/x86/port
parent0a50b1758fd3da118408fd724825d0a50a9ecf17 (diff)
parent5fbf41e967ed8e413ecf1e6abb72e8d285169df4 (diff)
Merge pull request #9 from rebovas/interrupts_picHEADmain
Pic + Tuple + refactor PrimaryInitialization class
Diffstat (limited to 'arch/x86/port')
-rw-r--r--arch/x86/port/Operations7
-rw-r--r--arch/x86/port/PortOps.cpp62
-rw-r--r--arch/x86/port/PortOps.h26
3 files changed, 95 insertions, 0 deletions
diff --git a/arch/x86/port/Operations b/arch/x86/port/Operations
new file mode 100644
index 0000000..4812518
--- /dev/null
+++ b/arch/x86/port/Operations
@@ -0,0 +1,7 @@
+#ifndef PORTOPEARATION_H
+#define PORTOPEARATION_H
+
+#include "PortOps.h"
+
+#endif
+
diff --git a/arch/x86/port/PortOps.cpp b/arch/x86/port/PortOps.cpp
new file mode 100644
index 0000000..4b418dd
--- /dev/null
+++ b/arch/x86/port/PortOps.cpp
@@ -0,0 +1,62 @@
+#include "PortOps.h"
+
+
+void PortOps::outb(portadr port, regb value)
+{
+ asm("outb %b0, %w1"
+ :
+ : "a"(value), "Nd"(port)
+ : "memory");
+};
+
+void PortOps::outw(portadr port, regw value)
+{
+ asm("out %w0, %w1"
+ :
+ : "a"(value), "Nd"(port)
+ : "memory");
+};
+
+void PortOps::outl(portadr port, regl value)
+{
+ asm("out %k0, %w1"
+ :
+ : "a"(value), "Nd"(port)
+ : "memory");
+};
+
+regb PortOps::inb(portadr port)
+{
+ regb res;
+
+ asm("in %w1, %b0"
+ : "=a"(res)
+ : "Nd"(port)
+ : "memory");
+
+ return res;
+};
+
+regw PortOps::inw(portadr port)
+{
+ regw res;
+
+ asm("in %w1, %w0"
+ : "=a"(res)
+ : "Nd"(port)
+ : "memory");
+
+ return res;
+};
+
+regl PortOps::inl(portadr port)
+{
+ regl res;
+
+ asm("in %w1, %k0"
+ : "=a"(res)
+ : "Nd"(port)
+ : "memory");
+
+ return res;
+};
diff --git a/arch/x86/port/PortOps.h b/arch/x86/port/PortOps.h
new file mode 100644
index 0000000..7db3a5f
--- /dev/null
+++ b/arch/x86/port/PortOps.h
@@ -0,0 +1,26 @@
+#ifndef PORT_H
+#define PORT_H
+
+#include <types.h>
+
+
+using regb = uint8;
+using regw = uint16;
+using regl = uint32;
+using portadr = uint16;
+
+class PortOps
+{
+ public:
+ static void outb(portadr port, regb value);
+ static void outw(portadr port, regw value);
+ static void outl(portadr port, regl value);
+ // Get byte from port
+ static regb inb(portadr port);
+ // Get word from port
+ static regw inw(portadr port);
+ // Get double word from port
+ static regl inl(portadr port);
+};
+
+#endif