00001 /* depends on beeos.h. */ 00002 00003 struct regs_struct { 00004 ushort SP; ushort PC; ushort IY; ushort IX; 00005 ushort D; uchar CCR; ushort _tmp; ushort _z; 00006 ushort _xy; ushort _d[GCC_SOFTREGCOUNT]; 00007 }; 00008 typedef struct regs_struct regs_t; 00009 00010 struct task_struct { 00011 regs_t regs; 00012 ushort nextrun; 00013 ushort stacksize; 00014 char *stack; 00015 void (*func)(void); 00016 schar priority; 00017 bool sleeping; 00018 struct task_struct *prev_prior; 00019 struct task_struct *next_prior; 00020 struct task_struct *prev_time; 00021 struct task_struct *next_time; 00022 }; 00023 typedef struct task_struct task_t; 00024 00025 struct execbase_struct { 00026 task_t *current; 00027 task_t *head_prior; 00028 task_t *head_time; 00029 task_t *tail_prior; 00030 task_t *tail_time; 00031 task_t *idle_task; 00032 uchar numtasks; 00033 uchar activetasks; 00034 bool idle; 00035 bool blocked; 00036 }; 00037 typedef struct execbase_struct execbase_t; 00038 00039 #ifndef IN_EXEC 00040 extern execbase_t exec; 00041 #endif 00042 00043 void bsleep (ushort sleeptime); 00044 void addtask (void (*func)(void), schar priority, ushort nextrun, ushort stacksize); 00045 void execprep (void); 00046 /* BEGIN EXEC.H CONFIG */ 00047 /*#define EXEC_DEBUG*/ 00048 /* END EXEC.H CONFIG */ 00049 00050 #ifdef IN_EXEC 00051 00055 #define CONTEXT_SAVE() do {\ 00056 __asm__ ("puld\n\tstd %0": "=m" (tempregs._xy) : : "%d");\ 00057 __asm__ ("puld\n\tstd %0": "=m" (tempregs._z) : : "%d");\ 00058 __asm__ ("puld\n\tstd %0": "=m" (tempregs._tmp) : : "%d");\ 00059 __asm__ ("pula\n\tstaa %0": "=m" (tempregs.CCR) : : "%a");\ 00060 __asm__ ("puld\n\tstd %0": "=m" (tempregs.D) : : "%d");\ 00061 __asm__ ("puld\n\tstd %0": "=m" (tempregs.IX) : : "%d");\ 00062 __asm__ ("puld\n\tstd %0": "=m" (tempregs.IY) : : "%d");\ 00063 __asm__ ("puld\n\tstd %0": "=m" (tempregs.PC) : : "%d");\ 00064 __asm__ ("tfr sp,d\n\tstd %0": "=m" (tempregs.SP) : : "%d");\ 00065 tempregs._d[0] = _d1;\ 00066 tempregs._d[1] = _d2;\ 00067 tempregs._d[2] = _d3;\ 00068 tempregs._d[3] = _d4;\ 00069 tempregs._d[4] = _d5;\ 00070 tempregs._d[5] = _d6;\ 00071 tempregs._d[6] = _d7;\ 00072 tempregs._d[7] = _d8;\ 00073 } while (0) 00074 00075 #define CONTEXT_RESTORE() do {\ 00076 tempregs._d[0] = _d1;\ 00077 tempregs._d[1] = _d2;\ 00078 tempregs._d[2] = _d3;\ 00079 tempregs._d[3] = _d4;\ 00080 tempregs._d[4] = _d5;\ 00081 tempregs._d[5] = _d6;\ 00082 tempregs._d[6] = _d7;\ 00083 tempregs._d[7] = _d8;\ 00084 __asm__ ("ldd %0\n\ttfr d,sp": : "m" (tempregs.SP) : "%d");\ 00085 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs.PC) : "%d");\ 00086 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs.IY) : "%d");\ 00087 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs.IX) : "%d");\ 00088 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs.D) : "%d");\ 00089 __asm__ ("ldaa %0\n\tpsha": : "m" (tempregs.CCR) : "%a");\ 00090 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs._tmp) : "%d");\ 00091 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs._z) : "%d");\ 00092 __asm__ ("ldd %0\n\tpshd": : "m" (tempregs._xy) : "%d");\ 00093 } while (0) 00094 00095 #endif