Читаю описание команды sysret, в интеловском мануале. В таблице опкод только один 0F 07, так же написано что интрукция может быть выполнена только в 64-битном режиме. Написано, что можно вернуться в режим совместимости. (впринципе, это как-то не логично потому что syscall на процессоре Intel нельзя вызвать ) Вопрос: как сделать так чтобы проц вернулся в режим совместимости? Вернее, как сделать так чтобы размер операнда был 32 бита?
а как он узнает что помещать в регистр CS? IA32_STAR[63:48]+16 или просто IA32_STAR[63:48]. в общем, я тут подумал, надо писать прогу и тестить
rpy3uH Хм, полистал мануалы. Кстати, советую почитать AMD'шный, там поподробней написано. Таки такая фигня имеет место быть. Надо еще посмотреть и подумать, мне казалось, что все проще А насчет Сделать-то можно, хотя бы через REX, но мне сдается, все должно быть проще...
читал. увидел фигу. читану ещё раз. так ещё косяк в том, что на AMD процах инструкции syscall/sysret можно юзать и в защищённом режиме... смысл в том, что обычно в таблице опкодов пишется, с камими префиксами его можно употребить
В общем, если по AMD, то всё пучком. У них эту инструкцию можно выполнять в режиме совместимости. Т.е. если её выполнить в режиме совместимости и в ring0, то и возврат произойдёт в режим совместимости в ring3.
ну не знаю. ну у него написано что интрукцию sysret нельзя вызывать в Compatibility mode. именно это меня и смутило.
Пес его знает. Я, честно говоря так и не понял, можно или нельзя. По идее - можно. Но этот код можно будет выполнять только в compatibility. Потому как в native 32 syscall у Intel'а не работает.
убедился экспериментально: rex.w sysret (48h 0Fh 07h) - возврат в 64 битный режим sysret (0Fh 07h) - возврат в режим совместимости
процессор нам не даёт такой возможности, поэтому придётся вручную. ну я думаю это не проблема. можно например, в регистр eax заносить какое-нибудь значение чтобы указать обработчику syscall откуда был вызов и так далее и тому подобное.
блин, нельзя редактировать.... кстати, если учесть что при выполнении syscall RIP -> RCX, RFLAGS -> R11, то можно определить по косвенным признакам, например, можно определить по обратному адресу