qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] Fix ABI incompatibility between Qemu-aarch64 an


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH] Fix ABI incompatibility between Qemu-aarch64 and Linux Kernel in signal handling.
Date: Mon, 2 Feb 2015 14:23:48 +0000

On 2 February 2015 at 08:23, Maxim Ostapenko
<address@hidden> wrote:
> Sorry, missed ML.

You missed qemu-devel as well :-)

> On 02/02/2015 12:20 PM, Maxim Ostapenko wrote:
>>
>> Hi,
>>
>> this patch fixes https://bugs.launchpad.net/qemu/+bug/1416988.
>>
>> There is a small ABI incompatibility between Qemu-aarch64 and Linux Kernel
>> 3.19 caused by wrong size of struct target_siginfo in Qemu. This tiny patch
>> fixes the issue.
>>
>> -Maxim
>>
>> From 1d662e325d004bce2d640cfea5b337c92c7feca2 Mon Sep 17 00:00:00 2001
>> From: Max Ostapenko <address@hidden>
>> Date: Mon, 2 Feb 2015 12:03:20 +0400
>> Subject: [PATCH] linux-user: wrong TARGET_SI_PAD_SIZE value for some
>> targets.
>>
>> Fix TARGET_SI_PAD_SIZE for S390X, SPARC, ALPHA and AARCH64 to correspond
>> Linux Kernel 3.19 c59c961ca511dc7ee2f4f7e9c224d16f5c76ca6e revision.

Thanks for this patch. I'm afraid that to apply it we need a
Signed-off-by: line from you that certifies that you're OK to
contribute it. (This is the same as Linux kernel patches; see
the "Patch emails must include a Signed-off-by: line" section in
http://wiki.qemu.org/Contribute/SubmitAPatch ).

>> ---
>>  linux-user/syscall_defs.h | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
>> index ebb3be1..b95a0b2 100644
>> --- a/linux-user/syscall_defs.h
>> +++ b/linux-user/syscall_defs.h
>> @@ -655,7 +655,12 @@ typedef struct {
>>  #endif
>>
>>  #define TARGET_SI_MAX_SIZE    128
>> +#if defined(TARGET_S390X) || defined(TARGET_SPARC) \
>> +   || defined(TARGET_ALPHA) || defined(TARGET_AARCH64)

I don't think this ifdef is correct. For instance for sparc
the kernel defines things differently for 32 and 64 bit.

In fact as far as I can tell for all architectures the
kernel defines __ARCH_SI_PREAMBLE_SIZE to (4 * sizeof(int))
for 64 bit and (3 * sizeof(int)) for 32 bit.

>> +#define TARGET_SI_PAD_SIZE    ((TARGET_SI_MAX_SIZE/sizeof(int)) - 4)
>> +#else
>>  #define TARGET_SI_PAD_SIZE    ((TARGET_SI_MAX_SIZE/sizeof(int)) - 3)
>> +#endif

So I would suggest

#if TARGET_ABI_BITS == 32
#define TARGET_SI_PREAMBLE_SIZE (3 * sizeof(int))
#else
#define TARGET_SI_PREAMBLE_SIZE (4 * sizeof(int))
#endif

#define TARGET_SI_PAD_SIZE ((TARGET_SI_MAX_SIZE -
TARGET_SI_PREAMBLE_SIZE) / sizeof(int))

which should give us the correct answer for all archs and
configurations (including I think the 32-bit-on-64-bit
setups like sparc32plus). It also rephrases the
calculation to match what the kernel uses.

thanks
-- PMM



reply via email to

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