From ba1cc0c6bc7446a340c9c97068f60f9ba0a08d18 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Mon, 15 Jun 2009 14:58:41 +0300 Subject: [PATCH] Updated LICENSE/README files, removed unused code from tasks. --- LICENSE | 5 +- README | 197 +++++------------------ tasks/blkdev0/SConstruct | 130 --------------- tasks/blkdev0/fsbin/SConstruct | 43 ----- tasks/blkdev0/fsbin/incbin.S | 7 - tasks/blkdev0/fsbin/romfs.bin | Bin 296960 -> 0 bytes tasks/blkdev0/include/arch | 1 - tasks/blkdev0/include/blkdev.h | 31 ---- tasks/blkdev0/include/linker.lds | 47 ------ tasks/blkdev0/include/ramdisk.h | 7 - tasks/blkdev0/main.c | 59 ------- tasks/blkdev0/src/init.c | 11 -- tasks/blkdev0/src/ramdisk.c | 116 ------------- tasks/blkdev0/tools/generate_bootdesc.py | 28 ---- tasks/sigma0/channel.c | 18 --- tasks/sigma0/main.c | 154 ------------------ tasks/sigma0/rpc | Bin 8337 -> 0 bytes 17 files changed, 44 insertions(+), 810 deletions(-) delete mode 100644 tasks/blkdev0/SConstruct delete mode 100644 tasks/blkdev0/fsbin/SConstruct delete mode 100644 tasks/blkdev0/fsbin/incbin.S delete mode 100644 tasks/blkdev0/fsbin/romfs.bin delete mode 120000 tasks/blkdev0/include/arch delete mode 100644 tasks/blkdev0/include/blkdev.h delete mode 100644 tasks/blkdev0/include/linker.lds delete mode 100644 tasks/blkdev0/include/ramdisk.h delete mode 100644 tasks/blkdev0/main.c delete mode 100644 tasks/blkdev0/src/init.c delete mode 100644 tasks/blkdev0/src/ramdisk.c delete mode 100755 tasks/blkdev0/tools/generate_bootdesc.py delete mode 100644 tasks/sigma0/channel.c delete mode 100644 tasks/sigma0/main.c delete mode 100755 tasks/sigma0/rpc diff --git a/LICENSE b/LICENSE index e5f499c..52899cb 100644 --- a/LICENSE +++ b/LICENSE @@ -2,14 +2,13 @@ The source code under the codezero directory tree is governed by the license below and this version only, unless it is stated otherwise as part of the file. To be more precise, for every source file where it -says: "Copyright (C) 2007, 2008 Bahadir Balban" or a similar wording +says: "Copyright (C) 2007-2009 Bahadir Balban" or a similar wording (capitalisation, years or the format of the name may change), the below license has effect. Any other source file may or may not be inclusive. -For questions please contact me on bbalban@b-labs.co.uk +For questions please contact me on bahadir@l4dev.org Bahadir Balban - GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 diff --git a/README b/README index c2cc633..2029afc 100644 --- a/README +++ b/README @@ -1,100 +1,44 @@ - Codezero Microkernel Pre-release + Codezero Microkernel v0.1 Release - Copyright (C) 2007, 2008 Bahadir Balban + Copyright (C) 2007-2009 Bahadir Bilgehan Balban + +1.) What is Codezero? + +Codezero is a new L4 microkernel that has been written from scratch. It is a +modern microkernel implementation that provides capabilities for virtualization +and implementation of native OS services. Codezero can act as a virtualisation +platform, a hardware abstraction layer, and as a basis for developing operating +system services. Codezero's primary focus is on embedded systems. -What is Codezero? - -Codezero is a new microkernel that has been developed for embedded systems. It -implements a simple API that is based on the L4 Microkernel, and it can be used -as a base to develop or run new operating systems. As part of the project, -server tasks are provided that implement memory management and a virtual -filesystem layer. These servers are built upon the base Codezero API, and they -currently support a small but essential subset of the POSIX API. - -Codezero targets high-end embedded systems that support virtual memory and it -has an emphasis on the ARM architecture. Open source development practices are -used in its development. Users can use Codezero's POSIX-like server tasks or -another operating system built upon it, or both at the same time. Codezero aims -to differ from other systems by implementing a modern embedded operating system -and yet provide more flexibility than a single operating system API. - - -Why the name Codezero? +2.) Why the name Codezero? The project focuses on simplicity and clarity in software design. Everything is -kept simple, from the user-level tasks down to the build system that does not -take part in the actual microkernel. +kept simple, from the user-level services down to the build system that does +not take part in the actual microkernel. Codezero is a microkernel that is +easy-to-use and modify, providing a rapid kernel software development +environment. -Who could use Codezero? +3.) Why use Codezero? -Currently, Codezero can be used on any embedded system that requires -multitasking and virtual memory support but not all the detailed features of a -complex operating system. Codezero's initial advantage in that respect would be -its clarity and simplicity that makes it easier for users to grasp and use. In -the near future, the real-time features will be optimised and it will also be a -good candidate for real-time applications. Finally it will be used on systems -that require high dependability. Tightly integrated embedded systems are one -such example where multiple isolated application domains exist side-by-side, -sharing the same cpu and memory system. +Codezero aims to provide easy hands-on experience; you may simply download the +source tree, install the tools using this guide, and get up and running with +development on your virtual embedded platform from the comfort of your host PC. + +Codezero strives to incorporate the most modern design features and presents +them in a well-written source code base. In other words, Codezero strives to be +technically cutting edge. Updates are rapid and open community is encouraged to +get involved in core development. -What are the design features? +4.) What is the license? -Codezero attempts to incorporate many modern features that are present in -today's operating systems. Some of them are presented below. - -Based on the L4 microkernel design principles, there are only a few system -calls in Codezero. These system calls provide purely mechanism; threads and -address spaces, and the methods of inter-process communication between them. -Anything beyond these are policy and they are implemented in the userspace. Due -to this rigorously simple design the same microkernel can be used to design -completely different operating systems. - -In terms of other features, the microkernel is preemptive, and smp-ready. -Currently only synchronous communication is implemented, but this will change -in the near future. The microkernel also incorporates a simple priority-based -scheduler, and all blocking operations (locking, ipc, waiting) are -interruptible. Even though the microkernel needs to be optimised in its -real-time capabilities, it does incorporate the necessary architecture to -support real-time performance. - -There are two system tasks built upon the base microkernel that manage memory -and file-based I/O, called MM0 and FS0. MM0 is the system task that implements -memory management. It contains allocators and manages the page cache. It -implements demand paging by managing page faults, physical pages and their -file/task associations. MM0 provides the default paging mechanism on Codezero. - -FS0 is the system task that implements a simple, modern virtual filesystem -layer. It is designed to serve file requests from MM0. Since it abstracts the -low-level filesystem details, it is a relatively easy job to port a new -filesystem to be used under FS0. - -MM0 and FS0 both reside in the userspace, and they are not mandatory services. -For example the virtual and physical memory resources can be partitioned by -Codezero among pagers, and a third-party pager can override Codezero's pager on -the same run-time, and implement an independent paging behaviour for its own -memory partition. This feature provides the option of having an adjustable -mixture of generalisation and specialisation of system services at the same -run-time. For instance, Codezero's abstract posix-like page/file management -services can be used in combination with an application-specific pager that -depends on its own paging abilities. A critical task could both use mm0 and -fs0's posix-like files benefiting from the abstraction and simplification that -it brings, but at the same time rely on its own specialised page-fault handling -mechanism for its critical data. Similarly, a complete operating system can be -virtualised and both native and virtualised applications can run on the same -run-time. - - -What will the license be? - -The current release is distributed under GNU General Public License Version 3 -and this version only. Any next version will be released in the same license, -but there are intentions to keep the project in a dual-licensed manner. In any -case, one version of the source code will always be released as open source as -in the OSI definition. +The current release is distributed under GNU General Public License Version 3. +For contributions we ask for a copyright share agreement and you may freely +contribute to the project this way. This is our current model, but if you +object to this, feel free to mention your ideas in our mailing list. The third party source code under the directories loader/ tools/ libs/c libs/elf have their own copyright and licenses, separate from this project. All @@ -102,79 +46,22 @@ third party source code is open source in the OSI definition. Please check these directories for their respective licenses. -Why yet another POSIX microkernel? +5.) Why not improve on a popular open source kernel instead of Codezero? -There are many open source POSIX operating systems with advanced features such -as BSD versions and Linux. However, neither of these were originally designed -for embedded systems. Multiple problems arise due to this fact. +Open source POSIX kernels are not designed for running on embedded platforms. + * Their source code is encumbered and cluttered with legacy or unrelated + components. + * Their user bases are saturated, their core developers are engaged and + focused on non-embedded platforms. + * Their source code base is too complex to grasp and most components enforce + unnecessary policy on embedded applications. -Unix itself and all the tools built upon weren't meant for using on small -devices. Accordingly, existing Unix operating systems contain a lot of -historical code. Their code base is so big, that it gets more and more -difficult to understand how their internals work. On these systems usually much -of the existing code base is irrelevant to newly developed software, and -embedded systems need new software often. Codezero is written from scratch to -solely target embedded systems and as such the source code is %100 relevant. -It is small and free from legacy code. +Codezero is simple, clean, and focused on embedded systems. Still, existing +open source kernels are valuable with some of their features and drivers. As a +result, we attempt to virtualize them on top of Codezero. -From a design perspective, these kernels have a monolithic design, and as such -they may have issues with dependability due to much of the code sharing the -same address space. This is an important issue on embedded systems since their -operation is more sensitive to disruptions. Being a microkernel design, -Codezero aims to defeat this problem and increase dependability. - -From a support perspective, most unix operating systems like BSD and Linux have -a highly saturated user base. The developers focus on these existing users and -often the systems they support are not embedded computers. Codezero will focus -completely on embedded systems, aiming to meet the support need for this type -of systems. - -Other than modern Unix kernels, there are established operating systems -targeting embedded devices. Codezero will contrast and compete with some of -them by its simplicity, some by its openness and some by its feature set, but -mostly by providing a more flexible development model. - -Finally, POSIX compliance is only a step, or a partial aim for the Codezero -microkernel. It is not limited to the goal of just complying with POSIX, which -has been done many times by other operating systems. Codezero microkernel will -provide a dependable software environment where isolated application domains -can run side-by-side in the same run-time. In addition, user-level servers MM0 -and FS0 will implement native system services and provide a POSIX-like API for -these application domains.  By supplying a variety of system software options, -the applications will be able to choose among different speed, safety, -determinism policies at the same run-time. This is expected to prove useful in -embedded systems. - -Furthermore there are new ideas in literature that would improve systems -software but aren't implemented either because they have no existing users or -may break compatibility (e.g. some are presented in Plan 9). For example file -abstractions could be used more liberally to cover data exchange and control of -devices, services and network communication. Existing kernels already have -established methods of doing such operations and they would oppose major design -overhauls, which limits their innovation capability for this kind of -experimentation. In contrast, Codezero's partitioned nature provides the -opportunity to implement innovative feature services in small and isolated -parts, without cluttering the rest of the system. As well as natively -supporting existing APIs such as POSIX, Codezero project aims to keep up with -the latest OS literature and provide the opportunity to incorporate the latest -ideas in OS technology. - - -Can you summarise? Why should I use Codezero, again? - -Codezero is an operating system that targets embedded systems with virtual -memory support. It implements modern features such as demand-paging and a -virtual filesystem layer under a POSIX-like API. Different from most other -POSIX-like systems, it is based on a microkernel design. The microkernel has -been carefully designed so that it is small and well-focused. It has a cleanly -separated set of system services that can be used as a base for implementing or -running other operating systems. It can also be used as a barebones system that -provides multitasking and thread communication. Its source code is also freely -available (See LICENSE heading for details). Codezero aims to differ from other -systems by implementing an open and modern embedded operating system that -provides more flexibility than a single operating system API. Since currently -there's a very small user base, it can be easily adopted for any custom -embedded system project that needs focused developer attention. +Other embedded open source kernels are also out there. Codezero aims to differ +by clarity, simplicity and its cutting edge features. diff --git a/tasks/blkdev0/SConstruct b/tasks/blkdev0/SConstruct deleted file mode 100644 index 273433f..0000000 --- a/tasks/blkdev0/SConstruct +++ /dev/null @@ -1,130 +0,0 @@ -# -# User space application build script -# -# Copyright (C) 2007 Bahadir Balban -# -import os -import sys -import shutil -from string import split -from os.path import join -from glob import glob - -task_name = "blkdev0" - -# The root directory of the repository where this file resides: -project_root = "../.." -tools_root = join(project_root, "tools") -prev_image = join(project_root, "tasks/mm0/mm0.axf") -libs_path = join(project_root, "libs") -ld_script = "include/linker.lds" -physical_base_ld_script = "include/physical_base.lds" - -# libc paths: -libc_variant = "userspace" -libc_libpath = join(libs_path, "c/build/%s" % libc_variant) -libc_incpath = join(libc_libpath, "include") -libc_crt0 = join(libs_path, "c/build/crt/sys-userspace/arch-arm/crt0.o") -libc_name = "c-%s" % libc_variant - -# libl4 paths: -libl4_path = "../libl4" -libl4_incpath = join(libl4_path, "include") - -#libmem paths: -libmem_path = "../libmem" -libmem_incpath = "../libmem" - -# kernel paths: -kernel_incpath = join(project_root, "include") - -# Kernel config header. -config_h = join(project_root, "include/l4/config.h") - - -# If crt0 is in its library path, it becomes hard to link with it. -# For instance the linker script must use an absolute path for it. -def copy_crt0(source, target, env): - os.system("cp " + str(source[0]) + " " + str(target[0])) - -def get_physical_base(source, target, env): - os.system(join(tools_root, "pyelf/readelf.py --first-free-page " + \ - prev_image +" >> " + physical_base_ld_script)) - -# The kernel build environment: -env = Environment(CC = 'arm-none-linux-gnueabi-gcc', - # We don't use -nostdinc because sometimes we need standard headers, - # such as stdarg.h e.g. for variable args, as in printk(). - CCFLAGS = ['-g', '-nostdlib', '-ffreestanding', '-std=gnu99', '-Wall', '-Werror'], - LINKFLAGS = ['-nostdlib', '-T' + ld_script, "-L" + libc_libpath, "-L" + libl4_path, "-L" + libmem_path], - ASFLAGS = ['-D__ASSEMBLY__'], - PROGSUFFIX = '.axf', # The suffix to use for final executable - ENV = {'PATH' : os.environ['PATH']}, # Inherit shell path - LIBS = [libc_name, 'libl4', 'libmm', 'libmc', 'libkm', \ - 'gcc', libc_name], # libgcc.a - This is required for division routines. - CPPFLAGS = "-D__USERSPACE__", - CPPPATH = ['#include', libl4_incpath, libc_incpath, kernel_incpath, libmem_incpath]) - -def extract_arch_subarch_plat(config_header): - ''' - From the autogenerated kernel config.h, extracts platform, archictecture, - subarchitecture information. This is used to include the relevant headers - from the kernel directories. - ''' - arch = None - subarch = None - plat = None - - if not os.path.exists(config_header): - print "\n\nconfig.h does not exist. "\ - "Please run: `scons configure' first\n\n" - sys.exit() - f = open(config_h, "r") - while True: - line = f.readline() - if line == "": - break - parts = split(line) - if len(parts) > 0: - if parts[0] == "#define": - if parts[1] == "__ARCH__": - arch = parts[2] - elif parts[1] == "__PLATFORM__": - plat = parts[2] - elif parts[1] == "__SUBARCH__": - subarch = parts[2] - f.close() - if arch == None: - print "Error: No config symbol found for architecture" - sys.exit() - if subarch == None: - print "Error: No config symbol found for subarchitecture" - sys.exit() - if plat == None: - print "Error: No config symbol found for platform" - sys.exit() - return arch, subarch, plat - -def create_symlinks(arch): - arch_path = "include/arch" - arch_path2 ="src/arch" - if os.path.exists(arch_path): - os.system("rm %s" % (arch_path)) - os.system("ln -s %s %s" % ("arch-" + arch, arch_path)) - if os.path.exists(arch_path2): - os.system("rm %s" % (arch_path2)) - os.system("ln -s %s %s" % ("arch-" + arch, arch_path2)) - -arch, subarch, plat = extract_arch_subarch_plat(config_h) - -create_symlinks(arch) # Creates symlinks to architecture specific directories. - -src = [glob("src/*.c"), glob("fsbin/*.S"), glob("*.c"), glob("src/arch/*.c")] -objs = env.Object(src) -physical_base = env.Command(physical_base_ld_script, prev_image, get_physical_base) -crt0_copied = env.Command("crt0.o", libc_crt0, copy_crt0) - -task = env.Program(task_name, objs + [crt0_copied]) -env.Alias(task_name, task) -env.Depends(task, physical_base) - diff --git a/tasks/blkdev0/fsbin/SConstruct b/tasks/blkdev0/fsbin/SConstruct deleted file mode 100644 index 9458c99..0000000 --- a/tasks/blkdev0/fsbin/SConstruct +++ /dev/null @@ -1,43 +0,0 @@ -# -# Binary to elf build script -# Works by including a binary in an assembler file and linking it. -# -# Copyright (C) 2007 Bahadir Balban -# -import os -import sys -import shutil -from os.path import join -from glob import glob - -elfimg_name = "romfs" - -# The root directory of the repository where this file resides: -project_root = "../.." -tools_root = join(project_root, "tools") -prev_image = join(project_root, "tasks/test0/test0.axf") -ld_script = "include/linker.lds" -physical_base_ld_script = "include/physical_base.lds" - -def get_physical_base(source, target, env): - os.system(join(tools_root, "pyelf/readelf.py --first-free-page " + \ - prev_image + " >> " + physical_base_ld_script)) - -# The kernel build environment: -env = Environment(CC = 'arm-none-linux-gnueabi-gcc', - # We don't use -nostdinc because sometimes we need standard headers, - # such as stdarg.h e.g. for variable args, as in printk(). - CCFLAGS = ['-g', '-nostdlib', '-ffreestanding', '-std=gnu99', '-Wall', '-Werror'], - LINKFLAGS = ['-nostdlib', '-T' + ld_script], - ASFLAGS = ['-D__ASSEMBLY__'], - PROGSUFFIX = '.axf', # The suffix to use for final executable - ENV = {'PATH' : os.environ['PATH']}, # Inherit shell path - CPPFLAGS = "-D__USERSPACE__", - CPPPATH = ['#include']) - -src = [glob("*.S")] -objs = env.Object(src) -physical_base = env.Command(physical_base_ld_script, prev_image, get_physical_base) -task = env.Program(elfimg_name, objs) -env.Alias(elfimg_name, task) -env.Depends(task, physical_base) diff --git a/tasks/blkdev0/fsbin/incbin.S b/tasks/blkdev0/fsbin/incbin.S deleted file mode 100644 index a8e5044..0000000 --- a/tasks/blkdev0/fsbin/incbin.S +++ /dev/null @@ -1,7 +0,0 @@ - - -/* This is used to place a binary file into an elf section */ -.section .data.fs - -.incbin "fsbin/romfs.bin" -.align 4 diff --git a/tasks/blkdev0/fsbin/romfs.bin b/tasks/blkdev0/fsbin/romfs.bin deleted file mode 100644 index a7dd1e8d8f2b32540d68b8151ca9e989bfe50d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296960 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

`l4&R16H8Zu9_`q`pX^}jCH**xjU0c=95RY~ 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�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 - -struct block_device; - -struct block_device_ops { - int (*init)(struct block_device *bdev); - int (*open)(struct block_device *bdev); - int (*read)(struct block_device *bdev, unsigned long offset, - int size, void *buf); - int (*write)(struct block_device *bdev, unsigned long offset, - int size, void *buf); - int (*read_page)(struct block_device *bdev, - unsigned long pfn, void *buf); - int (*write_page)(struct block_device *bdev, - unsigned long pfn, void *buf); -}; - -struct block_device { - char *name; - void *private; /* Low-level device specific data */ - u64 size; - struct block_device_ops ops; -}; - - -void init_blkdev(void); - -#endif /* __BLKDEV_H__ */ diff --git a/tasks/blkdev0/include/linker.lds b/tasks/blkdev0/include/linker.lds deleted file mode 100644 index c8d5734..0000000 --- a/tasks/blkdev0/include/linker.lds +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Simple linker script for userspace or svc tasks. - * - * Copyright (C) 2007 Bahadir Balban - */ - -/* - * The only catch with this linker script is that everything - * is linked starting at virtual_base, and loaded starting - * at physical_base. virtual_base is the predefined region - * of virtual memory for userland applications. physical_base - * is determined at build-time, it is one of the subsequent pages - * that come after the kernel image's load area. - */ -/* USER_AREA_START, see memlayout.h */ -virtual_base = 0x10000000; -__stack = 0x20000000; -INCLUDE "include/physical_base.lds" - -/* physical_base = 0x228000; */ -offset = virtual_base - physical_base; - -ENTRY(_start) - -SECTIONS -{ - . = virtual_base; - _start_text = .; - .text : AT (ADDR(.text) - offset) { crt0.o(.text) *(.text) } - /* rodata is needed else your strings will link at physical! */ - .rodata : AT (ADDR(.rodata) - offset) { *(.rodata) } - .rodata1 : AT (ADDR(.rodata1) - offset) { *(.rodata1) } - .data : AT (ADDR(.data) - offset) - { - . = ALIGN(4K); - _start_ramdisk0 = .; - *(.data.romfs) - _end_ramdisk0 = .; - . = ALIGN(4K); - _start_ramdisk1 = .; - *(.data.sfs) - _end_ramdisk1 = .; - *(.data) - } - .bss : AT (ADDR(.bss) - offset) { *(.bss) } - _end = .; -} diff --git a/tasks/blkdev0/include/ramdisk.h b/tasks/blkdev0/include/ramdisk.h deleted file mode 100644 index e792be3..0000000 --- a/tasks/blkdev0/include/ramdisk.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __RAMDISK_H__ -#define __RAMDISK_H__ - -extern struct block_device ramdisk[]; -extern struct block_device ramdisk[]; - -#endif diff --git a/tasks/blkdev0/main.c b/tasks/blkdev0/main.c deleted file mode 100644 index 6d60f5c..0000000 --- a/tasks/blkdev0/main.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * High-level block device handling. - * - * Copyright (C) 2007, 2008 Bahadir Balban - */ -#include -#include - -/* - * Handles block device requests from fs0 using a combination of - * server-specific and posix shm semantics - */ -void handle_block_device_request() -{ - u32 mr[MR_UNUSED_TOTAL]; - l4id_t sender; - int err; - u32 tag; - - printf("%s: Listening requests.\n", __TASKNAME__); - - if ((err = l4_receive(L4_ANYTHREAD)) < 0) { - printf("%s: %s: IPC Error: %d. Quitting...\n", __TASKNAME__, - __FUNCTION__, err); - BUG(); - } - - /* Read conventional ipc data */ - tag = l4_get_tag(); - sender = l4_get_sender(); - - /* Read mrs not used by syslib */ - for (int i = 0; i < MR_UNUSED_TOTAL; i++) - mr[i] = read_mr(i); - - switch(tag) { - case L4_IPC_TAG_WAIT: - printf("%s: Synced with waiting thread.\n", __TASKNAME__); - break; - case L4_IPC_TAG_BLOCK_OPEN: - sys_open(sender, (void *)mr[0], (int)mr[1], (u32)mr[2]); - break; - default: - printf("%s: Unrecognised ipc tag (%d)" - "received. Ignoring.\n", __TASKNAME__, mr[MR_TAG]); - } -} - -int main(void) -{ - /* Initialise the block devices */ - init_blkdev(); - - while (1) { - handle_block_device_request(); - } - return 0; -} - diff --git a/tasks/blkdev0/src/init.c b/tasks/blkdev0/src/init.c deleted file mode 100644 index f353d6a..0000000 --- a/tasks/blkdev0/src/init.c +++ /dev/null @@ -1,11 +0,0 @@ - - -#include -#include - - -void init_blkdev(void) -{ - ramdisk[0].ops.init(&ramdisk[0]); - ramdisk[1].ops.init(&ramdisk[1]); -} diff --git a/tasks/blkdev0/src/ramdisk.c b/tasks/blkdev0/src/ramdisk.c deleted file mode 100644 index 8d7a11a..0000000 --- a/tasks/blkdev0/src/ramdisk.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * A basic ramdisk implementation. - * - * Copyright (C) 2007, 2008 Bahadir Balban - * - * The ramdisk binary is embedded in the data section of the ramdisk device - * executable. Read/writes simply occur to this area. The disk area could - * have any filesystem layout e.g. romfs, which is irrelevant for this code. - */ -#include -#include -#include -#include -#include -#include -#include INC_SUBARCH(mm.h) -#include INC_GLUE(memory.h) - -/* Ramdisk section markers for ramdisk inside this executable image */ -extern char _start_ramdisk0[]; -extern char _end_ramdisk0[]; -extern char _start_ramdisk1[]; -extern char _end_ramdisk1[]; - -struct ramdisk_data { - u64 base; - u64 end; -}; - -struct ramdisk_data rddata[2]; - -__attribute__((section(".data.sfs"))) char sfsdisk[SZ_16MB]; - -int ramdisk_init(struct block_device *ramdisk) -{ - struct ramdisk_data *rddata = ramdisk->private; - - if (!strcmp("ramdisk0", ramdisk->name)) { - rddata->base = (u64)(unsigned long)_start_ramdisk0; - rddata->end = (u64)(unsigned long)_end_ramdisk0; - ramdisk->size = (u64)((unsigned long)_end_ramdisk0 - - (unsigned long)_start_ramdisk0); - } else if (!strcmp("ramdisk1", ramdisk->name)) { - rddata->base = (u64)(unsigned long)_start_ramdisk1; - rddata->end = (u64)(unsigned long)_end_ramdisk1; - ramdisk->size = (u64)((unsigned long)_end_ramdisk1 - - (unsigned long)_start_ramdisk1); - } else - return -1; - - return 0; -} - -int ramdisk_open(struct block_device *ramdisk) -{ - return 0; -} - -int ramdisk_read(struct block_device *b, unsigned long offset, int size, void *buf) -{ - struct ramdisk_data *data = b->private; - void *src = (void *)(unsigned long)(data->base + offset); - - memcpy(buf, src, size); - return 0; -} - -int ramdisk_write(struct block_device *b, unsigned long offset, - int size, void *buf) -{ - struct ramdisk_data *data = b->private; - void *dst = (void *)(unsigned long)(data->base + offset); - - memcpy(dst, buf, size); - return 0; -} - -int ramdisk_readpage(struct block_device *b, unsigned long pfn, void *buf) -{ - ramdisk_read(b, __pfn_to_addr(pfn), PAGE_SIZE, buf); - return 0; -} - -int ramdisk_writepage(struct block_device *b, unsigned long pfn, void *buf) -{ - ramdisk_write(b, __pfn_to_addr(pfn), PAGE_SIZE, buf); - return 0; -} - -struct block_device ramdisk[2] = { - [0] = { - .name = "ramdisk0", - .private = &rddata[0], - .ops = { - .init = ramdisk_init, - .open = ramdisk_open, - .read = ramdisk_read, - .write = ramdisk_write, - .read_page = ramdisk_readpage, - .write_page = ramdisk_writepage, - }, - }, - [1] = { - .name = "ramdisk1", - .private = &rddata[1], - .ops = { - .init = ramdisk_init, - .open = ramdisk_open, - .read = ramdisk_read, - .write = ramdisk_write, - .read_page = ramdisk_readpage, - .write_page = ramdisk_writepage, - }, - } -}; - diff --git a/tasks/blkdev0/tools/generate_bootdesc.py b/tasks/blkdev0/tools/generate_bootdesc.py deleted file mode 100755 index fcd8e89..0000000 --- a/tasks/blkdev0/tools/generate_bootdesc.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python -import os -import sys - -compiler_prefix = "arm-none-linux-gnueabi-" -objdump = "objdump" -command = "-t" -image_name = "inittask.axf" -linkoutput_file_suffix = "-linkinfo.txt" -linkoutput_file = image_name + linkoutput_file_suffix - -def generate_bootdesc(): - command = compiler_prefix + objdump + " -t " + image_name + " > " + linkoutput_file - print command - os.system(command) - f = open(linkoutput_file, "r") - - while True: - line = f.readline() - if len(line) is 0: - break - if "_start" in line or "_end" in line: - print line - f.close() - -if __name__ == "__main__": - generate_bootdesc() - diff --git a/tasks/sigma0/channel.c b/tasks/sigma0/channel.c deleted file mode 100644 index 68e584d..0000000 --- a/tasks/sigma0/channel.c +++ /dev/null @@ -1,18 +0,0 @@ - -struct channel { - int dir; /* Direction */ - char *name; /* Name */ - int cd; /* Channel descriptor */ -}; - - -struct interface { - struct channel chan[]; -}; - - -int main(int argc, char *argv[]) -{ - void *buf = malloc(sizeof(struct channel)*10); - struct interface *intf = buf; -} diff --git a/tasks/sigma0/main.c b/tasks/sigma0/main.c deleted file mode 100644 index a234118..0000000 --- a/tasks/sigma0/main.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Lightweight and simple RPC primitives. - * - * Copyright (c) 2007 Bahadir Balban - * - * Some methodology is needed for efficient and functional message passing - * among processes, particulary when shared memory or same address space - * messaging is available. The rpc primitives here attempt to fill this gap. - * - * The idea is to generate as little bloat as possible. To that end we don't - * need encryption, marshalling, type tracking and discovery. Also Very minor - * boilerplated code is produced from C macros rather than a notorious rpc tool. - */ -#include -#include -#include - -/* What default value arg0 is given for rpc calls */ -#define ARG0 8 -#define PAGE_SIZE 0x1000 -char pagebuf[PAGE_SIZE]; - -struct ipc_shmem { - unsigned long vaddr; -}; - -struct tlmsg { - struct ipc_shmem shmem; - unsigned long arg[3]; - unsigned long ret; - unsigned long method_num; -}; - -typedef int (*remote_call_t)(struct tlmsg *m); - -int square(int i) -{ - printf("%s: Entering...\n", __FUNCTION__); - return i*i; -} - -/* Hand coded wrapper for non-complex argument types. */ -int rpc_square(struct tlmsg *m) -{ - printf("%s: Entering...\n", __FUNCTION__); - return square(m->arg[0]); -} - -struct complex_struct { - int item; - int item2; -}; - -/* Use this to declare an RPC wrapper for your function. Your function - * must return a primitive type (e.g, int, float, long etc.) and can - * have a ref to a single argument of complex type (e.g. a struct). Apart - * from these limitations it is essentially a regular C function. Note - * that one can pass a lot of data back and forth using a single struct. - * The wrappers are very lightweight, and thanks to many possibilities of - * shared memory (e.g. same address-space, shared pages) data need not be - * copied when passed back and forth. */ -#define DECLARE_RPC_BYREF(ret, func, type0) \ -static inline ret rpc_byref_##func(struct tlmsg *m) \ -{ /* Find struct address */ \ - unsigned long multiword_struct = m->arg[0] + \ - m->shmem.vaddr; /* Data passed by a shared entity */ \ - return func((type0 *)multiword_struct); /* Call real function */\ -} - -/* Same as above, but passing a structure by value instead of reference. - * This is much slower due to lots of copying involved. It is not - * recommended but included for completion. */ -#define DECLARE_RPC_BYVAL(ret, func, type0) \ -static inline ret rpc_byval_##func(struct tlmsg *m) \ -{ /* Find struct address */ \ - unsigned long multiword_struct = m->arg[0] + \ - m->shmem.vaddr; /* Data passed by a shared entity */ \ - /* Call real function, by value */ \ - return func((type0)(*(type0 *)multiword_struct)); \ -} -/* Use these directly to declare the function, *and* its RPC wrapper. */ -#define RPC_FUNC_BYREF(ret, func, type0) \ -ret func(type0 *); \ -DECLARE_RPC_BYREF(ret, func, type0) \ -ret func(type0 *arg0) - -#define RPC_FUNC_BYVAL(ret, func, type0) \ -ret func(type0); \ -DECLARE_RPC_BYVAL(ret, func, type0) \ -ret func(type0 arg0) - -RPC_FUNC_BYVAL(int, complex_byval, struct complex_struct) -{ - printf("%s: Entering...\n", __FUNCTION__); - arg0.item++; - return 0; -} - -RPC_FUNC_BYREF(int, complex_byref, struct complex_struct) -{ - printf("%s: Entering...\n", __FUNCTION__); - arg0->item++; - return 0; -} - -#define RPC_NAME(func, by) rpc_##by##_##func -remote_call_t remote_call_array[] = { - rpc_square, - RPC_NAME(complex_byval, byval), - RPC_NAME(complex_byref, byref), -}; - -struct tlmsg *getmsg(int x) -{ - struct tlmsg *m = (struct tlmsg *)malloc(sizeof(struct tlmsg)); - m->method_num = x; - m->arg[0] = ARG0; - m->shmem.vaddr = (unsigned long)&pagebuf; - return m; -} - -void putmsg(struct tlmsg *m) -{ - free((void *)m); -} - -void check_rpc_success() -{ - struct complex_struct *cs = (struct complex_struct *)(pagebuf + ARG0); - - printf("complex struct at offset 0x%x. cs->item: %d, expected: 1.\n", ARG0, cs->item); -} - -int main(void) -{ - struct tlmsg *m[3]; - unsigned int ret; - remote_call_t call[3]; - memset((void *)pagebuf, 0, PAGE_SIZE); - for (int i = 0; i < 3; i++) { - m[i] = getmsg(i); - printf("Calling remote function %d according to incoming msg.\n", i); - call[i] = remote_call_array[m[i]->method_num]; - ret = call[i](m[i]); /* i.e. call rpc function number i, with - * message number i as argument */ - printf("Call returned %d\n", ret); - m[i]->ret = ret; - putmsg(m[i]); - } - check_rpc_success(); -} - - - diff --git a/tasks/sigma0/rpc b/tasks/sigma0/rpc deleted file mode 100755 index de1e31d4e0ad817c55fac980b3a970ea8700b24f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8337 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 z