kernel 3.10 (64 bit), android32 & radeon kns [message #51651] |
Sun, 14 September 2014 15:51  |
|
Привет!
Имеем рабочий android32 (с ядром 3.10, собранным для x86). Для его работы используется radeon kms. При сборке ядра в режиме x86_64 возникает проблема с этим самым kms: от android идёт запрос ioctl(DRM_RADEON_INFO), но адрес userspace-структуры, куда положить ответ -- явно неверен, и на этом всё заканчивется.
Рассматриваю radeon_ioc32.c, который предназначен для выполнения запросов ioctl от userspace32 и ничего не понимаю. Размер integer для userspace в этом случае 32, размер integer для ядра -- 64. Как можно преобоазовать структуру запроса, если в описании формата пользовательского запроса используется int вместо int32? Преобразуются только адреса. Такое впечатление, что предполагается sizeof(int)==32 и sizeof(void *) == 64 для ядра x86_64. Так оно и есть на самом деле? В любом случае в драйвере radeon чего-то не зватает для работы с userspcace32
|
|
|
Re: kernel 3.10 (64 bit), android32 & radeon kns [message #51652 is a reply to message #51651] |
Mon, 15 September 2014 07:06   |
|
В общем, android-x86 4.0-r1 (32bit) запустился из-под ядра 3.10 x86_64 el7 при использовании binder от 3.16.1. Получается, драйвер radeon не виноват. А размер integer для ядра x86-64 действительно 4 байта.
PS: жду обещанной версии 3.10 от openvz. Вроде к осени обещали. Хотя бы unstable.
|
|
|
Re: kernel 3.10 (64 bit), android32 & radeon kns [message #51653 is a reply to message #51652] |
Mon, 15 September 2014 09:28   |
|
Поправка: всё-таки оказался виноват драйвер radeon. Просто ранее при поиске причины ошибки первым делом поправил в radeon_kms.c (функция radeon_info_ioctl) строку
// value_ptr = (uint32_t *)((unsigned long)info->value);
value_ptr = (uint32_t *)((unsigned)info->value);
но не проверил после этого работу с android-4.0 (запускал версию 4.4) Причина проблемы: в 64 битном ядре ioctl для совместимости с x86 выделяет временную память и преобразует 32-структуру в 64-структуру для дальнейшей обработки. Эта временная память размещается в верхних адресах памяти (как и само ядро). И обрезание этого адреса приводит к ошибке. Проявляется только на 64-битных ядрах 
|
|
|
Re: kernel 3.10 (64 bit), android32 & radeon kns [message #51655 is a reply to message #51653] |
Mon, 15 September 2014 15:30  |
|
Окончательный вердикт: андроид при запросе ioctl заполняет структуру radeon_info_t неправильно: в 64-битном поле vaule старшие 32 бита содержат мусор. Поэтому написал для этого запроса compat_ioctl, который чистит эти биты для 32-битных приложений.
Патч для 3.10 el7 прилагается
|
|
|