 - 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.

