Mam problem z wywołaniem dalekiej procedury w x86-64. Tz samo wywołanie idzie gładko po przez wywołanie typu:

call far [gate_ptr]
...
gate_ptr: dd 0
             dw gate_sel

W moim przypadku mimo, że odwołuje się przez bramkę to akurat to wywołanie jest z CPL0 do CPL0.
Problem się pojawia gdy chce wrócić z tej procedury. Samo wywołanie call far powoduje odłożenie na stos argumentów o rozmiarze 64b. Jednak gdy chce powrócić z procedury instrukcją retf to próbuje ona pobierać ze stosu argumenty o rozmiarze 32b. Jak czytam w dokumentacji to powinien on mi pobierać argumenty 64b jeżeli jestem w PM64, ale coś tutaj nie gra.
Nie miałem okazji testować tego na realnym komputerze, ale na qemu i bochs sie wykrzacza.

Jeżeli natomiast przed retf wymuszę stosowanie argumentów 64b po przez przedrostek 0x48 to w bochs już mi to trawi, ale qemu nadal tego nie przepuszcza.

Może natknął się ktoś na ten problem, albo może mi jakoś doradzić co robię źle.
Deskryptory segmentów mam takie:

cs    0x00A09A0000000000
ds,ss 0x0040920000000000