From: Richard Henderson <[email protected]>

The token is not computed via TARGET_PAGE_SIZE, but via a fixed 12-bit field.

Cc: [email protected]
Fixes: ad1afe433fa ("linux-user/aarch64: Implement map_shadow_stack syscall")
Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4106
Signed-off-by: Richard Henderson <[email protected]>
Reviewed-by: Pierrick Bouvier <[email protected]>
Signed-off-by: Helge Deller <[email protected]>
(cherry picked from commit 8d0ac5933aa3476283c14680f165727268103fcd)
Signed-off-by: Michael Tokarev <[email protected]>

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index dcf461806ad..85ef8261e63 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6848,7 +6848,8 @@ static abi_long do_map_shadow_stack(CPUArchState *env, 
abi_ulong addr,
                 /* Leave an extra empty frame at top-of-stack. */
                 cap_ptr -= 8;
             }
-            cap_val = (cap_ptr & TARGET_PAGE_MASK) | 1;
+            /* Note the 12 bit field is unaffected by current page size. */
+            cap_val = deposit64(cap_ptr, 0, 12, 1);
             if (put_user_u64(cap_val, cap_ptr)) {
                 /* Allocation succeeded above. */
                 g_assert_not_reached();
-- 
2.47.3


Reply via email to