mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-30 13:37:38 +00:00
Fix run XIP file failure on SGX platform (#880)
This commit is contained in:
parent
208cafc776
commit
7505ae25a2
|
@ -119,6 +119,71 @@ handle_cmd_destroy_runtime()
|
||||||
LOG_VERBOSE("Destroy runtime success.\n");
|
LOG_VERBOSE("Destroy runtime success.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8 *
|
||||||
|
align_ptr(const uint8 *p, uint32 b)
|
||||||
|
{
|
||||||
|
uintptr_t v = (uintptr_t)p;
|
||||||
|
uintptr_t m = b - 1;
|
||||||
|
return (uint8 *)((v + m) & ~m);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define AOT_SECTION_TYPE_TARGET_INFO 0
|
||||||
|
#define AOT_SECTION_TYPE_SIGANATURE 6
|
||||||
|
#define E_TYPE_XIP 4
|
||||||
|
|
||||||
|
#define CHECK_BUF(buf, buf_end, length) \
|
||||||
|
do { \
|
||||||
|
if (buf + length < buf || buf + length > buf_end) \
|
||||||
|
return false; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define read_uint16(p, p_end, res) \
|
||||||
|
do { \
|
||||||
|
p = (uint8 *)align_ptr(p, sizeof(uint16)); \
|
||||||
|
CHECK_BUF(p, p_end, sizeof(uint16)); \
|
||||||
|
res = *(uint16 *)p; \
|
||||||
|
p += sizeof(uint16); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define read_uint32(p, p_end, res) \
|
||||||
|
do { \
|
||||||
|
p = (uint8 *)align_ptr(p, sizeof(uint32)); \
|
||||||
|
CHECK_BUF(p, p_end, sizeof(uint32)); \
|
||||||
|
res = *(uint32 *)p; \
|
||||||
|
p += sizeof(uint32); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_xip_file(const uint8 *buf, uint32 size)
|
||||||
|
{
|
||||||
|
const uint8 *p = buf, *p_end = buf + size;
|
||||||
|
uint32 section_type, section_size;
|
||||||
|
uint16 e_type;
|
||||||
|
|
||||||
|
if (get_package_type(buf, size) != Wasm_Module_AoT)
|
||||||
|
return false;
|
||||||
|
CHECK_BUF(p, p_end, 8);
|
||||||
|
p += 8;
|
||||||
|
while (p < p_end) {
|
||||||
|
read_uint32(p, p_end, section_type);
|
||||||
|
read_uint32(p, p_end, section_size);
|
||||||
|
CHECK_BUF(p, p_end, section_size);
|
||||||
|
|
||||||
|
if (section_type == AOT_SECTION_TYPE_TARGET_INFO) {
|
||||||
|
p += 4;
|
||||||
|
read_uint16(p, p_end, e_type);
|
||||||
|
if (e_type == E_TYPE_XIP) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (section_type >= AOT_SECTION_TYPE_SIGANATURE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
p += section_size;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_cmd_load_module(uint64 *args, uint32 argc)
|
handle_cmd_load_module(uint64 *args, uint32 argc)
|
||||||
{
|
{
|
||||||
|
@ -129,15 +194,10 @@ handle_cmd_load_module(uint64 *args, uint32 argc)
|
||||||
uint32 error_buf_size = *(uint32 *)args++;
|
uint32 error_buf_size = *(uint32 *)args++;
|
||||||
uint64 total_size = sizeof(EnclaveModule) + (uint64)wasm_file_size;
|
uint64 total_size = sizeof(EnclaveModule) + (uint64)wasm_file_size;
|
||||||
EnclaveModule *enclave_module;
|
EnclaveModule *enclave_module;
|
||||||
bool is_xip_file = false;
|
|
||||||
|
|
||||||
bh_assert(argc == 4);
|
bh_assert(argc == 4);
|
||||||
|
|
||||||
#if WASM_ENABLE_AOT != 0
|
if (!is_xip_file((uint8 *)wasm_file, wasm_file_size)) {
|
||||||
is_xip_file = wasm_runtime_is_xip_file((uint8 *)wasm_file, wasm_file_size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!is_xip_file) {
|
|
||||||
if (total_size >= UINT32_MAX
|
if (total_size >= UINT32_MAX
|
||||||
|| !(enclave_module = (EnclaveModule *)wasm_runtime_malloc(
|
|| !(enclave_module = (EnclaveModule *)wasm_runtime_malloc(
|
||||||
(uint32)total_size))) {
|
(uint32)total_size))) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user