Add spawn and wait/waitpid functions into libc.
This commit is contained in:
parent
21a30db5d3
commit
63f2ae716e
@ -177,8 +177,10 @@ SConscript('bin/date/SConscript', variant_dir='build/bin/date')
|
|||||||
SConscript('bin/echo/SConscript', variant_dir='build/bin/echo')
|
SConscript('bin/echo/SConscript', variant_dir='build/bin/echo')
|
||||||
SConscript('bin/ethdump/SConscript', variant_dir='build/bin/ethdump')
|
SConscript('bin/ethdump/SConscript', variant_dir='build/bin/ethdump')
|
||||||
SConscript('bin/ethinject/SConscript', variant_dir='build/bin/ethinject')
|
SConscript('bin/ethinject/SConscript', variant_dir='build/bin/ethinject')
|
||||||
|
SConscript('bin/false/SConscript', variant_dir='build/bin/false')
|
||||||
SConscript('bin/ls/SConscript', variant_dir='build/bin/ls')
|
SConscript('bin/ls/SConscript', variant_dir='build/bin/ls')
|
||||||
SConscript('bin/shell/SConscript', variant_dir='build/bin/shell')
|
SConscript('bin/shell/SConscript', variant_dir='build/bin/shell')
|
||||||
|
SConscript('bin/true/SConscript', variant_dir='build/bin/true')
|
||||||
SConscript('sbin/ifconfig/SConscript', variant_dir='build/sbin/ifconfig')
|
SConscript('sbin/ifconfig/SConscript', variant_dir='build/sbin/ifconfig')
|
||||||
SConscript('sbin/init/SConscript', variant_dir='build/sbin/init')
|
SConscript('sbin/init/SConscript', variant_dir='build/sbin/init')
|
||||||
SConscript('sbin/sysctl/SConscript', variant_dir='build/sbin/sysctl')
|
SConscript('sbin/sysctl/SConscript', variant_dir='build/sbin/sysctl')
|
||||||
@ -207,8 +209,10 @@ if env["BOOTDISK"] == "1":
|
|||||||
Depends(bootdisk, "#build/bin/echo/echo")
|
Depends(bootdisk, "#build/bin/echo/echo")
|
||||||
Depends(bootdisk, "#build/bin/ethdump/ethdump")
|
Depends(bootdisk, "#build/bin/ethdump/ethdump")
|
||||||
Depends(bootdisk, "#build/bin/ethinject/ethinject")
|
Depends(bootdisk, "#build/bin/ethinject/ethinject")
|
||||||
|
Depends(bootdisk, "#build/bin/false/false")
|
||||||
Depends(bootdisk, "#build/bin/ls/ls")
|
Depends(bootdisk, "#build/bin/ls/ls")
|
||||||
Depends(bootdisk, "#build/bin/shell/shell")
|
Depends(bootdisk, "#build/bin/shell/shell")
|
||||||
|
Depends(bootdisk, "#build/bin/true/true")
|
||||||
Depends(bootdisk, "#build/sbin/ifconfig/ifconfig")
|
Depends(bootdisk, "#build/sbin/ifconfig/ifconfig")
|
||||||
Depends(bootdisk, "#build/sbin/init/init")
|
Depends(bootdisk, "#build/sbin/init/init")
|
||||||
Depends(bootdisk, "#build/sbin/sysctl/sysctl")
|
Depends(bootdisk, "#build/sbin/sysctl/sysctl")
|
||||||
|
23
bin/false/SConscript
Normal file
23
bin/false/SConscript
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
Import('env')
|
||||||
|
|
||||||
|
false_env = env.Clone()
|
||||||
|
|
||||||
|
src = [ ]
|
||||||
|
|
||||||
|
src_common = [
|
||||||
|
"false.c"
|
||||||
|
]
|
||||||
|
|
||||||
|
src.append(env["CRTBEGIN"])
|
||||||
|
src.append(src_common)
|
||||||
|
src.append(env["CRTEND"])
|
||||||
|
|
||||||
|
false_env.Append(LINKFLAGS = ['-nostdlib'])
|
||||||
|
false_env.Append(CPPFLAGS = ['-fno-builtin', '-nostdinc'])
|
||||||
|
false_env.Append(CPPPATH = ['#build/include'])
|
||||||
|
false_env.Append(LIBPATH = ['#build/lib/libc'], LIBS = ['c'])
|
||||||
|
|
||||||
|
false_env.Program("false", src)
|
||||||
|
|
7
bin/false/false.c
Normal file
7
bin/false/false.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
@ -3,10 +3,11 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
// Castor Only
|
|
||||||
#include <syscall.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
#include <sys/dirent.h>
|
#include <sys/dirent.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <syscall.h>
|
||||||
|
|
||||||
#define SHELL_MAX_ARGS 5
|
#define SHELL_MAX_ARGS 5
|
||||||
#define SHELL_MAX_LINE 256
|
#define SHELL_MAX_LINE 256
|
||||||
@ -66,12 +67,13 @@ Cmd_Run(int argc, const char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
argv[argc] = NULL;
|
argv[argc] = NULL;
|
||||||
status = OSSpawn(path, &argv[0]);
|
status = spawn(path, &argv[0]);
|
||||||
if (status > 100000) {
|
if (status > 100000) {
|
||||||
printf("Spawn failed!\n");
|
printf("Spawn failed!\n");
|
||||||
}
|
}
|
||||||
status = OSWait(status);
|
|
||||||
printf("Process result: %d\n", status);
|
pid_t pid = wait(&status);
|
||||||
|
printf("Process result: %d (pid %d)\n", WEXITSTATUS(status), pid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
bin/true/SConscript
Normal file
23
bin/true/SConscript
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
Import('env')
|
||||||
|
|
||||||
|
true_env = env.Clone()
|
||||||
|
|
||||||
|
src = [ ]
|
||||||
|
|
||||||
|
src_common = [
|
||||||
|
"true.c"
|
||||||
|
]
|
||||||
|
|
||||||
|
src.append(env["CRTBEGIN"])
|
||||||
|
src.append(src_common)
|
||||||
|
src.append(env["CRTEND"])
|
||||||
|
|
||||||
|
true_env.Append(LINKFLAGS = ['-nostdlib'])
|
||||||
|
true_env.Append(CPPFLAGS = ['-fno-builtin', '-nostdinc'])
|
||||||
|
true_env.Append(CPPPATH = ['#build/include'])
|
||||||
|
true_env.Append(LIBPATH = ['#build/lib/libc'], LIBS = ['c'])
|
||||||
|
|
||||||
|
true_env.Program("true", src)
|
||||||
|
|
7
bin/true/true.c
Normal file
7
bin/true/true.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,7 @@ struct timeval;
|
|||||||
|
|
||||||
int syscall(int number, ...);
|
int syscall(int number, ...);
|
||||||
unsigned int sleep(unsigned int seconds);
|
unsigned int sleep(unsigned int seconds);
|
||||||
|
pid_t spawn(const char *path, const char *argv[]);
|
||||||
|
|
||||||
#endif /* __UNISTD_H__ */
|
#endif /* __UNISTD_H__ */
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ exit(int status)
|
|||||||
_atexit_last = _atexit_last->next;
|
_atexit_last = _atexit_last->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSExit(status);
|
OSExit(status & 0x00ff);
|
||||||
|
|
||||||
__builtin_unreachable();
|
__builtin_unreachable();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
@ -13,3 +17,37 @@ sleep(unsigned int seconds)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pid_t
|
||||||
|
spawn(const char *path, const char *argv[])
|
||||||
|
{
|
||||||
|
uint64_t status = OSSpawn(path, argv);
|
||||||
|
|
||||||
|
if (SYSCALL_ERRCODE(status) != 0) {
|
||||||
|
errno = SYSCALL_ERRCODE(status);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (pid_t)SYSCALL_VALUE(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t
|
||||||
|
waitpid(pid_t pid, int *status, UNUSED int options)
|
||||||
|
{
|
||||||
|
uint64_t wstatus = OSWait(pid);
|
||||||
|
|
||||||
|
if (SYSCALL_ERRCODE(wstatus) != 0) {
|
||||||
|
errno = SYSCALL_ERRCODE(wstatus);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*status = SYSCALL_VALUE(wstatus) & 0x0000ffff;
|
||||||
|
|
||||||
|
return WGETPID(SYSCALL_VALUE(wstatus));
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t
|
||||||
|
wait(int *status)
|
||||||
|
{
|
||||||
|
return waitpid(WAIT_ANY, status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ OSTime()
|
|||||||
void
|
void
|
||||||
OSExit(int status)
|
OSExit(int status)
|
||||||
{
|
{
|
||||||
syscall(SYSCALL_EXIT);
|
syscall(SYSCALL_EXIT, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t
|
uint64_t
|
||||||
|
@ -10,8 +10,10 @@ DIR /
|
|||||||
FILE echo build/bin/echo/echo
|
FILE echo build/bin/echo/echo
|
||||||
FILE ethdump build/bin/ethdump/ethdump
|
FILE ethdump build/bin/ethdump/ethdump
|
||||||
FILE ethinject build/bin/ethinject/ethinject
|
FILE ethinject build/bin/ethinject/ethinject
|
||||||
|
FILE false build/bin/false/false
|
||||||
FILE ls build/bin/ls/ls
|
FILE ls build/bin/ls/ls
|
||||||
FILE shell build/bin/shell/shell
|
FILE shell build/bin/shell/shell
|
||||||
|
FILE true build/bin/true/true
|
||||||
END
|
END
|
||||||
DIR sbin
|
DIR sbin
|
||||||
FILE ifconfig build/sbin/ifconfig/ifconfig
|
FILE ifconfig build/sbin/ifconfig/ifconfig
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#define NO_RETURN __attribute__((noreturn))
|
#define NO_RETURN __attribute__((noreturn))
|
||||||
#define UNREACHABLE __builtin_unreachable
|
#define UNREACHABLE __builtin_unreachable
|
||||||
|
|
||||||
|
#define UNUSED __attribute__((unused))
|
||||||
|
|
||||||
#define ROUNDUP(_x, _n) (((_x) + (_n) - 1) & ~((_n) - 1))
|
#define ROUNDUP(_x, _n) (((_x) + (_n) - 1) & ~((_n) - 1))
|
||||||
|
|
||||||
#define __MALLOC __attribute__((__malloc__))
|
#define __MALLOC __attribute__((__malloc__))
|
||||||
|
@ -25,6 +25,8 @@ typedef uint64_t ino_t;
|
|||||||
typedef uint64_t time_t;
|
typedef uint64_t time_t;
|
||||||
typedef uint64_t suseconds_t;
|
typedef uint64_t suseconds_t;
|
||||||
|
|
||||||
|
typedef uint16_t pid_t;
|
||||||
|
|
||||||
#define NULL ((void *)0)
|
#define NULL ((void *)0)
|
||||||
|
|
||||||
#endif /* __SYS_TYPES_H__ */
|
#endif /* __SYS_TYPES_H__ */
|
||||||
|
@ -209,8 +209,6 @@ Process_Wait(Process *proc, uint64_t pid)
|
|||||||
Process *p = NULL;
|
Process *p = NULL;
|
||||||
uint64_t status;
|
uint64_t status;
|
||||||
|
|
||||||
// XXX: Need to verify pid exists!
|
|
||||||
|
|
||||||
Mutex_Lock(&proc->zombieProcLock);
|
Mutex_Lock(&proc->zombieProcLock);
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -226,7 +224,7 @@ Process_Wait(Process *proc, uint64_t pid)
|
|||||||
p = Process_Lookup(pid);
|
p = Process_Lookup(pid);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
Mutex_Unlock(&proc->zombieProcLock);
|
Mutex_Unlock(&proc->zombieProcLock);
|
||||||
return ENOENT;
|
return SYSCALL_PACK(ENOENT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (p->procState != PROC_STATE_ZOMBIE) {
|
while (p->procState != PROC_STATE_ZOMBIE) {
|
||||||
@ -242,7 +240,7 @@ Process_Wait(Process *proc, uint64_t pid)
|
|||||||
}
|
}
|
||||||
Mutex_Unlock(&proc->zombieProcLock);
|
Mutex_Unlock(&proc->zombieProcLock);
|
||||||
|
|
||||||
status = (p->pid << 16) | p->exitCode;
|
status = (p->pid << 16) | (p->exitCode & 0xff);
|
||||||
|
|
||||||
// Release threads
|
// Release threads
|
||||||
Spinlock_Lock(&proc->lock);
|
Spinlock_Lock(&proc->lock);
|
||||||
@ -261,7 +259,7 @@ Process_Wait(Process *proc, uint64_t pid)
|
|||||||
// Release process
|
// Release process
|
||||||
Process_Release(p);
|
Process_Release(p);
|
||||||
|
|
||||||
return status;
|
return SYSCALL_PACK(0, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user