Проблема с SYSCALL и SYSENTER в длинном режиме
mov ecx, 0xC0000080
rdmsr
or eax, 1
wrmsr
mov ecx, 0xC0000081
mov edx, (CODE_SELECTOR shl 16) or APP_CODE_SELECTOR
xor eax, eax
wrmsr
mov ecx, 0xC0000082
xor edx, edx
mov eax, syscall_entry
wrmsr
mov ecx, 0xC0000084
mov eax, 0x202
wrmsr
; Настройка процессора для SYSENTER/SYSEXIT
mov ecx, 0x174
xor edx, edx
mov eax, CODE_SELECTOR
wrmsr
mov ecx, 0x175
mov eax, kernel_stack_top
wrmsr
mov ecx, 0x176
mov eax, sysenter_entry
wrmsr
...
syscall_entry:
sysret
...
sysenter_entry:
sysexit
различие в том что у Intel syscall/sysret можно выполнить только в long mode, а у AMD в обоих режимах. почитай внимательно маны (оба). С командой c sysexit всё ясно - нужен префикс REX.W Но возникает серьёзная непонятка с sysret, насколько я понял, именно в этом и у тебя косяк.
из интеловского мана: Опкод у sysret только один, т.е. не указаны какие-либо префиксы, но при этом написано следующее
In a return to 64-bit mode using Osize 64, SYSRET sets the CS selector value to MSR
IA32_STAR[63:48] +16. The SS is set to IA32_STAR[63:48] + 8.
SYSRET transfer control to compatibility mode using Osize 32. The CS selector value
is set to MSR IA32_STAR[63:48]. The SS is set to IA32_STAR[63:48] + 8.
Вопрос: как указать размер операнда 64 бита?
Я сам хотел лично экспериментально во всём убедиться и проверить, да всё руки не доходят...
У меня пока так и не получилось заставить работать программу потому, что она падает на первой же инструкции после возврата (притом не важно на какой). Отпишусь, как заставлю работать :) (глупая ошибка скорее всего)
PS. Кстати, кто собирается писать, не забудьте о флаге в MSR регистре IA32_EFER разрешающем эти инструкции (я три часа думал, почему у меня программа падает на инструкции sysret, пока не вспомнил про этот бит).
У меня пока так и не получилось заставить работать программу потому, что она падает на первой же инструкции после возврата (притом не важно на какой). Отпишусь, как заставлю работать :) (глупая ошибка скорее всего)
да, действительно глупая ошибка: забыл выставить флаг U/S в структурах описывающих страницы.
В "прицепе" программа на FASM с демонстрацией использования инструкций syscall/sysret. Открываем файл LM.asm и компилируем его (код 64-битного режима в файле LM_CODE) скидываем файл LM.exe на дискету и загружаем DOS, после загрузки DOS запускаем программу. Кому-то покажется что это изврат, но лично мне так удобнее.