Merge branch main into dev/wasi-libc-windows
This commit is contained in:
69
core/shared/platform/common/posix/posix_blocking_op.c
Normal file
69
core/shared/platform/common/posix/posix_blocking_op.c
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include "platform_api_extension.h"
|
||||
|
||||
#ifdef OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||
|
||||
static bool g_blocking_op_inited = false;
|
||||
static int g_blocking_op_signo = SIGUSR1;
|
||||
static sigset_t g_blocking_op_sigmask;
|
||||
|
||||
static void
|
||||
blocking_op_sighandler(int signo)
|
||||
{
|
||||
/* nothing */
|
||||
}
|
||||
|
||||
void
|
||||
os_set_signal_number_for_blocking_op(int signo)
|
||||
{
|
||||
g_blocking_op_signo = signo;
|
||||
}
|
||||
|
||||
int
|
||||
os_blocking_op_init()
|
||||
{
|
||||
if (g_blocking_op_inited) {
|
||||
return BHT_OK;
|
||||
}
|
||||
|
||||
sigemptyset(&g_blocking_op_sigmask);
|
||||
sigaddset(&g_blocking_op_sigmask, g_blocking_op_signo);
|
||||
|
||||
struct sigaction sa;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
sa.sa_handler = blocking_op_sighandler;
|
||||
if (sigaction(g_blocking_op_signo, &sa, NULL)) {
|
||||
return BHT_ERROR;
|
||||
}
|
||||
g_blocking_op_inited = true;
|
||||
return BHT_OK;
|
||||
}
|
||||
|
||||
void
|
||||
os_begin_blocking_op()
|
||||
{
|
||||
pthread_sigmask(SIG_UNBLOCK, &g_blocking_op_sigmask, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
os_end_blocking_op()
|
||||
{
|
||||
pthread_sigmask(SIG_BLOCK, &g_blocking_op_sigmask, NULL);
|
||||
}
|
||||
|
||||
int
|
||||
os_wakeup_blocking_op(korp_tid tid)
|
||||
{
|
||||
int ret = pthread_kill(tid, g_blocking_op_signo);
|
||||
if (ret != 0) {
|
||||
return BHT_ERROR;
|
||||
}
|
||||
return BHT_OK;
|
||||
}
|
||||
|
||||
#endif /* OS_ENABLE_WAKEUP_BLOCKING_OP */
|
||||
@ -5,6 +5,10 @@
|
||||
|
||||
#include "platform_api_vmcore.h"
|
||||
|
||||
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||
#include <libkern/OSCacheControl.h>
|
||||
#endif
|
||||
|
||||
#ifndef BH_ENABLE_TRACE_MMAP
|
||||
#define BH_ENABLE_TRACE_MMAP 0
|
||||
#endif
|
||||
@ -36,7 +40,11 @@ void *
|
||||
os_mmap(void *hint, size_t size, int prot, int flags)
|
||||
{
|
||||
int map_prot = PROT_NONE;
|
||||
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_JIT;
|
||||
#else
|
||||
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
||||
#endif
|
||||
uint64 request_size, page_size;
|
||||
uint8 *addr = MAP_FAILED;
|
||||
uint32 i;
|
||||
@ -251,3 +259,11 @@ os_mprotect(void *addr, size_t size, int prot)
|
||||
void
|
||||
os_dcache_flush(void)
|
||||
{}
|
||||
|
||||
void
|
||||
os_icache_flush(void *start, size_t len)
|
||||
{
|
||||
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||
sys_icache_invalidate(start, len);
|
||||
#endif
|
||||
}
|
||||
20
core/shared/platform/common/posix/posix_sleep.c
Normal file
20
core/shared/platform/common/posix/posix_sleep.c
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "platform_api_extension.h"
|
||||
|
||||
int
|
||||
os_usleep(uint32 usec)
|
||||
{
|
||||
struct timespec ts;
|
||||
int ret;
|
||||
|
||||
ts.tv_sec = usec / 1000000;
|
||||
ts.tv_nsec = (usec % 1000000) * 1000;
|
||||
ret = nanosleep(&ts, NULL);
|
||||
return ret == 0 ? 0 : -1;
|
||||
}
|
||||
@ -53,7 +53,7 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr,
|
||||
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
||||
|
||||
bh_sockaddr->port = ntohs(addr->sin_port);
|
||||
bh_sockaddr->addr_bufer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
||||
bh_sockaddr->addr_buffer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
||||
bh_sockaddr->is_ipv4 = true;
|
||||
return BHT_OK;
|
||||
}
|
||||
@ -65,12 +65,12 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr,
|
||||
|
||||
bh_sockaddr->port = ntohs(addr->sin6_port);
|
||||
|
||||
for (i = 0; i < sizeof(bh_sockaddr->addr_bufer.ipv6)
|
||||
/ sizeof(bh_sockaddr->addr_bufer.ipv6[0]);
|
||||
for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6)
|
||||
/ sizeof(bh_sockaddr->addr_buffer.ipv6[0]);
|
||||
i++) {
|
||||
uint16 part_addr = addr->sin6_addr.s6_addr[i * 2]
|
||||
| (addr->sin6_addr.s6_addr[i * 2 + 1] << 8);
|
||||
bh_sockaddr->addr_bufer.ipv6[i] = ntohs(part_addr);
|
||||
bh_sockaddr->addr_buffer.ipv6[i] = ntohs(part_addr);
|
||||
}
|
||||
|
||||
bh_sockaddr->is_ipv4 = false;
|
||||
@ -91,7 +91,7 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
|
||||
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
||||
addr->sin_port = htons(bh_sockaddr->port);
|
||||
addr->sin_family = AF_INET;
|
||||
addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_bufer.ipv4);
|
||||
addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_buffer.ipv4);
|
||||
*socklen = sizeof(*addr);
|
||||
}
|
||||
#ifdef IPPROTO_IPV6
|
||||
@ -101,10 +101,10 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
|
||||
addr->sin6_port = htons(bh_sockaddr->port);
|
||||
addr->sin6_family = AF_INET6;
|
||||
|
||||
for (i = 0; i < sizeof(bh_sockaddr->addr_bufer.ipv6)
|
||||
/ sizeof(bh_sockaddr->addr_bufer.ipv6[0]);
|
||||
for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6)
|
||||
/ sizeof(bh_sockaddr->addr_buffer.ipv6[0]);
|
||||
i++) {
|
||||
uint16 part_addr = htons(bh_sockaddr->addr_bufer.ipv6[i]);
|
||||
uint16 part_addr = htons(bh_sockaddr->addr_buffer.ipv6[i]);
|
||||
addr->sin6_addr.s6_addr[i * 2] = 0xff & part_addr;
|
||||
addr->sin6_addr.s6_addr[i * 2 + 1] = (0xff00 & part_addr) >> 8;
|
||||
}
|
||||
@ -799,7 +799,7 @@ os_socket_set_ip_add_membership(bh_socket_t socket,
|
||||
{
|
||||
assert(imr_multiaddr);
|
||||
if (is_ipv6) {
|
||||
#ifdef IPPROTO_IPV6
|
||||
#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN)
|
||||
struct ipv6_mreq mreq;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] =
|
||||
@ -837,7 +837,7 @@ os_socket_set_ip_drop_membership(bh_socket_t socket,
|
||||
{
|
||||
assert(imr_multiaddr);
|
||||
if (is_ipv6) {
|
||||
#ifdef IPPROTO_IPV6
|
||||
#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN)
|
||||
struct ipv6_mreq mreq;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] =
|
||||
|
||||
@ -39,6 +39,9 @@ os_thread_wrapper(void *arg)
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
if (os_thread_signal_init(handler) != 0)
|
||||
return NULL;
|
||||
#endif
|
||||
#ifdef OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||
os_end_blocking_op();
|
||||
#endif
|
||||
start_func(thread_arg);
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
@ -470,6 +473,14 @@ os_thread_get_stack_boundary()
|
||||
return addr;
|
||||
}
|
||||
|
||||
void
|
||||
os_thread_jit_write_protect_np(bool enabled)
|
||||
{
|
||||
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||
pthread_jit_write_protect_np(enabled);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
|
||||
#define SIG_ALT_STACK_SIZE (32 * 1024)
|
||||
@ -564,8 +575,8 @@ mask_signals(int how)
|
||||
pthread_sigmask(how, &set, NULL);
|
||||
}
|
||||
|
||||
static os_thread_local_attribute struct sigaction prev_sig_act_SIGSEGV;
|
||||
static os_thread_local_attribute struct sigaction prev_sig_act_SIGBUS;
|
||||
static struct sigaction prev_sig_act_SIGSEGV;
|
||||
static struct sigaction prev_sig_act_SIGBUS;
|
||||
|
||||
/* ASAN is not designed to work with custom stack unwind or other low-level \
|
||||
things. > Ignore a function that does some low-level magic. (e.g. walking \
|
||||
@ -596,9 +607,12 @@ signal_callback(int sig_num, siginfo_t *sig_info, void *sig_ucontext)
|
||||
prev_sig_act->sa_sigaction(sig_num, sig_info, sig_ucontext);
|
||||
}
|
||||
else if (prev_sig_act
|
||||
&& ((void *)prev_sig_act->sa_sigaction == SIG_DFL
|
||||
|| (void *)prev_sig_act->sa_sigaction == SIG_IGN)) {
|
||||
sigaction(sig_num, prev_sig_act, NULL);
|
||||
&& prev_sig_act->sa_handler
|
||||
/* Filter out SIG_DFL and SIG_IGN here, they will
|
||||
run into the else branch below */
|
||||
&& (void *)prev_sig_act->sa_handler != SIG_DFL
|
||||
&& (void *)prev_sig_act->sa_handler != SIG_IGN) {
|
||||
prev_sig_act->sa_handler(sig_num);
|
||||
}
|
||||
/* Output signal info and then crash if signal is unhandled */
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user