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   
Text File  |  1991-06-06  |  13KB  |  287 lines

  1.  - Aus der Maus HH -
  2. on: Johannes Hill @ F (Di, 04.06.91 22:20)
  3.  
  4. Hallo Leute,
  5.  
  6. heute habe ich um TempleMon auf Bugs zu testen ein bischen mit dem Masterstack
  7. der 68030 CPU gespielt, und siehe da, da bin ich auf Bugs im TT-TOS 3.01 und
  8. 3.05 gestossen. Dabei ist ganz lustig, daß dieser Bug im GemDos Handler
  9. scheinbar nur bei einer Funktion sichtbar wird, nämlich SUPER (32). Das
  10. hängt damit zusammen, daß diese Funktionnummer im Trap-Handler vorabgetestet
  11. wird, alle anderen werden über eine Sprungtabelle angesprungen. Wer einmal
  12. folgendes Programm unverändert laufen läßt, sieht den Fehler. Der Fehler
  13. tritt nicht mehr auf, wenn die einkommentierten Befehle gültig gemacht werden:
  14.  
  15.                 MC68030
  16. gemdos          EQU 1
  17. cconws          EQU 9
  18. super           EQU 32
  19.                 TEXT
  20.                 clr.l   -(SP)         ; in Supervisor Modus schalten
  21.                 move.w  #super,-(SP)
  22.                 trap    #gemdos
  23.                 addq.l  #6,SP         ; nun arbeiten wir auf dem ISP
  24.                 move.l  D0,stpnt
  25.                 lea     mstpnt(PC),A0 ; MSP initialisieren; wird nicht
  26.                 movec   A0,MSP        ; vom TOS gemacht!
  27.                 move.l  #$87654321,-(SP) ; ein bischen Murks auf Interrupt-
  28.                 move.w  #9,-(SP)         ; stack ablegen
  29.                 move.w  SR,D0         ; auf Masterstack umschalten
  30.                 bset    #12,D0
  31.                 move.w  D0,SR
  32.                 pea     message(PC)   ; GemDos(CCONWS) auf Masterstack
  33.                 move.w  #cconws,-(SP) ; aufrufen; das geht auch schön
  34.                 trap    #gemdos
  35.                 addq.l  #6,SP
  36. ;               move.w  SR,D0         ; hier würde wieder auf den ISP
  37. ;               bclr    #12,D0        ; umgeschaltet, wenn nicht
  38. ;               move.w  D0,SR         ; einkommentiert
  39. ;               addq.l  #6,SP         ; Murksparamter abräumen
  40.                 move.l  stpnt(PC),-(SP) ; schön wieder in UserModus
  41.                 move.w  #super,-(SP)    ; zurückschalten. Waren wir jetzt
  42.                 trap    #gemdos         ; im Mastermodus, kracht es!
  43.                 clr.w   -(SP)
  44.                 trap    #gemdos
  45.                 DATA
  46. message:        DC.B 13,10
  47.                 DC.B 'GemDos Test erfolgreich verlaufen'
  48.                 DC.B 13,10,0
  49.                 BSS
  50. mstack:         DS.L 128
  51. mstpnt:         DS.L 1
  52.                 DS.L 16
  53. stpnt:          DS.L 1
  54.                 END
  55.  
  56. Was passiert in einem Fehlerfall? Der PC wird plötzlich auf Adresse 0
  57. gestellt, was in der Folge 4 Bomben bringt.
  58.  
  59. Es könnte sein, daß dieser Fehler auch bei BIOS und XBIOS auftreten kann; ich
  60. habe es aber noch nicht explizit ausgetestet.
  61.  
  62. Mein Tipp: vom Mastermodus keine Betriebssystemaufrufe machen. Eigentlich ist
  63. der Mastermodus von den CPU Architekten nur für das Betriebssystem vorgesehen
  64. worden. Allerdings sollte nicht sein, daß ich durch geeignetes Beschreiben
  65. von CPU-Registern TOS zum Abstürzen bringen kann.
  66.  
  67. Diese Message geht mit einer ausführlicheren Fehlerbeschreibung an Normen
  68. Kowalewski, Atari Deutschland.
  69.  
  70. Gruss, Johannes
  71. Hierzu gibt es 1 Kommentar
  72.  
  73.  
  74. Es gibt  1  Kommentar !
  75.  
  76. Antwort, Brief, Weiter, Raus, No Stop, +/- oder Exit (02:10) : 
  77. DATUM: 06.06.1991                   ATARI TT                      ZEIT: 20:14:36
  78. Nr.2/3     Betreff : TT Bugs            Von : SYSOP          07.06.1991 17:28:42
  79.  Antwort auf die Mail 'TT-Bugs' von SYSOP !
  80.  
  81.  - Aus der Maus HH -
  82. on: Johannes Hill @ F (Do, 06.06.91 00:46)
  83.  
  84. So, nun kommentiere ich mich mal wieder selber. Also, der Fehler tritt
  85. nur in der Super Funktion auf. Atari löscht dort beim Umschalten vom Super-
  86. visor in den Usermodus nur das S-Bit im SR, läßt aber ein gesetztes M-Bit
  87. stehen. Dies führt nach Motorola-Dokumentation zu einem nicht definierten
  88. Zustand der CPU! Patched man dies mit Hilfe von ROMRAM diesen Fehler (ist
  89. relativ einfach möglich), tritt leider beim Umkopieren der Returnwerte zwischen
  90. den einzelnen Stacks wieder ein neuer Fehler auf. Ich habe meinen Mitbewohner
  91. Stefan Wolf in der WG hier dazu überreden können, dafür ein Fixprogramm zu
  92. schreiben, das ich auch an Atari schicken werde. Durch geschicktes Löschen des
  93. M-Bits während des Umkopierens lassen sich so die Fehler in der Routine
  94. eliminieren. Das Programm folgt im Sourcecode direkt an diese Message.
  95. Es verwendet die XBRA-ID 'MSPF'.
  96. Soweit wir es ausprobieren konnten, funktioniert es ohne Fehler auf allen drei
  97. Stacks, doch möchte ich daraufhinweisen, daß eine Verwendung auf eigene Gefahr
  98. erfolgt. Sollte ein Fehler auftauchen, den wir nicht erwarten, bitte ich sofort
  99. um Nachricht.
  100.  
  101. Gruss, Johannes
  102.  
  103. P.S.: Ist für TOS 3.01 und 3.05 gedacht.
  104.  
  105. *****************************************************************
  106. *                                                               *
  107. *                          SUPERFIX.PRG                         *
  108. *                                                               *
  109. * Umgeht einen Fehler in der TT Gemdos Routine Super.           *
  110. *                                                               *
  111. * Die Orginalroutine enthält 2 (!) Fehler.                      *
  112. *  1) Wenn Super vom Mastermode in den Usermode zurückschalten  *
  113. *     soll wird nur das S nicht aber das M Bit gelöscht.        *
  114. *     Dieser Zustand ist nach der Motorola Dokumentation nicht  *
  115. *     definiert. Wird gepatcht mit (1).                         *
  116. *  2) Beim Zurückschalten aus dem Master- in den Usermodus wird *
  117. *     der Übergebene neue ssp in den msp geladen. Beim nächsten *
  118. *     Aufruf wird aber mit dem isp weitergearbeitet. Spätestens *
  119. *     am Ende des Programms kracht's dann. Wird gepatcht mit (2)*
  120. *                                                               *
  121. * (C) 1991 by Stefan Wolf                                       *
  122. *                                                               *
  123. *                                                               *
  124. *****************************************************************
  125.  
  126. gemdos      =  1
  127. CConws      =  9
  128. Ptermres    =  49
  129.  
  130. xbios       =  14
  131. Supexec     =  38
  132.  
  133. _p_cookies  =  $5a0                    ; Pointer auf cookie-jar
  134. trapvector  =  $84                     ; TRAP #1 Vektor
  135.  
  136.             .super
  137.             .text
  138. start:      bra install                ; Sprung zum transienten Teil
  139.  
  140. *******************************************************************
  141. *
  142. * my_gemdos: Neuer Traphandler für den Gemdos-Trap
  143. *
  144. *******************************************************************
  145.  
  146.             .dc.b    "XBRA"
  147.             .dc.l    "MSPF"
  148. o_gemdos:   .dc.l    0                 ; alter GEMDOS-Vektor
  149.  
  150. my_gemdos:                             ; Die folgende Routine entspricht
  151.                                        ; bis auf die 3 Patchstellen der
  152.                                        ; Orginalroutine von TOS 3.05.
  153.             btst.b   #5,(a7)           ; aus Supervisormodus aufgerufen?
  154.             beq      cont              ; nein -> Interessiert uns nicht
  155.             cmpi.w   #$20,8(a7)        ; Super ?
  156.             bne      cont              ; nein -> Interessiert uns nicht
  157.             move.l   10(a7),d1         ; Parameter holen
  158.             beq      same_stack        ; 0L ? ->
  159.             subq.l   #1,d1             ; -1L
  160.             beq      cont              ; ja -> Interessiert uns nicht
  161.             movea.l  10(a7),a1         ; neuer ssp
  162.             move.w   (a7)+,d0          ; Format lesen
  163.             move.l   (a7)+,d1          ; Rückkehradresse lesen
  164.             move.w   (a7)+,-(a1)       ; Flags kopieren
  165.             move.l   d1,-(a1)          ; Rückkehradresse schreiben
  166.             move.w   d0,-(a1)          ; Format schreiben
  167.             move     usp,a0
  168.             cmpa.l   a0,a7             ; sp=USP
  169.             beq      eq_usp            ; ja ->
  170.             move.l   (a7)+,-(a0)
  171.             ANDI     #$EFFF,SR         ; M Bit löschen   <<<<<<<<< (2)
  172.             movea.l  a1,a7             ; neuen ssp laden (isp)
  173.             bra      load_usp
  174. eq_usp:     ANDI     #$EFFF,SR         ; M Bit löschen   <<<<<<<<< (2)
  175.             movea.l  a1,a7             ; neuen ssp laden (isp)
  176.             bra      switch
  177. same_stack: lea      8(a7),a0
  178. load_usp:   move     a0,usp            ; usp laden
  179. switch:     andi.w   #$CFFF,(a7)       ; S und M Bit löschen <<<<< (1)
  180.             rte
  181.  
  182. cont:       move.l   o_gemdos(pc),a0   ; Alter Vektorinhalt
  183.             jmp      (a0)              ; und ab !
  184.  
  185. *******************************************************************
  186. *
  187. *           Installationsteil (bleibt nicht resident)
  188. *
  189. *******************************************************************
  190.  
  191. install:    pea      super(pc)
  192.             move     #Supexec,-(sp)
  193.             trap     #xbios
  194.             addq.l   #6,sp
  195.             tst.b    stflag               ; Atari ST ?
  196.             bne.b    quitst               ; ja->Ende
  197.             tst.b    instflag             ; Schon installiert ?
  198.             bne.b    quitinst             ; ja->Ende
  199.             pea      message
  200.             move     #CConws,-(sp)        ; Startmeldung ausgeben
  201.             trap     #gemdos
  202.             addq.l   #6,sp
  203.  
  204.             move.l   #install-start+$100,a1; Länge des Residenten Teils
  205.             clr      -(sp)
  206.             pea      (a1)
  207.             move     #Ptermres,-(sp)      ; Resident verlassen
  208.             trap     #gemdos
  209.  
  210. quitst:     pea      ttonly               ; Fehler 'ST-Computer'
  211.             bra.b    abort
  212. quitinst:   pea      inst                 ; Fehler 'schon installiert'
  213. abort:      move     #CConws,-(sp)
  214.             trap     #gemdos              ; Fehlermeldung ausgeben
  215.             addq.l   #6,sp
  216.             clr      -(sp)                ; Normal beenden
  217.             trap     #gemdos
  218.  
  219.  
  220. super:      move.l   _p_cookies,d0        ; Cookie jar vorhanden?
  221.             seq      stflag
  222.             beq      exit                 ; nein->Ende
  223.             move.l   d0,a0
  224. loop:       movem.l  (a0)+,d0-d1          ; Ende der
  225.             tst.l    d0                   ; Liste?
  226.             beq.b    test_inst            ; ja->Schleife verlassen
  227.             cmp.l    #"_MCH",d0           ; Cookie für Computertyp?
  228.             bne      loop                 ; nein->weiter in der Schleife
  229.             cmp.l    #$00020000,d1        ; TT ?
  230.             sne      stflag
  231.             bne.b    exit                 ; nein->Ende
  232.             bra.b    loop
  233.  
  234. test_inst:  tst.b    stflag               ; ST ? -> Abbruch
  235.             bne.b    exit
  236.             move.l   trapvector,a0
  237. xloop:      cmp.l    #'XBRA',-12(a0)      ; XBRA kennung ?
  238.             bne      do_inst              ; nein ? -> dann installieren
  239.             cmp.l    #'MSPF',-8(a0)       ; Sind wir schon da ?
  240.             seq      instflag
  241.             beq      exit                 ; JA ! -> Abbruch
  242.             move.l   -4(a0),a0            ; XBRA verfolgen
  243.             bra      xloop
  244.  
  245. do_inst:    move.l   trapvector,o_gemdos  ; Alten Vektor retten
  246.             move.l   #my_gemdos,trapvector; Neuen Vektor setzen
  247.  
  248. exit:       rts                           ; das war's
  249.  
  250.             .data
  251.                                           ; Startmeldung
  252. message:    .dc.b $0d,$0a
  253.             .dc.b "SUPERFIX V1.0 installiert",$0d,$0a
  254.             .dc.b "© 1991 by Stefan Wolf",$0d,$0a,$00
  255.                                           ; Fehlermeldungen
  256. ttonly:     .dc.b $0d,$0a
  257.             .dc.b "SUPERFIX läuft nur auf dem Atari TT !",$0d,$0a,$00
  258. inst:       .dc.b $0d,$0a
  259.             .dc.b "SUPERFIX schon installiert !",$0d,$0a,$00
  260. instflag:   .dc.b 0                       ; Schon Installiert Flag
  261.  
  262.             .bss
  263.  
  264. stflag:     .ds.b 1                       ; Flag für Atari ST
  265.  
  266.             .end
  267.  
  268.  
  269. Antwort, Brief, Weiter, Raus, No Stop, +/- oder Exit (03:38) : 
  270. DATUM: 06.06.1991                   ATARI TT                      ZEIT: 20:15:32
  271. Nr.3/3     Betreff : TT Proc            Von : SYSOP          07.06.1991 17:29:22
  272.  
  273.  - Nochmal aus der Maus HH -
  274. on: Julian Reschke @ MS (Di, 04.06.91 22:32)
  275.  
  276. Zitat aus dem `Hitchhiker':
  277.   proc_lives      equ     $380    ; $12345678 iff valid
  278.   proc_dregs      equ     $384    ; saved D0-D7
  279.   proc_aregs      equ     $3a4    ; saved A0-A6, supervisor A7 (SSP)
  280.   proc_enum       equ     $3c4    ; first byte is exception #
  281.   proc_usp        equ     $3c8    ; saved user A7
  282.   proc_stk        equ     $3cc    ; sixteen words popped from SSP
  283.  
  284. Daß irgendwo der pc steht, ist also sowieso nicht offiziell
  285. dokumentiert. Abhilfe? Eigenen Dispatcher schreiben.
  286.  
  287.