Files
xv6-custom-os/sysproc.c
iDunnoDev 9b23ca2a45 Added buffer to the console
Added hotkeys to switch between console buffers and to return to the home one
Added clear screen command
Added debug text outputs to the hello command and when loading sh
2022-12-09 10:39:55 +00:00

147 lines
2.3 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", myproc()->consoleIndex);
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;
int consoleindex = -1;
if ((consoleindex = newconsole()) != 0)
{
curproc->consoleIndex = consoleindex;
switchtoconsole(consoleindex);
wakeup(myproc()->chan);
result = 1;
}
return result;
}
int sys_cls(void)
{
clearscreen();
return 0;
}