Wyse S10

Полтора года назад у моего друга был день рождения.

Просто собрать обычный компьютер — не интересно.

Сначала я рассматривал варианты с каким-нибудь ARM-планшетом

Затем я вспомнил про тонкие клиенты.

Wyse S10 построен на базе процессора (теперь уже) AMD Geode GX500.

Таймер, контроллер прерываний, часы реального времени, DMA-контроллер, контроллер клавиатуры и прочие, типичные для IBM PC AT-совместимой машины контроллеры

SMM впервые появился в Intel 386SL

Даже текстовый видеорежим отсутствует у этой машины в привычном исполнении
f.seek(0x1e)
vsm_system_offset, = struct.unpack('<H', f.read(2))
f.seek(vsm_system_offset)
vsm_header = f.read(14)
vsm_sig, vsm_type, vsm_cpu, vsm_chipset, vsm_ver, vsm_len = \
  struct.unpack('<4sBBHHI', vsm_header)
print('\t'.join(['type', 'cpu', 'chipset', 'ver', 'start', 'len']))
  
Virtual Subsystem Architecture (VSA)

Сначала я попытался запустить на этой машине coreboot

Также coreboot использовался в проекте OLPC

  1. https://review.coreboot.org/cgit/blobs.git/
    tree/cpu/amd/geode_lx/gplvsa_ii
  2. .../tree/cpu/amd/geode_lx/gpl_vsa_lx_102.bin


Поскольку программатора с соответствующей кроваткой у меня не было, я решил попробовать прошиться внутрисхемно

  1. https://www.parkytowers.me.uk/thin/wyse/s10/


Дело в том, что инструкция по использованию flashrom предлагала перепрошивать не сам BIOS (который занимает 256 килобайт, восьмую часть флеш-микросхемы), а раздел, в котором хранится Wyse ThinOS (WTOS)
К счастью, разгадка этой проблемы находилась в самом сообщение об ошибке:
Found chipset "AMD CS5536". Enabling flash write...
Error while opening /dev/cpu/0/msr: No such file or directory
Did you run 'modprobe msr'?
FAILED!

Я прошил coreboot, перезагрузил устройство и, конечно же, увидел чёрный экран.

Во время конфигурации coreboot я включил отладочную консоль на последовательном порту.

я заметил, что PCI-идентификатор устройства (device id) "видеокарты" отличается от того, что показывал Tiny Core Linux в lspci с оригинальным BIOS.

у Wyse S10 микросхема флеш-памяти отображается в конец адресного пространства
001c46b0  24 49 4d 47 04 00 00 06  00 75 33 03 00 4a 75 01  |$IMG.....u3..Ju.|
001c46c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
001c46d0  4a 43 75 33 03 00 8b 0d  63 f9 10 a7 ee 20 69 7f  |JCu3....c.... i.|
001c46e0  74 58 7f c8 e6 09 28 80  a9 65 98 5e 80 45 0f 11  |tX....(..e.^.E..|
  
Структура модулей у BIOS Wyse S10 оказалась необычной — с ними не захотели работать распаковщики от биосов AWARD и AMI. К счастью, структура оказалась достаточно простой, чтобы её можно было разобрать без особого труда:
char name[4];   /* '$' and a 3-character code */
uint8_t format; /* 3 is compressed, 4 is raw */
uint32_t load_address;
uint32_t unpacked_size;
uint32_t packed_size;   /* including this 32-byte header */
char pad[15];

Если в поле format написано число 3, то модуль сжат упаковщиком JCALG1

В первом непустом модуле как раз находится VSA.

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

внедрить DOS прямо в оригинальную прошивку

решения, позволяющие запустить DOS из ROM.

проект RomOS[4], который эмулировал загрузочный диск

  1. http://rayer.g6.cz/romos/romose.htm


Я стал писать свой эмулятор диска.

Для восстановления прошивки я использовал метод "hot swap"
00000260  55 aa 01 eb 4f 00 00 6b  6d 65 61 77 00 5e b3 08  |U...O..kmeaw.^..|
00000270  6a 00 fe cb 75 fa 56 c3  1c 00 34 00 50 43 49 52  |j...u.V...4.PCIR|
  
Когда мне не удалось отладить мой эмулятор, то я решил сменить направление — раз уж я всё равно заменяю WTOS на образ дискеты, почему бы не воспользоваться уже готовым механизмом для загрузки WTOS, и не внедрить туда свой код.
00000000  fa eb 57 00 00 00 00 00  00 00 00 00 00 00 00 00  |..W.............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  71 34 01 00 08 dd 6a 00  d0 0f 0c 00              |q4....j.....    |
  
Образ WTOS начинается с трёх байт кода: cli; jmp start. Затем идёт заголовок, у которого есть всего одно поле, которое читает оригинальная прошивка - размер. Для запуска WTOS, прошивка копирует WTOS в первый мегабайт памяти, настраивает таблицу GDT, включает защищённый 32-битный режим процессора, а затем передаёт образу управление, начиная указанной выше с пары инструкций.

в реальном режиме доступно около 1 мегабайта памяти, и физический адрес получается из двух 16-битных регистров — сегментного и смещения

В защищённом режиме всё гораздо сложнее.

Но мой эмулятор был написан для реального режима

Эмулятор перехватывает int13h, сервис BIOS для работы с дисками.
00000198  81C60093          add si,0x9300
0000019C  56                push si
0000019D  52                push dx
0000019E  6AFF              push byte -0x1
000001A0  E86AFE            call 0xd
000001A3  89E6              mov si,sp
000001A5  06                push es
000001A6  16                push ss
000001A7  07                pop es
000001A8  B487              mov ah,0x87
000001AA  CD15              int 0x15
  
В случае попытки чтения, эмулятор готовит на стеке GDT, переключается в защищённый режим, копирует запрошенные сектора из флеш-памяти и нижнюю память, а затем переключается обратно в реальный режим.

С "дискеты" загружается драйвер RAM-диска, на него копируется содержимое дискеты, затем эмулятор завершает свою работу (дискете делается eject).

На RAM-диск распаковывается архив с программами — пакетный драйвер сетевой карты, TCP/IP-стек mTCP и оболочка DOS Navigator. Затем по сети скачивается меню со списком игр и запускается оболочка, которая сразу же это меню и показывает.
htget -quiet -o c:\stuffit.com http://dos.kmeaw.com/stuffit.com
:skipst
md c:\games
md c:\games\doom
c:\srdisk 8328
if errorlevel 1 reboot
echo Downloading...
htget -quiet -o c:\games\uninst.bat http://dos.kmeaw.com/games/doom/uninst.bat
echo [1/15] readme.txt
htget -quiet -o c:\games\doom\readme.txt http://dos.kmeaw.com/games/doom/readme.txt
echo [2/15] sersetup.exe
  
Выбор игры из меню приводит к скачиванию пакетного файла download.bat
:START
c:\stuffit +2 27 @45 13 +1 "c:\games\doom\start.bat dn" 13
  
Alt-X (выход), Enter (подтверждение выхода), путь к файлу start.bat и снова клавиша (Enter). start.bat запускает игру, а затем запускает оболочку обратно, и пользователь снова видит меню.
Так получается без какой-либо эмуляции процессора, почти нативно, запускать старые игры, которые (вместе с каталогом) находятся на удалённом сервере.

На сервере dos.kmeaw.com работает обычный nginx, а меню обновляется шелл-скриптом.

Из пока что нерешённых проблем:
  • не работает звук; мне не удалось найти работающую реализацию эмулятора SB16 в VSM, но судя по рекламным материалам, он существует;

Из пока что нерешённых проблем:
  • некоторые игры неправильно освобождают память

Из пока что нерешённых проблем:
  • сейвы в играх не столь полезны, как могли бы быть
Вопросы?