Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Jul 2013 18:54:40 +0000
From:      Damjan Jovanovic <damjan.jov@gmail.com>
To:        Hans Petter Selasky <hps@bitfrost.no>
Cc:        freebsd-usb@freebsd.org
Subject:   Re: COMPAT_32BIT libusb ABI problem
Message-ID:  <CAJm2B-nBTKUw42U_6OkLoYEZg8Fwd9J1zeVwZvgEj5Z_gLscrg@mail.gmail.com>
In-Reply-To: <51F0C193.4000104@bitfrost.no>
References:  <CAJm2B-mfidBre0tCwJg=6OirBtdgvxCTrGGVX-3kqQ8vYf1kFw@mail.gmail.com> <51F0C193.4000104@bitfrost.no>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jul 25, 2013 at 6:11 AM, Hans Petter Selasky <hps@bitfrost.no> wrote:
> On 07/24/13 22:09, Damjan Jovanovic wrote:
>>
>> Hi
>>
>> The ioctl:
>> #define USB_FS_INIT             _IOW ('U', 195, struct usb_fs_init)
>> when used by a COMPAT_32BIT libusb on amd64, fails (causing
>> libusb_open() to fail) due to:
>>
>> freebsd32_ioctl(0x6,0x800c55c3,0xffffc710,0x0,0x0,0x0) ERR#25
>> 'Inappropriate ioctl for device'
>> but when hacked a bit:
>> freebsd32_ioctl(0x6,0x801055c3,0xffffc710,0x0,0x0,0x0) = 0 (0x0)
>>
>> because sizeof(struct usb_fs_init) is 12 bytes on i386, and 16 bytes on
>> amd64.
>>
>> But the failure of even libusb_open() - a fundamental libusb function
>> - must mean that the COMPAT_32BIT libusb never worked. Can we please
>> take this opportunity to kill it and do a real 32 bit compatibility
>> layer in the kernel that will work from 32 bit chroots and statically
>> linked 32 bit binaries? I'll help.
>
>
> Hi,
>
> How did you compile it? Is the structure the same size, compiled with GCC
> and LLVM?

GCC 4.2.1
"gcc file.c -o file -lusb" in a 32 bit chroot = 12 bytes
"gcc file.c -o file -lusb" 64 bit = 16 bytes

Clang 3.1
"clang file.c -o file -lusb" in a 32 bit chroot = 12 bytes
"clang file.c -o file -lusb" 64 bit = 16 bytes

The "uint8_t ep_index_max" field at the end of struct usb_fs_init must
be getting padded to a 4 byte boundary on 32 bit, and 8 byte boundary
on 64 bit.

> The LIB32 for USB has been tested. I did a quick test and found on 9-stable:
>
> cc -m32 -I . -L /usr/lib32 -lusb usbconfig.c dump.c
> env LD_PRELOAD=/usr/lib32/libusb.so ./a.out
> ugen0.1: <UHCI root HUB Intel> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps)
> pwr=SAVE (0mA)
> ugen1.1: <UHCI root HUB Intel> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps)
> pwr=SAVE (0mA)
>
> ...

But usbconfig uses the libusb20 API and never seems to get to that broken ioctl.

> Your approach requires much more code. It is not just about some structures,
> but also about code accessing those structures. Feel free to submit a patch
> however.

I'll see what I can do.

> I would rather fix this by adding the proper __aligned() to the structures
> in question.

Do that in the meanwhile?

> --HPS
>

Damjan



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJm2B-nBTKUw42U_6OkLoYEZg8Fwd9J1zeVwZvgEj5Z_gLscrg>