All posix tests running as before.

This commit is contained in:
Bahadir Balban
2009-10-10 00:23:13 +03:00
parent 13c7a6476d
commit f54747a208
15 changed files with 86 additions and 113 deletions

View File

@@ -181,14 +181,17 @@ int do_execve(struct tcb *sender, char *filename, struct args_struct *args,
}
/* Map task's new segment markers as virtual memory regions */
if ((err = task_mmap_segments(new_task, vmfile, &efd, args, env)) < 0) {
if ((err = task_mmap_segments(new_task, vmfile,
&efd, args, env)) < 0) {
vm_file_put(vmfile);
kfree(new_task);
return err;
}
/* Set up task registers via exchange_registers() */
task_setup_registers(new_task, 0, new_task->args_start, new_task->pagerid);
task_setup_registers(new_task, 0,
new_task->args_start,
new_task->pagerid);
/* Add new task to global list */
global_add_task(new_task);

View File

@@ -106,7 +106,6 @@ void do_exit(struct tcb *task, int status)
task_destroy_utcb(task);
/* Remove default shared page shm areas from vfs */
BUG();
// printf("Unmapping 0x%p from vfs as shared-page of %d\n", task->shared_page, task->tid);
//shpage_unmap_from_task(task, find_task(VFS_TID));

View File

@@ -663,8 +663,8 @@ int do_close(struct tcb *task, int fd)
{
int err;
printf("%s: Closing fd: %d on task %d\n", __FUNCTION__,
fd, task->tid);
//printf("%s: Closing fd: %d on task %d\n", __FUNCTION__,
// fd, task->tid);
if ((err = id_del(task->files->fdpool, fd)) < 0) {
printf("%s: Error releasing fd identifier.\n",

View File

@@ -42,6 +42,7 @@ test_exec_objs = test_exec_env.Object(test_exec_src)
test_exec = test_exec_env.Program('src/test_exec/test_exec', test_exec_objs)
test_exec_asm = Command('test_exec.S', test_exec, generate_incbin_asm)
Depends(test_exec, test_exec_objs)
Depends(test_exec, 'include/test_exec_linker.lds')
env.Append(LIBS = ['posix', 'c-userspace'])
env.Append(LINKFLAGS = '-T' + lma_lds[0].path)

View File

@@ -5,7 +5,8 @@
*/
virtual_base = 0x10000000;
__stack = (0x20000000 - 0x1000 - 8); /* First page before the env/args */
/* __stack = (0x20000000 - 0x1000 - 8); */
/* First page before the env/args */
ENTRY(_start)
@@ -16,6 +17,7 @@ SECTIONS
.text : { *(.text.head) *(.text) }
.rodata : { *(.rodata) }
.rodata1 : { *(.rodata1) }
. = ALIGN(4K);
.data : { *(.data) }
.bss : { *(.bss) }
}

View File

@@ -3,7 +3,7 @@
#define __TASKNAME__ "test0"
#define TEST_VERBOSE_PRINT
//#define TEST_VERBOSE_PRINT
#if defined (TEST_VERBOSE_PRINT)
#define test_printf(...) printf(__VA_ARGS__)
#else
@@ -22,7 +22,7 @@ int mmaptest(void);
int dirtest(void);
int fileio(void);
int clonetest(void);
int exectest(void);
int exectest(pid_t);
int user_mutex_test(void);
#endif /* __TEST0_TESTS_H__ */

View File

@@ -34,7 +34,6 @@ int main(int argc, char *argv[])
wait_pager(0);
printf("\n%s: Running POSIX API tests.\n", __TASKNAME__);
dirtest();
@@ -56,7 +55,8 @@ int main(int argc, char *argv[])
if (parent_of_all == getpid()) {
user_mutex_test();
}
exectest();
exectest(parent_of_all);
while (1)
wait_pager(0);

View File

@@ -14,7 +14,7 @@
extern char _start_test_exec[];
extern char _end_test_exec[];
int exectest(void)
int exectest(pid_t parent_of_all)
{
int fd, err;
void *exec_start = (void *)_start_test_exec;
@@ -22,6 +22,8 @@ int exectest(void)
int left, cnt;
char *argv[5];
char filename[128];
char *envp[2];
char env_string[30];
memset(filename, 0, 128);
sprintf(filename, "/home/bahadir/execfile%d", getpid());
@@ -65,8 +67,13 @@ int exectest(void)
argv[3] = "FOURTH ARG";
argv[4] = 0;
memset(env_string, 0, 30);
sprintf(env_string, "parent_of_all=%d", parent_of_all);
envp[0] = env_string;
envp[1] = 0; /* This is important as the array needs to end with a null */
/* Execute the file */
err = execve(filename, argv, 0);
err = execve(filename, argv, envp);
out_err:
printf("EXECVE failed with %d\n", err);

View File

@@ -17,7 +17,7 @@ int forktest(void)
/* 16 forks */
for (int i = 0; i < 1; i++) {
for (int i = 0; i < 3; i++) {
test_printf("%d: Forking...\n", getpid());
if (fork() < 0)
goto out_err;

View File

@@ -80,11 +80,11 @@ int user_mutex_test(void)
int temp;
/* Lock page */
test_printf("Child locking page.\n");
// test_printf("Child locking page.\n");
l4_mutex_lock(&shared_page->mutex);
/* Read variable */
test_printf("Child locked page.\n");
// test_printf("Child locked page.\n");
temp = shared_page->shared_var;
/* Update local copy */
@@ -96,11 +96,11 @@ int user_mutex_test(void)
/* Write back the result */
shared_page->shared_var = temp;
test_printf("Child modified. Unlocking...\n");
// test_printf("Child modified. Unlocking...\n");
/* Unlock */
l4_mutex_unlock(&shared_page->mutex);
test_printf("Child unlocked page.\n");
// test_printf("Child unlocked page.\n");
/* Thread switch */
l4_thread_switch(0);
@@ -115,11 +115,11 @@ int user_mutex_test(void)
int temp;
/* Lock page */
test_printf("Parent locking page.\n");
// test_printf("Parent locking page.\n");
l4_mutex_lock(&shared_page->mutex);
/* Read variable */
test_printf("Parent locked page.\n");
// test_printf("Parent locked page.\n");
temp = shared_page->shared_var;
/* Update local copy */
@@ -131,11 +131,11 @@ int user_mutex_test(void)
/* Write back the result */
shared_page->shared_var = temp;
test_printf("Parent modified. Unlocking...\n");
// test_printf("Parent modified. Unlocking...\n");
/* Unlock */
l4_mutex_unlock(&shared_page->mutex);
test_printf("Parent unlocked page.\n");
// test_printf("Parent unlocked page.\n");
/* Thread switch */
l4_thread_switch(0);
@@ -143,7 +143,7 @@ int user_mutex_test(void)
/* Sync with the child */
l4_receive(child);
test_printf("Parent checking validity of value.\n");
// test_printf("Parent checking validity of value.\n");
if (shared_page->shared_var != 0)
goto out_err;

View File

@@ -8,15 +8,23 @@
#include <l4lib/init.h>
#include <l4lib/utcb.h>
#include <posix_init.h> /* Initialisers for posix library */
#include <stdlib.h>
void main(void);
int main(int argc, char *argv[]);
void __container_init(void)
int __container_init(int argc, char **argv)
{
void *envp = &argv[argc + 1];
if ((char *)envp == *argv)
envp = &argv[argc];
__libposix_init(envp);
/* Generic L4 thread initialisation */
__l4_init();
/* Entry to main */
main();
return main(argc, argv);
}

View File

@@ -1,93 +1,23 @@
/*
* Australian Public Licence B (OZPLB)
*
* Version 1-0
*
* Copyright (c) 2004 National ICT Australia
*
* All rights reserved.
*
* Developed by: Embedded, Real-time and Operating Systems Program (ERTOS)
* National ICT Australia
* http://www.ertos.nicta.com.au
*
* Permission is granted by National ICT Australia, free of charge, to
* any person obtaining a copy of this software and any associated
* documentation files (the "Software") to deal with the Software without
* restriction, including (without limitation) the rights to use, copy,
* modify, adapt, merge, publish, distribute, communicate to the public,
* sublicense, and/or sell, lend or rent out copies of the Software, and
* to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimers.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimers in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of National ICT Australia, nor the names of its
* contributors, may be used to endorse or promote products derived
* from this Software without specific prior written permission.
*
* EXCEPT AS EXPRESSLY STATED IN THIS LICENCE AND TO THE FULL EXTENT
* PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS-IS", AND
* NATIONAL ICT AUSTRALIA AND ITS CONTRIBUTORS MAKE NO REPRESENTATIONS,
* WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO ANY REPRESENTATIONS, WARRANTIES OR CONDITIONS
* REGARDING THE CONTENTS OR ACCURACY OF THE SOFTWARE, OR OF TITLE,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT,
* THE ABSENCE OF LATENT OR OTHER DEFECTS, OR THE PRESENCE OR ABSENCE OF
* ERRORS, WHETHER OR NOT DISCOVERABLE.
*
* TO THE FULL EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
* NATIONAL ICT AUSTRALIA OR ITS CONTRIBUTORS BE LIABLE ON ANY LEGAL
* THEORY (INCLUDING, WITHOUT LIMITATION, IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHERWISE) FOR ANY CLAIM, LOSS, DAMAGES OR OTHER
* LIABILITY, INCLUDING (WITHOUT LIMITATION) LOSS OF PRODUCTION OR
* OPERATION TIME, LOSS, DAMAGE OR CORRUPTION OF DATA OR RECORDS; OR LOSS
* OF ANTICIPATED SAVINGS, OPPORTUNITY, REVENUE, PROFIT OR GOODWILL, OR
* OTHER ECONOMIC LOSS; OR ANY SPECIAL, INCIDENTAL, INDIRECT,
* CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES, ARISING OUT OF OR IN
* CONNECTION WITH THIS LICENCE, THE SOFTWARE OR THE USE OF OR OTHER
* DEALINGS WITH THE SOFTWARE, EVEN IF NATIONAL ICT AUSTRALIA OR ITS
* CONTRIBUTORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH CLAIM, LOSS,
* DAMAGES OR OTHER LIABILITY.
*
* If applicable legislation implies representations, warranties, or
* conditions, or imposes obligations or liability on National ICT
* Australia or one of its contributors in respect of the Software that
* cannot be wholly or partly excluded, restricted or modified, the
* liability of National ICT Australia or the contributor is limited, to
* the full extent permitted by the applicable legislation, at its
* option, to:
* a. in the case of goods, any one or more of the following:
* i. the replacement of the goods or the supply of equivalent goods;
* ii. the repair of the goods;
* iii. the payment of the cost of replacing the goods or of acquiring
* equivalent goods;
* iv. the payment of the cost of having the goods repaired; or
* b. in the case of services:
* i. the supplying of the services again; or
* ii. the payment of the cost of having the services supplied again.
*
* The construction, validity and performance of this licence is governed
* by the laws in force in New South Wales, Australia.
* Copyright (C) 2009 Bahadir Balban
*/
#ifdef __thumb__
#define bl blx
#endif
/*
* We expect initial stack state:
*
* (low) |->argc|argv[0]|argv[1]|...|argv[argc] = 0|envp[0]|...|NULL| (high)
*
*/
.section .text.head
.code 32
.global _start;
.align;
_start:
ldr sp, =__stack
bl platform_init
mov fp, #0 @ Clear frame pointer
mov lr, #0 @ Clear link register
ldmfd sp!, {r0} @ Argc value in r0
mov r1, sp @ Ptr to argv in r1
bl __container_init
1:
b 1b

View File

@@ -12,6 +12,7 @@
#include <tests.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
void wait_pager(l4id_t partner)
{
@@ -22,15 +23,35 @@ void wait_pager(l4id_t partner)
// printf("Pager synced with us.\n");
}
void main(void)
int main(int argc, char *argv[])
{
wait_pager(0);
if (getpid() == 2) {
char *parent_of_all;
char pidbuf[10];
/* Convert current pid to string */
sprintf(pidbuf, "%d", getpid());
if (strcmp(argv[0], "FIRST ARG") ||
strcmp(argv[1], "SECOND ARG") ||
strcmp(argv[2], "THIRD ARG") ||
strcmp(argv[3], "FOURTH ARG")) {
printf("EXECVE TEST -- FAILED --\n");
goto out;
}
/* Get parent of all pid as a string from environment */
parent_of_all = getenv("parent_of_all");
/* Compare two pid strings. We use strings because we dont have atoi() */
if (!strcmp(pidbuf, parent_of_all)) {
printf("EXECVE TEST -- PASSED --\n");
printf("\nThread (%d): Continues to sync with the pager...\n\n", getpid());
while (1)
wait_pager(0);
}
out:
_exit(0);
}

View File

@@ -9,7 +9,9 @@ from os.path import join
Import('env')
###
### FIXME: We are missing the dependency on containers.elf
###
PROJRELROOT = '../../'
from config.projpaths import *

View File

@@ -375,8 +375,8 @@ elf_loadFile(void *elfFile, bool phys)
// printf("Elf program header offset: %p\n", src);
pheader_type = elf_getProgramHeaderType(elfFile, i);
// printf("Elf program header type: %p\n", pheader_type);
printf("Copying to range from 0x%x to 0x%x of size: 0x%x\n", (unsigned int)dest, (unsigned int)dest + (unsigned int)len, (unsigned int)len);
// Comment
//printf("Copying to range from 0x%x to 0x%x of size: 0x%x\n", (unsigned int)dest, (unsigned int)dest + (unsigned int)len, (unsigned int)len);
memcpy((void*) (uintptr_t) dest, (void*) (uintptr_t) src, len);
dest += len;
clrsize = elf_getProgramHeaderMemorySize(elfFile, i) - len;
@@ -385,7 +385,7 @@ elf_loadFile(void *elfFile, bool phys)
// printf("Memory cleared.\n");
}
// And this one
printf("\n");
//printf("\n");
return true;
}