greatbridf 4 anos atrás
pai
commit
bea738fe10
4 arquivos alterados com 102 adições e 0 exclusões
  1. 2 0
      CMakeLists.txt
  2. 22 0
      include/types/buffer.h
  3. 1 0
      include/types/types.h
  4. 77 0
      src/types/buffer.c

+ 2 - 0
CMakeLists.txt

@@ -32,12 +32,14 @@ set(KERNEL_MAIN_SOURCES src/kernel_main.c
                         src/kernel/stdio.c
                         src/kernel/mem.c
                         src/kernel/vga.c
+                        src/types/buffer.c
                         include/asm/boot.h
                         include/asm/port_io.h
                         include/kernel/interrupt.h
                         include/kernel/stdio.h
                         include/kernel/mem.h
                         include/kernel/vga.h
+                        include/types/buffer.h
                         include/types/types.h
                         include/types/size.h
                         include/types/stdint.h

+ 22 - 0
include/types/buffer.h

@@ -0,0 +1,22 @@
+#pragma once
+
+#include "stdint.h"
+
+struct ring_buffer {
+    char* const buf_start_pos;
+    char* const buf_end_pos;
+    char* base;
+    char* head;
+    size_t count;
+};
+
+int32_t
+ring_buffer_empty(struct ring_buffer* buf);
+
+int32_t
+ring_buffer_full(struct ring_buffer* buf);
+
+char ring_buffer_read(struct ring_buffer* buf);
+
+int32_t
+ring_buffer_write(struct ring_buffer* buf, char c);

+ 1 - 0
include/types/types.h

@@ -1,4 +1,5 @@
 #pragma once
 
+#include "buffer.h"
 #include "size.h"
 #include "stdint.h"

+ 77 - 0
src/types/buffer.c

@@ -0,0 +1,77 @@
+#include <types/buffer.h>
+#include <types/stdint.h>
+
+int32_t
+ring_buffer_empty(struct ring_buffer* buf)
+{
+    return (buf->count == 0);
+}
+
+int32_t
+ring_buffer_full(struct ring_buffer* buf)
+{
+    return (buf->count == (buf->buf_end_pos - buf->buf_start_pos + 1));
+}
+
+static inline void
+ring_buffer_move_base_ptr_forward(struct ring_buffer* buf)
+{
+    if (buf->base == buf->buf_end_pos) {
+        buf->base = buf->buf_start_pos;
+    } else {
+        ++buf->base;
+    }
+}
+
+static inline void
+ring_buffer_move_head_ptr_forward(struct ring_buffer* buf)
+{
+    if (buf->head == buf->buf_end_pos) {
+        buf->head = buf->buf_start_pos;
+    } else {
+        ++buf->head;
+    }
+}
+
+static inline char
+ring_buffer_get_data(struct ring_buffer* buf)
+{
+    --buf->count;
+    return *buf->base;
+}
+
+static inline void
+ring_buffer_put_data(struct ring_buffer* buf, char c)
+{
+    *buf->head = c;
+    ++buf->count;
+}
+
+char ring_buffer_read(struct ring_buffer* buf)
+{
+    if (ring_buffer_empty(buf)) {
+        // TODO: set error flag
+        return 0xff;
+    }
+
+    char c = ring_buffer_get_data(buf);
+
+    ring_buffer_move_base_ptr_forward(buf);
+
+    return c;
+}
+
+int32_t
+ring_buffer_write(struct ring_buffer* buf, char c)
+{
+    if (ring_buffer_full(buf)) {
+        // TODO: set error flag
+        return 1;
+    }
+
+    ring_buffer_put_data(buf, c);
+
+    ring_buffer_move_head_ptr_forward(buf);
+
+    return 0;
+}