home *** CD-ROM | disk | FTP | other *** search
- - 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 gültig 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 würde 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) ; zurückschalten. 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 für das Betriebssystem vorgesehen
- worden. Allerdings sollte nicht sein, daß ich durch geeignetes Beschreiben
- von CPU-Registern TOS zum Abstürzen bringen kann.
-
- Diese Message geht mit einer ausführlicheren 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 führt 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, dafür 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 für 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 zurückschalten *
- * 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 Zurückschalten 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 für 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 ; Rückkehradresse lesen
- move.w (a7)+,-(a1) ; Flags kopieren
- move.l d1,-(a1) ; Rückkehradresse 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 für 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 für 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.
-
-