Files
xv6-custom-os/sysproc.c
2023-01-13 17:37:43 +00:00

171 lines
3.0 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;
}
// System call i used to debug and test the consoles, it returns useful information in relation to the current console/process
int sys_greeting(void)
{
cprintf("Hello! here is the info you requested...\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;
}
// System call to shutdown or restart the OS
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;
}
// System call for handling the new screen user app
int sys_screen(void)
{
struct proc *curproc = myproc();
int result = 0;
struct vconsole* consoleptr = 0;
int bgcol;
char *title;
// Get the background color value
if (argint(1, &bgcol) < 0)
{
return -1;
}
// Get the title arg value
if (argstr(0, &title) < 0)
{
return -1;
}
// Try to setup an unused console from the pool
if ((consoleptr = newconsole(title, bgcol)) != 0)
{
// New console was successful, set the pointer and switch to it
curproc->consoleptr = consoleptr;
switchtoconsole(consoleptr);
result = 1;
}
else
{
cprintf("screen: failed to create a new console\n");
}
return result;
}
// System call to clear the screen
int sys_cls(void)
{
clearscreen(0);
return 0;
}