From 4a549ead416c994d874f62d88901c6223fd1e5b8 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Tue, 29 Dec 2015 02:22:41 +0100 Subject: [PATCH] add first draft of HermitCore as libOS --- hermit/Makefile | 85 +++++++++-------- hermit/Makefile.inc | 2 +- hermit/arch/x86/kernel/entry.asm | 10 +- hermit/arch/x86/kernel/isrs.c | 2 +- hermit/arch/x86/kernel/tasks.c | 2 +- hermit/arch/x86/mm/page.c | 2 +- hermit/include/hermit/config.h | 1 + hermit/include/hermit/stdlib.h | 2 +- hermit/include/hermit/tasks.h | 2 +- hermit/include/hermit/tasks_types.h | 2 - hermit/kernel/main.c | 137 ++++++++++++++++++++-------- hermit/kernel/syscall.c | 137 ++++++++++++++-------------- hermit/kernel/tasks.c | 8 +- hermit/libkern/stdio.c | 2 +- hermit/lwip | 2 +- hermit/tools/Makefile | 3 +- hermit/tools/create_proxy.sh | 2 +- hermit/tools/proxy.c | 79 ++++++++++++---- hermit/usr/Makefile | 6 +- hermit/usr/binutils | 2 +- hermit/usr/gcc | 2 +- hermit/usr/newlib | 2 +- hermit/usr/tests/Makefile | 25 ++++- 23 files changed, 327 insertions(+), 190 deletions(-) diff --git a/hermit/Makefile b/hermit/Makefile index c9b9bb78b..529b89073 100644 --- a/hermit/Makefile +++ b/hermit/Makefile @@ -1,54 +1,46 @@ TERM = xterm TOPDIR := $(shell pwd) ARCH = x86 -NAME = hermit -LWIPDIRS = lwip/src/arch lwip/src/api lwip/src/core lwip/src/core/ipv4 lwip/src/netif +NAME = libhermit.a DRIVERDIRS = drivers/net -KERNDIRS = kernel mm libkern arch/$(ARCH)/kernel arch/$(ARCH)/mm $(LWIPDIRS) $(DRIVERDIRS) +KERNDIRS = kernel mm libkern arch/$(ARCH)/kernel arch/$(ARCH)/mm $(DRIVERDIRS) SUBDIRS = $(KERNDIRS) GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags) TODAY := $(shell date +'%Y%m%d') INITRAMFS=../../busybox-1.23.2/initramfs/ # Set your own cross compiler tool chain prefix here -CROSSCOMPREFIX = x86_64-hermit- +CROSSCOMPREFIX = x86_64-hermit STACKPROT = -fno-stack-protector -FC_FOR_TARGET = $(CROSSCOMPREFIX)gfortran -CC_FOR_TARGET = $(CROSSCOMPREFIX)gcc -CXX_FOR_TARGET = $(CROSSCOMPREFIX)g++ -GCC_FOR_TARGET = $(CROSSCOMPREFIX)gcc -CPP_FOR_TARGET = $(CROSSCOMPREFIX)cpp -AR_FOR_TARGET = $(CROSSCOMPREFIX)ar -AS_FOR_TARGET = $(CROSSCOMPREFIX)as -LD_FOR_TARGET = $(CROSSCOMPREFIX)ld -NM_FOR_TARGET = $(CROSSCOMPREFIX)nm -OBJDUMP_FOR_TARGET = $(CROSSCOMPREFIX)objdump -OBJCOPY_FOR_TARGET = $(CROSSCOMPREFIX)objcopy -RANLIB_FOR_TARGET = $(CROSSCOMPREFIX)ranlib -STRIP_FOR_TARGET = $(CROSSCOMPREFIX)strip -READELF_FOR_TARGET = $(CROSSCOMPREFIX)readelf +FC_FOR_TARGET = $(CROSSCOMPREFIX)-gfortran +CC_FOR_TARGET = $(CROSSCOMPREFIX)-gcc +CXX_FOR_TARGET = $(CROSSCOMPREFIX)-g++ +GCC_FOR_TARGET = $(CROSSCOMPREFIX)-gcc +CPP_FOR_TARGET = $(CROSSCOMPREFIX)-cpp +AR_FOR_TARGET = $(CROSSCOMPREFIX)-ar +AS_FOR_TARGET = $(CROSSCOMPREFIX)-as +LD_FOR_TARGET = $(CROSSCOMPREFIX)-ld +NM_FOR_TARGET = $(CROSSCOMPREFIX)-nm +OBJDUMP_FOR_TARGET = $(CROSSCOMPREFIX)-objdump +OBJCOPY_FOR_TARGET = $(CROSSCOMPREFIX)-objcopy +RANLIB_FOR_TARGET = $(CROSSCOMPREFIX)-ranlib +STRIP_FOR_TARGET = $(CROSSCOMPREFIX)-strip +READELF_FOR_TARGET = $(CROSSCOMPREFIX)-readelf MAKE = make NASM = nasm NASMFLAGS = -felf64 -g -i$(TOPDIR)/include/hermit/ INCLUDE = -I$(TOPDIR)/include -I$(TOPDIR)/arch/$(ARCH)/include -I$(TOPDIR)/lwip/src/include -I$(TOPDIR)/lwip/src/include/ipv4 -I$(TOPDIR)/drivers -# Compiler options for final code -CFLAGS = -DVERSION=\"$(GIT_VERSION)\" -D_HERMIT -g -m64 -Wall -O2 -mno-red-zone -fno-var-tracking-assignments -fstrength-reduce -fomit-frame-pointer -finline-functions -ffreestanding -nostdinc -fno-stack-protector $(INCLUDE) -# Compiler options for debugging -debug debug-eclipse : CFLAGS = -DVERSION=\"$(GIT_VERSION)\" -D_HERMIT -g -O0 -m64 -Wall -fno-builtin -DWITH_FRAME_POINTER -nostdinc -mno-red-zone -fno-stack-protector $(INCLUDE) +CFLAGS = -DVERSION=\"$(GIT_VERSION)\" -g -m64 -Wall -O2 -mno-red-zone -fno-var-tracking-assignments -fstrength-reduce -fomit-frame-pointer -finline-functions -ffreestanding -nostdinc -fno-stack-protector $(INCLUDE) AR = ar ARFLAGS = rsv RM = rm -rf -LDFLAGS = -T link.ld -z max-page-size=4096 --defsym __BUILD_DATE=$(TODAY) -nostdlib -STRIP_DEBUG = --strip-debug -KEEP_DEBUG = --only-keep-debug -OUTPUT_FORMAT = -O elf32-i386 -CFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -ftls-model=initial-exec -O3 -mavx2 -mfma -mtune=intel #$(STACKPROT) -FFLAGS_FOR_NEWLIB = -O3 -CXXFLAGS_FOR_NEWLIB = +CFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -ftls-model=initial-exec -mno-red-zone -O3 -mavx2 -mfma -mtune=intel $(STACKPROT) +FFLAGS_FOR_NEWLIB = -O3 -mavx2 -mfma -mtune=intel +CXXFLAGS_FOR_NEWLIB = $(CFLAGS_FOR_NEWLIB) LDFLAGS_FOR_NEWLIB = NASMFLAGS_FOR_NEWLIB = -felf64 CFLAGS_FOR_TOOLS = -O2 -Wall @@ -64,9 +56,28 @@ endif default: all -all: bootstrap toolchain tools $(NAME).elf +all: bootstrap $(NAME) toolchain tools toolchain: + $Q$(MAKE) ARCH=$(ARCH) \ + LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_NEWLIB)" \ + CFLAGS_FOR_TARGET="$(CFLAGS_FOR_NEWLIB)" \ + FFLAGS_FOR_TARGET="$(FFLAGS_FOR_NEWLIB)" \ + CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_NEWLIB)" \ + NASMFLAGS="$(NASMFLAGS_FOR_NEWLIB)" \ + CC_FOR_TARGET=$(CC_FOR_TARGET) \ + FC_FOR_TARGET=$(FC_FOR_TARGET) \ + CXX_FOR_TARGET=$(CXX_FOR_TARGET) \ + GCC_FOR_TARGET=$(GCC_FOR_TARGET) \ + AR_FOR_TARGET=$(AR_FOR_TARGET) \ + AS_FOR_TARGET=$(AS_FOR_TARGET) \ + LD_FOR_TARGET=$(LD_FOR_TARGET) \ + NM_FOR_TARGET=$(NM_FOR_TARGET) \ + OBJDUMP_FOR_TARGET=$(OBJDUMP_FOR_TARGET) \ + OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) \ + RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET) \ + STRIP_FOR_TARGET=$(STRIP_FOR_TARGET) \ + READELF_FOR_TARGET=$(READELF_FOR_TARGET) -C lwip all $Q$(MAKE) ARCH=$(ARCH) \ LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_NEWLIB)" \ CFLAGS_FOR_TARGET="$(CFLAGS_FOR_NEWLIB)" \ @@ -86,6 +97,7 @@ toolchain: RANLIB_FOR_TARGET=$(RANLIB_FOR_TARGET) \ STRIP_FOR_TARGET=$(STRIP_FOR_TARGET) \ READELF_FOR_TARGET=$(READELF_FOR_TARGET) -C usr toolchain + #$Qcp -R lwip/src/include/lwip* usr/$(ARCH)/$(CROSSCOMPREFIX)/include bootstrap: $Q$(MAKE) ARCH=$(ARCH) CFLAGS="" LDFLAGS="" -C usr bootstrap @@ -93,20 +105,21 @@ bootstrap: tools: $Q$(MAKE) ARCH=$(ARCH) CFLAGS="$(CFLAGS_FOR_TOOLS)" LDFLAGS="$(LDFLAGS_FOR_TOOLS)" -C tools -$(NAME).elf: - @echo [LD] $(NAME).elf - $Q$(LD_FOR_TARGET) $(LDFLAGS) -o $(NAME).elf $^ - @echo [OBJCOPY] $(NAME).bin - $Q$(OBJCOPY_FOR_TARGET) -j .mboot -j .kmsg -j .initrd -j .text -j .text.startup -j .data -j .rodata -j .bss -O binary $(NAME).elf $(NAME).bin +$(NAME): + @echo [AR] $(NAME) + $Q$(AR_FOR_TARGET) $(ARFLAGS) -o $(NAME) $^ + $Q$(OBJCOPY_FOR_TARGET) --rename-section .bss=.kbss --rename-section .text=.ktext --rename-section .data=.kdata $(NAME) $(TOPDIR)/usr/$(ARCH)/$(CROSSCOMPREFIX)/lib/$(NAME) clean: - $Q$(RM) $(NAME).elf $(NAME).sym $(NAME).bin *~ + $Q$(RM) $(NAME) $(NAME).sym $(NAME).bin *~ + $Q$(MAKE) -C lwip clean $Q$(MAKE) -C tools clean $Q$(MAKE) -C usr clean @echo Cleaned. veryclean: clean $Q$(RM) qemu-vlan0.pcap include/hermit/config.inc + $Q$(MAKE) -C lwip veryclean $Q$(MAKE) -C tools veryclean $Q$(MAKE) -C usr veryclean @echo Very cleaned diff --git a/hermit/Makefile.inc b/hermit/Makefile.inc index 743cacc25..c0e214dc9 100644 --- a/hermit/Makefile.inc +++ b/hermit/Makefile.inc @@ -8,7 +8,7 @@ OBJS-$(MODULE) += $(ASM_source-$(MODULE):.asm=.o) $(MODULE): $(OBJS-$(MODULE)) -$(NAME).elf: $(OBJS-$(MODULE)) +$(NAME): $(OBJS-$(MODULE)) clean: clean-$(MODULE) clean-$(MODULE): clean-% : diff --git a/hermit/arch/x86/kernel/entry.asm b/hermit/arch/x86/kernel/entry.asm index f1ab648c1..5b5a8a275 100644 --- a/hermit/arch/x86/kernel/entry.asm +++ b/hermit/arch/x86/kernel/entry.asm @@ -43,8 +43,8 @@ MSR_KERNEL_GS_BASE equ 0xc0000102 ; We use a special name to map this section at the begin of our kernel ; => Multiboot expects its magic number at the beginning of the kernel. SECTION .mboot -global start -start: +global _start +_start: jmp start64 align 4 @@ -101,7 +101,7 @@ boot_pgd: boot_pgt: times 512 DQ 0 -SECTION .text +SECTION .ktext align 4 start64: ; reset registers to kill any stale realmode selectors @@ -198,8 +198,8 @@ L1: mov rbp, rsp ; jump to the boot processors's C code - extern main - call main + extern hermit_main + call hermit_main jmp $ %if MAX_CORES > 1 diff --git a/hermit/arch/x86/kernel/isrs.c b/hermit/arch/x86/kernel/isrs.c index 7d6fa78ba..42673c248 100644 --- a/hermit/arch/x86/kernel/isrs.c +++ b/hermit/arch/x86/kernel/isrs.c @@ -215,5 +215,5 @@ static void fault_handler(struct state *s) apic_eoi(s->int_no); irq_enable(); - abort(); + do_abort(); } diff --git a/hermit/arch/x86/kernel/tasks.c b/hermit/arch/x86/kernel/tasks.c index b833ddec0..fd1e9d534 100644 --- a/hermit/arch/x86/kernel/tasks.c +++ b/hermit/arch/x86/kernel/tasks.c @@ -242,7 +242,7 @@ static int load_task(load_args_t* largs) if (!largs->executable || (largs->sd < 0)) return -EINVAL; - curr_task->sd = largs->sd; + //curr_task->sd = largs->sd; memcpy(&header, largs->executable, sizeof(elf_header_t)); if (BUILTIN_EXPECT(header.ident.magic != ELF_MAGIC, 0)) diff --git a/hermit/arch/x86/mm/page.c b/hermit/arch/x86/mm/page.c index ccd427517..41ea16c6f 100644 --- a/hermit/arch/x86/mm/page.c +++ b/hermit/arch/x86/mm/page.c @@ -326,7 +326,7 @@ default_handler: apic_eoi(s->int_no); irq_enable(); - abort(); + do_abort(); } int page_init(void) diff --git a/hermit/include/hermit/config.h b/hermit/include/hermit/config.h index 6c9a74fc2..38bd9079b 100644 --- a/hermit/include/hermit/config.h +++ b/hermit/include/hermit/config.h @@ -49,6 +49,7 @@ extern "C" { #define BYTE_ORDER LITTLE_ENDIAN +#define LIBOS #define DYNAMIC_TICKS #define BUILTIN_EXPECT(exp, b) __builtin_expect((exp), (b)) diff --git a/hermit/include/hermit/stdlib.h b/hermit/include/hermit/stdlib.h index 0381e112b..d7160f6fe 100644 --- a/hermit/include/hermit/stdlib.h +++ b/hermit/include/hermit/stdlib.h @@ -44,7 +44,7 @@ extern "C" { #endif -void NORETURN abort(void); +void NORETURN do_abort(void); /** @brief General page allocator function * diff --git a/hermit/include/hermit/tasks.h b/hermit/include/hermit/tasks.h index 9543bb2b6..05191bdcd 100644 --- a/hermit/include/hermit/tasks.h +++ b/hermit/include/hermit/tasks.h @@ -212,7 +212,7 @@ int set_timer(uint64_t deadline); void check_timers(void); /** @brief Abort current task */ -void NORETURN abort(void); +void NORETURN do_abort(void); /** @brief This function shall be called by leaving kernel-level tasks */ void NORETURN leave_kernel_task(void); diff --git a/hermit/include/hermit/tasks_types.h b/hermit/include/hermit/tasks_types.h index 19105a19a..0239b15b5 100644 --- a/hermit/include/hermit/tasks_types.h +++ b/hermit/include/hermit/tasks_types.h @@ -112,8 +112,6 @@ typedef struct task { size_t tls_mem_size; /// TLS file size size_t tls_file_size; - /// Socket descriptor to the proxy - int sd; /// LwIP error code int lwip_err; /// FPU state diff --git a/hermit/kernel/main.c b/hermit/kernel/main.c index b2a29df0f..588251ae0 100644 --- a/hermit/kernel/main.c +++ b/hermit/kernel/main.c @@ -66,8 +66,8 @@ volatile int8_t shutdown = 0; */ extern const void kernel_start; extern const void kernel_end; -extern const void bss_start; -extern const void bss_end; +extern const void kbss_start; +extern const void kbss_end; extern const void percore_start; extern const void percore_end0; extern const void percore_end; @@ -82,6 +82,7 @@ extern atomic_int32_t cpu_online; extern atomic_int32_t possible_cpus; extern int32_t isle; extern int32_t possible_isles; +extern int libc_sd; islelock_t* rcce_lock = NULL; rcce_mpb_t* rcce_mpb = NULL; @@ -106,7 +107,7 @@ static int hermit_init(void) size_t sz = (size_t) &percore_end0 - (size_t) &percore_start; // initialize .bss section - memset((void*)&bss_start, 0x00, ((size_t) &bss_end - (size_t) &bss_start)); + memset((void*)&kbss_start, 0x00, ((size_t) &kbss_end - (size_t) &kbss_start)); // initialize .percore section => copy first section to all other sections for(i=1; i creates all other tasks an initialize the LwIP static int initd(void* arg) { - int s, c, len, err; - int32_t magic; + int s = -1, c = -1; + int i, j, flag = 1; + int len, err; + int magic; struct sockaddr_in server, client; + task_t* curr_task = per_core(current_task); + size_t heap = 0x8000000; + int argc; + char** argv = NULL; + + // setup heap + if (!curr_task->heap) + curr_task->heap = (vma_t*) kmalloc(sizeof(vma_t)); + + if (BUILTIN_EXPECT(!curr_task->heap, 0)) { + kprintf("load_task: heap is missing!\n"); + return -ENOMEM; + } + + curr_task->heap->flags = VMA_HEAP|VMA_USER; + curr_task->heap->start = PAGE_FLOOR(heap); + curr_task->heap->end = PAGE_FLOOR(heap); //create_kernel_task(NULL, foo, "foo1", NORMAL_PRIO); //create_kernel_task(NULL, foo, "foo2", NORMAL_PRIO); init_netifs(); - init_rcce(); + + //init_rcce(); s = socket(PF_INET , SOCK_STREAM , 0); if (s < 0) { @@ -276,51 +299,91 @@ static int initd(void* arg) } len = sizeof(struct sockaddr_in); - while(!shutdown) + + kputs("TCP server listening.\n"); + + if ((c = accept(s, (struct sockaddr *)&client, (socklen_t*)&len)) < 0) { - int flag = 1; - - kputs("TCP server listening.\n"); - - if ((c = accept(s, (struct sockaddr *)&client, (socklen_t*)&len)) < 0) - { - kprintf("accept faild: %d\n", errno); - closesocket(s); - return -1; - } - - kputs("Establish IP connection\n"); - - setsockopt(c, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize)); - setsockopt(c, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize)); - setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); - - read(c, &magic, sizeof(int32_t)); - if (magic != HEMRIT_MAGIC) - { - kprintf("Invalid magic number %d\n", magic); - closesocket(c); - continue; - } - - create_user_task_form_socket(NULL, c, NORMAL_PRIO); + kprintf("accept faild: %d\n", errno); + closesocket(s); + return -1; } - closesocket(s); + kputs("Establish IP connection\n"); - network_shutdown(); + setsockopt(c, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize)); + setsockopt(c, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize)); + setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); + + read(c, &magic, sizeof(magic)); + if (magic != HEMRIT_MAGIC) + { + kprintf("Invalid magic number %d\n", magic); + closesocket(c); + return -1; + } + + err = read(c, &argc, sizeof(argc)); + if (err != sizeof(argc)) + goto out; + + argv = kmalloc((argc+1)*sizeof(char*)); + if (!argv) + goto out; + memset(argv, 0x00, (argc+1)*sizeof(char*)); + + for(i=0; i 0) + closesocket(c); + libc_sd = -1; + + if (s > 0) + closesocket(s); + + //network_shutdown(); return 0; } -int main(void) +int hermit_main(void) { hermit_init(); system_calibration(); // enables also interrupts atomic_int32_inc(&cpu_online); - kprintf("This is Hermit %s, build date %u\n", VERSION, &__BUILD_DATE); + kprintf("This is Hermit %s, build date %u\n", VERSION, &__DATE__); kprintf("Isle %d of %d possible isles\n", isle, possible_isles); kprintf("Kernel starts at %p and ends at %p\n", &kernel_start, &kernel_end); kprintf("Per core data starts at %p and ends at %p\n", &percore_start, &percore_end); diff --git a/hermit/kernel/syscall.c b/hermit/kernel/syscall.c index c20245077..ef08bf14c 100644 --- a/hermit/kernel/syscall.c +++ b/hermit/kernel/syscall.c @@ -45,15 +45,16 @@ static spinlock_t lwip_lock = SPINLOCK_INIT; extern int32_t isle; extern int32_t possible_isles; +extern int libc_sd; -static tid_t sys_getpid(void) +tid_t sys_getpid(void) { task_t* task = per_core(current_task); return task->id; } -static int sys_getprio(void) +int sys_getprio(void) { task_t* task = per_core(current_task); @@ -75,17 +76,16 @@ typedef struct { /** @brief To be called by the systemcall to exit tasks */ void NORETURN sys_exit(int arg) { - task_t* task = per_core(current_task); sys_exit_t sysargs = {__NR_exit, arg}; - if (task->sd >= 0) + if (libc_sd >= 0) { spinlock_lock(&lwip_lock); - write(task->sd, &sysargs, sizeof(sysargs)); + write(libc_sd, &sysargs, sizeof(sysargs)); spinlock_unlock(&lwip_lock); - closesocket(task->sd); - task->sd = -1; + closesocket(libc_sd); + libc_sd = -1; } do_exit(arg); @@ -97,26 +97,25 @@ typedef struct { size_t len; } __attribute__((packed)) sys_read_t; -static ssize_t sys_read(int fd, char* buf, size_t len) +ssize_t sys_read(int fd, char* buf, size_t len) { - task_t* task = per_core(current_task); sys_read_t sysargs = {__NR_read, fd, len}; ssize_t j, ret; - if (task->sd < 0) + if (libc_sd < 0) return -ENOSYS; spinlock_lock(&lwip_lock); - write(task->sd, &sysargs, sizeof(sysargs)); + write(libc_sd, &sysargs, sizeof(sysargs)); - read(task->sd, &j, sizeof(j)); + read(libc_sd, &j, sizeof(j)); if (j > 0) { ssize_t i = 0; while(i < j) { - ret = read(task->sd, buf+i, j-i); + ret = read(libc_sd, buf+i, j-i); if (ret < 0) { spinlock_unlock(&lwip_lock); return ret; @@ -137,9 +136,8 @@ typedef struct { size_t len; } __attribute__((packed)) sys_write_t; -static ssize_t sys_write(int fd, const char* buf, size_t len) +ssize_t sys_write(int fd, const char* buf, size_t len) { - task_t* task = per_core(current_task); ssize_t i, ret; int flag; sys_write_t sysargs = {__NR_write, fd, len}; @@ -147,7 +145,7 @@ static ssize_t sys_write(int fd, const char* buf, size_t len) if (BUILTIN_EXPECT(!buf, 0)) return -1; - if (task->sd < 0) + if (libc_sd < 0) { for(i=0; isd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); + setsockopt(libc_sd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); - write(task->sd, &sysargs, sizeof(sysargs)); + write(libc_sd, &sysargs, sizeof(sysargs)); i=0; while(i < len) { - ret = write(task->sd, (char*)buf+i, len-i); + ret = write(libc_sd, (char*)buf+i, len-i); if (ret < 0) { spinlock_unlock(&lwip_lock); return ret; @@ -175,10 +173,10 @@ static ssize_t sys_write(int fd, const char* buf, size_t len) } flag = 1; - setsockopt(task->sd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); + setsockopt(libc_sd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag)); if (fd > 2) { - ret = read(task->sd, &i, sizeof(i)); + ret = read(libc_sd, &i, sizeof(i)); if (ret < 0) i = ret; } else i = len; @@ -188,7 +186,7 @@ static ssize_t sys_write(int fd, const char* buf, size_t len) return i; } -static ssize_t sys_sbrk(int incr) +ssize_t sys_sbrk(int incr) { task_t* task = per_core(current_task); vma_t* heap = task->heap; @@ -198,7 +196,7 @@ static ssize_t sys_sbrk(int incr) if (BUILTIN_EXPECT(!heap, 0)) { kprintf("sys_sbrk: missing heap!\n"); - abort(); + do_abort(); } ret = heap->end; @@ -214,13 +212,12 @@ static ssize_t sys_sbrk(int incr) return ret; } -static int sys_open(const char* name, int flags, int mode) +int sys_open(const char* name, int flags, int mode) { - task_t* task = per_core(current_task); int i, ret, sysnr = __NR_open; size_t len; - if (task->sd < 0) + if (libc_sd < 0) return 0; len = strlen(name)+1; @@ -228,37 +225,37 @@ static int sys_open(const char* name, int flags, int mode) spinlock_lock(&lwip_lock); i = 0; - setsockopt(task->sd, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); + setsockopt(libc_sd, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); - ret = write(task->sd, &sysnr, sizeof(sysnr)); + ret = write(libc_sd, &sysnr, sizeof(sysnr)); if (ret < 0) goto out; - ret = write(task->sd, &len, sizeof(len)); + ret = write(libc_sd, &len, sizeof(len)); if (ret < 0) goto out; i=0; while(isd, name+i, len-i); + ret = write(libc_sd, name+i, len-i); if (ret < 0) goto out; i += ret; } - ret = write(task->sd, &flags, sizeof(flags)); + ret = write(libc_sd, &flags, sizeof(flags)); if (ret < 0) goto out; - ret = write(task->sd, &mode, sizeof(mode)); + ret = write(libc_sd, &mode, sizeof(mode)); if (ret < 0) goto out; i = 1; - setsockopt(task->sd, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); + setsockopt(libc_sd, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); - read(task->sd, &ret, sizeof(ret)); + read(libc_sd, &ret, sizeof(ret)); out: spinlock_unlock(&lwip_lock); @@ -271,21 +268,20 @@ typedef struct { int fd; } __attribute__((packed)) sys_close_t; -static int sys_close(int fd) +int sys_close(int fd) { int ret; - task_t* task = per_core(current_task); sys_close_t sysargs = {__NR_close, fd}; - if (task->sd < 0) + if (libc_sd < 0) return 0; spinlock_lock(&lwip_lock); - ret = write(task->sd, &sysargs, sizeof(sysargs)); + ret = write(libc_sd, &sysargs, sizeof(sysargs)); if (ret != sizeof(sysargs)) goto out; - read(task->sd, &ret, sizeof(ret)); + read(libc_sd, &ret, sizeof(ret)); out: spinlock_unlock(&lwip_lock); @@ -293,14 +289,17 @@ out: return ret; } -static int sys_msleep(unsigned int msec) +int sys_msleep(unsigned int ms) { - timer_wait((msec*TIMER_FREQ)/1000); + if (ms * TIMER_FREQ / 1000 > 0) + timer_wait(ms * TIMER_FREQ / 1000); + else if (ms > 0) + udelay(ms * 1000); return 0; } -static int sys_sem_init(sem_t** sem, unsigned int value) +int sys_sem_init(sem_t** sem, unsigned int value) { int ret; @@ -320,7 +319,7 @@ static int sys_sem_init(sem_t** sem, unsigned int value) return ret; } -static int sys_sem_destroy(sem_t* sem) +int sys_sem_destroy(sem_t* sem) { int ret; @@ -334,7 +333,7 @@ static int sys_sem_destroy(sem_t* sem) return ret; } -static int sys_sem_wait(sem_t* sem) +int sys_sem_wait(sem_t* sem) { if (BUILTIN_EXPECT(!sem, 0)) return -EINVAL; @@ -342,7 +341,7 @@ static int sys_sem_wait(sem_t* sem) return sem_wait(sem, 0); } -static int sys_sem_post(sem_t* sem) +int sys_sem_post(sem_t* sem) { if (BUILTIN_EXPECT(!sem, 0)) return -EINVAL; @@ -350,7 +349,7 @@ static int sys_sem_post(sem_t* sem) return sem_post(sem); } -static int sys_sem_timedwait(sem_t *sem, unsigned int ms) +int sys_sem_timedwait(sem_t *sem, unsigned int ms) { if (BUILTIN_EXPECT(!sem, 0)) return -EINVAL; @@ -358,7 +357,7 @@ static int sys_sem_timedwait(sem_t *sem, unsigned int ms) return sem_wait(sem, ms); } -static int sys_clone(tid_t* id, void* ep, void* argv) +int sys_clone(tid_t* id, void* ep, void* argv) { return clone_task(id, ep, argv, per_core(current_task)->prio); } @@ -370,19 +369,18 @@ typedef struct { int whence; } __attribute__((packed)) sys_lseek_t; -static off_t sys_lseek(int fd, off_t offset, int whence) +off_t sys_lseek(int fd, off_t offset, int whence) { off_t off; - task_t* task = per_core(current_task); sys_lseek_t sysargs = {__NR_lseek, fd, offset, whence}; - if (task->sd < 0) + if (libc_sd < 0) return -ENOSYS; spinlock_lock(&lwip_lock); - write(task->sd, &sysargs, sizeof(sysargs)); - read(task->sd, &off, sizeof(off)); + write(libc_sd, &sysargs, sizeof(sysargs)); + read(libc_sd, &off, sizeof(off)); spinlock_unlock(&lwip_lock); @@ -527,11 +525,16 @@ out: return ret; } -static size_t sys_get_ticks(void) +size_t sys_get_ticks(void) { return get_clock_tick(); } +int sys_stat(const char* file, /*struct stat *st*/ void* st) +{ + return -ENOSYS; +} + static int default_handler(void) { #if 0 @@ -546,14 +549,14 @@ static int default_handler(void) } size_t syscall_table[] = { - (size_t) sys_exit, /* __NR_exit */ - (size_t) sys_write, /* __NR_write */ - (size_t) sys_open, /* __NR_open */ - (size_t) sys_close, /* __NR_close */ - (size_t) sys_read, /* __NR_read */ + (size_t) sys_exit, /* __NR_exit */ + (size_t) sys_write, /* __NR_write */ + (size_t) sys_open, /* __NR_open */ + (size_t) sys_close, /* __NR_close */ + (size_t) sys_read, /* __NR_read */ (size_t) sys_lseek, /* __NR_lseek */ - (size_t) default_handler, /* __NR_unlink */ - (size_t) sys_getpid, /* __NR_getpid */ + (size_t) default_handler, /* __NR_unlink */ + (size_t) sys_getpid, /* __NR_getpid */ (size_t) default_handler, /* __NR_kill */ (size_t) default_handler, /* __NR_fstat */ (size_t) sys_sbrk, /* __NR_sbrk */ @@ -571,7 +574,7 @@ size_t syscall_table[] = { (size_t) default_handler, /* __NR_socket */ (size_t) default_handler, /* __NR_getsockopt */ (size_t) default_handler, /* __NR_setsockopt */ - (size_t) default_handler, /* __NR_gethostbyname */ + (size_t) default_handler, /* __NR_gethostbyname */ (size_t) default_handler, /* __NR_sendto */ (size_t) default_handler, /* __NR_recvfrom */ (size_t) default_handler, /* __NR_select */ @@ -580,17 +583,17 @@ size_t syscall_table[] = { (size_t) default_handler, /* __NR_dup2 */ (size_t) sys_msleep, /* __NR_msleep */ (size_t) sys_yield, /* __NR_yield */ - (size_t) sys_sem_init, /* __NR_sem_init */ - (size_t) sys_sem_destroy, /* __NR_sem_destroy */ - (size_t) sys_sem_wait, /* __NR_sem_wait */ - (size_t) sys_sem_post, /* __NR_sem_post */ - (size_t) sys_sem_timedwait, /* __NR_sem_timedwait */ + (size_t) sys_sem_init, /* __NR_sem_init */ + (size_t) sys_sem_destroy, /* __NR_sem_destroy */ + (size_t) sys_sem_wait, /* __NR_sem_wait */ + (size_t) sys_sem_post, /* __NR_sem_post */ + (size_t) sys_sem_timedwait, /* __NR_sem_timedwait */ (size_t) sys_getprio, /* __NR_getprio */ (size_t) default_handler, /* __NR_setprio */ (size_t) sys_clone, /* __NR_clone */ (size_t) sys_sem_timedwait, /* __NR_sem_cancelablewait */ (size_t) sys_get_ticks, /* __NR_get_ticks */ (size_t) sys_rcce_init, /* __NR_rcce_init */ - (size_t) sys_rcce_fini, /* __NR_rcce_fini */ + (size_t) sys_rcce_fini, /* __NR_rcce_fini */ (size_t) sys_rcce_malloc /* __NR_rcce_malloc */ }; diff --git a/hermit/kernel/tasks.c b/hermit/kernel/tasks.c index 01a47a6db..1feafb3c6 100644 --- a/hermit/kernel/tasks.c +++ b/hermit/kernel/tasks.c @@ -42,8 +42,8 @@ * A task's id will be its position in this array. */ static task_t task_table[MAX_TASKS] = { \ - [0] = {0, TASK_IDLE, 0, NULL, NULL, TASK_DEFAULT_FLAGS, 0, 0, 0, SPINLOCK_IRQSAVE_INIT, SPINLOCK_INIT, NULL, 0, NULL, NULL, 0, NULL, NULL, 0, 0, 0, -1, 0}, \ - [1 ... MAX_TASKS-1] = {0, TASK_INVALID, 0, NULL, NULL, TASK_DEFAULT_FLAGS, 0, 0, 0, SPINLOCK_IRQSAVE_INIT, SPINLOCK_INIT, NULL, 0, NULL, NULL, 0, NULL, NULL, 0, 0, 0, -1, 0}}; + [0] = {0, TASK_IDLE, 0, NULL, NULL, TASK_DEFAULT_FLAGS, 0, 0, 0, SPINLOCK_IRQSAVE_INIT, SPINLOCK_INIT, NULL, 0, NULL, NULL, 0, NULL, NULL, 0, 0, 0, 0}, \ + [1 ... MAX_TASKS-1] = {0, TASK_INVALID, 0, NULL, NULL, TASK_DEFAULT_FLAGS, 0, 0, 0, SPINLOCK_IRQSAVE_INIT, SPINLOCK_INIT, NULL, 0, NULL, NULL, 0, NULL, NULL, 0, 0, 0, 0}}; static spinlock_irqsave_t table_lock = SPINLOCK_IRQSAVE_INIT; @@ -257,7 +257,7 @@ void NORETURN leave_kernel_task(void) { } /** @brief Aborting a task is like exiting it with result -1 */ -void NORETURN abort(void) { +void NORETURN do_abort(void) { do_exit(-1); } @@ -326,7 +326,6 @@ int clone_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio) task_table[i].tls_addr = curr_task->tls_addr; task_table[i].tls_mem_size = curr_task->tls_mem_size; task_table[i].tls_file_size = curr_task->tls_file_size; - task_table[i].sd = task_table[i].sd; task_table[i].lwip_err = 0; task_table[i].user_usage = curr_task->user_usage; task_table[i].page_map = curr_task->page_map; @@ -414,7 +413,6 @@ int create_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio, uint32_t c task_table[i].tls_addr = 0; task_table[i].tls_mem_size = 0; task_table[i].tls_file_size = 0; - task_table[i].sd = -1; task_table[i].lwip_err = 0; spinlock_irqsave_init(&task_table[i].page_lock); diff --git a/hermit/libkern/stdio.c b/hermit/libkern/stdio.c index 9cdf7defb..0085c72f1 100644 --- a/hermit/libkern/stdio.c +++ b/hermit/libkern/stdio.c @@ -43,7 +43,7 @@ static atomic_int32_t kmsg_counter = ATOMIC_INIT(-1); /* Workaround for a compiler bug. gcc 5.1 seems to ignore this array, if we defined it as as static array. At least it is as static array not part of the binary. => no valid kernel messages */ -/* static */ unsigned char kmessages[KMSG_SIZE+1] __attribute__ ((section(".kmsg"))) = {[0 ... KMSG_SIZE-1] = 0x00}; +/* static */ unsigned char kmessages[KMSG_SIZE+1] __attribute__ ((section(".kmsg"))) = {[0 ... KMSG_SIZE] = 0x00}; int koutput_init(void) { diff --git a/hermit/lwip b/hermit/lwip index a3de9b98a..5d850dabc 160000 --- a/hermit/lwip +++ b/hermit/lwip @@ -1 +1 @@ -Subproject commit a3de9b98acf96c082fa87699070f29853e9bc8ba +Subproject commit 5d850dabc5db631bc887a9a85329bf615ec30b50 diff --git a/hermit/tools/Makefile b/hermit/tools/Makefile index 88a40dd91..01f2288f9 100644 --- a/hermit/tools/Makefile +++ b/hermit/tools/Makefile @@ -5,7 +5,7 @@ CC = gcc CFLAGS = -O2 -Wall HEXDUMP = hexdump LDFLGAS = -PROXYFILES = $(shell find ../usr/tests -perm -u+r+x -type f) $(shell find ../usr/benchmarks -perm -u+r+x -type f) +PROXYFILES = $(shell find ../usr/tests -name '*.bin') $(shell find ../usr/benchmarks -name '*.bin') # Prettify output V = 0 @@ -40,7 +40,6 @@ proxy: iso $(PROXYFILES) @echo [PROXY] Create proxy files $Q./create_proxy.sh $(foreach FILE, $(PROXYFILES), $(FILE)) $Qmv *_proxy iso/ - $Qcp ../hermit.bin iso $Qgenisoimage -R -J -input-charset utf8 -o proxy-image.iso iso clean: diff --git a/hermit/tools/create_proxy.sh b/hermit/tools/create_proxy.sh index c87a279eb..b10485a1a 100755 --- a/hermit/tools/create_proxy.sh +++ b/hermit/tools/create_proxy.sh @@ -3,7 +3,7 @@ while [[ $# > 0 ]] do fname=$(basename "$1") - fname_new=$(basename "$1")_proxy + fname_new="${fname//.bin}"_proxy echo "Create proxy for $fname" echo ".section .rodata" > inc.S diff --git a/hermit/tools/proxy.c b/hermit/tools/proxy.c index 746c38df8..383ecc276 100644 --- a/hermit/tools/proxy.c +++ b/hermit/tools/proxy.c @@ -50,13 +50,22 @@ static char saddr[16]; static int sobufsize = 131072; static unsigned int isle_nr = 0; +static char fname[] = "/tmp/hermitXXXXXX"; extern char hermit_app[]; extern unsigned app_size; -int init_enviroment(void) +static void fini_env(void) { + //unlink(fname); +} + +static int init_env(void) +{ + int j, fd; + int ret; char* str; + FILE* file; str = getenv("HERMIT_ISLE"); if (str) @@ -68,6 +77,57 @@ int init_enviroment(void) snprintf(saddr, 16, "192.168.28.%u", isle_nr+2); + mkstemp(fname); + printf("fname %s\n", fname); + + // register function to delete temporary files + atexit(fini_env); + + fd = open(fname, O_CREAT|O_RDWR); + if (fd < 0) { + perror("open"); + exit(1); + } + + // write binary to tmpfs + j = 0; + while(j < app_size) + { + ret = write(fd, hermit_app+j, app_size-j); + if (ret < 0) { + perror("write"); + close(fd); + exit(1); + } + j += ret; + } + + close(fd); + + // set path to temporary file + file = fopen("/sys/hermit/path", "w"); + if (!file) { + perror("fopen"); + exit(1); + } + + fprintf(file, "%s", fname); + + fclose(file); + + // start application + file = fopen("/sys/hermit/isle0/cpus", "w"); + if (!file) { + perror("fopen"); + exit(1); + } + + fprintf(file, "%s", "3"); + + fclose(file); + + sleep(3); + return 0; } @@ -264,7 +324,7 @@ int main(int argc, char **argv) int32_t magic = HERMIT_MAGIC; struct sockaddr_in serv_name; - init_enviroment(); + init_env(); /* create a socket */ s = socket(PF_INET, SOCK_STREAM, 0); @@ -320,21 +380,6 @@ int main(int argc, char **argv) } } - // send length of the elf file to HermitCore - ret = write(s, &app_size, sizeof(app_size)); - if (ret < 0) - goto out; - - // send the executable to HermitCore - j = 0; - while(j < app_size) - { - ret = write(s, hermit_app+j, app_size-j); - if (ret < 0) - goto out; - j += ret; - } - ret = handle_syscalls(s); close(s); diff --git a/hermit/usr/Makefile b/hermit/usr/Makefile index c76804f17..31fa7c619 100644 --- a/hermit/usr/Makefile +++ b/hermit/usr/Makefile @@ -24,8 +24,8 @@ demo: @echo Build demo applications $Q$(MAKE) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C tests depend $Q$(MAKE) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C tests - $Q$(MAKE) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C benchmarks depend - $Q$(MAKE) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C benchmarks + #$Q$(MAKE) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C benchmarks depend + #$Q$(MAKE) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C benchmarks $(ARCH): $Q$(MKDIR) $(TMP) @@ -65,7 +65,7 @@ $(TMP)/gcc: $Q$(CD) $(TMP)/gcc; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-newlib --enable-languages=c --disable-nls --disable-shared --disable-libssp --enable-threads=posix --disable-libgomp --enable-tls --enable-lto --disable-symvers && $(MAKE) $(NJOBS) && $(MAKE) install $Q$(RM) $(TMP)/gcc $Q$(MKDIR) $(TMP)/gcc - $Q$(CD) $(TMP)/gcc; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-newlib --enable-languages=c,c++,fortran,lto --disable-nls --disable-shared --disable-libssp --enable-threads=posix --disable-libgomp --enable-tls --enable-lto --disable-symvers && $(MAKE) $(NJOBS) && $(MAKE) install + $Q$(CD) $(TMP)/gcc; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-newlib --enable-languages=c,c++,lto --disable-nls --disable-shared --disable-libssp --enable-threads=posix --disable-libgomp --enable-tls --enable-lto --disable-symvers && $(MAKE) $(NJOBS) && $(MAKE) install clean: @echo Cleaning toolchain diff --git a/hermit/usr/binutils b/hermit/usr/binutils index 36a850444..72df72547 160000 --- a/hermit/usr/binutils +++ b/hermit/usr/binutils @@ -1 +1 @@ -Subproject commit 36a8504446db193cbc4c8f94eaf957996fc6bd03 +Subproject commit 72df72547e5f46d4413f101abd8979d03e8e44d3 diff --git a/hermit/usr/gcc b/hermit/usr/gcc index 3064382b9..3164d9205 160000 --- a/hermit/usr/gcc +++ b/hermit/usr/gcc @@ -1 +1 @@ -Subproject commit 3064382b91d74719b082df4fa84d83cda0beedda +Subproject commit 3164d9205b9569f709ddfafcb95fc0f50cb4a656 diff --git a/hermit/usr/newlib b/hermit/usr/newlib index 67c0ccaa6..0cb24e13a 160000 --- a/hermit/usr/newlib +++ b/hermit/usr/newlib @@ -1 +1 @@ -Subproject commit 67c0ccaa60d432495b08197fe82f3da8f65e928b +Subproject commit 0cb24e13ad246487a255839c28473438c82fa291 diff --git a/hermit/usr/tests/Makefile b/hermit/usr/tests/Makefile index 002cbd06d..8d8d8572b 100644 --- a/hermit/usr/tests/Makefile +++ b/hermit/usr/tests/Makefile @@ -1,8 +1,9 @@ ARCH = x86 TARGET=x86_64-hermit MAKE = make -override STRIP_DEBUG = --strip-unneeded --strip-debug +override STRIP_DEBUG = --strip-debug #--strip-unneeded KEEP_DEBUG = --only-keep-debug +OBJCOPY_FLAGS = -j .mboot -j .ktext -j .kdata -j .kbss -j .fini -j .init -j .ctors -j .dtors -j .text -j .data -j .rodata -j .bss -j .percore -O binary # Set your own cross compiler tool chain prefix here CROSSCOMPREFIX = x86_64-hermit- @@ -43,7 +44,7 @@ endif default: all -all: hello hello++ hellof jacobi thr_hello RCCE_minimum +all: hello.bin hello++.bin #hellof.bin thr_hello.bin #jacobi RCCE_minimum hello++: hello++.o @echo [LD] $@ @@ -52,6 +53,10 @@ hello++: hello++.o $Q$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ $Qchmod a-x $@.sym +hello++.bin: hello++ + @echo [OBJECT_COPY] $@ + $Q$(OBJCOPY_FOR_TARGET) $(OBJCOPY_FLAGS) $< $@ + hello: hello.o @echo [LD] $@ $Q$(CC_FOR_TARGET) $(LDFLAGS_FOR_TARGET) $(CFLAGS_FOR_TARGET) -o $@ $< @@ -59,6 +64,10 @@ hello: hello.o $Q$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ $Qchmod a-x $@.sym +hello.bin: hello + @echo [OBJECT_COPY] $@ + $Q$(OBJCOPY_FOR_TARGET) $(OBJCOPY_FLAGS) $< $@ + hellof: hellof.o @echo [LD] $@ $Q$(FC_FOR_TARGET) $(LDFLAGS_FOR_TARGET) $(FFLAGS_FOR_TARGET) -o $@ $< @@ -66,6 +75,10 @@ hellof: hellof.o $Q$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ $Qchmod a-x $@.sym +hellof.bin: hellof + @echo [OBJECT_COPY] $@ + $Q$(OBJCOPY_FOR_TARGET) $(OBJCOPY_FLAGS) $< $@ + jacobi: jacobi.o @echo [LD] $@ $Q$(CC_FOR_TARGET) $(LDFLAGS_FOR_TARGET) $(CFLAGS_FOR_TARGET) -o $@ $< -lm @@ -84,6 +97,10 @@ thr_hello: thr_hello.o $Q$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ $Qchmod a-x $@.sym +thr_hello.bin: thr_hello + @echo [OBJECT_COPY] $@ + $Q$(OBJCOPY_FOR_TARGET) $(OBJCOPY_FLAGS) $< $@ + RCCE_minimum: RCCE_minimum.o @echo [LD] $@ $Q$(CC_FOR_TARGET) $(LDFLAGS_FOR_TARGET) $(CFLAGS_FOR_TARGET) -o $@ $< -lircce @@ -93,11 +110,11 @@ RCCE_minimum: RCCE_minimum.o clean: @echo Cleaning tests - $Q$(RM) hello hello++ hellof jacobi thr_hello RCCE_minimum *.sym *.o *~ + $Q$(RM) hello hello++ hellof jacobi thr_hello RCCE_minimum *.sym *.o *~ *.bin veryclean: @echo Propper cleaning tests - $Q$(RM) hello hello++ hellof jacobi thr_hello RCCE_minimum *.sym *.o *~ + $Q$(RM) hello hello++ hellof jacobi thr_hello RCCE_minimum *.sym *.o *~ *.bin depend: $Q$(CC_FOR_TARGET) -MM $(CFLAGS_FOR_TARGET) *.c > Makefile.dep