Adding wait system call

This commit is contained in:
Ali Mashtizadeh 2015-01-18 15:08:12 -08:00
parent 4f15c9fd01
commit 02c0816e41
5 changed files with 49 additions and 11 deletions

View File

@ -19,6 +19,7 @@ main(int argc, const char *argv[])
char buf[256]; char buf[256];
printf("System Shell\n"); printf("System Shell\n");
while (1) { while (1) {
fputs("Shell> ", stdout); fputs("Shell> ", stdout);
fgets(buf, sizeof(buf), stdin); fgets(buf, sizeof(buf), stdin);
@ -31,12 +32,13 @@ void
Cmd_Help(int argc, const char *argv[]) Cmd_Help(int argc, const char *argv[])
{ {
printf("cat Print file\n"); printf("cat Print file\n");
printf("bkpt Trigger a kernel breakpoint\n");
printf("date Print current date and time\n");
printf("echo Echo arguments\n"); printf("echo Echo arguments\n");
printf("exit Exit shell\n"); printf("exit Exit shell\n");
printf("help Display the list of commands\n"); printf("help Display the list of commands\n");
printf("ls List files in a directory\n"); printf("ls List files in a directory\n");
printf("date Print current date and time\n"); printf("spawn Spawn a process\n");
printf("bkpt Trigger a kernel breakpoint\n");
} }
void void
@ -124,6 +126,23 @@ Cmd_Hexdump(int argc, const char *argv[])
{ {
} }
void
Cmd_Spawn(int argc, const char *argv[])
{
int fd;
uint64_t status;
uintptr_t offset = 0;
if (argc != 2) {
fputs("Requires an argument\n", stdout);
return;
}
status = OSSpawn(argv[1]);
// XXX: check errors
OSWait(status);
}
void void
DispatchCommand(char *buf) DispatchCommand(char *buf)
{ {
@ -168,6 +187,8 @@ DispatchCommand(char *buf)
exit(0); exit(0);
} else if (strcmp(argv[0], "ls") == 0) { } else if (strcmp(argv[0], "ls") == 0) {
Cmd_List(argc, (const char **)argv); Cmd_List(argc, (const char **)argv);
} else if (strcmp(argv[0], "spawn") == 0) {
Cmd_Spawn(argc, (const char **)argv);
} else if (strcmp(argv[0], "#") == 0) { } else if (strcmp(argv[0], "#") == 0) {
// Ignore comments // Ignore comments
} else if (buf[0] != '\0') { } else if (buf[0] != '\0') {

View File

@ -5,9 +5,10 @@
#include <sys/stat.h> #include <sys/stat.h>
uint64_t OSTime(); uint64_t OSTime();
void OSExit(int status);
uint64_t OSGetPID(); uint64_t OSGetPID();
void OSExit(int status);
uint64_t OSSpawn(const char *path); uint64_t OSSpawn(const char *path);
uint64_t OSWait(uint64_t pid);
// Memory // Memory
void *OSMemMap(void *addr, uint64_t len, int flags); void *OSMemMap(void *addr, uint64_t len, int flags);

View File

@ -31,6 +31,12 @@ OSSpawn(const char *path)
return syscall(SYSCALL_SPAWN, path); return syscall(SYSCALL_SPAWN, path);
} }
uint64_t
OSWait(uint64_t pid)
{
return syscall(SYSCALL_WAIT, pid);
}
void * void *
OSMemMap(void *addr, uint64_t len, int flags) OSMemMap(void *addr, uint64_t len, int flags)
{ {

View File

@ -4,9 +4,10 @@
#define SYSCALL_NULL 0x00 #define SYSCALL_NULL 0x00
#define SYSCALL_TIME 0x01 #define SYSCALL_TIME 0x01
#define SYSCALL_EXIT 0x02 #define SYSCALL_GETPID 0x02
#define SYSCALL_SPAWN 0x03 #define SYSCALL_EXIT 0x03
#define SYSCALL_GETPID 0x04 #define SYSCALL_SPAWN 0x04
#define SYSCALL_WAIT 0x05
// Memory // Memory
#define SYSCALL_MMAP 0x08 #define SYSCALL_MMAP 0x08

View File

@ -24,6 +24,13 @@ Syscall_Time()
return KTime_GetEpochNS(); return KTime_GetEpochNS();
} }
uint64_t
Syscall_GetPID()
{
Thread *cur = Thread_Current();
return cur->tid;
}
void void
Syscall_Exit(uint64_t status) Syscall_Exit(uint64_t status)
{ {
@ -101,10 +108,10 @@ Syscall_Spawn(uint64_t user_path)
} }
uint64_t uint64_t
Syscall_GetPID() Syscall_Wait(uint64_t pid)
{ {
Thread *cur = Thread_Current(); NOT_IMPLEMENTED();
return cur->tid; return 0;
} }
uint64_t uint64_t
@ -379,13 +386,15 @@ Syscall_Entry(uint64_t syscall, uint64_t a1, uint64_t a2,
return 0; return 0;
case SYSCALL_TIME: case SYSCALL_TIME:
return Syscall_Time(); return Syscall_Time();
case SYSCALL_GETPID:
return Syscall_GetPID();
case SYSCALL_EXIT: case SYSCALL_EXIT:
Syscall_Exit(a1); Syscall_Exit(a1);
return 0; // To eliminate warning return 0; // To eliminate warning
case SYSCALL_SPAWN: case SYSCALL_SPAWN:
return Syscall_Spawn(a1); return Syscall_Spawn(a1);
case SYSCALL_GETPID: case SYSCALL_WAIT:
return Syscall_GetPID(); return Syscall_Wait(a1);
case SYSCALL_MMAP: case SYSCALL_MMAP:
return Syscall_MMap(a1, a2, a3); return Syscall_MMap(a1, a2, a3);
case SYSCALL_MUNMAP: case SYSCALL_MUNMAP: