Patchwork linux-user: Fix incorrect TARGET_BLKBSZGET, TARGET_BLKBSZSET

login
register
mail settings
Submitter Peter Maydell
Date July 23, 2012, 6:05 p.m.
Message ID <1343066720-21806-1-git-send-email-peter.maydell@linaro.org>
Download mbox | patch
Permalink /patch/172730/
State New
Headers show

Comments

Peter Maydell - July 23, 2012, 6:05 p.m.
The definitions for the ioctl numbers TARGET_BLKBSZGET and
TARGET_BLKBSZSET had the wrong size parameters (they are defined
with size_t, not int, even though the ioctl implementations themselves
read and write integers). Since commit 354a0008 we now have an
ioctl wrapper definition for BLKBSZGET and so on an x86-64-to-x86-64
linux-user binary we were triggering the mismatch warning in
syscall_init().

Signed-off-by: Peter Maydell <peter.maydell>
---
 linux-user/syscall_defs.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Andreas Färber - July 24, 2012, 12:02 p.m.
Am 23.07.2012 20:05, schrieb Peter Maydell:
> The definitions for the ioctl numbers TARGET_BLKBSZGET and
> TARGET_BLKBSZSET had the wrong size parameters (they are defined
> with size_t, not int, even though the ioctl implementations themselves
> read and write integers). Since commit 354a0008 we now have an
> ioctl wrapper definition for BLKBSZGET and so on an x86-64-to-x86-64
> linux-user binary we were triggering the mismatch warning in
> syscall_init().
> 
> Signed-off-by: Peter Maydell <peter.maydell>

Beep :)

> ---
>  linux-user/syscall_defs.h |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index a79b67d..0b239c4 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -832,8 +832,8 @@ struct target_pollfd {
>  #define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */
>  #define TARGET_BLKSSZGET  TARGET_IO(0x12,104)/* get block device sector size */
>  /* A jump here: 108-111 have been used for various private purposes. */
> -#define TARGET_BLKBSZGET  TARGET_IOR(0x12,112,int)
> -#define TARGET_BLKBSZSET  TARGET_IOW(0x12,113,int)
> +#define TARGET_BLKBSZGET  TARGET_IOR(0x12, 112, abi_ulong)
> +#define TARGET_BLKBSZSET  TARGET_IOW(0x12, 113, abi_ulong)
>  #define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,abi_ulong)
>                                               /* return device size in bytes
>                                                  (u64 *arg) */

For the usual suspects this looks right.
But does abi_ulong correctly handle ppc64abi32 and sparc32plus? Or is
this inside some #ifdef block?

Andreas
Peter Maydell - July 24, 2012, 12:24 p.m.
On 24 July 2012 13:02, Andreas Färber <afaerber@suse.de> wrote:
> Am 23.07.2012 20:05, schrieb Peter Maydell:
>> The definitions for the ioctl numbers TARGET_BLKBSZGET and
>> TARGET_BLKBSZSET had the wrong size parameters (they are defined
>> with size_t, not int, even though the ioctl implementations themselves
>> read and write integers). Since commit 354a0008 we now have an
>> ioctl wrapper definition for BLKBSZGET and so on an x86-64-to-x86-64
>> linux-user binary we were triggering the mismatch warning in
>> syscall_init().
>>
>> Signed-off-by: Peter Maydell <peter.maydell>
>
> Beep :)

Hrm, how did that happen?

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

>>  linux-user/syscall_defs.h |    4 ++--
>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
>> index a79b67d..0b239c4 100644
>> --- a/linux-user/syscall_defs.h
>> +++ b/linux-user/syscall_defs.h
>> @@ -832,8 +832,8 @@ struct target_pollfd {
>>  #define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */
>>  #define TARGET_BLKSSZGET  TARGET_IO(0x12,104)/* get block device sector size */
>>  /* A jump here: 108-111 have been used for various private purposes. */
>> -#define TARGET_BLKBSZGET  TARGET_IOR(0x12,112,int)
>> -#define TARGET_BLKBSZSET  TARGET_IOW(0x12,113,int)
>> +#define TARGET_BLKBSZGET  TARGET_IOR(0x12, 112, abi_ulong)
>> +#define TARGET_BLKBSZSET  TARGET_IOW(0x12, 113, abi_ulong)
>>  #define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,abi_ulong)
>>                                               /* return device size in bytes
>>                                                  (u64 *arg) */
>
> For the usual suspects this looks right.
> But does abi_ulong correctly handle ppc64abi32 and sparc32plus?

abi_ulong is always the size of a target's 'unsigned long'.
In this case the actual type used in the kernel's definition
of this ioctl number is 'size_t', but I believe that for
all our architectures (including the TARGET_ABI32 ones you
list) this is the same width as 'unsigned long' (though
not necessarily actually 'unsigned long'...)

-- PMM
Peter Maydell - Aug. 6, 2012, 1:02 p.m.
Ping? Patchwork URL: http://patchwork.ozlabs.org/patch/172730/

let me know if you want a v2 patch rather than just hand-fixing
the signed-off-by line snafu.

thanks
-- PMM

On 23 July 2012 19:05, Peter Maydell <peter.maydell@linaro.org> wrote:
> The definitions for the ioctl numbers TARGET_BLKBSZGET and
> TARGET_BLKBSZSET had the wrong size parameters (they are defined
> with size_t, not int, even though the ioctl implementations themselves
> read and write integers). Since commit 354a0008 we now have an
> ioctl wrapper definition for BLKBSZGET and so on an x86-64-to-x86-64
> linux-user binary we were triggering the mismatch warning in
> syscall_init().
>
> Signed-off-by: Peter Maydell <peter.maydell>
> ---
>  linux-user/syscall_defs.h |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index a79b67d..0b239c4 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -832,8 +832,8 @@ struct target_pollfd {
>  #define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */
>  #define TARGET_BLKSSZGET  TARGET_IO(0x12,104)/* get block device sector size */
>  /* A jump here: 108-111 have been used for various private purposes. */
> -#define TARGET_BLKBSZGET  TARGET_IOR(0x12,112,int)
> -#define TARGET_BLKBSZSET  TARGET_IOW(0x12,113,int)
> +#define TARGET_BLKBSZGET  TARGET_IOR(0x12, 112, abi_ulong)
> +#define TARGET_BLKBSZSET  TARGET_IOW(0x12, 113, abi_ulong)
>  #define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,abi_ulong)
>                                               /* return device size in bytes
>                                                  (u64 *arg) */
> --
> 1.7.5.4
>
>

Patch

diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index a79b67d..0b239c4 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -832,8 +832,8 @@  struct target_pollfd {
 #define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */
 #define TARGET_BLKSSZGET  TARGET_IO(0x12,104)/* get block device sector size */
 /* A jump here: 108-111 have been used for various private purposes. */
-#define TARGET_BLKBSZGET  TARGET_IOR(0x12,112,int)
-#define TARGET_BLKBSZSET  TARGET_IOW(0x12,113,int)
+#define TARGET_BLKBSZGET  TARGET_IOR(0x12, 112, abi_ulong)
+#define TARGET_BLKBSZSET  TARGET_IOW(0x12, 113, abi_ulong)
 #define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,abi_ulong)
                                              /* return device size in bytes
                                                 (u64 *arg) */