Команда sysret

Тема в разделе "WASM.X64", создана пользователем rpy3uH, 22 мар 2009.

  1. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Читаю описание команды sysret, в интеловском мануале.
    В таблице опкод только один 0F 07, так же написано что интрукция может быть выполнена только в 64-битном режиме.
    Написано, что можно вернуться в режим совместимости. (впринципе, это как-то не логично потому что syscall на процессоре Intel нельзя вызвать ) Вопрос: как сделать так чтобы проц вернулся в режим совместимости? Вернее, как сделать так чтобы размер операнда был 32 бита?
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Нельзя в 32-м режиме. В х64 можно.

    Дык, должен нормально возвращаться без всяких извращений.
     
  3. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    а как он узнает что помещать в регистр CS? IA32_STAR[63:48]+16 или просто IA32_STAR[63:48].

    в общем, я тут подумал, надо писать прогу и тестить
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    rpy3uH
    Хм, полистал мануалы. Кстати, советую почитать AMD'шный, там поподробней написано.
    Таки такая фигня имеет место быть. Надо еще посмотреть и подумать, мне казалось, что все проще :dntknw:
    А насчет
    Сделать-то можно, хотя бы через REX, но мне сдается, все должно быть проще...
     
  5. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    читал. увидел фигу. читану ещё раз. :) так ещё косяк в том, что на AMD процах инструкции syscall/sysret можно юзать и в защищённом режиме...

    смысл в том, что обычно в таблице опкодов пишется, с камими префиксами его можно употребить
     
  6. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    В общем, если по AMD, то всё пучком. У них эту инструкцию можно выполнять в режиме совместимости. Т.е. если её выполнить в режиме совместимости и в ring0, то и возврат произойдёт в режим совместимости в ring3.
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    А почему у Intel'а должно быть по-другому?
     
  8. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    ну не знаю.
    ну у него написано что интрукцию sysret нельзя вызывать в Compatibility mode. именно это меня и смутило.
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Пес его знает. Я, честно говоря так и не понял, можно или нельзя. По идее - можно. Но этот код можно будет выполнять только в compatibility. Потому как в native 32 syscall у Intel'а не работает.
     
  10. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    убедился экспериментально:
    rex.w sysret (48h 0Fh 07h) - возврат в 64 битный режим
    sysret (0Fh 07h) - возврат в режим совместимости
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    rpy3uH
    Э-э-э... А как понимать, откуда был вызов?
     
  12. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    процессор нам не даёт такой возможности, поэтому придётся вручную. ну я думаю это не проблема. можно например, в регистр eax заносить какое-нибудь значение чтобы указать обработчику syscall откуда был вызов и так далее и тому подобное.
     
  13. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    блин, нельзя редактировать....


    кстати, если учесть что при выполнении syscall RIP -> RCX, RFLAGS -> R11, то можно определить по косвенным признакам, например, можно определить по обратному адресу