qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [Qemu-devel] qemu-pcc 2.8.0 linux-user segfaults


From: Laurent Vivier
Subject: Re: [Qemu-ppc] [Qemu-devel] qemu-pcc 2.8.0 linux-user segfaults
Date: Thu, 2 Feb 2017 00:42:29 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0

Le 01/02/2017 à 23:30, David Gibson a écrit :
> On Wed, Feb 01, 2017 at 03:25:05PM +0000, Peter Maydell wrote:
>> On 30 January 2017 at 23:52, Sam Bobroff <address@hidden> wrote:
>>>> On 01/16/2017 03:56 PM, Aníbal Limón wrote:
>>>>> I'm trying to upgrade qemu to 2.8.0 in Openembedded-core and segfaults
>>>>> in qemu-ppc when is executing:
>>
>>> I've recently encountered a similar problem and I've posted a fix. If
>>> you'd like to try it, it's here:
>>>
>>> https://lists.gnu.org/archive/html/qemu-ppc/2017-01/msg00413.html
>>
>> Hmm, I missed that patch (it doesn't seem to have made it
>> to the qemu-devel list), but it isn't correct, I'm afraid.
>> In the patch for handling TARGET_USER_ESIGRETURN you must
>> not change the nip register, because we will have just
>> set it from the signal context that the guest provided
>> to the sigreturn syscall. (The patch as it stands will
>> cause us to reexecute an instruction after return from
>> a signal handler, which isn't going to go very well).

I think commit bd6fefe has already made the change in
target-ppc/excp_helper.c:

     case POWERPC_EXCP_SYSCALL:   /* System call exception
     */
         dump_syscall(env);
         lev = env->error_code;

+        /* We need to correct the NIP which in this case is supposed
+         * to point to the next instruction
+         */
+        env->nip += 4;
+
         /* "PAPR mode" built-in hypercall emulation */
         if ((lev == 1) && cpu_ppc_hypercall) {
             cpu_ppc_hypercall(cpu);

And target/ppc/translate.c:

#if defined(CONFIG_USER_ONLY)
#define POWERPC_SYSCALL POWERPC_EXCP_SYSCALL_USER
#else
#define POWERPC_SYSCALL POWERPC_EXCP_SYSCALL
#endif

So I guess the fix should be only to revert the
POWERPC_EXCP_SYSCALL_USER change of bd6fefe with:

@@ -2001,9 +2001,9 @@ void cpu_loop(CPUPPCState *env)
                              env->gpr[5], env->gpr[6], env->gpr[7],
                              env->gpr[8], 0, 0);
             if (ret == -TARGET_ERESTARTSYS) {
+                env->nip -= 4;
                 break;
             }
-            env->nip += 4;
             if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) {
                 /* Returning from a successful sigreturn syscall.
                    Avoid corrupting register state.  */

Not sure anyway...

Laurent




Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]