<div dir="ltr">
<div><div><div>Salutare,<br><br></div>In cadrul cursului 3 (primul care s-a tinut online) am primit la test urmatoarea intrebare:<br><br>```<br></div>Pentru următoarea secvență de cod, câte intrări vor fi adăugate în tabela de excepții:<br><br>char x;<br>short y;<br>int i, s = 0;<br><br><br>if (get_user(x, user_ptr_1))<br> return -EINVAL;<br>for(i = 0; i < x; i++) {<br> if (get_user(y, user_ptr_2))<br> return -EINVAL;<br> s += y;<br>}<br>```<br><br></div><div>M-am uitat putin peste implementarea `get_user` din kernel (<a href="https://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/uaccess.h#L166" target="_blank">https://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/uaccess.h#L166</a>).<br><br>Aici
se apeleaza in functie de sizeof(*ptr) (in asm volatile -> call
__get_user_%p4, ) una din functiile __get_user_ din getuser.S (<a href="https://elixir.bootlin.com/linux/v5.5.9/source/arch/x86/lib/getuser.S#L39" target="_blank">https://elixir.bootlin.com/linux/v5.5.9/source/arch/x86/lib/getuser.S#L39</a>).<br></div><div><br></div><div>Ele
sunt implementate ca functii (in asm). Se marcheaza cum am vazut la
curs instructiunea movzbl (%_ASM_AX),%edx (in cazul celei cu
sizeof(*ptr) == 1) prin label-uri, iar la finalul fisierului este chemat
macroul _ASM_EXTABLE_UA pentru fiecare tip de functie (pentru fiecare
functie __get_user_). In final, fiecare apel _ASM_EXTABLE_UA pune in sectiunea `__ex_table` un entry, folosind label-urile puse mai sus (<a href="https://elixir.bootlin.com/linux/v5.5.9/source/arch/x86/lib/getuser.S#L137">https://elixir.bootlin.com/linux/v5.5.9/source/arch/x86/lib/getuser.S#L137</a>).</div><div><br></div><div>In concluzie avand codul de la test
si presupunand ca avem un sistem pe x86_64 normal compilat putem spune ca raspunsul ar fi trebuit sa fie minim 4 entry-uri in
tabela de exceptii (cele 4 puse cu _ASM_EXTABLE_UA). Este ceva gresit in intelegerea mea? <br><br></div><div>Multumesc anticipat,<br></div><div>Ursescu Ionut</div>
</div>