OpenVZ Forum


Home » International » Russian » kernel 3.10 (64 bit), android32 & radeon kns (А оно готово для работы?)
kernel 3.10 (64 bit), android32 & radeon kns [message #51651] Sun, 14 September 2014 15:51 Go to next message
seyko2 is currently offline  seyko2
Messages: 188
Registered: February 2007
Location: Moscow
Senior Member

Привет!
Имеем рабочий 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 Go to previous messageGo to next message
seyko2 is currently offline  seyko2
Messages: 188
Registered: February 2007
Location: Moscow
Senior Member

В общем, 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 Go to previous messageGo to next message
seyko2 is currently offline  seyko2
Messages: 188
Registered: February 2007
Location: Moscow
Senior Member

Поправка: всё-таки оказался виноват драйвер 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-битных ядрах Sad
Re: kernel 3.10 (64 bit), android32 & radeon kns [message #51655 is a reply to message #51653] Mon, 15 September 2014 15:30 Go to previous message
seyko2 is currently offline  seyko2
Messages: 188
Registered: February 2007
Location: Moscow
Senior Member

Окончательный вердикт: андроид при запросе ioctl заполняет структуру radeon_info_t неправильно: в 64-битном поле vaule старшие 32 бита содержат мусор. Поэтому написал для этого запроса compat_ioctl, который чистит эти биты для 32-битных приложений.
Патч для 3.10 el7 прилагается
Previous Topic: framebuffer for ct
Next Topic: Проблема бекапа
Goto Forum:
  


Current Time: Thu Apr 18 23:23:10 GMT 2024

Total time taken to generate the page: 0.01711 seconds