elenbert
@elenbert

Arm ассемблер в ядре Linux?

Добрый день! Ковыряясь в сорцах ядра Linux, под ARM архитектуру, нашел такой код, использующийся в функции copy_from_user:

#define __range_ok(addr,size) ({ \<br/>
 unsigned long flag, roksum; \<br/>
 __chk_user_ptr(addr); \<br/>
 __asm__(&quot;adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0&quot; \<br/>
 : &quot;=&r&quot; (flag), &quot;=&r&quot; (roksum) \<br/>
 : &quot;r&quot; (addr), &quot;Ir&quot; (size), &quot;&quot; (current_thread_info()-&gt;addr_limit) \<br/>
 : &quot;cc&quot;); \<br/>
 flag; })<br/>



Никак не могу в нем до конца разобраться. Я уже задавал вопрос на stackoverflow, там мне дали ссылку на документацию и пару полезных советов, это немного прояснило ситуацию. Дело в том, что тут используется вычитание с переносом, соответственно активно используется Carry flag.

Как я понимаю данный код:

Складываем значение addr и size, результат попадает в roksum (?)

Вычитаем с переносом значение addr_limit из roksum, но только если carry flag чист (?), результат попадает. По итогу операции устанавливаем или не устанавливаем этот же carry flag.

Если carry flag не был установлен — перемещаем значение 0, в регистр r0.


Что не понятно: где и как используется flag, а так же как интерпретируется результат sbcccs, т.е. если произошло переполнение — ставим флаг carry? И какое значение, по итогу, отдается в качестве результата?


Надеюсь, что кто-то поможет разобраться в данном вопросе.


Спасибо!
  • Вопрос задан
  • 3310 просмотров
Решения вопроса 1
apangin
@apangin
flag используется как возвращаемое значение (обратите внимание на последнюю строчку).
В результате, __range_ok вернет 0 тогда и только тогда, когда addr + size <= addr_limit, и при этом не произошло переполнения при сложении.

Работает это так:
0. flag = addr_limit (предполагается, что addr_limit != 0);
1. roksum = addr + size;
2. если в п.1 не произошло переполнения, то roksum = roksum — addr_limit — 1;
3. если в после п.2 rok_sum >= 0, то flag = 0
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы