* Uses Format-Lib "SUPERVIS.FOR" rev. 1.4(03/01)* PRINT 0 *------------------------------------------------* * Format Collection for Supervisor-Code * * ===================================== * * 1.1 04/97 Derived form COMFORM Ge* * 1.2 05/97 IRENTC/IREXTC/IRMALF... added Wo*1/2 * 1.3 11/99 TOR1Sx/TOA7Sx added;?-Test freigg. Wo*1/3 * 1.4 03/01 Fuer System on a Chip (PPC) Wo*1/4 *------------------------------------------------* .IF_PROCTYPE M68K *------------------------------------------------* *..... Dispatcher Call ..........................* DPCALL FORMAT.W ; no parameter * / 01010000111110000000100000000000 ST DPC * / e *------------------------------------------------* *..... IRs auf Supervisorlevel freigeben ........* IRON FORMAT.W a Dummy Reg-Nr. * / 00000010011111001111100011111111 ANDI =$F8FF,SR* / e *------------------------------------------------* *..... IRs auf Supervisorlevel sperren ..........* IROFF FORMAT.W a Dummy Reg-Nr. * / 00000000011111000000011100000000 ORI =$700,SR * / e *------------------------------------------------* *..... IR-Entry-Code ............................*1/2 IRENTC FORMAT.W+2 r,a Malfunktion,IR-Vec * / #A=#1#A-#$#A-2#A(16:31) DC.W Malfkt-$-2 / #A?16 passt in 16 Bit? (ab Assembler 4.8-A) * / 00111111001110000000011111111110 MOVE.W IID,-(A7) / 0011000111111100#2(16:31) * / 0000011111111110 MOVE.W =IR-Vec,IID / e *------------------------------------------------* *..... IR-Exit-Code .............................*1/2 IREXTC FORMAT.W ; no parameter * / 00110001110111110000011111111110 MOVE.W (A7)+,IID / 00000000011111000000011100000000 ORI =$700,SR / 01001010011110000000100000000000 TST DPC * / 0110101100000010 BMI.S $+2 * / 0100111001110011 RTE * / 01001110111110000000100100000110 JMP DISEX * / e *------------------------------------------------* *..... IR-Malfunction (Dummy in 68k).............*1/2 IRMALF FORMAT.W a IR-Vec * / e *------------------------------------------------* .FIN PAGE .IF_PROCTYPE MPC604 *------------------------------------------------* *..... Dispatcher Call ..........................* DPCALL FORMAT.L ; no parameter * / 01001110110101101011001001000010 creqv crb(dpbit),... / e *------------------------------------------------* .IF SOCPPC <<<<<<<<<<<<<<<<<<<<<1/4 *------------------------------------------------* *..... IRs auf Supervisorlevel freigeben ........* IRON FORMAT.L a,(SUMSR) Hilfsregister-Nr. rH*1/4 / 001111#1(27:31)00000#A=#2#A%16#A(0:15) lis rH,=SUMSRhi*1/4 / 100000#1(27:31)#1(27:31)#2(16:31) lwz rH,SUMSRlo(rH)*1/4 / 011111#1(27:31)000000000000100100100 mtmsr rH* / e *------------------------------------------------* *..... IRs auf Supervisorlevel sperren ..........* IROFF FORMAT.L a,(SUMSR) Hilfsregister-Nr. rH*1/4 / 001111#1(27:31)00000#A=#2#A%16#A(0:15) lis rH,=SUMSRhi*1/4 / 100000#1(27:31)#1(27:31)#2(16:31) lwz rH,SUMSRlo(rH)*1/4 / 010101#1(27:31)#1(27:31)0000010001011110 rlwinm rH,rH,0,17,15 / 011111#1(27:31)000000000000100100100 mtmsr rH* / e *------------------------------------------------* *..... IR-Entry-Code ............................*1/2 IRENTC FORMAT.L r,a,(IID) Malfunktion,IR-Vec *1/4 / 10010111110011111111111111111100 stwu r30,-4(A7) / 10010111101011111111111111111100 stwu r29,-4(A7) / 10010111100011111111111111111100 stwu r28,-4(A7) / 10010111011011111111111111111100 stwu r27,-4(A7) / 10010111010011111111111111111100 stwu r26,-4(A7) / 10010111001011111111111111111100 stwu r25,-4(A7) / 01111111111000010000001010100110 mfxer r31 * / 10010111111011111111111111111100 stwu r31,-4(A7) / 01111111111010000000001010100110 mflr r31 * / 10010111111011111111111111111100 stwu r31,-4(A7) / 0011111111000000#A=#3#A%16#A(0:15) lis r30,=IIDhi*1/4 / 1000001111111110#3(16:31) lwz r31,IIDlo(r30)*1/4 / 10010111111011111111111111111100 stwu r31,-4(A7) / 01001000000000000000000000000101 bl $+4 * / 01111111111010000000001010100110 mflr r31 * / 0011101111111111#A=#1#A-#$#A-31#A-25 *1/4 / #A(16:31) addi r31,=Malfkt-$-56*1/4 / #A?16 passt in 16 Bit? (ab Tapp 2.6-A) * / 1001001111111110#3(16:31) stw r31,IIDlo(r30)*1/4 / e *------------------------------------------------* * (IRENPP fehlt noch fuer SOCPPC) *1/4 *------------------------------------------------* *..... IR-Exit-Code .............................*1/2 IREXTC FORMAT.L (IID) ; no parameter *1/4 / 10000011111011110000000000000000 lwz r31,(A7) * / 0011111111000000#A=#1#A%16#A(0:15) lis r30,=IIDhi*1/4 / 1001001111111110#1(16:31) stw r31,IIDlo(r30)*1/4 / 10000111111011110000000000000100 lwzu r31,4(A7)* / 01111111111010000000001110100110 mtlr r31 * / 10000111111011110000000000000100 lwzu r31,4(A7)* / 01111111111000010000001110100110 mtxer r31 * / 10000111001011110000000000000100 lwzu r25,4(A7)* / 10000111010011110000000000000100 lwzu r26,4(A7)* / 10000111011011110000000000000100 lwzu r27,4(A7)* / 10000111100011110000000000000100 lwzu r28,4(A7)* / 10000111101011110000000000000100 lwzu r29,4(A7)* / 10000111110011110000000000000100 lwzu r30,4(A7)* / 00111001111011110000000000000100 addi A7,=4 * / 01001110100000000000000000100000 blr to IR-Slot* / e *------------------------------------------------* * (IREXPP fehlt noch fuer SOCPPC) *1/4 *------------------------------------------------* .ELSE SOCPPC <<<<<<<<<<<<<<<<<<<<<1/4 *------------------------------------------------* *..... IRs auf Supervisorlevel freigeben ........* IRON FORMAT.L a Hilfsregister-Nr. rH* / 100000#1(27:31)000000101000000001000 lwz rH,SUMSR / 011111#1(27:31)000000000000100100100 mtmsr rH * / e *------------------------------------------------* *..... IRs auf Supervisorlevel sperren ..........* IROFF FORMAT.L a Hilfsregister-Nr. rH* / 100000#1(27:31)000000101000000001000 lwz rH,SUMSR / 010101#1(27:31)#1(27:31)0000010001011110 rlwinm rH,rH,0,17,15 / 011111#1(27:31)000000000000100100100 mtmsr rH * / e *------------------------------------------------* *..... IR-Entry-Code ............................*1/2 IRENTC FORMAT.L r,a Malfunktion,IR-Vec * / 10010111110011111111111111111100 stwu r30,-4(A7) / 10010111101011111111111111111100 stwu r29,-4(A7) / 10010111100011111111111111111100 stwu r28,-4(A7) / 10010111011011111111111111111100 stwu r27,-4(A7) / 10010111010011111111111111111100 stwu r26,-4(A7) / 10010111001011111111111111111100 stwu r25,-4(A7) / 01111111111000010000001010100110 mfxer r31 * / 10010111111011111111111111111100 stwu r31,-4(A7) / 01111111111010000000001010100110 mflr r31 * / 10010111111011111111111111111100 stwu r31,-4(A7) / 10000011111000000101000000000100 lwz r31,IID * / 10010111111011111111111111111100 stwu r31,-4(A7) / 01001000000000000000000000000101 bl $+4 * / 01111111111010000000001010100110 mflr r31 * / 0011101111111111#A=#1#A-#$#A-31#A-21 * / #A(16:31) addi r31,=Malfkt-$-52* / #A?16 passt in 16 Bit? (ab Tapp 2.6-A) * / 10010011111000000101000000000100 stw r31,IID * / e *------------------------------------------------* *..... IR-Entry-Code, nur PowerPC native! .......*1/2 IRENPP FORMAT.L r,a Malfunktion,IR-Vec * / 01111111111010000000001010100110 mflr r31 * / 10010111111011111111111111111100 stwu r31,-4(A7) / 10000011111000000101000000000100 lwz r31,IID * / 10010111111011111111111111111100 stwu r31,-4(A7) / 01001000000000000000000000000101 bl $+4 * / 01111111111010000000001010100110 mflr r31 * / 0011101111111111#A=#1#A-#$#A-20 * / #A(16:31) addi r31,=Malfkt-$-20* / #A?16 passt in 16 Bit? (ab Tapp 2.6-A) * / 10010011111000000101000000000100 stw r31,IID * / e *------------------------------------------------* *..... IR-Exit-Code .............................*1/2 IREXTC FORMAT.L ; no parameter * / 10000011111011110000000000000000 lwz r31,(A7) * / 10010011111000000101000000000100 stw r31,IID * / 10000111111011110000000000000100 lwzu r31,4(A7)* / 01111111111010000000001110100110 mtlr r31 * / 10000111111011110000000000000100 lwzu r31,4(A7)* / 01111111111000010000001110100110 mtxer r31 * / 10000111001011110000000000000100 lwzu r25,4(A7)* / 10000111010011110000000000000100 lwzu r26,4(A7)* / 10000111011011110000000000000100 lwzu r27,4(A7)* / 10000111100011110000000000000100 lwzu r28,4(A7)* / 10000111101011110000000000000100 lwzu r29,4(A7)* / 10000111110011110000000000000100 lwzu r30,4(A7)* / 00111001111011110000000000000100 addi A7,=4 * / 01001110100000000000000000100000 blr to IR-Slot* / e *------------------------------------------------* *..... IR-Exit-Code, nur PowerPC native! ........*1/2 IREXPP FORMAT.L ; no parameter * / 10000011111011110000000000000000 lwz r31,(A7) * / 10010011111000000101000000000100 stw r31,IID * / 10000111111011110000000000000100 lwzu r31,4(A7)* / 01111111111010000000001110100110 mtlr r31 * / 00111001111011110000000000000100 addi A7,=4 * / 01001110100000000000000000100000 blr to IR-Slot* / e *------------------------------------------------* .FIN SOCPPC <<<<<<<<<<<<<<<<<<<<<1/4 *------------------------------------------------* *..... IR-Malfunction............................*1/2 IRMALF FORMAT.L+4 a IR-Vec * / #1(0:31) DC.L IR-Vec * / e *------------------------------------------------* *...... Hinweise zu den Formaten ................*1/3 * TOR1Sx "To r1-Stack" und * * TOA7Sx "To A7-Stack": * * Die Formate dienen dazu, beim PowerPC auf * * Supervisor-Ebene vom normalen RTOS-Stackpionter* * A7 zu dem in C gebraeuchlichen Stackpointer r1 * * zu wechseln. * * . . . . . . . . . . . . . . . . . . . . . . . .* * Das Paar mit der Endung "I" ist fuer IR-Routi- * * nen gedacht. Typisch waere also folgender Code:* * IRxy IRENTC Malf,IVEC IR-Entry * * TOR1SI Wechsel nach r1-Stk.* * (r1=D1 ist jetzt der gueltige System-Stk-Poin- * * ter, A7 darf zwischendurch verwendet werden.) * * .IF_PROCTYPE MPC604 * * stwu A7,-4(r1) z.B. A7 auf r1-Stk * * li A7,=$1234 z.B.A7(=r15) aendern* * ... * * Exit lwz A7,(r1) alles zurueck ... * * addi r1,=4 auf Stack freigeben * * .FIN PROCTYPE MPC604 * * TOA7SI Wechsel nach A7-Stk.* * IREXTC Ausgang mit A7-Stack* * Malf IRMALF IVEC Malfunction * * ... (Stk. ist noch r1) * * BRA Exit zum Ausstieg * * . . . . . . . . . . . . . . . . . . . . . . . .* * Bei Verwendung mit PIRTRI ist folgendes Vorge- * * hen notwendig: * * IRxy IRENTC Malf,IVEC IR-Entry * * MOVEM.L D1/D6/D7/A1,-(A7) PIRTRI-Regs save* * TOR1SI Wechsel nach r1-Stk.* * (r1=D1 ist jetzt der gueltige System-Stk-Poin- * * ter, A7 darf zwischendurch verwendet werden.) * * .IF_PROCTYPE MPC604 * * stwu A7,-4(r1) z.B. A7 auf r1-Stk * * li A7,=$1234 z.B.A7(=r15) aendern* * ... * * Exit lwz A7,(r1) alles zurueck ... * * addi r1,=4 auf Stack freigeben * * .FIN PROCTYPE MPC604 * * TOA7SI Wechsel nach A7-Stk.* * MOVE.L =$80000000,D1 event-Code setzen * * MOVEA.L PIRTRI,A1 Sprungadr. laden * * JMP (A1) Prozess-IR feuern * * Malf IRMALF IVEC Malfunction * * ... (Stk. ist noch r1) * * BRA Exit zum Ausstieg * * . . . . . . . . . . . . . . . . . . . . . . . .* * Fuer eine Task im Supervisor-Mode sind die For-* * mate mit der Endung "O" (fuer "OFF") gedacht. * * TOR1SO bringt A7(=r15) in den Zustand vor dem * * OFF und macht das vom User kommende r1 zum * * gueltigen System-Stackpointer! * * Folglich muss r1 vor dem OFF von der User-Task * * unbedingt als Stack-Pointer initialisiert wer- * * den. Da IRs, welche die Supervisor-Sequenz * * durchschlagen, dieses r1 als Stack-Pointer ver-* * wenden, muss auf dem r1-Stack zu jedem Zeit- * * punkt genug Platz (sicherheitshalber > $800 * * Bytes) frei sein! * * Typisch ist folgende Verwendung in einer Task: * * ... Init r1 als Stk-Pntr* * OFF to Supervisor * * TOR1SO r1 als Sys-Stk-Pntr.* * (Das unveraenderte User-r1(=D1) ist jetzt der * * gueltige System-Stack-Pointer. Der Stack darf * * benutzt werden. Der Stack-Fuellstand darf beim* * DPC anders sein als er beim OFF war. * * r15(=A7) hat den gleichen Inhalt wie vor dem * * OFF und darf beliebig veraendert werden.) * * ... * * IRON 30 "IR frei"ist erlaubt* * ... * * TOA7SO recall A7 Sys-Stack * * DPC wieder zu User werdn* * (r1 und r15 haben fuer die User-Task nun wieder* * den gleichen Inhalt wie innerhalb der Supervi-* * sor-Sequenz.) * * . . . . . . . . . . . . . . . . . . . . . . . .* * Achtung: * * - Die Aenderung von cr5 ist streng verboten! * * (Dies gilt sowieso in jeder Supervisor- * * Sequenz. Auch zwischenzeitliches "stacken" * * von cr5 ist nicht erlaubt.) * * - Diese Fromate duerfen erst ab NUK 7.8-D * * verwendet werden! * * - Die Imp. muss speziell fuer den Stack- * * Pointer-Wechsel angepasst sein! * * - Die Formate duerfen grundsaetzlich nur als * * Paar verwendet werden (nach dem Einstieg erst* * "to r1" und dann vor dem Ausstieg "to A7")! * *------------------------------------------------* *..... To r1-Stack (IR)..........................*1/3 TOR1SI FORMAT.L ; no parameter * / 01111100001111110000101101111000 or r31,r1,r1 copy Outer-r1 / 01111101111000010111101101111000 or r1,A7,A7 Suprv-Stk A7 and r1 / 01001110111000000000001001000010 creqv crb(r1bit),crb0,crb0 mark:r1-Stk / 01111111111011111111101101111000 or A7,r31,r31 save Outr-r1 to A7 / e * *------------------------------------------------* *..... To A7-Stack (IR)..........................*1/3 TOA7SI FORMAT.L ; no parameter * / 01111101111111110111101101111000 or r31,A7,A7 copy "Outer-r1" / 01111100001011110000101101111000 or A7,r1,r1 Suprv-Stk A7 and r1 / 01001110111000000000000110000010 crxor crb(r1bit),crb0,crb0 mark:A7-Stk / 01111111111000011111101101111000 or r1,r31,r31 recll Outr-r1 (from A7) / e * *------------------------------------------------* *..... To r1-Stack (OFF).........................*1/3 TOR1SO FORMAT.L ; no parameter * / 01001110111000000000001001000010 creqv crb(r1bit),crb0,crb0 mark:r1-Stk / 01111111110100010100001010100110 mfsprg1 r30 copy Task's Usr-A7 / 01111101111100010100001110100110 mtsprg1 A7 save RTOS-Stk-Pntr.instead / 01111111110011111111001101111000 or A7,r30,r30 recall Task's Usr-A7 / e * *------------------------------------------------* *..... To A7-Stack (OFF).........................*1/3 TOA7SO FORMAT.L ; no parameter * / 01111101111111100111101101111000 or r30,A7,A7 copy (modified?) Tsk's A7 / 01111101111100010100001010100110 mfsprg1 A7 recall RTOS-Stk.-Pntr. / 01111111110100010100001110100110 mtsprg1 r30 "resave" Tsk's A7 for Usr / 01001110111000000000000110000010 crxor crb(r1bit),crb0,crb0 mark:A7-Stk / e * *------------------------------------------------* .FIN