diff --git a/hermit/kernel/main.c b/hermit/kernel/main.c index 83e298591..09ae2a475 100644 --- a/hermit/kernel/main.c +++ b/hermit/kernel/main.c @@ -85,7 +85,7 @@ extern atomic_int32_t possible_cpus; extern int32_t isle; extern int32_t possible_isles; extern uint32_t boot_processor; -extern int libc_sd; +extern volatile int libc_sd; uint32_t idle_poll = 1; diff --git a/hermit/kernel/syscall.c b/hermit/kernel/syscall.c index 67fc79e7a..ba70ad4bc 100644 --- a/hermit/kernel/syscall.c +++ b/hermit/kernel/syscall.c @@ -47,7 +47,7 @@ static spinlock_t lwip_lock = SPINLOCK_INIT; extern int32_t isle; extern int32_t possible_isles; -extern int libc_sd; +extern volatile int libc_sd; extern uint32_t idle_poll; tid_t sys_getpid(void) @@ -83,15 +83,24 @@ void NORETURN sys_exit(int arg) { sys_exit_t sysargs = {__NR_exit, arg}; + spinlock_lock(&lwip_lock); if (libc_sd >= 0) { - spinlock_lock(&lwip_lock); - lwip_write(libc_sd, &sysargs, sizeof(sysargs)); + int s = libc_sd; + + lwip_write(s, &sysargs, sizeof(sysargs)); + libc_sd = -1; + spinlock_unlock(&lwip_lock); - lwip_close(libc_sd); - libc_sd = -1; + // switch to LwIP thread + reschedule(); + +kprintf("exit %d\n", arg); + lwip_close(s); idle_poll = 0; + } else { + spinlock_unlock(&lwip_lock); } do_exit(arg); @@ -107,6 +116,7 @@ ssize_t sys_read(int fd, char* buf, size_t len) { sys_read_t sysargs = {__NR_read, fd, len}; ssize_t j, ret; + int s; // do we have an LwIP file descriptor? if (fd & LWIP_FD_BIT) { @@ -117,20 +127,23 @@ ssize_t sys_read(int fd, char* buf, size_t len) return ret; } - if (libc_sd < 0) - return -ENOSYS; - spinlock_lock(&lwip_lock); - lwip_write(libc_sd, &sysargs, sizeof(sysargs)); + if (libc_sd < 0) { + spinlock_unlock(&lwip_lock); + return -ENOSYS; + } - lwip_read(libc_sd, &j, sizeof(j)); + s = libc_sd; + lwip_write(s, &sysargs, sizeof(sysargs)); + + lwip_read(s, &j, sizeof(j)); if (j > 0) { ssize_t i = 0; while(i < j) { - ret = lwip_read(libc_sd, buf+i, j-i); + ret = lwip_read(s, buf+i, j-i); if (ret < 0) { spinlock_unlock(&lwip_lock); return ret; @@ -160,6 +173,7 @@ ssize_t sys_write(int fd, const char* buf, size_t len) { ssize_t i, ret; sys_write_t sysargs = {__NR_write, fd, len}; + int s; if (BUILTIN_EXPECT(!buf, 0)) return -1; @@ -173,22 +187,24 @@ ssize_t sys_write(int fd, const char* buf, size_t len) return ret; } + spinlock_lock(&lwip_lock); if (libc_sd < 0) { + spinlock_unlock(&lwip_lock); + for(i=0; i 2) { - ret = lwip_read(libc_sd, &i, sizeof(i)); + ret = lwip_read(s, &i, sizeof(i)); if (ret < 0) i = ret; } else i = len; @@ -241,48 +257,50 @@ ssize_t sys_sbrk(ssize_t incr) int sys_open(const char* name, int flags, int mode) { - int i, ret, sysnr = __NR_open; + int s, i, ret, sysnr = __NR_open; size_t len; - if (libc_sd < 0) - return 0; + spinlock_lock(&lwip_lock); + if (libc_sd < 0) { + ret = 0; + goto out; + } + s = libc_sd; len = strlen(name)+1; - spinlock_lock(&lwip_lock); - //i = 0; - //lwip_setsockopt(libc_sd, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); + //lwip_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); - ret = lwip_write(libc_sd, &sysnr, sizeof(sysnr)); + ret = lwip_write(s, &sysnr, sizeof(sysnr)); if (ret < 0) goto out; - ret = lwip_write(libc_sd, &len, sizeof(len)); + ret = lwip_write(s, &len, sizeof(len)); if (ret < 0) goto out; i=0; while(i