From 8528e2e1baac9ac6876cc138cf156d6223b4bd3b Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Tue, 12 May 2009 11:25:14 +0300 Subject: [PATCH] Modified the kernel and all tasks with well-formatted printout messages. --- include/l4/api/kip.h | 1 - include/l4/macros.h | 2 + include/l4/platform/pb926/printascii.h | 4 +- libs/c/src/perror.c | 5 - src/arch/arm/v5/mm.c | 10 +- src/generic/pgalloc.c | 5 +- src/generic/physmem.c | 1 - src/glue/arm/init.c | 12 ++- tasks/fs0/main.c | 6 +- tasks/fs0/src/init.c | 2 + tasks/fs0/src/memfs/memfs.c | 2 +- tasks/fs0/src/syscalls.c | 4 +- tasks/libposix/errno.c | 6 ++ tasks/mm0/main.c | 9 +- tasks/mm0/src/clone.c | 2 +- tasks/mm0/src/init.c | 9 +- tasks/mm0/src/kdata.c | 8 +- tasks/mm0/src/munmap.c | 7 +- tasks/mm0/src/pagers.c | 4 +- tasks/mm0/src/task.c | 2 +- tasks/test0/include/tests.h | 9 +- tasks/test0/main.c | 44 +-------- tasks/test0/src/clonetest.c | 28 +++--- tasks/test0/src/dirtest.c | 113 +++++++++++++-------- tasks/test0/src/exectest.c | 21 ++-- tasks/test0/src/fileio.c | 130 +++++++------------------ tasks/test0/src/forktest.c | 42 ++++---- tasks/test0/src/mmaptest.c | 34 +++---- 28 files changed, 237 insertions(+), 285 deletions(-) diff --git a/include/l4/api/kip.h b/include/l4/api/kip.h index 9788f7a..440fb11 100644 --- a/include/l4/api/kip.h +++ b/include/l4/api/kip.h @@ -82,7 +82,6 @@ struct kip { #define BLKDEV_TID 2 #define __PAGERNAME__ "mm0" -#define __KERNELNAME__ "code0" #define __VFSNAME__ "fs0" #define __BLKDEVNAME__ "blkdev0" diff --git a/include/l4/macros.h b/include/l4/macros.h index d5cc67b..6da8907 100644 --- a/include/l4/macros.h +++ b/include/l4/macros.h @@ -2,6 +2,8 @@ #define __MACROS_H__ #include "config.h" +#define __KERNELNAME__ "code0" + /* * This file is automatically included before the first line of any * source file, using gcc's -imacro command line option. Only macro diff --git a/include/l4/platform/pb926/printascii.h b/include/l4/platform/pb926/printascii.h index 767ccba..0d0be28 100644 --- a/include/l4/platform/pb926/printascii.h +++ b/include/l4/platform/pb926/printascii.h @@ -2,10 +2,12 @@ #define __PLATFORM__PB926__PRINTASCII__H__ #define dprintk(str, val) \ +{ \ printascii(str); \ printascii("0x"); \ printhex8((val)); \ - printascii("\n"); + printascii("\n"); \ +} void printascii(char *str); void printhex8(unsigned int); diff --git a/libs/c/src/perror.c b/libs/c/src/perror.c index 518655c..16c8ba3 100644 --- a/libs/c/src/perror.c +++ b/libs/c/src/perror.c @@ -7,9 +7,4 @@ */ #include -extern int errno; -void perror(const char *str) -{ - printf("%s: %d\n", str, errno); -} diff --git a/src/arch/arm/v5/mm.c b/src/arch/arm/v5/mm.c index 157f513..80f2275 100644 --- a/src/arch/arm/v5/mm.c +++ b/src/arch/arm/v5/mm.c @@ -14,6 +14,7 @@ #include INC_GLUE(memlayout.h) #include INC_ARCH(linker.h) #include INC_ARCH(asm.h) +#include INC_API(kip.h) /* * These are indices into arrays with pgd_t or pmd_t sized elements, @@ -282,7 +283,7 @@ int __remove_mapping(pmd_table_t *pmd, unsigned long vaddr) switch (pmd->entry[pmd_i] & PMD_TYPE_MASK) { case PMD_TYPE_FAULT: - ret = -1; + ret = -ENOENT; break; case PMD_TYPE_LARGE: pmd->entry[pmd_i] = 0; @@ -596,8 +597,9 @@ void relocate_page_tables(void) __pt_start = pt_new; __pt_end = pt_new + pt_area_size; - printk("Initial page table area relocated from phys 0x%x to 0x%x\n", - virt_to_phys(&kspace), virt_to_phys(TASK_PGD(current))); + printk("%s: Initial page tables moved from 0x%x to 0x%x physical\n", + __KERNELNAME__, virt_to_phys(&kspace), + virt_to_phys(TASK_PGD(current))); } /* @@ -640,7 +642,7 @@ void remap_as_pages(void *vstart, void *vend) /* Replace the direct section physical address with pmd's address */ pgd->entry[pgd_i] = (pgd_t)pmd_phys; - printk("Kernel area 0x%lx - 0x%lx remapped as %d pages\n", + printk("%s: Kernel area 0x%lx - 0x%lx remapped as %d pages\n", __KERNELNAME__, (unsigned long)vstart, (unsigned long)vend, numpages); } diff --git a/src/generic/pgalloc.c b/src/generic/pgalloc.c index ade5e0a..868aec9 100644 --- a/src/generic/pgalloc.c +++ b/src/generic/pgalloc.c @@ -41,8 +41,9 @@ void pgalloc_add_new_cache(struct mem_cache *cache, int cidx) void print_kmem_grant_params(grant_kmem_usage_t *params) { - printk("Possible kmem usage on this memory grant:\n"); - printk("PGDs: %lu, PMDs: %lu, TCBs: %lu, Extra: %lu bytes.\n", + printk("%s: %lu bytes physical memory granted.\n", __KERNELNAME__, params->total_size); + printk("%s: Possible kmem usage on this memory grant:\n", __KERNELNAME__); + printk("%s: PGDs: %lu, PMDs: %lu, TCBs: %lu, Extra: %lu bytes.\n", __KERNELNAME__, params->total_pgds, params->total_pmds, params->total_tcbs, params->extra); } diff --git a/src/generic/physmem.c b/src/generic/physmem.c index 22cf65d..769ab5d 100644 --- a/src/generic/physmem.c +++ b/src/generic/physmem.c @@ -88,7 +88,6 @@ void physmem_init() void memory_init() { - printascii("Initialising kernel memory allocator.\n"); init_pgalloc(); } diff --git a/src/glue/arm/init.c b/src/glue/arm/init.c index 1b9e00c..009bb1e 100644 --- a/src/glue/arm/init.c +++ b/src/glue/arm/init.c @@ -146,6 +146,7 @@ void start_vm() : "r" (KERNEL_OFFSET) : "r0" ); + /* At this point, execution is on virtual addresses. */ remove_section_mapping(virt_to_phys(_start_kernel)); @@ -286,7 +287,6 @@ void init_pager(char *name, struct task_ids *ids) } BUG_ON(!taskimg); - printk("\nInitialising %s.\n", name); if (taskimg->phys_start & PAGE_MASK) printk("Warning, image start address not page aligned.\n"); @@ -313,8 +313,8 @@ void init_pager(char *name, struct task_ids *ids) add_mapping_pgd(taskimg->phys_start, INITTASK_AREA_START, task_pages * PAGE_SIZE, MAP_USR_DEFAULT_FLAGS, TASK_PGD(task)); - printk("Mapping %d pages from 0x%x to 0x%x for %s\n", task_pages, - taskimg->phys_start, INITTASK_AREA_START, name); + //printk("Mapping %d pages from 0x%x to 0x%x for %s\n", task_pages, + // taskimg->phys_start, INITTASK_AREA_START, name); /* Add the physical pages used by the task to the page map */ set_page_map(taskimg->phys_start, task_pages, 1); @@ -345,6 +345,8 @@ void init_tasks() init_ktcb_list(); init_address_space_list(); + printk("%s: Initialized. Starting %s as pager.\n", + __KERNELNAME__, __PAGERNAME__); /* * This must come last so that other tasks can copy its pgd before it * modifies it for its own specifics. @@ -354,7 +356,7 @@ void init_tasks() void start_kernel(void) { - printascii("\nstart_kernel...\n"); + printascii("\n"__KERNELNAME__": start kernel...\n"); /* Print section boundaries for kernel image */ //print_sections(); @@ -370,6 +372,8 @@ void start_kernel(void) /* Initialise platform-specific page mappings, and peripherals */ platform_init(); + printk("%s: Virtual memory enabled.\n", __KERNELNAME__); + /* Map and enable high vector page. Faults can be handled after here. */ vectors_init(); diff --git a/tasks/fs0/main.c b/tasks/fs0/main.c index b14fbd2..ea16859 100644 --- a/tasks/fs0/main.c +++ b/tasks/fs0/main.c @@ -43,7 +43,7 @@ void wait_pager(l4id_t partner) { l4_send(partner, L4_IPC_TAG_SYNC); - printf("%s: Pager synced with us.\n", __TASKNAME__); + // printf("%s: Pager synced with us.\n", __TASKNAME__); } void handle_fs_requests(void) @@ -135,13 +135,13 @@ void handle_fs_requests(void) void main(void) { - printf("\n%s: Started with tid: %d\n", __TASKNAME__, self_tid()); + printf("\n%s: Started with thread id: %d\n", __TASKNAME__, self_tid()); initialise(); wait_pager(PAGER_TID); - printf("%s: Listening requests.\n", __TASKNAME__); + printf("%s: VFS service initialized. Listening requests.\n", __TASKNAME__); while (1) { handle_fs_requests(); } diff --git a/tasks/fs0/src/init.c b/tasks/fs0/src/init.c index c769ee4..1e04452 100644 --- a/tasks/fs0/src/init.c +++ b/tasks/fs0/src/init.c @@ -78,6 +78,8 @@ int initialise(void) /* Mount the filesystem on the root device */ vfs_mount_root(root_sb); + printf("%s: Mounted memfs root filesystem.\n", __TASKNAME__); + /* Learn about what tasks are running */ init_task_data(); diff --git a/tasks/fs0/src/memfs/memfs.c b/tasks/fs0/src/memfs/memfs.c index 4ce5c8d..5a7ca7f 100644 --- a/tasks/fs0/src/memfs/memfs.c +++ b/tasks/fs0/src/memfs/memfs.c @@ -185,7 +185,7 @@ struct superblock *memfs_get_superblock(void *block) struct memfs_superblock *sb = block; struct superblock *vfs_sb; - printf("%s: %s: Reading superblock.\n", __TASKNAME__, __FUNCTION__); + // printf("%s: %s: Reading superblock.\n", __TASKNAME__, __FUNCTION__); /* We don't do sanity checks here, just confirm id. */ if (strcmp(sb->name, "memfs")) { printf("%s: Name does not match: %s\n", __FUNCTION__, sb->name); diff --git a/tasks/fs0/src/syscalls.c b/tasks/fs0/src/syscalls.c index ec6438c..a742906 100644 --- a/tasks/fs0/src/syscalls.c +++ b/tasks/fs0/src/syscalls.c @@ -416,8 +416,8 @@ int pager_sys_write(struct tcb *pager, unsigned long vnum, unsigned long f_offse if (vfs_isdir(v)) return -EISDIR; - printf("%s/%s: Writing to vnode %lu, at pgoff 0x%x, %d pages, buf at 0x%x\n", - __TASKNAME__, __FUNCTION__, vnum, f_offset, npages, pagebuf); + //printf("%s/%s: Writing to vnode %lu, at pgoff 0x%x, %d pages, buf at 0x%x\n", + // __TASKNAME__, __FUNCTION__, vnum, f_offset, npages, pagebuf); if ((ret = v->fops.write(v, f_offset, npages, pagebuf)) < 0) return ret; diff --git a/tasks/libposix/errno.c b/tasks/libposix/errno.c index e8cc407..474e33c 100644 --- a/tasks/libposix/errno.c +++ b/tasks/libposix/errno.c @@ -1,7 +1,13 @@ #include +#include int errno_variable; +void perror(const char *str) +{ + printf("%s: %d\n", str, errno); +} + int *__errno_location(void) { return &errno_variable; diff --git a/tasks/mm0/main.c b/tasks/mm0/main.c index 9e64fe8..94a8a48 100644 --- a/tasks/mm0/main.c +++ b/tasks/mm0/main.c @@ -239,15 +239,12 @@ int self_spawn(void) void main(void) { + printf("\n%s: Started with thread id: %d\n", __TASKNAME__, self_tid()); + /* Initialise the memory, server tasks, mmap and start them. */ initialise(); -/* - if (self_spawn()) - while (1) - ; -*/ - + printf("%s: Memory/Process manager initialized. Listening requests.\n", __TASKNAME__); while (1) { handle_requests(); } diff --git a/tasks/mm0/src/clone.c b/tasks/mm0/src/clone.c index 2718786..7fa7446 100644 --- a/tasks/mm0/src/clone.c +++ b/tasks/mm0/src/clone.c @@ -157,7 +157,7 @@ int do_clone(struct tcb *parent, unsigned long child_stack, unsigned int flags) global_add_task(child); /* Start cloned child. */ - printf("%s/%s: Starting cloned child.\n", __TASKNAME__, __FUNCTION__); + // printf("%s/%s: Starting cloned child.\n", __TASKNAME__, __FUNCTION__); l4_thread_control(THREAD_RUN, &ids); /* Return child tid to parent */ diff --git a/tasks/mm0/src/init.c b/tasks/mm0/src/init.c index 241c7aa..8089840 100644 --- a/tasks/mm0/src/init.c +++ b/tasks/mm0/src/init.c @@ -119,7 +119,7 @@ int start_boot_tasks(struct initdata *initdata) } while (1); /* MM0 needs partial initialisation since it's already running. */ - printf("%s: Initialising mm0 tcb.\n", __TASKNAME__); + // printf("%s: Initialising mm0 tcb.\n", __TASKNAME__); ids.tid = PAGER_TID; ids.spid = PAGER_TID; ids.tgid = PAGER_TID; @@ -133,13 +133,13 @@ int start_boot_tasks(struct initdata *initdata) ids.spid = VFS_TID; ids.tgid = VFS_TID; - printf("%s: Initialising fs0\n",__TASKNAME__); + // printf("%s: Initialising fs0\n",__TASKNAME__); BUG_ON((IS_ERR(fs0_task = boottask_exec(fs0_file, USER_AREA_START, USER_AREA_END, &ids)))); total++; /* Initialise other tasks */ list_for_each_entry_safe(file, n, &other_files, list) { - printf("%s: Initialising new boot task.\n", __TASKNAME__); + // printf("%s: Initialising new boot task.\n", __TASKNAME__); ids.tid = TASK_ID_INVALID; ids.spid = TASK_ID_INVALID; ids.tgid = TASK_ID_INVALID; @@ -179,7 +179,7 @@ void init_mm(struct initdata *initdata) printf("SHM initialisation failed.\n"); BUG(); } - printf("%s: Initialised shm structures.\n", __TASKNAME__); + // printf("%s: Initialised shm structures.\n", __TASKNAME__); if (utcb_pool_init() < 0) { printf("SHM initialisation failed.\n"); @@ -204,6 +204,5 @@ void initialise(void) start_boot_tasks(&initdata); mm0_test_global_vm_integrity(); - printf("%s: Initialised the memory/process manager.\n", __TASKNAME__); } diff --git a/tasks/mm0/src/kdata.c b/tasks/mm0/src/kdata.c index 4acdff6..294d211 100644 --- a/tasks/mm0/src/kdata.c +++ b/tasks/mm0/src/kdata.c @@ -38,9 +38,7 @@ void print_page_map(struct page_bitmap *map) unsigned int total_used = 0; int numpages = 0; - printf("Pages start at address 0x%x\n", map->pfn_start << PAGE_BITS); - printf("Pages end at address 0x%x\n", map->pfn_end << PAGE_BITS); - printf("The used page areas are:\n"); + // printf("Page map: 0x%x-0x%x\n", map->pfn_start << PAGE_BITS, map->pfn_end << PAGE_BITS); for (int i = 0; i < (PHYSMEM_TOTAL_PAGES >> 5); i++) { for (int x = 0; x < WORD_BITS; x++) { if (map->map[i] & (1 << x)) { /* A used page found? */ @@ -52,14 +50,14 @@ void print_page_map(struct page_bitmap *map) if (start_pfn) { /* We had a used page */ /* Finished end of used range. * Print and reset. */ - print_pfn_range(start_pfn, numpages); + //print_pfn_range(start_pfn, numpages); start_pfn = 0; numpages = 0; } } } } - printf("Total of %d pages. %d Kbytes.\n", total_used, total_used << 2); + printf("%s: Pagemap: Total of %d used physical pages. %d Kbytes used.\n", __TASKNAME__, total_used, total_used << 2); } diff --git a/tasks/mm0/src/munmap.c b/tasks/mm0/src/munmap.c index 821b64e..35cd93d 100644 --- a/tasks/mm0/src/munmap.c +++ b/tasks/mm0/src/munmap.c @@ -57,6 +57,7 @@ int vma_shrink(struct vm_area *vma, struct tcb *task, const unsigned long pfn_start, const unsigned long pfn_end) { unsigned long diff, unmap_start, unmap_end; + int err; /* Shrink from the end */ if (vma->pfn_start < pfn_start) { @@ -77,8 +78,8 @@ int vma_shrink(struct vm_area *vma, struct tcb *task, BUG(); /* Unmap the shrinked portion */ - BUG_ON(l4_unmap((void *)__pfn_to_addr(unmap_start), - unmap_end - unmap_start, task->tid) < 0); + BUG_ON((err = l4_unmap((void *)__pfn_to_addr(unmap_start), + unmap_end - unmap_start, task->tid)) < 0); return 0; } @@ -110,6 +111,8 @@ int vma_destroy_single(struct tcb *task, struct vm_area *vma) int vma_unmap(struct vm_area *vma, struct tcb *task, const unsigned long pfn_start, const unsigned long pfn_end) { + // printf("Unmapping vma. Tid: %d, 0x%x-0x%x\n",task->tid, __pfn_to_addr(pfn_start), __pfn_to_addr(pfn_end)); + /* Split needed? */ if (vma->pfn_start < pfn_start && vma->pfn_end > pfn_end) return vma_split(vma, task, pfn_start, pfn_end); diff --git a/tasks/mm0/src/pagers.c b/tasks/mm0/src/pagers.c index aa3513b..a0fc3c2 100644 --- a/tasks/mm0/src/pagers.c +++ b/tasks/mm0/src/pagers.c @@ -92,8 +92,8 @@ int file_page_out(struct vm_object *vm_obj, unsigned long page_offset) /* Map the page to vfs task */ l4_map(paddr, vaddr, 1, MAP_USR_RW_FLAGS, VFS_TID); - printf("%s/%s: Writing to vnode %d, at pgoff 0x%x, %d pages, buf at 0x%x\n", - __TASKNAME__, __FUNCTION__, vm_file_to_vnum(f), page_offset, 1, vaddr); + // printf("%s/%s: Writing to vnode %d, at pgoff 0x%x, %d pages, buf at 0x%x\n", + // __TASKNAME__, __FUNCTION__, vm_file_to_vnum(f), page_offset, 1, vaddr); /* Syscall to vfs to write page back to file. */ if ((err = vfs_write(vm_file_to_vnum(f), page_offset, 1, vaddr)) < 0) diff --git a/tasks/mm0/src/task.c b/tasks/mm0/src/task.c index 3d0ae1b..d9a1398 100644 --- a/tasks/mm0/src/task.c +++ b/tasks/mm0/src/task.c @@ -623,7 +623,7 @@ int task_start(struct tcb *task) }; /* Start the thread */ - printf("Starting task with id %d, spid: %d\n", task->tid, task->spid); + printf("%s: Starting task with thread id: %d, space id: %d\n", __TASKNAME__, task->tid, task->spid); if ((err = l4_thread_control(THREAD_RUN, &ids)) < 0) { printf("l4_thread_control failed with %d\n", err); return err; diff --git a/tasks/test0/include/tests.h b/tasks/test0/include/tests.h index 8f0b2e6..16cd1e4 100644 --- a/tasks/test0/include/tests.h +++ b/tasks/test0/include/tests.h @@ -3,12 +3,19 @@ #define __TASKNAME__ "test0" +// #define TEST_VERBOSE_PRINT +#if defined (TEST_VERBOSE_PRINT) +#define test_printf(...) printf(__VA_ARGS__) +#else +#define test_printf(...) +#endif + + int shmtest(void); int forktest(void); int mmaptest(void); int dirtest(void); int fileio(void); -int fileio2(void); int clonetest(void); int exectest(void); diff --git a/tasks/test0/main.c b/tasks/test0/main.c index 04847c2..2f475b2 100644 --- a/tasks/test0/main.c +++ b/tasks/test0/main.c @@ -22,59 +22,25 @@ void wait_pager(l4id_t partner) // printf("Pager synced with us.\n"); } -pid_t pid; - void main(void) { - printf("\n%s: Started with tid %d.\n", __TASKNAME__, self_tid()); - /* Sync with pager */ + wait_pager(0); dirtest(); - exectest(); + // exectest(); - /* Check mmap/munmap */ mmaptest(); - printf("Forking...\n"); - if ((pid = fork()) < 0) - printf("Error forking...\n"); + fileio(); - if (pid == 0) { - pid = getpid(); - printf("Child: file IO test 1.\n"); - if (fileio() == 0) - printf("-- Fileio PASSED --\n"); - else - printf("-- Fileio FAILED --\n"); + forktest(); - printf("Child: forktest.\n"); - if (forktest() == 0) - printf("-- Fork PASSED -- \n"); - else - printf("-- Fork FAILED -- \n"); - } else { - printf("Parent: file IO test 2. child pid %d:\n", pid); - if (fileio2() == 0) - printf("-- Fileio2 PASSED --\n"); - else - printf("-- Fileio2 FAILED --\n"); - } - - printf("Testing clone syscall...\n"); - if ((pid = fork()) < 0) - printf("Error forking...\n"); - /* Child does the clonetest(). All of them will exit */ - if (pid == 0) - clonetest(); + clonetest(); while (1) wait_pager(0); -#if 0 - /* Check shmget/shmat/shmdt */ - shmtest(); -#endif } diff --git a/tasks/test0/src/clonetest.c b/tasks/test0/src/clonetest.c index f508b47..1695895 100644 --- a/tasks/test0/src/clonetest.c +++ b/tasks/test0/src/clonetest.c @@ -7,15 +7,14 @@ #include #include #include +#include int clone_global = 0; int my_thread_func(void *arg) { - printf("Cloned child %d running...\n", getpid()); for (int i = 0; i < 25; i++) clone_global++; - printf("Cloned child exiting with global increased to: %d. (Should be just about 100 at final)\n", clone_global); _exit(0); } @@ -27,27 +26,30 @@ int clonetest(void) /* Parent loops and calls clone() to clone new threads. Children don't come back from the clone() call */ for (int i = 0; i < 4; i++) { if ((child_stack = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_GROWSDOWN, 0, 0)) == MAP_FAILED) { - printf("MMAP failed.\n"); - _exit(1); + test_printf("MMAP failed.\n"); + goto out_err; } else { - printf("Mapped area starting at %p\n", child_stack); + test_printf("Mapped area starting at %p\n", child_stack); } ((int *)child_stack)[-1] = 5; /* Test mapped area */ - printf("Cloning...\n"); + test_printf("Cloning...\n"); if ((childid = clone(my_thread_func, child_stack, CLONE_PARENT | CLONE_FS | CLONE_VM | CLONE_THREAD | CLONE_SIGHAND, 0)) < 0) { - perror("CLONE failed.\n"); + test_printf("CLONE failed.\n"); + goto out_err; } else { - printf("Cloned a new thread with child pid %d\n", childid); + test_printf("Cloned a new thread with child pid %d\n", childid); } } - _exit(0); + + /* TODO: Add wait() or something similar and check that global is 100 */ + + printf("CLONE TEST -- PASSED --\n"); + return 0; +out_err: + printf("CLONE TEST -- FAILED --\n"); return 0; } - - - - diff --git a/tasks/test0/src/dirtest.c b/tasks/test0/src/dirtest.c index 8c7e71c..5fcfe43 100644 --- a/tasks/test0/src/dirtest.c +++ b/tasks/test0/src/dirtest.c @@ -95,7 +95,7 @@ void print_dirents(char *path, void *buf, int cnt) //if (stat(pathbuf, &statbuf) < 0) // perror("STAT"); // print_fstat(&statbuf); - printf("%s\n", dp->d_name); + test_printf("%s\n", dp->d_name); cnt -= dp->d_reclen; dp = (struct dirent *)((void *)dp + dp->d_reclen); i++; @@ -111,13 +111,13 @@ int lsdir(char *path) memset(dents, 0, sizeof(struct dirent) * DENTS_TOTAL); if ((fd = open(path, O_RDONLY)) < 0) { - printf("OPEN failed.\n"); + test_printf("OPEN failed.\n"); return -1; } else - printf("Got fd: %d for opening %s\n", fd, path); + test_printf("Got fd: %d for opening %s\n", fd, path); if ((bytes = os_readdir(fd, dents, sizeof(struct dirent) * DENTS_TOTAL)) < 0) { - printf("GETDENTS error: %d\n", bytes); + test_printf("GETDENTS error: %d\n", bytes); return -1; } else { print_dirents(path, dents, bytes); @@ -126,61 +126,88 @@ int lsdir(char *path) return 0; } - int dirtest(void) { - printf("\nlsdir current directory:\n"); if (lsdir(".") < 0) { - printf("lsdir failed.\n"); + test_printf("lsdir failed.\n"); goto out_err; } - printf("\nlsdir root directory:\n"); if (lsdir("/") < 0) { - printf("lsdir failed.\n"); + test_printf("lsdir failed.\n"); goto out_err; } - printf("\nCreating directories: usr, etc, tmp, var, home, opt, bin, boot, lib, dev\n"); - if (mkdir("/usr", 0) < 0) - perror("MKDIR"); - if (mkdir("/etc", 0) < 0) - perror("MKDIR"); - if (mkdir("/tmp", 0) < 0) - perror("MKDIR"); - if (mkdir("/var", 0) < 0) - perror("MKDIR"); - if (mkdir("/bin", 0) < 0) - perror("MKDIR"); - if (mkdir("/boot", 0) < 0) - perror("MKDIR"); - if (mkdir("/lib", 0) < 0) - perror("MKDIR"); - if (mkdir("/dev", 0) < 0) - perror("MKDIR"); + test_printf("\nCreating directories: usr, etc, tmp, var, home, opt, bin, boot, lib, dev\n"); + if (mkdir("/usr", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/etc", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/tmp", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/var", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/bin", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/boot", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/lib", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/dev", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/usr/bin", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/home/", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (mkdir("/home/bahadir", 0) < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + if (chdir("/home/bahadir") < 0) { + test_printf("MKDIR: %d\n", errno); + goto out_err; + } + test_printf("Changed curdir to /home/bahadir\n"); - if (mkdir("/usr/bin", 0) < 0) - perror("MKDIR"); - if (mkdir("/home/", 0) < 0) - perror("MKDIR"); - if (mkdir("/home/bahadir", 0) < 0) - perror("MKDIR"); - if (chdir("/home/bahadir") < 0) - perror("CHDIR"); - printf("Changed curdir to /home/bahadir\n"); + test_printf("\nlsdir root directory:\n"); + if (lsdir("/") < 0) + goto out_err; - printf("\nlsdir root directory:\n"); - lsdir("/"); + test_printf("\nlsdir /usr:\n"); + if (lsdir("/usr") < 0) + goto out_err; - printf("\nlsdir /usr:\n"); - lsdir("/usr"); + test_printf("\nlsdir current directory:\n"); + if (lsdir(".") < 0) + goto out_err; + test_printf("\nlsdir /usr/./././bin//\n"); + if (lsdir("/usr/./././bin//") < 0) + goto out_err; - printf("\nlsdir current directory:\n"); - lsdir("."); - printf("\nlsdir /usr/./././bin//\n"); - lsdir("/usr/./././bin//"); + printf("DIR TEST -- PASSED --\n"); return 0; out_err: + printf("DIR TEST -- FAILED --\n"); return 0; } diff --git a/tasks/test0/src/exectest.c b/tasks/test0/src/exectest.c index 1c0dd87..34de4cc 100644 --- a/tasks/test0/src/exectest.c +++ b/tasks/test0/src/exectest.c @@ -9,7 +9,7 @@ #include #include #include - +#include extern char _start_test1[]; extern char _end_test1[]; @@ -23,24 +23,20 @@ int exectest(void) char *argv[5]; /* First create a new file and write the executable data to that file */ - printf("%s: Creating new executable file.\n", __FUNCTION__); if ((fd = open("/home/bahadir/test1.axf", O_RDWR | O_CREAT | O_TRUNC, S_IRWXU)) < 0) { - perror("OPEN"); - return -1; + test_printf("OPEN: %d\n", errno); + goto out_err; } - printf("%s: Writing to the executable file.\n", __FUNCTION__); left = size; while (left != 0) { - cnt = write(fd, exec_start, left); - if (cnt < 0) { - printf("Error writing to file.\n"); - return -1; - } + if ((cnt = write(fd, exec_start, left)) < 0) + goto out_err; left -= cnt; } - close(fd); + if (close(fd) < 0) + goto out_err; /* Set up some arguments */ argv[0] = "FIRST ARG"; @@ -49,10 +45,11 @@ int exectest(void) argv[3] = "FOURTH ARG"; argv[4] = 0; - printf("%s: Executing the file.\n", __FUNCTION__); /* Execute the file */ execve("/home/bahadir/test1.axf", argv, 0); +out_err: + printf("EXECVE TEST -- FAILED --\n"); return 0; } diff --git a/tasks/test0/src/fileio.c b/tasks/test0/src/fileio.c index e54bd71..9c2af27 100644 --- a/tasks/test0/src/fileio.c +++ b/tasks/test0/src/fileio.c @@ -6,71 +6,7 @@ #include #include #include - -int fileio2(void) -{ - int fd; - ssize_t cnt; - int err; - char buf[128]; - off_t offset; - int tid = getpid(); - char *str = "I WROTE TO THIS FILE\n"; - - memset(buf, 0, 128); - if ((fd = open("/home/bahadir/newfile2.txt", O_RDWR | O_CREAT | O_TRUNC, S_IRWXU)) < 0) { - perror("OPEN"); - return -1; - } - printf("%d: Created newfile2.txt\n", tid); - - printf("%d: write.\n", tid); - if ((int)(cnt = write(fd, str, strlen(str))) < 0) { - perror("WRITE"); - return -1; - } - printf("%d: close.\n", tid); - if ((err = close(fd)) < 0) { - printf("Close failed.\n"); - perror("CLOSE"); - return -1; - } - printf("%d: re-open.\n", tid); - if ((fd = open("/home/bahadir/newfile2.txt", O_RDWR, S_IRWXU)) < 0) { - perror("OPEN"); - return -1; - } - - printf("%d: lseek.\n", tid); - if ((int)(offset = lseek(fd, 0, SEEK_SET)) < 0) { - perror("LSEEK"); - return -1; - } - printf("%d: read.\n", tid); - if ((int)(cnt = read(fd, buf, strlen(str))) < 0) { - perror("READ"); - return -1; - } - - printf("%d: Read: %d bytes from file.\n", tid, cnt); - if (cnt) { - printf("%d: Read string: %s\n", tid, buf); - if (strcmp(buf, str)) { - printf("Error: strings not the same:\n"); - printf("str: %s\n", str); - printf("buf: %s\n", buf); - return -1; - } - } - - printf("%d: close.\n", tid); - if ((err = close(fd)) < 0) { - perror("CLOSE"); - return -1; - } - - return 0; -} +#include int fileio(void) { @@ -81,64 +17,72 @@ int fileio(void) off_t offset; int tid = getpid(); char *str = "I WROTE TO THIS FILE\n"; + char filename[128]; memset(buf, 0, 128); - if ((fd = open("/home/bahadir/newfile.txt", O_RDWR | O_CREAT | O_TRUNC, S_IRWXU)) < 0) { - perror("OPEN"); - return -1; + memset(filename, 0, 128); + sprintf(filename, "/home/bahadir/newfile%d.txt", tid); + if ((fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU)) < 0) { + test_printf("OPEN: %d", errno); + goto out_err; } - printf("%d: Created newfile.txt\n", tid); + test_printf("%d: Created %s\n", tid, filename); - printf("%d: write.\n", tid); + test_printf("%d: write.\n", tid); if ((int)(cnt = write(fd, str, strlen(str))) < 0) { - perror("WRITE"); - return -1; + test_printf("WRITE: %d", errno); + goto out_err; } - printf("%d: lseek.\n", tid); + test_printf("%d: lseek.\n", tid); if ((int)(offset = lseek(fd, 0, SEEK_SET)) < 0) { - perror("LSEEK"); - return -1; + test_printf("LSEEK: %d", errno); + goto out_err; } - printf("%d: read.\n", tid); + test_printf("%d: read.\n", tid); if ((int)(cnt = read(fd, buf, strlen(str))) < 0) { - perror("READ"); - return -1; + test_printf("READ: %d", errno); + goto out_err; } - printf("%d: Read: %d bytes from file.\n", tid, cnt); + test_printf("%d: Read: %d bytes from file.\n", tid, cnt); if (cnt) { - printf("%d: Read string: %s\n", tid, buf); + test_printf("%d: Read string: %s\n", tid, buf); if (strcmp(buf, str)) { - printf("Strings not the same:\n"); - printf("Str: %s\n", str); - printf("Buf: %s\n", buf); - return -1; + test_printf("Strings not the same:\n"); + test_printf("Str: %s\n", str); + test_printf("Buf: %s\n", buf); + goto out_err; } } - printf("%d: close.\n", tid); if ((err = close(fd)) < 0) { - perror("CLOSE"); - return -1; + test_printf("CLOSE: %d", errno); + goto out_err; } + + printf("FILE IO TEST -- PASSED --\n"); + return 0; + +out_err: + printf("FILE IO TEST -- FAILED --\n"); return 0; } #if defined(HOST_TESTS) int main(void) { - printf("File IO test 1:\n"); + test_printf("File IO test 1:\n"); if (fileio() == 0) - printf("-- PASSED --\n"); + test_printf("-- PASSED --\n"); else - printf("-- FAILED --\n"); + test_printf("-- FAILED --\n"); - printf("File IO test 2:\n"); + test_printf("File IO test 2:\n"); if (fileio2() == 0) - printf("-- PASSED --\n"); + test_printf("-- PASSED --\n"); else - printf("-- FAILED --\n"); + test_printf("-- FAILED --\n"); return 0; diff --git a/tasks/test0/src/forktest.c b/tasks/test0/src/forktest.c index a723a49..ab81ff5 100644 --- a/tasks/test0/src/forktest.c +++ b/tasks/test0/src/forktest.c @@ -9,37 +9,45 @@ #include int global = 0; -extern pid_t pid; + +static pid_t pid; int forktest(void) { pid_t myid; + pid_t parent = getpid(); /* 16 forks */ for (int i = 0; i < 4; i++) - fork(); + if (fork() < 0) + goto out_err; myid = getpid(); pid = myid; if (global != 0) { - printf("Global not zero.\n"); - printf("-- FAILED --\n"); - goto out; + test_printf("Global not zero.\n"); + test_printf("-- FAILED --\n"); + goto out_err; } - global = myid; + global += myid; - if (global != myid) { - printf("Global has not changed to myid.\n"); - printf("-- FAILED --\n"); - goto out; + if (global != myid) + goto out_err; + + + if (getpid() != parent) { + /* Successful childs return here */ + _exit(0); + BUG(); } - /* Print only when failed, otherwise too many pass messages */ - printf("PID: %d, my global: %d\n", myid, global); - printf("-- PASSED --\n"); -out: - printf("PID: %d exiting...\n", myid); - _exit(0); - BUG(); + /* Parent of all comes here if successful */ + printf("FORK TEST -- PASSED --\n"); + return 0; + + /* Any erroneous child or parent comes here */ +out_err: + printf("FORK TEST -- FAILED --\n"); + return 0; } diff --git a/tasks/test0/src/mmaptest.c b/tasks/test0/src/mmaptest.c index d0e1a48..3f1f64e 100644 --- a/tasks/test0/src/mmaptest.c +++ b/tasks/test0/src/mmaptest.c @@ -13,6 +13,7 @@ #include #include #include +#include #define PAGE_SIZE 0x1000 @@ -23,42 +24,33 @@ int mmaptest(void) int x = 0x1000; if ((fd = open("./newfile3.txt", O_CREAT | O_TRUNC | O_RDWR, S_IRWXU)) < 0) - perror("open:"); - else - printf("open: Success.\n"); + goto out_err; /* Extend the file */ if ((int)lseek(fd, PAGE_SIZE*16, SEEK_SET) < 0) - perror("lseek"); - else - printf("lseek: Success.\n"); + goto out_err; if (write(fd, &x, sizeof(x)) < 0) - perror("write"); - else - printf("write: Success.\n"); + goto out_err; - printf("%s: Calling mmap()\n", __TASKNAME__); if ((int)(base = mmap(0, PAGE_SIZE*16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) < 0) - perror("mmap"); - else - printf("mmap: Success: %p\n", base); + goto out_err; *(unsigned int *)(base + PAGE_SIZE*2) = 0x1000; - printf("%s: Calling msync()\n", __TASKNAME__); if (msync(base + PAGE_SIZE*2, PAGE_SIZE, MS_SYNC) < 0) - perror("msync"); - else - printf("msync: Success: %p\n", base); + goto out_err; - printf("%s: Calling munmap()\n", __TASKNAME__); if (munmap(base + PAGE_SIZE*2, PAGE_SIZE) < 0) - perror("munmap"); - else - printf("munmap: Success: %p\n", base); + goto out_err; + *(unsigned int *)(base + PAGE_SIZE*3) = 0x1000; *(unsigned int *)(base + PAGE_SIZE*1) = 0x1000; + printf("MMAP TEST -- PASSED --\n"); + return 0; + +out_err: + printf("MMAP TEST -- FAILED --\n"); return 0; }