summaryrefslogtreecommitdiff
path: root/emulators/qemu-devel/files/extra-patch-bsd-user-arm-signal
blob: 55604c367022d48a3b4d18467a70caf87c07d452 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
diff --git a/bsd-user/arm/target_arch_signal.h b/bsd-user/arm/target_arch_signal.h
index 048bd4f..0b14b0b 100644
--- a/bsd-user/arm/target_arch_signal.h
+++ b/bsd-user/arm/target_arch_signal.h
@@ -47,7 +47,7 @@
 #define TARGET_INSN_SIZE    4       /* arm instruction size */
 
 /* Size of the signal trampolin code. See _sigtramp(). */
-#define TARGET_SZSIGCODE    ((abi_ulong)(8 * TARGET_INSN_SIZE))
+#define TARGET_SZSIGCODE    ((abi_ulong)(9 * TARGET_INSN_SIZE))
 
 /* compare to arm/include/_limits.h */
 #define TARGET_MINSIGSTKSZ  (1024 * 4)                  /* min sig stack size */
@@ -248,7 +248,7 @@ static inline abi_long get_ucontext_sigreturn(CPUARMState *regs,
         return -TARGET_EINVAL;
     }
 
-    *target_uc = target_sf + offsetof(struct target_sigframe, sf_uc);
+    *target_uc = target_sf;
 
     return 0;
 }
diff --git a/bsd-user/arm/target_arch_sigtramp.h b/bsd-user/arm/target_arch_sigtramp.h
index 98dc313..5b7424c 100644
--- a/bsd-user/arm/target_arch_sigtramp.h
+++ b/bsd-user/arm/target_arch_sigtramp.h
@@ -15,16 +15,17 @@ static inline abi_long setup_sigtramp(abi_ulong offset, unsigned sigf_uc,
      */
     uint32_t sigtramp_code[] = {
     /* 1 */ 0xE1A0000D,         /* mov r0, sp */
-    /* 2 */ 0xE59F700C,         /* ldr r7, [pc, #12] */
-    /* 3 */ 0xEF000000 + sys_sigreturn, /* swi (SYS_sigreturn) */
-    /* 4 */ 0xE59F7008,         /* ldr r7, [pc, #8] */
-    /* 5 */ 0xEF000000 + sys_exit,      /* swi (SYS_exit)*/
-    /* 6 */ 0xEAFFFFFA,         /* b . -16 */
-    /* 7 */ sys_sigreturn,
-    /* 8 */ sys_exit
+    /* 2 */ 0xE2800000 + sigf_uc,   /*  add r0, r0, #SIGF_UC */
+    /* 3 */ 0xE59F700C,         /* ldr r7, [pc, #12] */
+    /* 4 */ 0xEF000000 + sys_sigreturn, /* swi (SYS_sigreturn) */
+    /* 5 */ 0xE59F7008,         /* ldr r7, [pc, #8] */
+    /* 6 */ 0xEF000000 + sys_exit,      /* swi (SYS_exit)*/
+    /* 7 */ 0xEAFFFFFA,         /* b . -16 */
+    /* 8 */ sys_sigreturn,
+    /* 9 */ sys_exit
     };
 
-    for (i = 0; i < 8; i++) {
+    for (i = 0; i < 9; i++) {
         tswap32s(&sigtramp_code[i]);
     }