From 8e85ae5318bb47af04c9b2e4d2158ce113e9c991 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Thu, 7 Feb 2019 17:52:57 -0800 Subject: [PATCH] Added getpid system call --- src/drivers/nulldrv/main.s | 10 +++++++++- src/kernel/scheduler.cpp | 14 +++++++------- src/kernel/syscall.cpp | 28 +++++++++++++++++++--------- src/kernel/syscall.h | 1 + 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/drivers/nulldrv/main.s b/src/drivers/nulldrv/main.s index a0175bd..fdad2b2 100644 --- a/src/drivers/nulldrv/main.s +++ b/src/drivers/nulldrv/main.s @@ -1,11 +1,19 @@ global _start _start: xor rbp, rbp ; Sentinel rbp + + mov rax, 5 ; GETPID syscall + int 0xee + mov r12, rax ; save pid to r12 + + mov rax, 1 ; DEBUG syscall + int 0xee + mov r11, 0 ; counter mov rbx, 20 ; sleep timeout .loop: - mov rax, 1 ; DEBUG syscall + mov rax, 2 ; MESSAGE syscall ;mov rax, 0 ; NOOP syscall ;syscall int 0xee diff --git a/src/kernel/scheduler.cpp b/src/kernel/scheduler.cpp index 0155263..cc1d693 100644 --- a/src/kernel/scheduler.cpp +++ b/src/kernel/scheduler.cpp @@ -216,13 +216,11 @@ void scheduler::prune(uint64_t now) while (proc) { bool ready = proc->flags && process_flags::ready; ready |= proc->wake_on_time(now); - if (!ready) { - proc = proc->next(); - continue; - } auto *remove = proc; proc = proc->next(); + if (!ready) continue; + m_blocked.remove(remove); m_runlists[remove->priority].push_front(remove); } @@ -234,15 +232,17 @@ scheduler::schedule(uintptr_t rsp0) // TODO: lol a real clock static uint64_t now = 0; - prune(++now); m_current->rsp = rsp0; m_runlists[m_current->priority].remove(m_current); - if (m_current->flags && process_flags::ready) + if (m_current->flags && process_flags::ready) { m_runlists[m_current->priority].push_back(m_current); - else + } else { m_blocked.push_back(m_current); + } + + prune(++now); uint8_t pri = 0; while (m_runlists[pri].empty()) { diff --git a/src/kernel/syscall.cpp b/src/kernel/syscall.cpp index bdd65e2..a50d2cc 100644 --- a/src/kernel/syscall.cpp +++ b/src/kernel/syscall.cpp @@ -40,20 +40,23 @@ syscall_dispatch(uintptr_t return_rsp, cpu_state ®s) console *cons = console::get(); syscall call = static_cast(regs.rax); + auto &s = scheduler::get(); + auto *p = s.current(); + switch (call) { case syscall::noop: break; case syscall::debug: cons->set_color(11); - cons->printf("\nReceived DEBUG syscall\n"); + cons->printf("\nProcess %u: Received DEBUG syscall\n", p->pid); cons->set_color(); print_regs(regs); break; case syscall::message: cons->set_color(11); - cons->printf("\nReceived MESSAGE syscall\n"); + cons->printf("\nProcess %u: Received MESSAGE syscall\n", p->pid); cons->set_color(); break; @@ -64,7 +67,7 @@ syscall_dispatch(uintptr_t return_rsp, cpu_state ®s) auto &s = scheduler::get(); auto *p = s.current(); p->wait_on_signal(-1ull); - cons->printf("\nReceived PAUSE syscall\n"); + cons->printf("\nProcess %u: Received PAUSE syscall\n", p->pid); return_rsp = s.schedule(return_rsp); cons->set_color(); } @@ -73,16 +76,23 @@ syscall_dispatch(uintptr_t return_rsp, cpu_state ®s) case syscall::sleep: { cons->set_color(11); - - auto &s = scheduler::get(); - auto *p = s.current(); - p->wait_on_time(regs.rbx); - cons->printf("\nReceived SLEEP syscall\n"); - return_rsp = s.schedule(return_rsp); + cons->printf("\nProcess %u: Received SLEEP syscall\n", p->pid); + cons->printf("Sleeping until %lu\n", regs.rbx); cons->set_color(); + + p->wait_on_time(regs.rbx); + return_rsp = s.schedule(return_rsp); } break; + case syscall::getpid: + cons->set_color(11); + cons->printf("\nProcess %u: Received GETPID syscall\n", p->pid); + cons->set_color(); + regs.rax = p->pid; + break; + + default: cons->set_color(9); cons->printf("\nReceived unknown syscall: %02x\n", call); diff --git a/src/kernel/syscall.h b/src/kernel/syscall.h index 12df735..a1f27c5 100644 --- a/src/kernel/syscall.h +++ b/src/kernel/syscall.h @@ -11,6 +11,7 @@ enum class syscall : uint64_t message, pause, sleep, + getpid, last_syscall };