1
0
Fork 0
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:
Stefan Lankes 2015-12-29 02:22:41 +01:00
parent cc60eb1b90
commit 4a549ead41
23 changed files with 327 additions and 190 deletions

View file

@ -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

View file

@ -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-% :

View file

@ -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

View file

@ -215,5 +215,5 @@ static void fault_handler(struct state *s)
apic_eoi(s->int_no);
irq_enable();
abort();
do_abort();
}

View file

@ -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))

View file

@ -326,7 +326,7 @@ default_handler:
apic_eoi(s->int_no);
irq_enable();
abort();
do_abort();
}
int page_init(void)

View file

@ -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))

View file

@ -44,7 +44,7 @@
extern "C" {
#endif
void NORETURN abort(void);
void NORETURN do_abort(void);
/** @brief General page allocator function
*

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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 */
};

View file

@ -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);

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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