Added comments and help commands to user apps
This commit is contained in:
4
Makefile
4
Makefile
@ -225,8 +225,8 @@ QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \
|
||||
then echo "-gdb tcp::$(GDBPORT)"; \
|
||||
else echo "-s -p $(GDBPORT)"; fi)
|
||||
ifndef CPUS
|
||||
#CPUS := 2
|
||||
CPUS := 1 # For debugging
|
||||
CPUS := 2
|
||||
#CPUS := 1 # For debugging
|
||||
endif
|
||||
QEMUOPTS = -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp $(CPUS) -m 512 $(QEMUEXTRA)
|
||||
|
||||
|
110
console.c
110
console.c
@ -20,7 +20,7 @@
|
||||
#define MENUWIDTH 27
|
||||
// Number of max consoles + 1 for bottom border and another 2 for a space between top and bottom
|
||||
#define MENUHEIGHT (MAXVCONSOLES + 3);
|
||||
|
||||
// Vars to hold the current menu item and menu active bool
|
||||
static int currentmenuitem = 0;
|
||||
static int menuactive = 0;
|
||||
|
||||
@ -36,6 +36,7 @@ struct kbdbuffer inputBuffer;
|
||||
|
||||
struct kbdbuffer *input = 0;
|
||||
|
||||
// Struct to hold the variables needed for a virtual console
|
||||
struct vconsole
|
||||
{
|
||||
uint consoleindex;
|
||||
@ -46,9 +47,11 @@ struct vconsole
|
||||
int pos;
|
||||
int active;
|
||||
int inuse;
|
||||
// Variables for the title bar, this can be manual set and locked, if not the current process is used
|
||||
uint titlebgcol;
|
||||
char proctitle[20];
|
||||
int titlelocked;
|
||||
// Status for possible future use with the title bar to allow a proccess to set messages to print
|
||||
char status[30];
|
||||
};
|
||||
|
||||
@ -80,6 +83,7 @@ static struct
|
||||
int locking;
|
||||
} vcons;
|
||||
|
||||
// Static function for getting the current count of active consoles
|
||||
static int getcurrentactiveconsolecount(void)
|
||||
{
|
||||
int resultcount = 0;
|
||||
@ -94,6 +98,7 @@ static int getcurrentactiveconsolecount(void)
|
||||
return resultcount;
|
||||
}
|
||||
|
||||
// Function to get the menu index of an active console because they might be offset
|
||||
static int getconsolemenuindex(struct vconsole* consolein)
|
||||
{
|
||||
int resultcount = 0;
|
||||
@ -112,6 +117,7 @@ static int getconsolemenuindex(struct vconsole* consolein)
|
||||
return resultcount;
|
||||
}
|
||||
|
||||
// Function for getting the console at the given menu index
|
||||
static int getmenuindexconsole(int menuindex)
|
||||
{
|
||||
int resultcount = 0;
|
||||
@ -135,6 +141,7 @@ static int getmenuindexconsole(int menuindex)
|
||||
return resultconsoleindex;
|
||||
}
|
||||
|
||||
// Function for getting a consoles index
|
||||
int getconsoleindex(struct vconsole* consolein)
|
||||
{
|
||||
return consolein->consoleindex;
|
||||
@ -173,6 +180,7 @@ static int itoa(int xx, int base, int sign, char* buf)
|
||||
return i;
|
||||
}
|
||||
|
||||
// Function for printing an integer as a string to the screen
|
||||
static void printint(int xx, int base, int sign)
|
||||
{
|
||||
int i = 0;
|
||||
@ -256,6 +264,8 @@ void cprintf(char *fmt, ...)
|
||||
}
|
||||
}
|
||||
|
||||
// Function to provide the same string manipulation as cprint but saving to the given buffer so it can be used without printing to the screen
|
||||
// sprintf is the c function that normally does this so i used the same name here
|
||||
void sprintf(char* strbuffer, char *fmt, ...)
|
||||
{
|
||||
int i, c, si;
|
||||
@ -401,28 +411,40 @@ struct vconsole* getvalidprocessconsoleptr(void)
|
||||
|
||||
static ushort *crt = (ushort *)P2V(0xb8000); // CGA memory
|
||||
|
||||
// Function for drawing the menu onto the screen
|
||||
static void drawmenu(void)
|
||||
{
|
||||
struct vconsole* inconsoleptr = getvalidprocessconsoleptr();
|
||||
// Rows = the number of active consoles + 1 for the padding at the top, 1 for the padding at the bottom and 1 for the border
|
||||
int rows = getcurrentactiveconsolecount() + 3;
|
||||
int pos = TITLEOFF;
|
||||
uint c = 0;
|
||||
// Small buffer to hold the menu memory
|
||||
char menulines[MAXVCONSOLES][24];
|
||||
|
||||
// Setup our menu item line strings
|
||||
int menuindex = 0;
|
||||
for (int i = 0; i < MAXVCONSOLES; i++)
|
||||
{
|
||||
if (consoles[i].active)
|
||||
{
|
||||
memset(menulines[i], 0, sizeof(menulines[i][0]) * sizeof(menulines[i]));
|
||||
sprintf(menulines[i], "%d: %s", consoles[i].consoleindex, consoles[i].proctitle);
|
||||
memset(menulines[menuindex], 0, sizeof(menulines[i][0]) * sizeof(menulines[i]));
|
||||
sprintf(menulines[menuindex], "%d: %s", consoles[i].consoleindex, consoles[i].proctitle);
|
||||
if (consoles[i].inuse)
|
||||
{
|
||||
currentmenuitem = menuindex;
|
||||
}
|
||||
menuindex++;
|
||||
}
|
||||
}
|
||||
|
||||
// Draw the rows for the menu
|
||||
for (int y = 0; y < rows; y++)
|
||||
{
|
||||
pos = TITLEOFF + (y * SCRWIDTH);
|
||||
for (int x = 0; x < MENUWIDTH; x++)
|
||||
{
|
||||
// Top line and the 2nd to last line are padding, we just draw spaces and the first and last x are the border character
|
||||
if (y == 0 || y == (rows - 2))
|
||||
{
|
||||
if (x == 0 || x == (MENUWIDTH - 1))
|
||||
@ -434,10 +456,12 @@ static void drawmenu(void)
|
||||
c = 0x0720;
|
||||
}
|
||||
}
|
||||
// The last row is the bottom border, so we can just fill it with the border character
|
||||
else if (y == (rows - 1))
|
||||
{
|
||||
c = 0xB2 | inconsoleptr->titlebgcol;
|
||||
}
|
||||
// Otherwise we draw the border chars and padding space with the console menu item string between
|
||||
else
|
||||
{
|
||||
if (x == 0 || x == (MENUWIDTH - 1))
|
||||
@ -471,6 +495,7 @@ static void drawmenu(void)
|
||||
menuactive = 1;
|
||||
}
|
||||
|
||||
// Function that handles the moving of the highlight bar for the menu
|
||||
static void navigatemenu(int dir)
|
||||
{
|
||||
int pos = 0;
|
||||
@ -486,14 +511,18 @@ static void navigatemenu(int dir)
|
||||
newindex = totalactiveconsoles - 1;
|
||||
}
|
||||
|
||||
// make sure the new index isnt just the same as the current selected menu item, we then change the background bits around
|
||||
// which saves us from redrawing the menu every time the selected item changes
|
||||
if (newindex != currentmenuitem)
|
||||
{
|
||||
// change the background bits of the last selected item to black
|
||||
pos = TITLEOFF + ((currentmenuitem + 1) * SCRWIDTH);
|
||||
for (int x = 2; x < MENUWIDTH - 2; x++)
|
||||
{
|
||||
crt[pos + x] = (crt[pos + x] & 0x00FF) | 0x0700;
|
||||
}
|
||||
|
||||
// change the background bits of the new selected item to the highlight color
|
||||
pos = TITLEOFF + ((newindex + 1) * SCRWIDTH);
|
||||
for (int x = 2; x < MENUWIDTH - 2; x++)
|
||||
{
|
||||
@ -504,6 +533,7 @@ static void navigatemenu(int dir)
|
||||
}
|
||||
}
|
||||
|
||||
// Function that closes the menu and reloads the buffer into screen memory
|
||||
static void closemenu(void)
|
||||
{
|
||||
loadscreenbuffer(currentconsole->screenbuffer);
|
||||
@ -517,42 +547,51 @@ static void closemenu(void)
|
||||
menuactive = 0;
|
||||
}
|
||||
|
||||
// Function for drawing the title bar of the current console
|
||||
static void drawtitle(void)
|
||||
{
|
||||
struct vconsole* inconsoleptr = getvalidprocessconsoleptr();
|
||||
|
||||
int pos = 0;
|
||||
char c = ' ';
|
||||
// Setup the title bar strings to print
|
||||
char menutext[] = "(M)enu";
|
||||
char consoletitletext[10]; // + (inconsoleptr->consoleindex + 1);
|
||||
sprintf(consoletitletext, "Console %d", inconsoleptr->consoleindex);
|
||||
|
||||
// Loop through the top row and write the current character to the screen buffer
|
||||
for (pos = 0; pos < SCRWIDTH; pos++)
|
||||
{
|
||||
int offset = 0;
|
||||
// Print the menu text
|
||||
if (pos < 6) {
|
||||
c = menutext[pos - offset];
|
||||
}
|
||||
// Print the console title
|
||||
else if (pos >= 10 && pos < 20)
|
||||
{
|
||||
offset = 10;
|
||||
c = consoletitletext[pos - offset];
|
||||
}
|
||||
// Print the process/title name
|
||||
else if (pos >= 25 && pos < 45)
|
||||
{
|
||||
offset = 25;
|
||||
c = inconsoleptr->proctitle[pos - offset];
|
||||
}
|
||||
// Print the status (not current in use)
|
||||
else if (pos >= 50 && pos < 80)
|
||||
{
|
||||
offset = 50;
|
||||
c = inconsoleptr->status[pos - offset];
|
||||
}
|
||||
// Otherwise print a space character so we still get the background
|
||||
else
|
||||
{
|
||||
c = ' ';
|
||||
}
|
||||
|
||||
// Print the actual character with the given bg and fg color settings
|
||||
if (inconsoleptr->inuse)
|
||||
{
|
||||
crt[pos] = (c & 0xff) | inconsoleptr->titlebgcol;
|
||||
@ -561,6 +600,7 @@ static void drawtitle(void)
|
||||
}
|
||||
}
|
||||
|
||||
// Function for printing a character to the screen and/or the current console buffer
|
||||
static void cgaputc(int c)
|
||||
{
|
||||
int pos;
|
||||
@ -568,6 +608,7 @@ static void cgaputc(int c)
|
||||
|
||||
ushort *currentbuffer = inconsoleptr->screenbuffer;
|
||||
|
||||
// if the console is inuse we get the hardware cursor position so we can use it
|
||||
if (inconsoleptr->inuse)
|
||||
{
|
||||
// Cursor position: col + 80*row.
|
||||
@ -576,6 +617,7 @@ static void cgaputc(int c)
|
||||
outb(CRTPORT, 15);
|
||||
pos |= inb(CRTPORT + 1);
|
||||
}
|
||||
// If the console is not in use we use the position saved to the console struct
|
||||
else
|
||||
{
|
||||
pos = inconsoleptr->pos;
|
||||
@ -587,6 +629,7 @@ static void cgaputc(int c)
|
||||
}
|
||||
else if (c == BACKSPACE)
|
||||
{
|
||||
// Check that the pos is not in the title offset so they cant remove it
|
||||
if (pos > (TITLEOFF))
|
||||
{
|
||||
currentbuffer[pos] = 0; // Clear the character from the buffer
|
||||
@ -595,19 +638,22 @@ static void cgaputc(int c)
|
||||
}
|
||||
else
|
||||
{
|
||||
// int posp = pos;
|
||||
// If the console is inuse print the character to the screen
|
||||
if (inconsoleptr->inuse)
|
||||
{
|
||||
crt[pos] = (c & 0xff) | 0x0700; // black on white
|
||||
}
|
||||
// Save the current character to the console buffer
|
||||
currentbuffer[pos] = (c & 0xff) | 0x0700; // black on white
|
||||
pos++;
|
||||
}
|
||||
// Check that the pos is not in the title area or greater than the screen size
|
||||
if (pos < TITLEOFF || pos > SCRHEIGHT * SCRWIDTH)
|
||||
{
|
||||
panic("pos under/overflow");
|
||||
}
|
||||
|
||||
// Handle the overflow scrolling for the screen and buffer
|
||||
if ((pos / 80) >= 24)
|
||||
{ // Scroll up.
|
||||
memmove(currentbuffer + TITLEOFF, currentbuffer + (SCRWIDTH + TITLEOFF), sizeof(crt[0]) * (SCRHEIGHT - 1) * SCRWIDTH);
|
||||
@ -615,6 +661,7 @@ static void cgaputc(int c)
|
||||
memset(currentbuffer + pos, 0, sizeof(crt[0]) * (SCRHEIGHT * SCRWIDTH - pos));
|
||||
if (inconsoleptr->inuse)
|
||||
{
|
||||
// Check if the menu is active, if so we want to offset the scrolling start pos so we dont overwrite the menu in screen memory
|
||||
int menuoffset = 0;
|
||||
if (menuactive)
|
||||
{
|
||||
@ -629,6 +676,8 @@ static void cgaputc(int c)
|
||||
memset(crt + pos, 0, sizeof(crt[0]) * (SCRHEIGHT * SCRWIDTH - pos));
|
||||
}
|
||||
}
|
||||
|
||||
// Set the consoles pos to the new pos, if the console was in use also save the hardware cursor pos
|
||||
inconsoleptr->pos = pos;
|
||||
|
||||
if (inconsoleptr->inuse)
|
||||
@ -692,7 +741,8 @@ void consoleintr(int (*getc)(void))
|
||||
int doconsoleswitch = 0;
|
||||
int switchto = -1;
|
||||
int doconsolehome = 0;
|
||||
//struct vconsole* inconsoleptr = getvalidprocessconsoleptr();
|
||||
|
||||
struct vconsole* inconsoleptr = getvalidprocessconsoleptr();
|
||||
struct kbdbuffer* consolekbdbuffer = ¤tconsole->keybuffer;
|
||||
|
||||
acquire(&cons.lock);
|
||||
@ -700,12 +750,15 @@ void consoleintr(int (*getc)(void))
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
// Hotkeys for dealing with the menu
|
||||
// Close the menu
|
||||
case 27:
|
||||
if (menuactive)
|
||||
{
|
||||
closemenu();
|
||||
}
|
||||
break;
|
||||
// Menu nav to the previous item
|
||||
// Up arrow (found in kbd.h)
|
||||
case 0xE2:
|
||||
if (menuactive)
|
||||
@ -713,6 +766,7 @@ void consoleintr(int (*getc)(void))
|
||||
navigatemenu(-1);
|
||||
}
|
||||
break;
|
||||
// Menu nav to the next item
|
||||
// Down arrow (found in kbd.h)
|
||||
case 0xE3:
|
||||
if (menuactive)
|
||||
@ -740,12 +794,15 @@ void consoleintr(int (*getc)(void))
|
||||
consputc(BACKSPACE);
|
||||
}
|
||||
break;
|
||||
// Hotkey to switch to the next console
|
||||
case C('T'):
|
||||
doconsoleswitch = 1;
|
||||
break;
|
||||
// Hotkey to switch to the home console
|
||||
case C('K'):
|
||||
doconsolehome = 1;
|
||||
break;
|
||||
// Hotkey open the menu
|
||||
case C('M'):
|
||||
if (!menuactive)
|
||||
{
|
||||
@ -769,6 +826,8 @@ void consoleintr(int (*getc)(void))
|
||||
// if the menu was not active we want the enter to be handled in the default case
|
||||
default:
|
||||
if (!menuactive)
|
||||
{
|
||||
if (inconsoleptr->inuse)
|
||||
{
|
||||
if (c != 0 && consolekbdbuffer->e - consolekbdbuffer->r < INPUT_BUF)
|
||||
{
|
||||
@ -782,6 +841,7 @@ void consoleintr(int (*getc)(void))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -791,6 +851,7 @@ void consoleintr(int (*getc)(void))
|
||||
{
|
||||
procdump(); // now call procdump() wo. cons.lock held
|
||||
}
|
||||
// Handle the home console hotkey
|
||||
if (doconsolehome)
|
||||
{
|
||||
if (currentconsole->consoleindex != 0)
|
||||
@ -798,9 +859,11 @@ void consoleintr(int (*getc)(void))
|
||||
switchtoconsole(getbaseconsoleptr());
|
||||
}
|
||||
}
|
||||
// Handle the console switch hotkey
|
||||
if (doconsoleswitch)
|
||||
{
|
||||
struct vconsole* toconsole = 0;
|
||||
acquire(&vcons.lock);
|
||||
acquire(&cons.lock);
|
||||
if (switchto == -1)
|
||||
{
|
||||
@ -822,6 +885,7 @@ void consoleintr(int (*getc)(void))
|
||||
toconsole = &consoles[getmenuindexconsole(switchto)];
|
||||
}
|
||||
release(&cons.lock);
|
||||
release(&vcons.lock);
|
||||
if (!toconsole->inuse)
|
||||
{
|
||||
switchtoconsole(toconsole);
|
||||
@ -838,7 +902,6 @@ int consoleread(struct inode *ip, char *dst, int n)
|
||||
|
||||
iunlock(ip);
|
||||
target = n;
|
||||
//acquire(&cons.lock);
|
||||
acquire(&inconsoleptr->lock);
|
||||
while (n > 0)
|
||||
{
|
||||
@ -870,7 +933,6 @@ int consoleread(struct inode *ip, char *dst, int n)
|
||||
break;
|
||||
}
|
||||
}
|
||||
//release(&cons.lock);
|
||||
release(&inconsoleptr->lock);
|
||||
ilock(ip);
|
||||
|
||||
@ -883,13 +945,11 @@ int consolewrite(struct inode *ip, char *buf, int n)
|
||||
struct vconsole* inconsoleptr = getvalidprocessconsoleptr();
|
||||
|
||||
iunlock(ip);
|
||||
//acquire(&cons.lock);
|
||||
acquire(&inconsoleptr->lock);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
consputc(buf[i] & 0xff);
|
||||
}
|
||||
//release(&cons.lock);
|
||||
release(&inconsoleptr->lock);
|
||||
ilock(ip);
|
||||
|
||||
@ -916,29 +976,34 @@ void testfillbuffer(ushort *bufferin)
|
||||
}
|
||||
}
|
||||
|
||||
// Function to get a pointer to the base console
|
||||
struct vconsole* getbaseconsoleptr(void)
|
||||
{
|
||||
return &consoles[0];
|
||||
}
|
||||
|
||||
// Function to clear a given buffer using its pointer/address
|
||||
void clearconsole(ushort *bufferin)
|
||||
{
|
||||
// Flood the screen buffer with blank spaces
|
||||
memset(bufferin, 0, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH);
|
||||
}
|
||||
|
||||
// Function for loading an entire buffer into the screen memory using its pointer/address
|
||||
void loadscreenbuffer(ushort *bufferin)
|
||||
{
|
||||
// Copy the memory from the console buffer to the crt buffer
|
||||
memmove(crt, bufferin, sizeof(bufferin[0]) * SCRHEIGHT * SCRWIDTH);
|
||||
}
|
||||
|
||||
// Function for saving the current screen memory into a given buffer
|
||||
void savescreenbuffer(ushort *bufferin)
|
||||
{
|
||||
// Copy the memory from the console buffer to the crt buffer
|
||||
memmove(bufferin, crt, sizeof(crt[0]) * SCRHEIGHT * SCRWIDTH);
|
||||
}
|
||||
|
||||
// Function for clearing the current screen/buffer
|
||||
void clearscreen(int prelocked)
|
||||
{
|
||||
// Check if a process has actually been created otherwise use the base console
|
||||
@ -952,6 +1017,7 @@ void clearscreen(int prelocked)
|
||||
clearconsole(inconsoleptr->screenbuffer);
|
||||
inconsoleptr->pos = pos;
|
||||
|
||||
// If the console is in use load the blank buffer into screen memory and set the cursor position
|
||||
if (inconsoleptr->inuse)
|
||||
{
|
||||
loadscreenbuffer(inconsoleptr->screenbuffer);
|
||||
@ -961,6 +1027,8 @@ void clearscreen(int prelocked)
|
||||
outb(CRTPORT, 15);
|
||||
outb(CRTPORT + 1, pos);
|
||||
}
|
||||
|
||||
// Draw the title bar onto the console
|
||||
drawtitle();
|
||||
if (!prelocked)
|
||||
{
|
||||
@ -973,6 +1041,7 @@ void consoleinit(void)
|
||||
initlock(&cons.lock, "console");
|
||||
initlock(&vcons.lock, "vconglobal");
|
||||
|
||||
// Init all of the virtual console buffers
|
||||
for (int i = 0; i < MAXVCONSOLES; i++)
|
||||
{
|
||||
consoles[i].consoleindex = i;
|
||||
@ -997,12 +1066,15 @@ void consoleinit(void)
|
||||
devsw[CONSOLE].read = consoleread;
|
||||
cons.locking = 1;
|
||||
|
||||
// Clear the screen and print the welcome message
|
||||
clearscreen(0);
|
||||
cprintf("Welcome! you are currently in the base console\n");
|
||||
|
||||
ioapicenable(IRQ_KBD, 0);
|
||||
}
|
||||
|
||||
// Function for "creating" a new console, in reality it sets the first non active console to active and setups the struct
|
||||
// if none are free it returns a nullptr/zero for the calling function to handle
|
||||
struct vconsole* newconsole(char* title, int bgpreset)
|
||||
{
|
||||
struct vconsole* result = 0;
|
||||
@ -1034,6 +1106,7 @@ struct vconsole* newconsole(char* title, int bgpreset)
|
||||
return result;
|
||||
}
|
||||
|
||||
// Function to "release" all consoles from inuse, this is to stop the chance of one not clearing and causing an issue with 2 being inuse
|
||||
void releaseallconsoles(void)
|
||||
{
|
||||
for (int i = 0; i < MAXVCONSOLES; i++)
|
||||
@ -1042,20 +1115,22 @@ void releaseallconsoles(void)
|
||||
}
|
||||
}
|
||||
|
||||
// Function for switching to another console using the given pointer
|
||||
int switchtoconsole(struct vconsole* consoleptr)
|
||||
{
|
||||
int pos;
|
||||
|
||||
acquire(&vcons.lock);
|
||||
// Release all consoles before setting the new one to inuse
|
||||
releaseallconsoles();
|
||||
currentconsole = consoleptr;
|
||||
currentconsole->inuse = 1;
|
||||
//input = ¤tconsole->keybuffer;
|
||||
// ioapicenable(IRQ_KBD, 0);
|
||||
|
||||
acquire(&cons.lock);
|
||||
// Load the next console into screen memory
|
||||
loadscreenbuffer(currentconsole->screenbuffer);
|
||||
|
||||
// Checks if the console was active, if not its most likely the first switch to this so we clear and print the welcome message
|
||||
if (!currentconsole->active)
|
||||
{
|
||||
clearscreen(1);
|
||||
@ -1064,6 +1139,7 @@ int switchtoconsole(struct vconsole* consoleptr)
|
||||
}
|
||||
else
|
||||
{
|
||||
// If it was already active we just set the cursor position to the one saved in the console struct
|
||||
pos = currentconsole->pos;
|
||||
|
||||
outb(CRTPORT, 14);
|
||||
@ -1072,7 +1148,7 @@ int switchtoconsole(struct vconsole* consoleptr)
|
||||
outb(CRTPORT + 1, pos);
|
||||
}
|
||||
|
||||
//drawtitle();
|
||||
// Remove the menu if it was active and set the console as the current menu item
|
||||
menuactive = 0;
|
||||
currentmenuitem = getconsolemenuindex(currentconsole);
|
||||
release(&cons.lock);
|
||||
@ -1080,17 +1156,19 @@ int switchtoconsole(struct vconsole* consoleptr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Function for closing the current console
|
||||
int closeconsole(void)
|
||||
{
|
||||
struct vconsole* consoleptr = myproc()->consoleptr;
|
||||
|
||||
//cprintf("Console Owner PID: %d\n", consoleptr->processowner->pid);
|
||||
acquire(&vcons.lock);
|
||||
// Check if the process exiting is the consoles parent process we clear the buffer and set the active to 0
|
||||
if (myproc() == consoleptr->processowner)
|
||||
{
|
||||
clearconsole(consoleptr->screenbuffer);
|
||||
consoleptr->active = 0;
|
||||
|
||||
// If the console was in use to switch back to the base console
|
||||
if (consoleptr->inuse)
|
||||
{
|
||||
consoleptr->inuse = 0;
|
||||
@ -1103,6 +1181,7 @@ int closeconsole(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Function for getting the console index of the current inuse console
|
||||
int getcurrentconsoleindex(void)
|
||||
{
|
||||
acquire(&vcons.lock);
|
||||
@ -1118,11 +1197,12 @@ int getcurrentconsoleindex(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Function for setting the title of a console for the title bar and menu
|
||||
void setconsoleproctitle(struct vconsole* consoleptr, char* newtitle)
|
||||
{
|
||||
if (!consoleptr->titlelocked)
|
||||
{
|
||||
acquire(&consoleptr->lock);
|
||||
acquire(&vcons.lock);
|
||||
//Clear the current buffer
|
||||
memset(consoleptr->proctitle, 0, sizeof(consoleptr->proctitle[0]) * sizeof(consoleptr->proctitle));
|
||||
//Copy the new title into the console title buffer
|
||||
@ -1131,6 +1211,6 @@ void setconsoleproctitle(struct vconsole* consoleptr, char* newtitle)
|
||||
//Redraw the title since its been updated now
|
||||
drawtitle();
|
||||
|
||||
release(&consoleptr->lock);
|
||||
release(&vcons.lock);
|
||||
}
|
||||
}
|
11
count.c
11
count.c
@ -1,6 +1,8 @@
|
||||
#include "types.h"
|
||||
#include "user.h"
|
||||
|
||||
// Simple user app to do a count from 0 to the given number (1000 by defaulf)
|
||||
// for testing concurrency
|
||||
int main(int argc, char *argv[]) {
|
||||
int countto = 1000;
|
||||
|
||||
@ -8,6 +10,15 @@ int main(int argc, char *argv[]) {
|
||||
if (strcmp(argv[i], "-c") == 0) {
|
||||
countto = atoi(argv[i + 1]);
|
||||
}
|
||||
else if (strcmp(argv[i], "-help") == 0)
|
||||
{
|
||||
printf(1, "Counts from 0 to the given number.\n");
|
||||
printf(1, "Default: 1000\n");
|
||||
printf(1, "Options:\n");
|
||||
printf(1, "-c [Number] : Sets the value to count upto.\n");
|
||||
exit();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
cls();
|
||||
|
1
exec.c
1
exec.c
@ -130,6 +130,7 @@ int exec(char *path, char **argv) {
|
||||
}
|
||||
safestrcpy(curproc->name, last, sizeof(curproc->name));
|
||||
|
||||
// If the process is tied to a console update the title to the new process name
|
||||
if (curproc->consoleptr != 0)
|
||||
{
|
||||
setconsoleproctitle(curproc->consoleptr, curproc->name);
|
||||
|
11
hello.c
11
hello.c
@ -1,7 +1,18 @@
|
||||
#include "types.h"
|
||||
#include "user.h"
|
||||
|
||||
// User app that was from one of the tutorial but i have since changed it to provide useful information about the current process and console
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "-help") == 0)
|
||||
{
|
||||
printf(1, "Does a system call that returns the current process and console information, used for debugging.\n");
|
||||
exit();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
greeting();
|
||||
exit();
|
||||
}
|
21
maze.c
21
maze.c
@ -1,9 +1,11 @@
|
||||
#include "types.h"
|
||||
#include "user.h"
|
||||
|
||||
// User app for generating a simple maze similar to the c64 version using the border ascii characters
|
||||
// This doesnt seem to work on the azure server but left in since i did the work on it...
|
||||
uint rngnumber(void)
|
||||
{
|
||||
// Take from http://stackoverflow.com/questions/1167253/implementation-of-rand
|
||||
// Taken from http://stackoverflow.com/questions/1167253/implementation-of-rand
|
||||
static unsigned int z1 = 12345, z2 = 12345, z3 = 12345, z4 = 12345;
|
||||
unsigned int b;
|
||||
b = ((z1 << 6) ^ z1) >> 13;
|
||||
@ -44,11 +46,23 @@ int main(int argc, char *argv[]) {
|
||||
{
|
||||
seed = atoi(argv[i + 1]);
|
||||
}
|
||||
else if (strcmp(argv[i], "-help") == 0)
|
||||
{
|
||||
printf(1, "Generates X lines of random maze.\n");
|
||||
printf(1, "Options:\n");
|
||||
printf(1, "-l [Number] : Sets number of lines to generate for the maze.\n");
|
||||
printf(1, "-s [Number] : Sets the current seed for the random function.\n");
|
||||
exit();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
cls();
|
||||
greeting();
|
||||
printf(1, "Start Maze\n");
|
||||
|
||||
printf(1, "Start Maze (DISABLED)\n");
|
||||
printf(1, "This does not work on the azure servers, but it would generate a random x lines of characters to look like a maze, similar to the old c64 basic program.\n");
|
||||
printf(1, "I could have used the slashes but they look aweful in this font so use the count app instead.\n\n");
|
||||
exit();
|
||||
|
||||
char mazeline[80];
|
||||
for (int y = 0; y < lines; y++)
|
||||
@ -83,5 +97,6 @@ int main(int argc, char *argv[]) {
|
||||
sleep(10);
|
||||
}
|
||||
printf(1, "Maze Ended\n");
|
||||
|
||||
exit();
|
||||
}
|
5
proc.c
5
proc.c
@ -142,6 +142,7 @@ void userinit(void) {
|
||||
safestrcpy(p->name, "initcode", sizeof(p->name));
|
||||
p->cwd = namei("/");
|
||||
|
||||
// Set the user init console to the base console
|
||||
p->consoleptr = getbaseconsoleptr();
|
||||
safestrcpy(p->title, "Shell (Root)", sizeof(p->title));
|
||||
|
||||
@ -219,6 +220,7 @@ int fork(void) {
|
||||
acquire(&ptable.lock);
|
||||
|
||||
np->state = RUNNABLE;
|
||||
// Copy the console pointer to the child
|
||||
np->consoleptr = curproc->consoleptr;
|
||||
|
||||
release(&ptable.lock);
|
||||
@ -267,11 +269,14 @@ void exit(void) {
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the assigned console is not the base console
|
||||
if (curproc->consoleptr != getbaseconsoleptr())
|
||||
{
|
||||
// If so try to close the console, this will only happen if this process is the owner for the console
|
||||
closeconsole();
|
||||
}
|
||||
|
||||
// Update the current process title for its assigned console
|
||||
if (curproc->consoleptr != 0)
|
||||
{
|
||||
setconsoleproctitle(curproc->consoleptr, curproc->parent->name);
|
||||
|
4
proc.h
4
proc.h
@ -48,8 +48,8 @@ struct proc {
|
||||
struct file *ofile[NOFILE]; // Open files
|
||||
struct inode *cwd; // Current directory
|
||||
char name[16]; // Process name (debugging)
|
||||
struct vconsole* consoleptr;
|
||||
char title[20];
|
||||
struct vconsole* consoleptr; // Pointer to the processes assigned console
|
||||
char title[20]; // the title for the process
|
||||
};
|
||||
|
||||
// Process memory is laid out contiguously, low addresses first:
|
||||
|
8
screen.c
8
screen.c
@ -23,10 +23,12 @@ int main(int argc, char *argv[]) {
|
||||
{
|
||||
printf(1, "Creates a new virtual console.\n");
|
||||
printf(1, "Options:\n");
|
||||
printf(1, "-bg [0 - 9] : Sets a background preset for the title bar.");
|
||||
printf(1, "-bg [0 - 9] : Sets a background preset for the title bar.\n");
|
||||
printf(1, "-t [String] : Sets a custom title for the console.\n");
|
||||
exit();
|
||||
return 0;
|
||||
}
|
||||
// Setup the title, it adds the space seperated strings to the title
|
||||
else
|
||||
{
|
||||
if (accepttitle)
|
||||
@ -50,6 +52,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
}
|
||||
|
||||
// Set the variable to the selected bg/fg preset option
|
||||
switch(selopt)
|
||||
{
|
||||
case 1:
|
||||
@ -81,6 +84,7 @@ int main(int argc, char *argv[]) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Fork into a new process and create the screen
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
printf(1, "screen: fork failed\n");
|
||||
@ -93,7 +97,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(1, "screen: failed to create a new console\n");
|
||||
|
||||
}
|
||||
}
|
||||
exit();
|
||||
|
14
sysproc.c
14
sysproc.c
@ -92,9 +92,10 @@ int sys_uptime(void)
|
||||
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 again\n");
|
||||
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);
|
||||
@ -102,6 +103,7 @@ int sys_greeting(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// System call to shutdown or restart the OS
|
||||
int sys_shutdown(void)
|
||||
{
|
||||
int restart;
|
||||
@ -125,6 +127,7 @@ int sys_shutdown(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// System call for handling the new screen user app
|
||||
int sys_screen(void)
|
||||
{
|
||||
struct proc *curproc = myproc();
|
||||
@ -133,25 +136,34 @@ int sys_screen(void)
|
||||
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);
|
||||
|
Reference in New Issue
Block a user