
Added some functionality to the procdump to show the current console and parent pids of processes for debugging Added var to clearconsole that enables the internal lock if one wasnt prelocked before hand Fixed issue where race conditions would stop the title from drawing by drawing it to the buffer too Fixed issue where the maze function was spamming the conswrite and cons lock by changing it to send an entire line instead of 1 char at a time
159 lines
2.4 KiB
C
159 lines
2.4 KiB
C
#include "types.h"
|
|
#include "x86.h"
|
|
#include "defs.h"
|
|
#include "date.h"
|
|
#include "param.h"
|
|
#include "memlayout.h"
|
|
#include "mmu.h"
|
|
#include "proc.h"
|
|
|
|
int sys_fork(void)
|
|
{
|
|
return fork();
|
|
}
|
|
|
|
int sys_exit(void)
|
|
{
|
|
exit();
|
|
return 0; // not reached
|
|
}
|
|
|
|
int sys_wait(void)
|
|
{
|
|
return wait();
|
|
}
|
|
|
|
int sys_kill(void)
|
|
{
|
|
int pid;
|
|
|
|
if (argint(0, &pid) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
return kill(pid);
|
|
}
|
|
|
|
int sys_getpid(void)
|
|
{
|
|
return myproc()->pid;
|
|
}
|
|
|
|
int sys_sbrk(void)
|
|
{
|
|
int addr;
|
|
int n;
|
|
|
|
if (argint(0, &n) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
addr = myproc()->sz;
|
|
if (growproc(n) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
return addr;
|
|
}
|
|
|
|
int sys_sleep(void)
|
|
{
|
|
int n;
|
|
uint ticks0;
|
|
|
|
if (argint(0, &n) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
acquire(&tickslock);
|
|
ticks0 = ticks;
|
|
while (ticks - ticks0 < n)
|
|
{
|
|
if (myproc()->killed)
|
|
{
|
|
release(&tickslock);
|
|
return -1;
|
|
}
|
|
sleep(&ticks, &tickslock);
|
|
}
|
|
release(&tickslock);
|
|
return 0;
|
|
}
|
|
|
|
// return how many clock tick interrupts have occurred
|
|
// since start.
|
|
int sys_uptime(void)
|
|
{
|
|
uint xticks;
|
|
|
|
acquire(&tickslock);
|
|
xticks = ticks;
|
|
release(&tickslock);
|
|
return xticks;
|
|
}
|
|
|
|
int sys_greeting(void)
|
|
{
|
|
cprintf("Hello again\n");
|
|
cprintf("Using Console: %d\n", getcurrentconsoleindex());
|
|
cprintf("Current PID: %d\n", myproc()->pid);
|
|
cprintf("Current Parent PID: %d\n", myproc()->parent->pid);
|
|
cprintf("Process Console: %d\n", getconsoleindex(myproc()->consoleptr));
|
|
return 0;
|
|
}
|
|
|
|
int sys_shutdown(void)
|
|
{
|
|
int restart;
|
|
if (argint(0, &restart) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (restart == 1)
|
|
{
|
|
unsigned char good = 0x02;
|
|
while (good & 0x02) {
|
|
good = inb(0x64);
|
|
}
|
|
outb(0x64, 0xFE);
|
|
}
|
|
else
|
|
{
|
|
outw(0x604, 0x2000);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int sys_screen(void)
|
|
{
|
|
struct proc *curproc = myproc();
|
|
int result = 0;
|
|
struct vconsole* consoleptr = 0;
|
|
int bgcol;
|
|
char *title;
|
|
|
|
if (argint(1, &bgcol) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (argstr(0, &title) < 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if ((consoleptr = newconsole(title, bgcol)) != 0)
|
|
{
|
|
curproc->consoleptr = consoleptr;
|
|
switchtoconsole(consoleptr);
|
|
result = 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
int sys_cls(void)
|
|
{
|
|
clearscreen(0);
|
|
return 0;
|
|
} |