Skip to contentSkip to conversation

linux-user/main.c: Remove redundant end_exclusive()

PATCH Superseded Chen Gang S 2 participants 3 messages Jan 23, 2015

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 linux-user/main.c: Remove redundant end_exclusive()

start/end_exclusive() need be pairs, except the start_exclusive() in stop_all_tasks() which is only used by force_sig(), which will be abort. So at present, start_exclusive() in stop_all_task() need not be paired.

So need remove end_exclusive() after queue_signal(). If could really return from queue_signal(), which meant stop_all_task() is not called ( at least, not called in time), the next end_exclusive() would be issue.

Also use TARGET_SIGSEGV instead of SIGSEGV, since queue_signal() is for TARGET_*, at present, queue_signal() is a normal function which may call force_sig(), or return (may kill pid or queue signal, then return).

---
 linux-user/main.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
linux-user/main.c +1 -3
index 8c70be4..a410a17 100644
@@ -517,14 +517,12 @@ segv:
     end_exclusive();
     /* We get the PC of the entry address - which is as good as anything,
        on a real kernel what you get depends on which mode it uses. */
-    info.si_signo = SIGSEGV;
+    info.si_signo = TARGET_SIGSEGV;
     info.si_errno = 0;
     /* XXX: check env->error_code */
     info.si_code = TARGET_SEGV_MAPERR;
     info._sifields._sigfault._addr = env->exception.vaddress;
     queue_signal(env, info.si_signo, &info);
-
-    end_exclusive();
 }
 
 /* Handle a jump to the kernel code page.  */
Signature · 1 line
1.9.3 (Apple Git-50)
#1 lore raw
Quoted 11 lines · Chen Gang S

start/end_exclusive() need be pairs, except the start_exclusive() in stop_all_tasks() which is only used by force_sig(), which will be abort. So at present, start_exclusive() in stop_all_task() need not be paired.

So need remove end_exclusive() after queue_signal(). If could really return from queue_signal(), which meant stop_all_task() is not called ( at least, not called in time), the next end_exclusive() would be issue.

Also use TARGET_SIGSEGV instead of SIGSEGV, since queue_signal() is for TARGET_*, at present, queue_signal() is a normal function which may call force_sig(), or return (may kill pid or queue signal, then return).

It would be helpful to mention the affected target architecture (and/or function name) in the commit message, because main.c covers a lot of ground.

Quoted 10 lines
---
 linux-user/main.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
linux-user/main.c +0 -0
index 8c70be4..a410a17 100644

linux-user/main.c segv: · line 520

Quoted 5 lines
linux-user/main.c +1 -1
@@ -517,14 +517,12 @@ segv:
     end_exclusive();
     /* We get the PC of the entry address - which is as good as anything,
        on a real kernel what you get depends on which mode it uses. */
-    info.si_signo = SIGSEGV;
+    info.si_signo = TARGET_SIGSEGV;

I think this is a correct bug fix, but it's not really related to the main point of the patch (fixing end_exclusive()) and there are actually a lot of instances of it in this file and possibly others. Could you fix it (and those others) in a separate patch, please?

linux-user/main.c segv: · line 526

Quoted 8 lines
linux-user/main.c +0 -2
     info.si_errno = 0;
     /* XXX: check env->error_code */
     info.si_code = TARGET_SEGV_MAPERR;
     info._sifields._sigfault._addr = env->exception.vaddress;
     queue_signal(env, info.si_signo, &info);
-
-    end_exclusive();
 }

This change is correct.

thanks
-- PMM

#2 lore raw
Quoted 9 lines · Peter Maydell
Quoted 8 lines · Chen Gang S

start/end_exclusive() need be pairs, except the start_exclusive() in stop_all_tasks() which is only used by force_sig(), which will be abort. So at present, start_exclusive() in stop_all_task() need not be paired.

So need remove end_exclusive() after queue_signal(). If could really return from queue_signal(), which meant stop_all_task() is not called ( at least, not called in time), the next end_exclusive() would be issue.

Quoted 8 lines
Quoted 3 lines

Also use TARGET_SIGSEGV instead of SIGSEGV, since queue_signal() is for TARGET_*, at present, queue_signal() is a normal function which may call force_sig(), or return (may kill pid or queue signal, then return).

It would be helpful to mention the affected target architecture (and/or function name) in the commit message, because main.c covers a lot of ground.

OK, thanks, I shall notice about it, next.

Quoted 5 lines
Quoted 5 lines
---
 linux-user/main.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)
Quoted 17 lines

linux-user/main.c segv: · line 520

Quoted 10 lines
linux-user/main.c +1 -1
index 8c70be4..a410a17 100644
@@ -517,14 +517,12 @@ segv:
     end_exclusive();
     /* We get the PC of the entry address - which is as good as anything,
        on a real kernel what you get depends on which mode it uses. */
-    info.si_signo = SIGSEGV;
+    info.si_signo = TARGET_SIGSEGV;

I think this is a correct bug fix, but it's not really related to the main point of the patch (fixing end_exclusive()) and there are actually a lot of instances of it in this file and possibly others. Could you fix it (and those others) in a separate patch, please?

OK, thanks, I shall send related patch for it within 2 days.

Quoted 11 lines

linux-user/main.c segv: · line 526

Quoted 8 lines
linux-user/main.c +0 -2
     info.si_errno = 0;
     /* XXX: check env->error_code */
     info.si_code = TARGET_SEGV_MAPERR;
     info._sifields._sigfault._addr = env->exception.vaddress;
     queue_signal(env, info.si_signo, &info);
-
-    end_exclusive();
 }

This change is correct.

OK, thanks.

Signature · 3 lines
Chen Gang

Open, share, and attitude like air, water, and life which God blessed