X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fswitch_dsp56k.c;h=d99a6487ddb94c10ebf5c07ba735e93c8e305cb8;hb=f78e7b82ce293dabb9695e3656c244b955fbb9d2;hp=e10216cbb6ccea4c3a37736658bcd29c5b010659;hpb=1cc167e20f21d2e81527ca47ccd4a21a6198f86f;p=bertos.git diff --git a/kern/switch_dsp56k.c b/kern/switch_dsp56k.c index e10216cb..d99a6487 100755 --- a/kern/switch_dsp56k.c +++ b/kern/switch_dsp56k.c @@ -1,7 +1,9 @@ /*! * \file + * * * \version $Id$ * @@ -12,6 +14,13 @@ /* * $Log$ + * Revision 1.3 2004/07/30 14:24:16 rasky + * Task switching con salvataggio perfetto stato di interrupt (SR) + * Kernel monitor per dump informazioni su stack dei processi + * + * Revision 1.2 2004/06/03 11:27:09 bernie + * Add dual-license information. + * * Revision 1.1 2004/05/23 17:27:00 bernie * Import kern/ subdirectory. * @@ -21,31 +30,6 @@ void asm_switch_context(void ** new_sp/*R2*/, void ** save_sp/*R3*/); asm void asm_switch_context(void ** new_sp, void ** save_sp) { lea (SP)+ - move n,x:(SP)+ - move x0,x:(SP)+ - move y0,x:(SP)+ - move y1,x:(SP)+ - move a0,x:(SP)+ - move a1,x:(SP)+ - move a2,x:(SP)+ - move b0,x:(SP)+ - move b1,x:(SP)+ - move b2,x:(SP)+ - move r0,x:(SP)+ - move r1,x:(SP)+ - move r2,x:(SP)+ - move r3,x:(SP)+ - - move omr,x:(SP)+ - move la,x:(SP)+ - move m01,x:(SP)+ - move lc,x:(SP)+ - - ; - ; save hardware stack - ; - move hws,x:(SP)+ - move hws,x:(SP)+ ; From the manual: ; The compiler uses page 0 address locations X: 0x0030 - 0x003F as register @@ -75,13 +59,16 @@ asm void asm_switch_context(void ** new_sp, void ** save_sp) move y1,x:(SP) ; - ; 28 words have been pushed on the stack. + ; Switch stacks nop move SP, x:(R3) nop move x:(R2), SP nop + ; + ; restore all saved registers + ; pop y1 move y1,x:<$3F pop y1 @@ -99,38 +86,13 @@ asm void asm_switch_context(void ** new_sp, void ** save_sp) pop y1 move y1,x:<$38 - ; - ; restore hardware stack - ; - move hws,la ; Clear HWS to ensure proper reload - move hws,la - pop HWS - pop HWS - - ; - ; restore all saved registers - ; - pop lc - pop m01 - pop la - pop omr - - pop r3 - pop r2 - pop r1 - pop r0 - pop b2 - pop b1 - pop b0 - pop a2 - pop a1 - pop a0 - - pop y1 - pop y0 - pop x0 + ; SR is already pushed on the stack (normal call context). Use RTI to restore + ; it, so that interrupt status is preserved across the tasks. + rti +} - pop n - - rts +int asm_switch_version(void); +int asm_switch_version(void) +{ + return 1; }