Skip to content

Commit dceeff1

Browse files
Encode arg cageid translation flag
1 parent 332f3b2 commit dceeff1

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/glibc/lind_syscall/addr_translation.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ extern "C"
6060
#define TRANSLATE_UADDR_TO_HOST(uaddr, cageid) \
6161
__lind_translate_uaddr_to_host ((uaddr), (cageid))
6262

63+
// Per-argument translation signaling for threei calls.
64+
#define LIND_ARG_TRANSLATE_FLAG (1ULL << 63)
65+
#define LIND_ARG_CAGEID_MASK (~LIND_ARG_TRANSLATE_FLAG)
66+
#define LIND_ARG_SHOULD_TRANSLATE(arg_cageid) \
67+
(((arg_cageid) & LIND_ARG_TRANSLATE_FLAG) != 0)
68+
#define LIND_ARG_CAGEID_STRIP(arg_cageid) ((arg_cageid) & LIND_ARG_CAGEID_MASK)
69+
#define LIND_ARG_CAGEID_TRANSLATE(cageid) \
70+
((uint64_t)(cageid) | LIND_ARG_TRANSLATE_FLAG)
71+
6372
/* Translate an array of guest iovec structures to host layout.
6473
Each iov_base is a wasm32 guest pointer; we split the translated
6574
64-bit host address across iov_base (low32) and __padding1 (high32).

src/glibc/lind_syscall/lind_syscall.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,32 @@ int make_threei_call (unsigned int callnumber,
7777
uint64_t arg6, uint64_t arg6cageid,
7878
int translate_errno)
7979
{
80+
if (LIND_ARG_SHOULD_TRANSLATE(arg1cageid)) {
81+
arg1 = TRANSLATE_GUEST_POINTER_TO_HOST((const void *)(uintptr_t)arg1);
82+
}
83+
if (LIND_ARG_SHOULD_TRANSLATE(arg2cageid)) {
84+
arg2 = TRANSLATE_GUEST_POINTER_TO_HOST((const void *)(uintptr_t)arg2);
85+
}
86+
if (LIND_ARG_SHOULD_TRANSLATE(arg3cageid)) {
87+
arg3 = TRANSLATE_GUEST_POINTER_TO_HOST((const void *)(uintptr_t)arg3);
88+
}
89+
if (LIND_ARG_SHOULD_TRANSLATE(arg4cageid)) {
90+
arg4 = TRANSLATE_GUEST_POINTER_TO_HOST((const void *)(uintptr_t)arg4);
91+
}
92+
if (LIND_ARG_SHOULD_TRANSLATE(arg5cageid)) {
93+
arg5 = TRANSLATE_GUEST_POINTER_TO_HOST((const void *)(uintptr_t)arg5);
94+
}
95+
if (LIND_ARG_SHOULD_TRANSLATE(arg6cageid)) {
96+
arg6 = TRANSLATE_GUEST_POINTER_TO_HOST((const void *)(uintptr_t)arg6);
97+
}
98+
99+
arg1cageid = LIND_ARG_CAGEID_STRIP(arg1cageid);
100+
arg2cageid = LIND_ARG_CAGEID_STRIP(arg2cageid);
101+
arg3cageid = LIND_ARG_CAGEID_STRIP(arg3cageid);
102+
arg4cageid = LIND_ARG_CAGEID_STRIP(arg4cageid);
103+
arg5cageid = LIND_ARG_CAGEID_STRIP(arg5cageid);
104+
arg6cageid = LIND_ARG_CAGEID_STRIP(arg6cageid);
105+
80106
int ret = __lind_make_syscall_trampoline(callnumber,
81107
callname,
82108
self_cageid, target_cageid,

0 commit comments

Comments
 (0)