1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-30 00:00:15 +01:00

check LWIP_FD_BIT before syscall will be forwarded to uhyve

This commit is contained in:
Stefan Lankes 2017-09-21 22:39:34 +02:00
parent 4906a04022
commit 22991d27c2

View file

@ -131,17 +131,8 @@ typedef struct {
ssize_t sys_read(int fd, char* buf, size_t len) ssize_t sys_read(int fd, char* buf, size_t len)
{ {
if (is_uhyve()) {
uhyve_read_t uhyve_args = {fd, (char*) virt_to_phys((size_t) buf), len, -1};
uhyve_send(UHYVE_PORT_READ, (unsigned)virt_to_phys((size_t)&uhyve_args));
return uhyve_args.ret;
}
sys_read_t sysargs = {__NR_read, fd, len}; sys_read_t sysargs = {__NR_read, fd, len};
ssize_t j, ret; ssize_t j, ret;
int s;
// do we have an LwIP file descriptor? // do we have an LwIP file descriptor?
if (fd & LWIP_FD_BIT) { if (fd & LWIP_FD_BIT) {
@ -152,13 +143,21 @@ ssize_t sys_read(int fd, char* buf, size_t len)
return ret; return ret;
} }
if (is_uhyve()) {
uhyve_read_t uhyve_args = {fd, (char*) virt_to_phys((size_t) buf), len, -1};
uhyve_send(UHYVE_PORT_READ, (unsigned)virt_to_phys((size_t)&uhyve_args));
return uhyve_args.ret;
}
spinlock_irqsave_lock(&lwip_lock); spinlock_irqsave_lock(&lwip_lock);
if (libc_sd < 0) { if (libc_sd < 0) {
spinlock_irqsave_unlock(&lwip_lock); spinlock_irqsave_unlock(&lwip_lock);
return -ENOSYS; return -ENOSYS;
} }
s = libc_sd; int s = libc_sd;
lwip_write(s, &sysargs, sizeof(sysargs)); lwip_write(s, &sysargs, sizeof(sysargs));
lwip_read(s, &j, sizeof(j)); lwip_read(s, &j, sizeof(j));
@ -203,18 +202,9 @@ typedef struct {
ssize_t sys_write(int fd, const char* buf, size_t len) ssize_t sys_write(int fd, const char* buf, size_t len)
{ {
if (BUILTIN_EXPECT(!buf, 0)) if (BUILTIN_EXPECT(!buf, 0))
return -1; return -EINVAL;
if (is_uhyve()) {
uhyve_write_t uhyve_args = {fd, (const char*) virt_to_phys((size_t) buf), len};
uhyve_send(UHYVE_PORT_WRITE, (unsigned)virt_to_phys((size_t)&uhyve_args));
return uhyve_args.len;
}
ssize_t i, ret; ssize_t i, ret;
int s;
sys_write_t sysargs = {__NR_write, fd, len}; sys_write_t sysargs = {__NR_write, fd, len};
// do we have an LwIP file descriptor? // do we have an LwIP file descriptor?
@ -226,6 +216,14 @@ ssize_t sys_write(int fd, const char* buf, size_t len)
return ret; return ret;
} }
if (is_uhyve()) {
uhyve_write_t uhyve_args = {fd, (const char*) virt_to_phys((size_t) buf), len};
uhyve_send(UHYVE_PORT_WRITE, (unsigned)virt_to_phys((size_t)&uhyve_args));
return uhyve_args.len;
}
spinlock_irqsave_lock(&lwip_lock); spinlock_irqsave_lock(&lwip_lock);
if (libc_sd < 0) if (libc_sd < 0)
{ {
@ -239,7 +237,7 @@ ssize_t sys_write(int fd, const char* buf, size_t len)
return len; return len;
} }
s = libc_sd; int s = libc_sd;
lwip_write(s, &sysargs, sizeof(sysargs)); lwip_write(s, &sysargs, sizeof(sysargs));
i=0; i=0;
@ -386,14 +384,6 @@ typedef struct {
int sys_close(int fd) int sys_close(int fd)
{ {
if (is_uhyve()) {
uhyve_close_t uhyve_close = {fd, -1};
uhyve_send(UHYVE_PORT_CLOSE, (unsigned)virt_to_phys((size_t) &uhyve_close));
return uhyve_close.ret;
}
int ret, s; int ret, s;
sys_close_t sysargs = {__NR_close, fd}; sys_close_t sysargs = {__NR_close, fd};
@ -406,6 +396,14 @@ int sys_close(int fd)
return 0; return 0;
} }
if (is_uhyve()) {
uhyve_close_t uhyve_close = {fd, -1};
uhyve_send(UHYVE_PORT_CLOSE, (unsigned)virt_to_phys((size_t) &uhyve_close));
return uhyve_close.ret;
}
spinlock_irqsave_lock(&lwip_lock); spinlock_irqsave_lock(&lwip_lock);
if (libc_sd < 0) { if (libc_sd < 0) {
ret = 0; ret = 0;