home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
tt
/
superfix.lzh
/
TT.TXT
< prev
Wrap
Text File
|
1991-06-06
|
13KB
|
287 lines
- 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.