implement printf syscall wrapper for linux

This commit is contained in:
wenyongh 2019-05-15 14:32:35 +08:00
parent a595ec79ab
commit 40e7c627aa
3 changed files with 29 additions and 16 deletions

View File

@ -109,31 +109,44 @@ __syscall3_wrapper(int32 arg0, int32 arg1, int32 arg2, int32 arg3)
return syscall(54, arg1, arg2, wsz); return syscall(54, arg1, arg2, wsz);
} }
case 145: /* readv */
case 146: /* writev */ case 146: /* writev */
{ {
/* Implement syscall 54 and syscall 146 to support printf() /* Implement syscall 54 and syscall 146 to support printf()
for non SIDE_MODULE=1 mode */ for non SIDE_MODULE=1 mode */
uint32 iovcnt = arg3, i; struct iovec_app {
struct iovec *vec_begin, *vec; int32 iov_base_offset;
uint32 iov_len;
} *vec;
int32 vec_offset = arg2, str_offset;
uint32 iov_count = arg3, i;
int32 count = 0;
char *iov_base, *str;
if (!validate_app_addr(arg2, sizeof(struct iovec))) if (!validate_app_addr(vec_offset, sizeof(struct iovec_app)))
return 0; return 0;
vec_begin = vec = (struct iovec*)addr_app_to_native(arg2); vec = (struct iovec_app *)addr_app_to_native(vec_offset);
for (i = 0; i < iovcnt; i++, vec++) { for (i = 0; i < iov_count; i++, vec++) {
if (vec->iov_len > 0) { if (vec->iov_len > 0) {
if (!validate_app_addr((int32)vec->iov_base, 1)) if (!validate_app_addr(vec->iov_base_offset, 1))
return 0; return 0;
vec->iov_base = addr_app_to_native((int32)vec->iov_base); iov_base = (char*)addr_app_to_native(vec->iov_base_offset);
if (!(str_offset = module_malloc(vec->iov_len + 1)))
return 0;
str = addr_app_to_native(str_offset);
memcpy(str, iov_base, vec->iov_len);
str[vec->iov_len] = '\0';
count += wasm_printf("%s", str);
module_free(str_offset);
} }
} }
if (arg0 == 145) return count;
return syscall(145, arg1, vec_begin, arg3);
else
return syscall(146, arg1, vec_begin, arg3);
} }
case 145: /* readv */
case 3: /* read*/ case 3: /* read*/
case 5: /* open */ case 5: /* open */
case 221: /* fcntl */ case 221: /* fcntl */

View File

@ -152,7 +152,7 @@ void gci_add_fc(gc_heap_t *heap, hmu_t *hmu, gc_size_t size)
bh_assert( bh_assert(
hmu && (gc_uint8*) hmu >= heap->base_addr hmu && (gc_uint8*) hmu >= heap->base_addr
&& (gc_uint8*) hmu < heap->base_addr + heap->current_size); && (gc_uint8*) hmu < heap->base_addr + heap->current_size);
bh_assert(((gc_uint32) hmu_to_obj(hmu) & 7) == 0); bh_assert(((gc_uint32)(uintptr_t)hmu_to_obj(hmu) & 7) == 0);
bh_assert( bh_assert(
size > 0 size > 0
&& ((gc_uint8*) hmu) + size && ((gc_uint8*) hmu) + size
@ -242,7 +242,7 @@ BH_STATIC hmu_t *alloc_hmu(gc_heap_t *heap, gc_size_t size)
p = node->next; p = node->next;
node->next = p->next; node->next = p->next;
bh_assert(((gc_int32) hmu_to_obj(p) & 7) == 0); bh_assert(((gc_int32)(intptr_t)hmu_to_obj(p) & 7) == 0);
if ((gc_size_t) node_idx if ((gc_size_t) node_idx
!= init_node_idx&& ((gc_size_t)node_idx << 3) >= size + GC_SMALLEST_SIZE) { /* with bigger size*/ != init_node_idx&& ((gc_size_t)node_idx << 3) >= size + GC_SMALLEST_SIZE) { /* with bigger size*/

View File

@ -75,7 +75,7 @@ static void *vm_thread_wrapper(void *arg)
{ {
thread_wrapper_arg * targ = arg; thread_wrapper_arg * targ = arg;
LOG_VERBOSE("THREAD CREATE 0x%08x\n", &targ); LOG_VERBOSE("THREAD CREATE 0x%08x\n", &targ);
targ->stack = (void *) ((unsigned int) (&arg) & ~0xfff); targ->stack = (void *) ((uintptr_t)(&arg) & ~0xfff);
_vm_tls_put(1, targ); _vm_tls_put(1, targ);
targ->start(targ->arg); targ->start(targ->arg);
bh_free(targ); bh_free(targ);