|
@@ -1843,6 +1843,12 @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
|
|
layout.total_size += sizeof(struct target_aarch64_ctx);
|
|
layout.total_size += sizeof(struct target_aarch64_ctx);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* We must always provide at least the standard 4K reserved space,
|
|
|
|
+ * even if we don't use all of it (this is part of the ABI)
|
|
|
|
+ */
|
|
|
|
+ layout.total_size = MAX(layout.total_size,
|
|
|
|
+ sizeof(struct target_rt_sigframe));
|
|
|
|
+
|
|
/* Reserve space for the return code. On a real system this would
|
|
/* Reserve space for the return code. On a real system this would
|
|
* be within the VDSO. So, despite the name this is not a "real"
|
|
* be within the VDSO. So, despite the name this is not a "real"
|
|
* record within the frame.
|
|
* record within the frame.
|
|
@@ -1850,12 +1856,6 @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
|
|
fr_ofs = layout.total_size;
|
|
fr_ofs = layout.total_size;
|
|
layout.total_size += sizeof(struct target_rt_frame_record);
|
|
layout.total_size += sizeof(struct target_rt_frame_record);
|
|
|
|
|
|
- /* We must always provide at least the standard 4K reserved space,
|
|
|
|
- * even if we don't use all of it (this is part of the ABI)
|
|
|
|
- */
|
|
|
|
- layout.total_size = MAX(layout.total_size,
|
|
|
|
- sizeof(struct target_rt_sigframe));
|
|
|
|
-
|
|
|
|
frame_addr = get_sigframe(ka, env, layout.total_size);
|
|
frame_addr = get_sigframe(ka, env, layout.total_size);
|
|
trace_user_setup_frame(env, frame_addr);
|
|
trace_user_setup_frame(env, frame_addr);
|
|
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
|
|
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
|