X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fswitch_dsp56k.c;h=41a12056679482af0324e3dbc5fe0fa63361020f;hb=4654a69f5df97af36ee5456d20cbccdc19012dc2;hp=51a380f47d21e6f691f0571d12abbb6219e05b46;hpb=96f0ef786b54356c56cc3d4e4f0838df2505cfcc;p=bertos.git diff --git a/kern/switch_dsp56k.c b/kern/switch_dsp56k.c old mode 100755 new mode 100644 index 51a380f4..41a12056 --- a/kern/switch_dsp56k.c +++ b/kern/switch_dsp56k.c @@ -1,8 +1,33 @@ -/*! +/** * \file * * * \version $Id$ @@ -12,45 +37,36 @@ * \brief DSP5680x task switching support */ -/* - * $Log$ - * 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. - * - */ +/*#* + *#* $Log$ + *#* Revision 1.7 2006/07/19 12:56:27 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.6 2006/02/24 01:17:05 bernie + *#* Update for new emulator. + *#* + *#* Revision 1.5 2005/11/04 16:20:02 bernie + *#* Fix reference to README.devlib in header. + *#* + *#* Revision 1.4 2004/08/25 14:12:09 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* 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. + *#* + *#*/ 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 @@ -78,15 +94,18 @@ asm void asm_switch_context(void ** new_sp, void ** save_sp) move y1,x:(SP)+ move x:<$3F,y1 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 @@ -104,38 +123,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; }