mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-09 00:00:03 +01:00
add first draft of HermitCore as libOS
This commit is contained in:
parent
cc60eb1b90
commit
4a549ead41
23 changed files with 327 additions and 190 deletions
|
@ -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
|
||||
|
|
|
@ -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-% :
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -215,5 +215,5 @@ static void fault_handler(struct state *s)
|
|||
|
||||
apic_eoi(s->int_no);
|
||||
irq_enable();
|
||||
abort();
|
||||
do_abort();
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -326,7 +326,7 @@ default_handler:
|
|||
|
||||
apic_eoi(s->int_no);
|
||||
irq_enable();
|
||||
abort();
|
||||
do_abort();
|
||||
}
|
||||
|
||||
int page_init(void)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
void NORETURN abort(void);
|
||||
void NORETURN do_abort(void);
|
||||
|
||||
/** @brief General page allocator function
|
||||
*
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<MAX_CORES; i++)
|
||||
|
@ -236,18 +237,40 @@ static int init_rcce(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int libc_start(int argc, char** argv);
|
||||
|
||||
// init task => 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<argc; i++)
|
||||
{
|
||||
err = read(c, &len, sizeof(c));
|
||||
if (err != sizeof(c))
|
||||
goto out;
|
||||
|
||||
argv[i] = kmalloc(len);
|
||||
if (!argv)
|
||||
goto out;
|
||||
|
||||
j = 0;
|
||||
while(j < len) {
|
||||
err = read(c, argv[i]+j, len-j);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
j += err;
|
||||
}
|
||||
}
|
||||
|
||||
libc_sd = c;
|
||||
libc_start(argc, argv);
|
||||
|
||||
out:
|
||||
if (argv) {
|
||||
for(i=0; i<argc; i++) {
|
||||
if (argv[i])
|
||||
kfree(argv[i]);
|
||||
}
|
||||
|
||||
kfree(argv);
|
||||
}
|
||||
|
||||
if (c > 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);
|
||||
|
|
|
@ -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; i<len; i++)
|
||||
kputchar(buf[i]);
|
||||
|
@ -158,14 +156,14 @@ static ssize_t sys_write(int fd, const char* buf, size_t len)
|
|||
spinlock_lock(&lwip_lock);
|
||||
|
||||
flag = 0;
|
||||
setsockopt(task->sd, 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(i<len)
|
||||
{
|
||||
ret = write(task->sd, 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 */
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit a3de9b98acf96c082fa87699070f29853e9bc8ba
|
||||
Subproject commit 5d850dabc5db631bc887a9a85329bf615ec30b50
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 36a8504446db193cbc4c8f94eaf957996fc6bd03
|
||||
Subproject commit 72df72547e5f46d4413f101abd8979d03e8e44d3
|
|
@ -1 +1 @@
|
|||
Subproject commit 3064382b91d74719b082df4fa84d83cda0beedda
|
||||
Subproject commit 3164d9205b9569f709ddfafcb95fc0f50cb4a656
|
|
@ -1 +1 @@
|
|||
Subproject commit 67c0ccaa60d432495b08197fe82f3da8f65e928b
|
||||
Subproject commit 0cb24e13ad246487a255839c28473438c82fa291
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue