added userspace testcase for fork() and execve() syscalls
This commit is contained in:
parent
e740cf265e
commit
c70c488336
4 changed files with 66 additions and 4 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -17,6 +17,7 @@ tools/make_initrd
|
||||||
tools/scc_bootinfo.asm
|
tools/scc_bootinfo.asm
|
||||||
newlib/examples/hello
|
newlib/examples/hello
|
||||||
newlib/examples/memtest
|
newlib/examples/memtest
|
||||||
|
newlib/examples/fork
|
||||||
newlib/examples/jacobi
|
newlib/examples/jacobi
|
||||||
newlib/examples/echo
|
newlib/examples/echo
|
||||||
newlib/examples/tests
|
newlib/examples/tests
|
||||||
|
|
|
@ -307,9 +307,9 @@ int memory(void* arg)
|
||||||
malloc();
|
malloc();
|
||||||
|
|
||||||
kprintf("======== USER: test userspace...\n");
|
kprintf("======== USER: test userspace...\n");
|
||||||
char* argv[] = {"/bin/memtest", "17", "kb", "5", NULL};
|
char* argv[] = {"/bin/fork", NULL};
|
||||||
ret = create_user_task(&id, argv[0], argv);
|
ret = create_user_task(&id, argv[0], argv);
|
||||||
test(!ret, "calling %s %s %s %s with id = %i:\n", argv[0], argv[1], argv[2], argv[3], id);
|
test(!ret, "calling %s with id = %i, ret = %i", argv[0], id, ret);
|
||||||
wait(&ret);
|
wait(&ret);
|
||||||
test(!ret, "userspace task returned with code = %d", ret);
|
test(!ret, "userspace task returned with code = %d", ret);
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ LDFLAGS =
|
||||||
|
|
||||||
default: all
|
default: all
|
||||||
|
|
||||||
all: memtest hello tests jacobi mshell server client rlogind
|
all: memtest hello tests jacobi mshell server client rlogind fork
|
||||||
|
|
||||||
jacobi: jacobi.o
|
jacobi: jacobi.o
|
||||||
$(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $< -lm
|
$(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $< -lm
|
||||||
|
@ -24,7 +24,13 @@ memtest: memtest.o
|
||||||
$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym
|
$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym
|
||||||
$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@
|
$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@
|
||||||
chmod a-x $@.sym
|
chmod a-x $@.sym
|
||||||
|
|
||||||
|
fork: fork.o
|
||||||
|
$(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $<
|
||||||
|
$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym
|
||||||
|
$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@
|
||||||
|
chmod a-x $@.sym
|
||||||
|
|
||||||
tests: tests.o
|
tests: tests.o
|
||||||
$(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $<
|
$(CC_FOR_TARGET) -T link.ld -o $@ $(LDFLAGS) $<
|
||||||
$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym
|
$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym
|
||||||
|
|
55
newlib/examples/fork.c
Normal file
55
newlib/examples/fork.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013 Steffen Vogel, Chair for Operating Systems,
|
||||||
|
* RWTH Aachen University
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
* This file is part of MetalSVM.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
printf("======== USER: test forking...\n");
|
||||||
|
|
||||||
|
int id = fork();
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (id < 0) {
|
||||||
|
perror(" PARENT: fork");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
else if (id == 0) {
|
||||||
|
printf(" CHILD: This is the child. My pid is %u\n", getpid());
|
||||||
|
printf(" CHILD: Running memtest...\n");
|
||||||
|
|
||||||
|
const char *argv[] = {"/bin/memtest", "512", "kb", "10", NULL};
|
||||||
|
execve(argv[0], argv, NULL);
|
||||||
|
perror(" CHILD: exec() returned: ");
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf(" PARENT: Here is the parent. My pid is %u\n", getpid());
|
||||||
|
|
||||||
|
wait(&ret);
|
||||||
|
printf(" PARENT: My child returned with code %i...\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue