mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
Added getpid system call
This commit is contained in:
@@ -1,11 +1,19 @@
|
|||||||
global _start
|
global _start
|
||||||
_start:
|
_start:
|
||||||
xor rbp, rbp ; Sentinel rbp
|
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 r11, 0 ; counter
|
||||||
mov rbx, 20 ; sleep timeout
|
mov rbx, 20 ; sleep timeout
|
||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
mov rax, 1 ; DEBUG syscall
|
mov rax, 2 ; MESSAGE syscall
|
||||||
;mov rax, 0 ; NOOP syscall
|
;mov rax, 0 ; NOOP syscall
|
||||||
;syscall
|
;syscall
|
||||||
int 0xee
|
int 0xee
|
||||||
|
|||||||
@@ -216,13 +216,11 @@ void scheduler::prune(uint64_t now)
|
|||||||
while (proc) {
|
while (proc) {
|
||||||
bool ready = proc->flags && process_flags::ready;
|
bool ready = proc->flags && process_flags::ready;
|
||||||
ready |= proc->wake_on_time(now);
|
ready |= proc->wake_on_time(now);
|
||||||
if (!ready) {
|
|
||||||
proc = proc->next();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto *remove = proc;
|
auto *remove = proc;
|
||||||
proc = proc->next();
|
proc = proc->next();
|
||||||
|
if (!ready) continue;
|
||||||
|
|
||||||
m_blocked.remove(remove);
|
m_blocked.remove(remove);
|
||||||
m_runlists[remove->priority].push_front(remove);
|
m_runlists[remove->priority].push_front(remove);
|
||||||
}
|
}
|
||||||
@@ -234,15 +232,17 @@ scheduler::schedule(uintptr_t rsp0)
|
|||||||
|
|
||||||
// TODO: lol a real clock
|
// TODO: lol a real clock
|
||||||
static uint64_t now = 0;
|
static uint64_t now = 0;
|
||||||
prune(++now);
|
|
||||||
|
|
||||||
m_current->rsp = rsp0;
|
m_current->rsp = rsp0;
|
||||||
m_runlists[m_current->priority].remove(m_current);
|
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);
|
m_runlists[m_current->priority].push_back(m_current);
|
||||||
else
|
} else {
|
||||||
m_blocked.push_back(m_current);
|
m_blocked.push_back(m_current);
|
||||||
|
}
|
||||||
|
|
||||||
|
prune(++now);
|
||||||
|
|
||||||
uint8_t pri = 0;
|
uint8_t pri = 0;
|
||||||
while (m_runlists[pri].empty()) {
|
while (m_runlists[pri].empty()) {
|
||||||
|
|||||||
@@ -40,20 +40,23 @@ syscall_dispatch(uintptr_t return_rsp, cpu_state ®s)
|
|||||||
console *cons = console::get();
|
console *cons = console::get();
|
||||||
syscall call = static_cast<syscall>(regs.rax);
|
syscall call = static_cast<syscall>(regs.rax);
|
||||||
|
|
||||||
|
auto &s = scheduler::get();
|
||||||
|
auto *p = s.current();
|
||||||
|
|
||||||
switch (call) {
|
switch (call) {
|
||||||
case syscall::noop:
|
case syscall::noop:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case syscall::debug:
|
case syscall::debug:
|
||||||
cons->set_color(11);
|
cons->set_color(11);
|
||||||
cons->printf("\nReceived DEBUG syscall\n");
|
cons->printf("\nProcess %u: Received DEBUG syscall\n", p->pid);
|
||||||
cons->set_color();
|
cons->set_color();
|
||||||
print_regs(regs);
|
print_regs(regs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case syscall::message:
|
case syscall::message:
|
||||||
cons->set_color(11);
|
cons->set_color(11);
|
||||||
cons->printf("\nReceived MESSAGE syscall\n");
|
cons->printf("\nProcess %u: Received MESSAGE syscall\n", p->pid);
|
||||||
cons->set_color();
|
cons->set_color();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -64,7 +67,7 @@ syscall_dispatch(uintptr_t return_rsp, cpu_state ®s)
|
|||||||
auto &s = scheduler::get();
|
auto &s = scheduler::get();
|
||||||
auto *p = s.current();
|
auto *p = s.current();
|
||||||
p->wait_on_signal(-1ull);
|
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);
|
return_rsp = s.schedule(return_rsp);
|
||||||
cons->set_color();
|
cons->set_color();
|
||||||
}
|
}
|
||||||
@@ -73,16 +76,23 @@ syscall_dispatch(uintptr_t return_rsp, cpu_state ®s)
|
|||||||
case syscall::sleep:
|
case syscall::sleep:
|
||||||
{
|
{
|
||||||
cons->set_color(11);
|
cons->set_color(11);
|
||||||
|
cons->printf("\nProcess %u: Received SLEEP syscall\n", p->pid);
|
||||||
auto &s = scheduler::get();
|
cons->printf("Sleeping until %lu\n", regs.rbx);
|
||||||
auto *p = s.current();
|
|
||||||
p->wait_on_time(regs.rbx);
|
|
||||||
cons->printf("\nReceived SLEEP syscall\n");
|
|
||||||
return_rsp = s.schedule(return_rsp);
|
|
||||||
cons->set_color();
|
cons->set_color();
|
||||||
|
|
||||||
|
p->wait_on_time(regs.rbx);
|
||||||
|
return_rsp = s.schedule(return_rsp);
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
cons->set_color(9);
|
cons->set_color(9);
|
||||||
cons->printf("\nReceived unknown syscall: %02x\n", call);
|
cons->printf("\nReceived unknown syscall: %02x\n", call);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ enum class syscall : uint64_t
|
|||||||
message,
|
message,
|
||||||
pause,
|
pause,
|
||||||
sleep,
|
sleep,
|
||||||
|
getpid,
|
||||||
|
|
||||||
last_syscall
|
last_syscall
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user