diff --git a/kernel/arch/x86_64/x86_64.mk b/kernel/arch/x86_64/x86_64.mk index 7eb27bd..e87d823 100644 --- a/kernel/arch/x86_64/x86_64.mk +++ b/kernel/arch/x86_64/x86_64.mk @@ -11,7 +11,7 @@ CFLAGS += -m64 \ -mno-red-zone \ -fno-stack-protector \ -fno-stack-check \ - -Os \ + -O0 \ LDFLAGS += -m elf_x86_64 \ -pie \ diff --git a/kernel/ipc/pipe/pipe.c b/kernel/ipc/pipe/pipe.c index 0e3b54e..0392540 100644 --- a/kernel/ipc/pipe/pipe.c +++ b/kernel/ipc/pipe/pipe.c @@ -6,16 +6,20 @@ #include "dlmalloc/malloc.h" #include "errors.h" #include "pipe.h" +#include "kprintf.h" int32_t ipc_pipeinit(IpcPipe *pipe, uint64_t pid) { hal_memset(pipe, 0, sizeof(*pipe)); spinlock_init(&pipe->spinlock); pipe->ownerpid = pid; - pipe->rbuf.buffer = dlmalloc(IPC_PIPE_MAX); - if (pipe->rbuf.buffer == NULL) { + + uint8_t *buf = dlmalloc(IPC_PIPE_MAX); + if (buf == NULL) { return E_NOMEMORY; } - pipe->rbuf.cap = IPC_PIPE_MAX; + + rbuf_init(&pipe->rbuf, buf, IPC_PIPE_MAX); + return E_OK; } @@ -29,9 +33,7 @@ int32_t ipc_pipewrite(IpcPipe *pipe, const uint8_t *const buffer, size_t n) { size_t i = 0; spinlock_acquire(&pipe->spinlock); for (; i < n; i++) { - if (rbuf_push(&pipe->rbuf, buffer[i]) < 0) { - break; - } + rbuf_push(&pipe->rbuf, buffer[i]); } spinlock_release(&pipe->spinlock); return i; @@ -40,10 +42,11 @@ int32_t ipc_pipewrite(IpcPipe *pipe, const uint8_t *const buffer, size_t n) { int32_t ipc_piperead(IpcPipe *pipe, uint8_t *const buffer, size_t n) { size_t i = 0; spinlock_acquire(&pipe->spinlock); - for (; i < n; i++) { + while (i < n) { if (rbuf_pop(&pipe->rbuf, &buffer[i]) < 0) { break; } + i++; } spinlock_release(&pipe->spinlock); return i; diff --git a/kernel/proc/ps2kbproc/ps2kbproc.c b/kernel/proc/ps2kbproc/ps2kbproc.c index f1f665f..b6956e5 100644 --- a/kernel/proc/ps2kbproc/ps2kbproc.c +++ b/kernel/proc/ps2kbproc/ps2kbproc.c @@ -9,14 +9,13 @@ Proc *PS2KBPROC = NULL; Ps2KbFastBuf PS2KB_BUF; - void ps2kbproc_init(Proc *proc) { PS2KBPROC = proc; PS2KBPROC->bcast_pipes.list = NULL; - PS2KB_BUF.rbuf.buffer = dlmalloc(IPC_PIPE_MAX); - PS2KB_BUF.rbuf.cap = IPC_PIPE_MAX; + uint8_t *buf = dlmalloc(IPC_PIPE_MAX); + rbuf_init(&PS2KB_BUF.rbuf, buf, IPC_PIPE_MAX); spinlock_init(&PS2KB_BUF.spinlock); } diff --git a/kernel/proc/ps2kbproc/ps2kbproc.h b/kernel/proc/ps2kbproc/ps2kbproc.h index 67a76b3..710130b 100644 --- a/kernel/proc/ps2kbproc/ps2kbproc.h +++ b/kernel/proc/ps2kbproc/ps2kbproc.h @@ -1,6 +1,7 @@ #ifndef PROC_PS2KB_PS2KBPROC_H_ #define PROC_PS2KB_PS2KBPROC_H_ +#include #include "proc/proc.h" #include "rbuf/rbuf.h" #include "spinlock/spinlock.h" diff --git a/kernel/proc/termproc/termproc.c b/kernel/proc/termproc/termproc.c index 45956da..16ad616 100644 --- a/kernel/proc/termproc/termproc.c +++ b/kernel/proc/termproc/termproc.c @@ -18,7 +18,7 @@ void termproc_fn(void) { for (;;) { char c = 0; int32_t read = ipc_piperead(TERMPROC->pipes[1], (uint8_t *)&c, 1); - if (read > 0 && c != 0) { + if (read > 0) { kprintf("%c", c); } } diff --git a/kernel/rbuf/rbuf.c b/kernel/rbuf/rbuf.c index cf2241f..de4745e 100644 --- a/kernel/rbuf/rbuf.c +++ b/kernel/rbuf/rbuf.c @@ -1,37 +1,34 @@ #include #include +#include #include "rbuf.h" +#include "kprintf.h" +#include "hal/hal.h" + +void rbuf_init(RBuf *rbuf, uint8_t *buf, size_t bufsize) { + rbuf->buffer = buf; + rbuf->tail = 0; + rbuf->head = 0; + rbuf->cap = bufsize; + rbuf->count = 0; +} int32_t rbuf_push(RBuf *rbuf, uint8_t data) { - size_t next; - - next = rbuf->head + 1; - if (next >= rbuf->cap) { - next = 0; - } - - if (next == rbuf->tail) { + if (rbuf->count == rbuf->cap) { return -1; } - rbuf->buffer[rbuf->head] = data; - rbuf->head = next; + rbuf->head = (rbuf->head + 1) % rbuf->cap; + rbuf->count++; return 0; } int32_t rbuf_pop(RBuf *rbuf, uint8_t *data) { - size_t next; - - if (rbuf->head == rbuf->tail) { + if (rbuf->count == 0) { return -1; } - - next = rbuf->tail + 1; - if (next >= rbuf->cap) { - next = 0; - } - *data = rbuf->buffer[rbuf->tail]; - rbuf->tail = next; + rbuf->tail = (rbuf->tail + 1) % rbuf->cap; + rbuf->count--; return 0; } diff --git a/kernel/rbuf/rbuf.h b/kernel/rbuf/rbuf.h index 5f1aa3c..5320eb7 100644 --- a/kernel/rbuf/rbuf.h +++ b/kernel/rbuf/rbuf.h @@ -3,15 +3,19 @@ #include #include +#include typedef struct { uint8_t *buffer; - size_t head; size_t tail; + size_t head; size_t cap; + size_t count; + bool full; } RBuf; int32_t rbuf_push(RBuf *rbuf, uint8_t data); int32_t rbuf_pop(RBuf *rbuf, uint8_t *data); +void rbuf_init(RBuf *rbuf, uint8_t *buf, size_t bufsize); #endif // RBUF_RBUF_H_ diff --git a/user/tb/main.c b/user/tb/main.c index 07626d4..f52b53e 100644 --- a/user/tb/main.c +++ b/user/tb/main.c @@ -120,6 +120,8 @@ void do_mode_interactive(void) { linebuf[cursor++] = b; uprintf("%c", b); } + } else { + schedrelease(); } }