OSDev
http://osdev.su/

Баги
http://osdev.su/viewtopic.php?f=18&t=496
Страница 2 из 3

Автор:  grindars [ 10 май 2012, 11:39 ]
Заголовок сообщения:  Re: Баги

Еще один баг в QEMU 1.0.1. Другие эмуляторы (в т.ч. VirtualBox) не подвержены.

Ошибка в инструкции sysret. Псевдокод для возврата в 64-битный режим:
Код:
EFLAGS ← R11;
CPL ← 0x3;
CS(SEL) ← IA32_STAR[63:48] + 16;
CS(PL) ← 0x3;
SS(SEL) ← IA32_STAR[63:48] + 8;
SS(PL) ← 0x3;
RIP ← RCX;


Здесь видно, что после загрузки селектора проц принудительно устанавливает PL в 3. QEMU же этого не делает. В результате, если в IA32_STAR перед возвратом было 0x10, то в SS вместо 0x1B окажется 0x18, и задача упадет с #GP.

Обойти ошибку можно, прибавив к значению в IA32_STAR 3. На реальных процах и других эмуляторах это никак не влияет на результат работы инструкции, а в QEMU - прогружает верный PL.

Автор:  Yoda [ 11 май 2012, 10:21 ]
Заголовок сообщения:  Re: Баги

А чего вы в багтрэк QEMU не постите?
Я сообщал об ошибках авторам NASM, DMDE, Bochs, - все оперативно исправляли баги.

Автор:  grindars [ 11 май 2012, 10:56 ]
Заголовок сообщения:  Re: Баги

Yoda писал(а):
А чего вы в багтрэк QEMU не постите?


Даже если я запостю и они исправят, то мне-то легче не станет: останутся старые версии (вроде сборок под винду), которые все равно придется поддерживать.

Автор:  Yoda [ 11 май 2012, 12:57 ]
Заголовок сообщения:  Re: Баги

Аааа, всё-таки официально винда не поддерживается...
жаль.

PS.
Ну хотя бы чтобы осчастливить пользователей Linux.

Автор:  grindars [ 11 май 2012, 13:05 ]
Заголовок сообщения:  Re: Баги

QEMU официально поддерживает винду (компилируется и всё такое), но не предоставляет официальных сборок. Чтобы пользоваться им под виндой, его надо или скомпилировать самому (чего большинство пользователей винды делать не будет), или найти готовую сборку сомнительной свежести.

Автор:  DJ PhoeniX [ 14 май 2012, 00:17 ]
Заголовок сообщения:  Re: Баги

Таки я на них сорвался. Люблю материть техподдержку, особенно иностранную, особенно когда они отмазываются...

Автор:  Yoda [ 14 май 2012, 10:09 ]
Заголовок сообщения:  Re: Баги

Ну это ты зря. До грубостей скатываться не стоит, обычно грубость субъективно настраивает против персоны и мешает достижению поставленной цели.

Автор:  Bargest [ 21 май 2012, 23:01 ]
Заголовок сообщения:  Re: Баги

Прокачал ось, тестируя на компе с множеством залоченных ядер. Теперь запускается в куеме на 167 ядрах.
При выставлении 168 куема говорит так:
Вложение:
121.jpg
121.jpg [ 55.68 КБ | Просмотров: 7976 ]

Собственно, на этом загрузка заканчивается. Даже до моей MBRки не доходит видимо.

Автор:  pavia [ 22 май 2012, 05:32 ]
Заголовок сообщения:  Re: Баги

Цитата:
Ошибка в инструкции sysret. Псевдокод для возврата в 64-битный режим:

У Intel и AMD эти инструкции видут себя по разному. Перепроверь вдруг не ошибка а просто проц AMD эмулируется?

Автор:  grindars [ 22 май 2012, 09:12 ]
Заголовок сообщения:  Re: Баги

pavia писал(а):
Цитата:
Ошибка в инструкции sysret. Псевдокод для возврата в 64-битный режим:

У Intel и AMD эти инструкции видут себя по разному. Перепроверь вдруг не ошибка а просто проц AMD эмулируется?


Еще веселее. Интелу что, больше делать было нечего? У них и так своя пара sysenter/sysexit есть, так они еще и криво AMD-овскую скопировали.

Чуть позже приложу образ, у кого есть реальный амд - проверьте, пожалуйста. На интелах пашет.

UPD: не, не в этом дело.

AMD SYSCALL and SYSRET Instruction Specification писал(а):
New selectors are loaded without any checking performed as follows:
n Bits [63–48] of the STAR register specify the selector that is copied into the CS
register.
n Bits [63–48]+1000b of the STAR register specify the selector that is copied into
the SS register.
Note: This effectively increments the index field of the CS selector such that the
resultant SS selector points to the next descriptor in a descriptor table, after the
CS descriptor.
n Bits [1–0] of the SS register are set to 11b (RPL of 3) regardless of the value of bits
[49–48] of the STAR register.
The CS and SS registers must not be modified by the operating system between the
execution of the SYSCALL instruction and its corresponding SYSRET instruction.
The CPL is set to 3 regardless of the value of bits [49–48] of the STAR register. If the
CPL is not equal to 0 when the SYSRET instruction is executed, a general protection
fault exception is generated with an error code of 0.


Тут, так же как и у интела, PL CS и SS должны загружаться в 3 на выходе.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/