David Howells | a5401ee | 2012-03-28 18:30:02 +0100 | [diff] [blame] | 1 | #ifndef _H8300_SWITCH_TO_H |
| 2 | #define _H8300_SWITCH_TO_H |
| 3 | |
| 4 | /* |
| 5 | * switch_to(n) should switch tasks to task ptr, first checking that |
| 6 | * ptr isn't the current task, in which case it does nothing. This |
| 7 | * also clears the TS-flag if the task we switched to has used the |
| 8 | * math co-processor latest. |
| 9 | */ |
| 10 | /* |
| 11 | * switch_to() saves the extra registers, that are not saved |
| 12 | * automatically by SAVE_SWITCH_STACK in resume(), ie. d0-d5 and |
| 13 | * a0-a1. Some of these are used by schedule() and its predecessors |
| 14 | * and so we might get see unexpected behaviors when a task returns |
| 15 | * with unexpected register values. |
| 16 | * |
| 17 | * syscall stores these registers itself and none of them are used |
| 18 | * by syscall after the function in the syscall has been called. |
| 19 | * |
| 20 | * Beware that resume now expects *next to be in d1 and the offset of |
| 21 | * tss to be in a1. This saves a few instructions as we no longer have |
| 22 | * to push them onto the stack and read them back right after. |
| 23 | * |
| 24 | * 02/17/96 - Jes Sorensen (jds@kom.auc.dk) |
| 25 | * |
| 26 | * Changed 96/09/19 by Andreas Schwab |
| 27 | * pass prev in a0, next in a1, offset of tss in d1, and whether |
| 28 | * the mm structures are shared in d2 (to avoid atc flushing). |
| 29 | * |
| 30 | * H8/300 Porting 2002/09/04 Yoshinori Sato |
| 31 | */ |
| 32 | |
| 33 | asmlinkage void resume(void); |
| 34 | #define switch_to(prev,next,last) { \ |
| 35 | void *_last; \ |
| 36 | __asm__ __volatile__( \ |
| 37 | "mov.l %1, er0\n\t" \ |
| 38 | "mov.l %2, er1\n\t" \ |
| 39 | "mov.l %3, er2\n\t" \ |
| 40 | "jsr @_resume\n\t" \ |
| 41 | "mov.l er2,%0\n\t" \ |
| 42 | : "=r" (_last) \ |
| 43 | : "r" (&(prev->thread)), \ |
| 44 | "r" (&(next->thread)), \ |
| 45 | "g" (prev) \ |
| 46 | : "cc", "er0", "er1", "er2", "er3"); \ |
| 47 | (last) = _last; \ |
| 48 | } |
| 49 | |
| 50 | #endif /* _H8300_SWITCH_TO_H */ |