#0 - smola - 2024-02-21 10:43
3dfx glide2x.dll 25-years old bug in the system [affected all v3 cards with 8MB vmem]
[watek przeniesiony z napraw pieknosci vga, tutaj bardziej pasuje, na koncu link do vogons z wersja EN]
3dfx Velocity 100 AGP part#2 [25-years old bug in the system] <brak linka>
info:
* okazalo sie ze moja velocity wcale nie dziala do konca tak jak powinna, poniewaz w niektorych starszych grach robi powazna sieczke na ekranie, problem opisal i zglosil na vogons nasz lukas12p, dotyczyl on zle dzialajacych gier nfs2se oraz carmagedon2, ja rowniez doswiadczylem problemu z gra unreal gold, dzialala w trybie glide ale nie bylo mgly... za to nfs3 dzialal ok - dziwne
* to sklonilo mnie do przyjrzenia sie problemowi, na pierwszy ogien poszedl unreal, bo jego mialem, po wertowaniu internetu problem z brakiem mgly zostal rozwiazany przez dodanie do rejestru wpisu:
{
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Display\xxxx\Glide
key: FX_GLIDE_NUM_TMU
value: 2
} klucz typu string, xxxx moze byc rozne, zaleznie ile kart graficznych bylo instalowane wczesniej, normalnie 0000, u mnie byl 0018 ale to dysk testowy na rozne konfigi, to wiadomka
* to rozwiazalo problem z unreal, ale nie pomoglo zupelnie z 2 poprzednimi grami
* mialem tylko nfs2se, wiec zaczalem grzebac w sdk glide, odpalilem ide i zdisasmowalem exeka nfs2se, znalazlem miejsce gdzie jest init fog table, wylaczylem ja w nowym exeku, test poszedl na v2 bo tam dziala mgla poprawnie, i faktycznie jest wylaczona, gra wyglada deko gorzej ale dziala ok, nastepnie zamienilem v2 na velocity i... gra odpalila bez mgly ale dziala ok, brzydka sieczka znikla
* porownujac screenshoty z fog on/off wydalo mi sie, ze z-bufor dla mgly jest odwrocony, bo w tle/oddali obraz byl ok z teksturami ale crap na bliskich obiektach, doszedlem do wniosku ze mgla jest "odwrocona"
* sprawdzilem jeszcze v3 2000 16MB i tam problemu nie bylo - bardzo dziwne
* uzyte testy na plikach z diagnostyki dla 3dfx, dla glide2 crap z mgla ale dla glide3 ok - to tez bardzo dziwne, bo w koncu to te same karty sa
* rzezba, zapiski z chata z kumplem, ktoremu relacjonowalem na zywo postep prac
{
* wiele prob z odwracaniem petli dla generowania wartosci dla map fogtable i tylko niewielkie roznice i polepszenia, to wciaz nie to
* w miedzyczasie zrobione wiele inline patchy, problem z miejscem w kodzie exe, finalnie ogarniete w hiew przez uzycie call/jmp, bo nie chcialem budowac calego nowego srodowiska dla debuggera, kompilatora masm, rekompilacji i klejeniem exeka
* spekulacje, ze blad jednak jest w gpu, bo zaimplementowali odwrotnie tablice do mgly, w grze jest lacznie 20 tablic dla roznych przypadkow, kazda ma 64 bajty i zawiera wartosci z przedzialu 0-ff, jest funkcja w glide2x.dll ktora to generuje i jest uzywana i trzeba petle odwrocic aby generowala ta tablice w odwrotnej kolejnosci, tylko bajtow brakuje na inline patch
* ale z 2 strony moze bym mogl naklecic kod do odwracania samej tablicy juz po jej wygenerowaniu, wtedy nie musze patchowac glide, tylko wklejka w exeku gry... taka funkcja reverse-order po wykonaniu org. procki, hmmm
* kolejne akcje: wyczailem algo na inwertowanie wartosci indeksu z przedzialu 0-63, po co mam sie p* z odwracaniem petli, jak moge glowna funkcje do wyliczania wartosci zmienic
wystarczy dla danej 0-63 zrobic not i potem add 64, idealnie odwraca wartosc, do tego mam 15 bajtow wolne, bo jest align16 w exeku, to sie powinnem zmiescic 
* i znow: dodalem patcha w glide2x.dll do generowania fog table w api i czesciowo sie poprawilo, bugi w gpu na 100%
* i zniechecenie: powoli odpuszczam ta mgle w nfs2, sporo testow i ch* dziala, troche sie poprawilo ale szkoda mi czasu, prosciej wylaczyc i dziala perfekt
chyba juz odpuszczam kodowanie dzis i jade muze na sluchawkach 
* znalazlem w koncu prawilna instalke carmagedon2, udalo mi sie poprawic exeka przez wylaczenie mgly i nareszcie wyglada normalnie
* w carma2 probowalem odwracac tablice z mgla, negowac indeksy ale nie pomoglo to wiele, to musi byc blad we wczesnych wersjach gpu, zaraz po nich wyszly voodoo3 2000 16mb i one juz dzialaja ok
* przeszukany internet, znalezione kody zrodlowe glide, ciezkie grzebanie w docach, pdf itp...
* i w koncu: rozpykalem tego 3dfx
problem jest z karta i sterami, pieknie mgla dziala z nfs2se i carma2 
* dopiero jak sciagnalem src od sterow glide i przegrzebalem sie przez to gowno, to znalazlem miejsce, oni mieli ogromne problemy przez ten blad i zle go poprawili, moglo to sie przyczynic do upadku firmy tez
* patch to 1 bajt, klasyczne jnz->jmp
}
* w changelogu na poczatku kodu widoczne wzmianki o problemach z fog table, niestety brak komentarzy w kodzie ale widoczne miejsce gdzie byl on zaaplikowany, nizej istotne info o zmianach w pliku gglide.c:
{
124 12/18/97 2:13p Peter
fogTable cataclysm
(...)
186 11/18/98 6:29p Dow
Fixed clear problem on banshee/avenger
187 11/24/98 4:21p Jeske
make sure we don't try to apply the banshee (rev<3) fogTable hack to avengers with (rev<3)
}
* jak widac problem sie pojawil w grudniu 1997 roku (when the shit hits the fan) a zafiksowali go dopiero po roku w listopadzie 1998, niestety ten fix jest zly, bo "psuje" wszystkie avengery z rewizja nizsza niz 3, czyli np. moja velocity 100/v3 1000 8MB oraz v2 2000 8MB od lukas12p - on nawet opisal problem na vogons ale 0 pomocy, ciezki temat
* nie mozna wykluczyc ze w chipach banshee oraz wczesnych avengerach byl blad w gpu ktory wymagal inwertowania rejestrow od mgly i stad te dodatkowe warunki, no ale minelo cwierc wieku i w koncu mozna to poprawic
* lista podatnych kart jest nastepujaca: deviceID=3 oraz devRev <3, jesli karta miala blad w gpu, to bedzie dzialac ok, ale jesli nie miala, to bedzie sieczka z mgla na ekranie, blad dotyczy tylko gier uzywajacych natywnej glide2x.dll, nie wystepuje w glide3x.dll i dlatego np. nfs3 dziala ok, blad nie dotyczny rowniej wszelkiej masci wrapperow jak d3d, opengl, nglide itp. - deviceID nie do konca takie, pozniej sie wyjasni
* spreparowana glide2x.dll z paczki Amigamerlin v2.9, 1 bajtowy klasyczny patch jnz->jmp i... po wrzuceniu jej do katalogu z gra nfs2se piekna mgla i wszysytko dziala ok
tak samo z carmagedon2, jest swietnie ale pojawil sie dylemat w analizie bowiem... DLACZEGO moja karta, ktora ma deviceID=5 skacze do kodu ktory jest przeznaczony tylko dla deviceID=3??? - prawdziwy brainfu*k
* to mnie uswiadomilo ze blad musi byc gdzies indziej, jeszcze glebiej - so, we need to go deeper
* poniewaz krytyczna wartosc jest w warunku (gc->bInfo->pciInfo.deviceID == 0x3) to przeszukalem wszystkie pliki ze zrodel na string 'pciInfo.deviceID', znalazlo sie kilka, najbardziej interesujacy to minihwc.c z nastepujacymi linijkami:
{
if (hInfo.boardInfo[monitor].h3Mem == 8) {
hInfo.boardInfo[monitor].pciInfo.deviceID = SST_DEVICE_ID_H3 ;
}
}
* no nie wierze, ze ktos to mogl tak napisac, jeszcze szybka weryfikacja stalej SST_DEVICE_ID_H3 i... bingo
{
#define SST_DEVICE_ID_SST1 1
#define SST_DEVICE_ID_SST96 2
#define SST_DEVICE_ID_H3 3
#define SST_DEVICE_ID_H4 4
#define SST_DEVICE_ID_H4_OEM 5
#define SST_DEVICE_ID_AP 6
#define SST_DEVICE_ID_L_AP 6
#define SST_DEVICE_ID_AP_OEM 9
#define SST_DEVICE_ID_H_AP 15
}
* to tutaj znajduje sie pierwotny blad, w pliku minihwc.c wewnatrz funkcji hwcInit () bez zadnego sprawdzania jaka karta jest wlozona, gpu jest determinowany tylko wielkoscia pamieci, jaka? 8MB
takze tego... jesli jest wlozona karta z 8MB vram, to funkcja na sztywno zmieni deviceID karty na SST_DEVICE_ID_H3, czyli 3, czyli banshee...
* to powazny blad, bo wszystkie karty v3 z taka iloscia pamieci sa na to podatne bez wzgledu na ID karty i dlatego moja velocity miala zamienione deviceID z 5 na 3 i trigerowala inwersje rejestrow od fogtable, to tez wyjasnia czemu zle dziala v3 2000 lukasa12p - ona tez ma 8MB, jp ale kwas
* podsumowujac ten blad w 1 linijce: jesli vmem 8MB to deviceID=3 i dowolna karta staje sie voodoo banshee
no nie wierze jak mozna takie kody pisac 
* pozostaje tylko wylaczenie tej bzdurnej inicjacji i spatchowanie glide2x.dll - nadal nie wierze w to co widze
* patch polega na zmianie bajtu pod offsetem 140BF: 75->eb, wymusi to bezwarunkowy skok do nastepnej instrukcji z pominieciem zamiany deviceID karty
* glide2x.dll poprawiona, testy z nfe2se i carma2 zaliczone, piekna mgla, doszedl jeszcze unreal gold bo wczesniej mial czkawke z dzialaniem i nie zawsze odpalal w trybie glide i... pieknie dziala od strzala, jest prawlina mgla
pelen sukces
* mozna teraz na stale ta dll podmienic w %systemdir% i sie cieszyc bezproblemowym dzialaniem kart z 8MB vram z glide2, ten patch moze rozwiazac problemy z innymi nietestowanymi grami, prosze o komentarz jesli ktos taka trafi
* tak samo jestem ciekaw jak wyglada sytuacja z banshee, niestety moja karta ma spalony gpu i nie mam jak sprawdzic
* a wszystkich posiadaczy kart v3 z 8MB vram prosze o sprawdzenie jak sie maja orginalne sterowniki amigamerlin v2.9 + poprawiona glide2x.dll, zwracac nalezy uwage na mgle a raczej jej brak lub sieczke jaka robi na ekranie
* uzyte techniki re i analiza statyczna + narzedzia: ida, hiew, totalcmd
dziala
w koncu po 25 latach 
* mam nadzieje ze to nie byl przyslowiowy gwozdz do trumny dla 3dfx (ale mogl sie przyczynic tak jak przejecie stb i wtopienie 141M$ + wypuszczenie gf256 z t&l przez nvidie) - to powazny blad i widac ze go nie zalatali, coz, pewnie nigdy sie nie dowiemy
* incepcja zakonczona na poziomie 3, 1:wylaczenie fogtable, 2:fogtable on i wylaczenie inwersji wartosci w rejestrach fogtable, 3:fogtable on i wylaczenie zamiany karty na banshee jesli vram 8MB - dzis zakoncze dzien browarkiem i to raczej niejednym
* a na koniec zagadka: czemu uzywam slowa inwersja a nie negacja i czym sie rozni w asmie instrukcja neg od not - to bylo 1 z pytan dla kandydatow na analitykow zagrozen na rozmowach kwalifikacyjnych w naszej firmie
web:
* lukas12p problem: <brak linka>
edit:
* literowki, doprecyzowania
* zalozylem watek na <brak linka>, dodana wersja eng oraz all fotki
[watek przeniesiony z napraw pieknosci vga, tutaj bardziej pasuje, na koncu link do vogons z wersja EN]
3dfx Velocity 100 AGP part#2 [25-years old bug in the system] <brak linka>
info:
* okazalo sie ze moja velocity wcale nie dziala do konca tak jak powinna, poniewaz w niektorych starszych grach robi powazna sieczke na ekranie, problem opisal i zglosil na vogons nasz lukas12p, dotyczyl on zle dzialajacych gier nfs2se oraz carmagedon2, ja rowniez doswiadczylem problemu z gra unreal gold, dzialala w trybie glide ale nie bylo mgly... za to nfs3 dzialal ok - dziwne
* to sklonilo mnie do przyjrzenia sie problemowi, na pierwszy ogien poszedl unreal, bo jego mialem, po wertowaniu internetu problem z brakiem mgly zostal rozwiazany przez dodanie do rejestru wpisu:
{
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Display\xxxx\Glide
key: FX_GLIDE_NUM_TMU
value: 2
} klucz typu string, xxxx moze byc rozne, zaleznie ile kart graficznych bylo instalowane wczesniej, normalnie 0000, u mnie byl 0018 ale to dysk testowy na rozne konfigi, to wiadomka

* to rozwiazalo problem z unreal, ale nie pomoglo zupelnie z 2 poprzednimi grami
* mialem tylko nfs2se, wiec zaczalem grzebac w sdk glide, odpalilem ide i zdisasmowalem exeka nfs2se, znalazlem miejsce gdzie jest init fog table, wylaczylem ja w nowym exeku, test poszedl na v2 bo tam dziala mgla poprawnie, i faktycznie jest wylaczona, gra wyglada deko gorzej ale dziala ok, nastepnie zamienilem v2 na velocity i... gra odpalila bez mgly ale dziala ok, brzydka sieczka znikla

* porownujac screenshoty z fog on/off wydalo mi sie, ze z-bufor dla mgly jest odwrocony, bo w tle/oddali obraz byl ok z teksturami ale crap na bliskich obiektach, doszedlem do wniosku ze mgla jest "odwrocona"
* sprawdzilem jeszcze v3 2000 16MB i tam problemu nie bylo - bardzo dziwne
* uzyte testy na plikach z diagnostyki dla 3dfx, dla glide2 crap z mgla ale dla glide3 ok - to tez bardzo dziwne, bo w koncu to te same karty sa
* rzezba, zapiski z chata z kumplem, ktoremu relacjonowalem na zywo postep prac

{
* wiele prob z odwracaniem petli dla generowania wartosci dla map fogtable i tylko niewielkie roznice i polepszenia, to wciaz nie to
* w miedzyczasie zrobione wiele inline patchy, problem z miejscem w kodzie exe, finalnie ogarniete w hiew przez uzycie call/jmp, bo nie chcialem budowac calego nowego srodowiska dla debuggera, kompilatora masm, rekompilacji i klejeniem exeka

* spekulacje, ze blad jednak jest w gpu, bo zaimplementowali odwrotnie tablice do mgly, w grze jest lacznie 20 tablic dla roznych przypadkow, kazda ma 64 bajty i zawiera wartosci z przedzialu 0-ff, jest funkcja w glide2x.dll ktora to generuje i jest uzywana i trzeba petle odwrocic aby generowala ta tablice w odwrotnej kolejnosci, tylko bajtow brakuje na inline patch

* ale z 2 strony moze bym mogl naklecic kod do odwracania samej tablicy juz po jej wygenerowaniu, wtedy nie musze patchowac glide, tylko wklejka w exeku gry... taka funkcja reverse-order po wykonaniu org. procki, hmmm
* kolejne akcje: wyczailem algo na inwertowanie wartosci indeksu z przedzialu 0-63, po co mam sie p* z odwracaniem petli, jak moge glowna funkcje do wyliczania wartosci zmienic


* i znow: dodalem patcha w glide2x.dll do generowania fog table w api i czesciowo sie poprawilo, bugi w gpu na 100%
* i zniechecenie: powoli odpuszczam ta mgle w nfs2, sporo testow i ch* dziala, troche sie poprawilo ale szkoda mi czasu, prosciej wylaczyc i dziala perfekt


* znalazlem w koncu prawilna instalke carmagedon2, udalo mi sie poprawic exeka przez wylaczenie mgly i nareszcie wyglada normalnie
* w carma2 probowalem odwracac tablice z mgla, negowac indeksy ale nie pomoglo to wiele, to musi byc blad we wczesnych wersjach gpu, zaraz po nich wyszly voodoo3 2000 16mb i one juz dzialaja ok
* przeszukany internet, znalezione kody zrodlowe glide, ciezkie grzebanie w docach, pdf itp...
* i w koncu: rozpykalem tego 3dfx


* dopiero jak sciagnalem src od sterow glide i przegrzebalem sie przez to gowno, to znalazlem miejsce, oni mieli ogromne problemy przez ten blad i zle go poprawili, moglo to sie przyczynic do upadku firmy tez
* patch to 1 bajt, klasyczne jnz->jmp

}
* w changelogu na poczatku kodu widoczne wzmianki o problemach z fog table, niestety brak komentarzy w kodzie ale widoczne miejsce gdzie byl on zaaplikowany, nizej istotne info o zmianach w pliku gglide.c:
{
124 12/18/97 2:13p Peter
fogTable cataclysm
(...)
186 11/18/98 6:29p Dow
Fixed clear problem on banshee/avenger
187 11/24/98 4:21p Jeske
make sure we don't try to apply the banshee (rev<3) fogTable hack to avengers with (rev<3)
}
* jak widac problem sie pojawil w grudniu 1997 roku (when the shit hits the fan) a zafiksowali go dopiero po roku w listopadzie 1998, niestety ten fix jest zly, bo "psuje" wszystkie avengery z rewizja nizsza niz 3, czyli np. moja velocity 100/v3 1000 8MB oraz v2 2000 8MB od lukas12p - on nawet opisal problem na vogons ale 0 pomocy, ciezki temat

* nie mozna wykluczyc ze w chipach banshee oraz wczesnych avengerach byl blad w gpu ktory wymagal inwertowania rejestrow od mgly i stad te dodatkowe warunki, no ale minelo cwierc wieku i w koncu mozna to poprawic

* lista podatnych kart jest nastepujaca: deviceID=3 oraz devRev <3, jesli karta miala blad w gpu, to bedzie dzialac ok, ale jesli nie miala, to bedzie sieczka z mgla na ekranie, blad dotyczy tylko gier uzywajacych natywnej glide2x.dll, nie wystepuje w glide3x.dll i dlatego np. nfs3 dziala ok, blad nie dotyczny rowniej wszelkiej masci wrapperow jak d3d, opengl, nglide itp. - deviceID nie do konca takie, pozniej sie wyjasni
* spreparowana glide2x.dll z paczki Amigamerlin v2.9, 1 bajtowy klasyczny patch jnz->jmp i... po wrzuceniu jej do katalogu z gra nfs2se piekna mgla i wszysytko dziala ok

* to mnie uswiadomilo ze blad musi byc gdzies indziej, jeszcze glebiej - so, we need to go deeper
* poniewaz krytyczna wartosc jest w warunku (gc->bInfo->pciInfo.deviceID == 0x3) to przeszukalem wszystkie pliki ze zrodel na string 'pciInfo.deviceID', znalazlo sie kilka, najbardziej interesujacy to minihwc.c z nastepujacymi linijkami:
{
if (hInfo.boardInfo[monitor].h3Mem == 8) {
hInfo.boardInfo[monitor].pciInfo.deviceID = SST_DEVICE_ID_H3 ;
}
}
* no nie wierze, ze ktos to mogl tak napisac, jeszcze szybka weryfikacja stalej SST_DEVICE_ID_H3 i... bingo

{
#define SST_DEVICE_ID_SST1 1
#define SST_DEVICE_ID_SST96 2
#define SST_DEVICE_ID_H3 3
#define SST_DEVICE_ID_H4 4
#define SST_DEVICE_ID_H4_OEM 5
#define SST_DEVICE_ID_AP 6
#define SST_DEVICE_ID_L_AP 6
#define SST_DEVICE_ID_AP_OEM 9
#define SST_DEVICE_ID_H_AP 15
}
* to tutaj znajduje sie pierwotny blad, w pliku minihwc.c wewnatrz funkcji hwcInit () bez zadnego sprawdzania jaka karta jest wlozona, gpu jest determinowany tylko wielkoscia pamieci, jaka? 8MB

* to powazny blad, bo wszystkie karty v3 z taka iloscia pamieci sa na to podatne bez wzgledu na ID karty i dlatego moja velocity miala zamienione deviceID z 5 na 3 i trigerowala inwersje rejestrow od fogtable, to tez wyjasnia czemu zle dziala v3 2000 lukasa12p - ona tez ma 8MB, jp ale kwas

* podsumowujac ten blad w 1 linijce: jesli vmem 8MB to deviceID=3 i dowolna karta staje sie voodoo banshee


* pozostaje tylko wylaczenie tej bzdurnej inicjacji i spatchowanie glide2x.dll - nadal nie wierze w to co widze

* patch polega na zmianie bajtu pod offsetem 140BF: 75->eb, wymusi to bezwarunkowy skok do nastepnej instrukcji z pominieciem zamiany deviceID karty
* glide2x.dll poprawiona, testy z nfe2se i carma2 zaliczone, piekna mgla, doszedl jeszcze unreal gold bo wczesniej mial czkawke z dzialaniem i nie zawsze odpalal w trybie glide i... pieknie dziala od strzala, jest prawlina mgla

* mozna teraz na stale ta dll podmienic w %systemdir% i sie cieszyc bezproblemowym dzialaniem kart z 8MB vram z glide2, ten patch moze rozwiazac problemy z innymi nietestowanymi grami, prosze o komentarz jesli ktos taka trafi
* tak samo jestem ciekaw jak wyglada sytuacja z banshee, niestety moja karta ma spalony gpu i nie mam jak sprawdzic
* a wszystkich posiadaczy kart v3 z 8MB vram prosze o sprawdzenie jak sie maja orginalne sterowniki amigamerlin v2.9 + poprawiona glide2x.dll, zwracac nalezy uwage na mgle a raczej jej brak lub sieczke jaka robi na ekranie

* uzyte techniki re i analiza statyczna + narzedzia: ida, hiew, totalcmd
dziala


* mam nadzieje ze to nie byl przyslowiowy gwozdz do trumny dla 3dfx (ale mogl sie przyczynic tak jak przejecie stb i wtopienie 141M$ + wypuszczenie gf256 z t&l przez nvidie) - to powazny blad i widac ze go nie zalatali, coz, pewnie nigdy sie nie dowiemy
* incepcja zakonczona na poziomie 3, 1:wylaczenie fogtable, 2:fogtable on i wylaczenie inwersji wartosci w rejestrach fogtable, 3:fogtable on i wylaczenie zamiany karty na banshee jesli vram 8MB - dzis zakoncze dzien browarkiem i to raczej niejednym

* a na koniec zagadka: czemu uzywam slowa inwersja a nie negacja i czym sie rozni w asmie instrukcja neg od not - to bylo 1 z pytan dla kandydatow na analitykow zagrozen na rozmowach kwalifikacyjnych w naszej firmie

web:
* lukas12p problem: <brak linka>
edit:
* literowki, doprecyzowania
* zalozylem watek na <brak linka>, dodana wersja eng oraz all fotki