- Aus der Maus HH - on: Johannes Hill @ F (Di, 04.06.91 22:20) Hallo Leute, heute habe ich um TempleMon auf Bugs zu testen ein bischen mit dem Masterstack der 68030 CPU gespielt, und siehe da, da bin ich auf Bugs im TT-TOS 3.01 und 3.05 gestossen. Dabei ist ganz lustig, daž dieser Bug im GemDos Handler scheinbar nur bei einer Funktion sichtbar wird, n„mlich SUPER (32). Das h„ngt damit zusammen, daž diese Funktionnummer im Trap-Handler vorabgetestet wird, alle anderen werden ber eine Sprungtabelle angesprungen. Wer einmal folgendes Programm unver„ndert laufen l„žt, sieht den Fehler. Der Fehler tritt nicht mehr auf, wenn die einkommentierten Befehle gltig gemacht werden: MC68030 gemdos EQU 1 cconws EQU 9 super EQU 32 TEXT clr.l -(SP) ; in Supervisor Modus schalten move.w #super,-(SP) trap #gemdos addq.l #6,SP ; nun arbeiten wir auf dem ISP move.l D0,stpnt lea mstpnt(PC),A0 ; MSP initialisieren; wird nicht movec A0,MSP ; vom TOS gemacht! move.l #$87654321,-(SP) ; ein bischen Murks auf Interrupt- move.w #9,-(SP) ; stack ablegen move.w SR,D0 ; auf Masterstack umschalten bset #12,D0 move.w D0,SR pea message(PC) ; GemDos(CCONWS) auf Masterstack move.w #cconws,-(SP) ; aufrufen; das geht auch sch”n trap #gemdos addq.l #6,SP ; move.w SR,D0 ; hier wrde wieder auf den ISP ; bclr #12,D0 ; umgeschaltet, wenn nicht ; move.w D0,SR ; einkommentiert ; addq.l #6,SP ; Murksparamter abr„umen move.l stpnt(PC),-(SP) ; sch”n wieder in UserModus move.w #super,-(SP) ; zurckschalten. Waren wir jetzt trap #gemdos ; im Mastermodus, kracht es! clr.w -(SP) trap #gemdos DATA message: DC.B 13,10 DC.B 'GemDos Test erfolgreich verlaufen' DC.B 13,10,0 BSS mstack: DS.L 128 mstpnt: DS.L 1 DS.L 16 stpnt: DS.L 1 END Was passiert in einem Fehlerfall? Der PC wird pl”tzlich auf Adresse 0 gestellt, was in der Folge 4 Bomben bringt. Es k”nnte sein, daž dieser Fehler auch bei BIOS und XBIOS auftreten kann; ich habe es aber noch nicht explizit ausgetestet. Mein Tipp: vom Mastermodus keine Betriebssystemaufrufe machen. Eigentlich ist der Mastermodus von den CPU Architekten nur fr das Betriebssystem vorgesehen worden. Allerdings sollte nicht sein, daž ich durch geeignetes Beschreiben von CPU-Registern TOS zum Abstrzen bringen kann. Diese Message geht mit einer ausfhrlicheren Fehlerbeschreibung an Normen Kowalewski, Atari Deutschland. Gruss, Johannes Hierzu gibt es 1 Kommentar Es gibt 1 Kommentar ! Antwort, Brief, Weiter, Raus, No Stop, +/- oder Exit (02:10) : DATUM: 06.06.1991 ATARI TT ZEIT: 20:14:36 Nr.2/3 Betreff : TT Bugs Von : SYSOP 07.06.1991 17:28:42 Antwort auf die Mail 'TT-Bugs' von SYSOP ! - Aus der Maus HH - on: Johannes Hill @ F (Do, 06.06.91 00:46) So, nun kommentiere ich mich mal wieder selber. Also, der Fehler tritt nur in der Super Funktion auf. Atari l”scht dort beim Umschalten vom Super- visor in den Usermodus nur das S-Bit im SR, l„žt aber ein gesetztes M-Bit stehen. Dies fhrt nach Motorola-Dokumentation zu einem nicht definierten Zustand der CPU! Patched man dies mit Hilfe von ROMRAM diesen Fehler (ist relativ einfach m”glich), tritt leider beim Umkopieren der Returnwerte zwischen den einzelnen Stacks wieder ein neuer Fehler auf. Ich habe meinen Mitbewohner Stefan Wolf in der WG hier dazu berreden k”nnen, dafr ein Fixprogramm zu schreiben, das ich auch an Atari schicken werde. Durch geschicktes L”schen des M-Bits w„hrend des Umkopierens lassen sich so die Fehler in der Routine eliminieren. Das Programm folgt im Sourcecode direkt an diese Message. Es verwendet die XBRA-ID 'MSPF'. Soweit wir es ausprobieren konnten, funktioniert es ohne Fehler auf allen drei Stacks, doch m”chte ich daraufhinweisen, daž eine Verwendung auf eigene Gefahr erfolgt. Sollte ein Fehler auftauchen, den wir nicht erwarten, bitte ich sofort um Nachricht. Gruss, Johannes P.S.: Ist fr TOS 3.01 und 3.05 gedacht. ***************************************************************** * * * SUPERFIX.PRG * * * * Umgeht einen Fehler in der TT Gemdos Routine Super. * * * * Die Orginalroutine enth„lt 2 (!) Fehler. * * 1) Wenn Super vom Mastermode in den Usermode zurckschalten * * soll wird nur das S nicht aber das M Bit gel”scht. * * Dieser Zustand ist nach der Motorola Dokumentation nicht * * definiert. Wird gepatcht mit (1). * * 2) Beim Zurckschalten aus dem Master- in den Usermodus wird * * der šbergebene neue ssp in den msp geladen. Beim n„chsten * * Aufruf wird aber mit dem isp weitergearbeitet. Sp„testens * * am Ende des Programms kracht's dann. Wird gepatcht mit (2)* * * * (C) 1991 by Stefan Wolf * * * * * ***************************************************************** gemdos = 1 CConws = 9 Ptermres = 49 xbios = 14 Supexec = 38 _p_cookies = $5a0 ; Pointer auf cookie-jar trapvector = $84 ; TRAP #1 Vektor .super .text start: bra install ; Sprung zum transienten Teil ******************************************************************* * * my_gemdos: Neuer Traphandler fr den Gemdos-Trap * ******************************************************************* .dc.b "XBRA" .dc.l "MSPF" o_gemdos: .dc.l 0 ; alter GEMDOS-Vektor my_gemdos: ; Die folgende Routine entspricht ; bis auf die 3 Patchstellen der ; Orginalroutine von TOS 3.05. btst.b #5,(a7) ; aus Supervisormodus aufgerufen? beq cont ; nein -> Interessiert uns nicht cmpi.w #$20,8(a7) ; Super ? bne cont ; nein -> Interessiert uns nicht move.l 10(a7),d1 ; Parameter holen beq same_stack ; 0L ? -> subq.l #1,d1 ; -1L beq cont ; ja -> Interessiert uns nicht movea.l 10(a7),a1 ; neuer ssp move.w (a7)+,d0 ; Format lesen move.l (a7)+,d1 ; Rckkehradresse lesen move.w (a7)+,-(a1) ; Flags kopieren move.l d1,-(a1) ; Rckkehradresse schreiben move.w d0,-(a1) ; Format schreiben move usp,a0 cmpa.l a0,a7 ; sp=USP beq eq_usp ; ja -> move.l (a7)+,-(a0) ANDI #$EFFF,SR ; M Bit l”schen <<<<<<<<< (2) movea.l a1,a7 ; neuen ssp laden (isp) bra load_usp eq_usp: ANDI #$EFFF,SR ; M Bit l”schen <<<<<<<<< (2) movea.l a1,a7 ; neuen ssp laden (isp) bra switch same_stack: lea 8(a7),a0 load_usp: move a0,usp ; usp laden switch: andi.w #$CFFF,(a7) ; S und M Bit l”schen <<<<< (1) rte cont: move.l o_gemdos(pc),a0 ; Alter Vektorinhalt jmp (a0) ; und ab ! ******************************************************************* * * Installationsteil (bleibt nicht resident) * ******************************************************************* install: pea super(pc) move #Supexec,-(sp) trap #xbios addq.l #6,sp tst.b stflag ; Atari ST ? bne.b quitst ; ja->Ende tst.b instflag ; Schon installiert ? bne.b quitinst ; ja->Ende pea message move #CConws,-(sp) ; Startmeldung ausgeben trap #gemdos addq.l #6,sp move.l #install-start+$100,a1; L„nge des Residenten Teils clr -(sp) pea (a1) move #Ptermres,-(sp) ; Resident verlassen trap #gemdos quitst: pea ttonly ; Fehler 'ST-Computer' bra.b abort quitinst: pea inst ; Fehler 'schon installiert' abort: move #CConws,-(sp) trap #gemdos ; Fehlermeldung ausgeben addq.l #6,sp clr -(sp) ; Normal beenden trap #gemdos super: move.l _p_cookies,d0 ; Cookie jar vorhanden? seq stflag beq exit ; nein->Ende move.l d0,a0 loop: movem.l (a0)+,d0-d1 ; Ende der tst.l d0 ; Liste? beq.b test_inst ; ja->Schleife verlassen cmp.l #"_MCH",d0 ; Cookie fr Computertyp? bne loop ; nein->weiter in der Schleife cmp.l #$00020000,d1 ; TT ? sne stflag bne.b exit ; nein->Ende bra.b loop test_inst: tst.b stflag ; ST ? -> Abbruch bne.b exit move.l trapvector,a0 xloop: cmp.l #'XBRA',-12(a0) ; XBRA kennung ? bne do_inst ; nein ? -> dann installieren cmp.l #'MSPF',-8(a0) ; Sind wir schon da ? seq instflag beq exit ; JA ! -> Abbruch move.l -4(a0),a0 ; XBRA verfolgen bra xloop do_inst: move.l trapvector,o_gemdos ; Alten Vektor retten move.l #my_gemdos,trapvector; Neuen Vektor setzen exit: rts ; das war's .data ; Startmeldung message: .dc.b $0d,$0a .dc.b "SUPERFIX V1.0 installiert",$0d,$0a .dc.b "½ 1991 by Stefan Wolf",$0d,$0a,$00 ; Fehlermeldungen ttonly: .dc.b $0d,$0a .dc.b "SUPERFIX l„uft nur auf dem Atari TT !",$0d,$0a,$00 inst: .dc.b $0d,$0a .dc.b "SUPERFIX schon installiert !",$0d,$0a,$00 instflag: .dc.b 0 ; Schon Installiert Flag .bss stflag: .ds.b 1 ; Flag fr Atari ST .end Antwort, Brief, Weiter, Raus, No Stop, +/- oder Exit (03:38) : DATUM: 06.06.1991 ATARI TT ZEIT: 20:15:32 Nr.3/3 Betreff : TT Proc Von : SYSOP 07.06.1991 17:29:22 - Nochmal aus der Maus HH - on: Julian Reschke @ MS (Di, 04.06.91 22:32) Zitat aus dem `Hitchhiker': proc_lives equ $380 ; $12345678 iff valid proc_dregs equ $384 ; saved D0-D7 proc_aregs equ $3a4 ; saved A0-A6, supervisor A7 (SSP) proc_enum equ $3c4 ; first byte is exception # proc_usp equ $3c8 ; saved user A7 proc_stk equ $3cc ; sixteen words popped from SSP Daž irgendwo der pc steht, ist also sowieso nicht offiziell dokumentiert. Abhilfe? Eigenen Dispatcher schreiben.