10 #define PRIORITY_NUM 16
11 #define THREAD_NAME_SIZE 15
13 /* ¥¹¥ì¥Ã¥É¡¦¥³¥ó¥Æ¥¥¹¥È */
14 typedef struct _kz_context {
15 uint32 sp; /* ¥¹¥¿¥Ã¥¯¡¦¥Ý¥¤¥ó¥¿ */
18 /* ¥¿¥¹¥¯¡¦¥³¥ó¥È¥í¡¼¥ë¡¦¥Ö¥í¥Ã¥¯(TCB) */
19 typedef struct _kz_thread {
20 struct _kz_thread *next;
21 char name[THREAD_NAME_SIZE + 1]; /* ¥¹¥ì¥Ã¥É̾ */
22 int priority; /* Í¥ÀèÅÙ */
23 char *stack; /* ¥¹¥¿¥Ã¥¯ */
24 uint32 flags; /* ³Æ¼ï¥Õ¥é¥° */
25 #define KZ_THREAD_FLAG_READY (1 << 0)
27 struct { /* ¥¹¥ì¥Ã¥É¤Î¥¹¥¿¡¼¥È¡¦¥¢¥Ã¥×(thread_init())¤ËÅϤ¹¥Ñ¥é¥á¡¼¥¿ */
28 kz_func_t func; /* ¥¹¥ì¥Ã¥É¤Î¥á¥¤¥ó´Ø¿ô */
29 int argc; /* ¥¹¥ì¥Ã¥É¤Î¥á¥¤¥ó´Ø¿ô¤ËÅϤ¹ argc */
30 char **argv; /* ¥¹¥ì¥Ã¥É¤Î¥á¥¤¥ó´Ø¿ô¤ËÅϤ¹ argv */
33 struct { /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ëÍѥХåե¡ */
34 kz_syscall_type_t type;
35 kz_syscall_param_t *param;
38 kz_context context; /* ¥³¥ó¥Æ¥¥¹¥È¾ðÊó */
41 /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ð¥Ã¥Õ¥¡ */
42 typedef struct _kz_msgbuf {
43 struct _kz_msgbuf *next;
44 kz_thread *sender; /* ¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤·¤¿¥¹¥ì¥Ã¥É */
45 struct { /* ¥á¥Ã¥»¡¼¥¸¤Î¥Ñ¥é¥á¡¼¥¿ÊݸÎΰè */
51 /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ü¥Ã¥¯¥¹ */
52 typedef struct _kz_msgbox {
53 kz_thread *receiver; /* ¼õ¿®ÂÔ¤Á¾õÂ֤Υ¹¥ì¥Ã¥É */
58 * H8¤Ï16¥Ó¥Ã¥ÈCPU¤Ê¤Î¤Ç¡¤32¥Ó¥Ã¥ÈÀ°¿ô¤ËÂФ·¤Æ¤Î¾è»»Ì¿Î᤬̵¤¤¡¥¤è¤Ã¤Æ
59 * ¹½Â¤ÂΤΥµ¥¤¥º¤¬£²¤Î³¬¾è¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤¤¤È¡¤¹½Â¤ÂΤÎÇÛÎó¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹
60 * ·×»»¤Ç¾è»»¤¬»È¤ï¤ì¤Æ¡Ö___mulsi3¤¬Ìµ¤¤¡×¤Ê¤É¤Î¥ê¥ó¥¯¡¦¥¨¥é¡¼¤Ë¤Ê¤ë¾ì¹ç¤¬
61 * ¤¢¤ë¡¥(£²¤Î³¬¾è¤Ê¤é¤Ð¥·¥Õ¥È±é»»¤¬ÍøÍѤµ¤ì¤ë¤Î¤ÇÌäÂê¤Ï½Ð¤Ê¤¤)
62 * Âкö¤È¤·¤Æ¡¤¥µ¥¤¥º¤¬£²¤Î³¬¾è¤Ë¤Ê¤ë¤è¤¦¤Ë¥À¥ß¡¼¡¦¥á¥ó¥Ð¤ÇÄ´À°¤¹¤ë¡¥
63 * ¾¹½Â¤ÂΤÇƱÍͤΥ¨¥é¡¼¤¬½Ð¤¿¾ì¹ç¤Ë¤Ï¡¤Æ±ÍͤÎÂнè¤ò¤¹¤ë¤³¤È¡¥
68 /* ¥¹¥ì¥Ã¥É¤Î¥ì¥Ç¥£¡¼¡¦¥¥å¡¼ */
72 } readyque[PRIORITY_NUM];
74 static kz_thread *current; /* ¥«¥ì¥ó¥È¡¦¥¹¥ì¥Ã¥É */
75 static kz_thread threads[THREAD_NUM]; /* ¥¿¥¹¥¯¡¦¥³¥ó¥È¥í¡¼¥ë¡¦¥Ö¥í¥Ã¥¯ */
76 static kz_handler_t handlers[SOFTVEC_TYPE_NUM]; /* ³ä¹þ¤ß¥Ï¥ó¥É¥é */
77 static kz_msgbox msgboxes[MSGBOX_ID_NUM]; /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ü¥Ã¥¯¥¹ */
79 void dispatch(kz_context *context);
81 /* ¥«¥ì¥ó¥È¡¦¥¹¥ì¥Ã¥É¤ò¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤«¤éÈ´¤½Ð¤¹ */
82 static int getcurrent(void)
84 if (current == NULL) {
87 if (!(current->flags & KZ_THREAD_FLAG_READY)) {
88 /* ¤¹¤Ç¤Ë̵¤¤¾ì¹ç¤Ï̵»ë */
92 /* ¥«¥ì¥ó¥È¡¦¥¹¥ì¥Ã¥É¤Ïɬ¤ºÀèƬ¤Ë¤¢¤ë¤Ï¤º¤Ê¤Î¤Ç¡¤ÀèƬ¤«¤éÈ´¤½Ð¤¹ */
93 readyque[current->priority].head = current->next;
94 if (readyque[current->priority].head == NULL) {
95 readyque[current->priority].tail = NULL;
97 current->flags &= ~KZ_THREAD_FLAG_READY;
103 /* ¥«¥ì¥ó¥È¡¦¥¹¥ì¥Ã¥É¤ò¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤Ë·Ò¤²¤ë */
104 static int putcurrent(void)
106 if (current == NULL) {
109 if (current->flags & KZ_THREAD_FLAG_READY) {
110 /* ¤¹¤Ç¤Ëͤë¾ì¹ç¤Ï̵»ë */
114 /* ¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤ÎËöÈø¤ËÀܳ¤¹¤ë */
115 if (readyque[current->priority].tail) {
116 readyque[current->priority].tail->next = current;
118 readyque[current->priority].head = current;
120 readyque[current->priority].tail = current;
121 current->flags |= KZ_THREAD_FLAG_READY;
126 static void thread_end(void)
131 /* ¥¹¥ì¥Ã¥É¤Î¥¹¥¿¡¼¥È¡¦¥¢¥Ã¥× */
132 static void thread_init(kz_thread *thp)
134 /* ¥¹¥ì¥Ã¥É¤Î¥á¥¤¥ó´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹ */
135 thp->init.func(thp->init.argc, thp->init.argv);
139 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_run():¥¹¥ì¥Ã¥É¤Îµ¯Æ°) */
140 static kz_thread_id_t thread_run(kz_func_t func, char *name, int priority,
141 int stacksize, int argc, char *argv[])
146 extern char userstack; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤ë¥¹¥¿¥Ã¥¯Îΰè */
147 static char *thread_stack = &userstack;
149 /* ¶õ¤¤¤Æ¤¤¤ë¥¿¥¹¥¯¡¦¥³¥ó¥È¥í¡¼¥ë¡¦¥Ö¥í¥Ã¥¯¤ò¸¡º÷ */
150 for (i = 0; i < THREAD_NUM; i++) {
152 if (!thp->init.func) /* ¸«¤Ä¤«¤Ã¤¿ */
155 if (i == THREAD_NUM) /* ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿ */
158 memset(thp, 0, sizeof(*thp));
160 /* ¥¿¥¹¥¯¡¦¥³¥ó¥È¥í¡¼¥ë¡¦¥Ö¥í¥Ã¥¯(TCB)¤ÎÀßÄê */
161 strcpy(thp->name, name);
163 thp->priority = priority;
166 thp->init.func = func;
167 thp->init.argc = argc;
168 thp->init.argv = argv;
170 /* ¥¹¥¿¥Ã¥¯Îΰè¤ò³ÍÆÀ */
171 memset(thread_stack, 0, stacksize);
172 thread_stack += stacksize;
174 thp->stack = thread_stack; /* ¥¹¥¿¥Ã¥¯¤òÀßÄê */
176 /* ¥¹¥¿¥Ã¥¯¤Î½é´ü²½ */
177 sp = (uint32 *)thp->stack;
178 *(--sp) = (uint32)thread_end;
181 * ¥×¥í¥°¥é¥à¡¦¥«¥¦¥ó¥¿¤òÀßÄꤹ¤ë¡¥
182 * ¥¹¥ì¥Ã¥É¤ÎÍ¥ÀèÅÙ¤¬¥¼¥í¤Î¾ì¹ç¤Ë¤Ï¡¤³ä¹þ¤ß¶Ø»ß¥¹¥ì¥Ã¥É¤È¤¹¤ë¡¥
184 *(--sp) = (uint32)thread_init | ((uint32)(priority ? 0 : 0xc0) << 24);
186 *(--sp) = 0; /* ER6 */
187 *(--sp) = 0; /* ER5 */
188 *(--sp) = 0; /* ER4 */
189 *(--sp) = 0; /* ER3 */
190 *(--sp) = 0; /* ER2 */
191 *(--sp) = 0; /* ER1 */
193 /* ¥¹¥ì¥Ã¥É¤Î¥¹¥¿¡¼¥È¡¦¥¢¥Ã¥×(thread_init())¤ËÅϤ¹°ú¿ô */
194 *(--sp) = (uint32)thp; /* ER0 */
196 /* ¥¹¥ì¥Ã¥É¤Î¥³¥ó¥Æ¥¥¹¥È¤òÀßÄê */
197 thp->context.sp = (uint32)sp;
199 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤ò¸Æ¤Ó½Ð¤·¤¿¥¹¥ì¥Ã¥É¤ò¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤ËÌ᤹ */
202 /* ¿·µ¬ºîÀ®¤·¤¿¥¹¥ì¥Ã¥É¤ò¡¤¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤ËÀܳ¤¹¤ë */
206 return (kz_thread_id_t)current;
209 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_exit():¥¹¥ì¥Ã¥É¤Î½ªÎ») */
210 static int thread_exit(void)
213 * ËÜÍè¤Ê¤é¥¹¥¿¥Ã¥¯¤â²òÊü¤·¤ÆºÆÍøÍѤǤ¤ë¤è¤¦¤Ë¤¹¤Ù¤¤À¤¬¾Êά¡¥
214 * ¤³¤Î¤¿¤á¡¤¥¹¥ì¥Ã¥É¤òÉÑÈˤËÀ¸À®¡¦¾Ãµî¤¹¤ë¤è¤¦¤Ê¤³¤È¤Ï¸½¾õ¤Ç¤Ç¤¤Ê¤¤¡¥
218 memset(current, 0, sizeof(*current));
222 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_wait():¥¹¥ì¥Ã¥É¤Î¼Â¹Ô¸¢Êü´þ) */
223 static int thread_wait(void)
229 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_sleep():¥¹¥ì¥Ã¥É¤Î¥¹¥ê¡¼¥×) */
230 static int thread_sleep(void)
235 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_wakeup():¥¹¥ì¥Ã¥É¤Î¥¦¥§¥¤¥¯¡¦¥¢¥Ã¥×) */
236 static int thread_wakeup(kz_thread_id_t id)
238 /* ¥¦¥§¥¤¥¯¡¦¥¢¥Ã¥×¤ò¸Æ¤Ó½Ð¤·¤¿¥¹¥ì¥Ã¥É¤ò¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤ËÌ᤹ */
241 /* »ØÄꤵ¤ì¤¿¥¹¥ì¥Ã¥É¤ò¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤ËÀܳ¤·¤Æ¥¦¥§¥¤¥¯¡¦¥¢¥Ã¥×¤¹¤ë */
242 current = (kz_thread *)id;
248 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_getid():¥¹¥ì¥Ã¥ÉID¼èÆÀ) */
249 static kz_thread_id_t thread_getid(void)
252 return (kz_thread_id_t)current;
255 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_chpri():¥¹¥ì¥Ã¥É¤ÎÍ¥ÀèÅÙÊѹ¹) */
256 static int thread_chpri(int priority)
258 int old = current->priority;
260 current->priority = priority; /* Í¥ÀèÅÙÊѹ¹ */
261 putcurrent(); /* ¿·¤·¤¤Í¥ÀèÅ٤Υì¥Ç¥£¡¼¡¦¥¥å¡¼¤Ë·Ò¤®Ä¾¤¹ */
265 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_kmalloc():ưŪ¥á¥â¥ê³ÍÆÀ) */
266 static void *thread_kmalloc(int size)
269 return kzmem_alloc(size);
272 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_kfree():¥á¥â¥ê²òÊü) */
273 static int thread_kmfree(char *p)
280 /* ¥á¥Ã¥»¡¼¥¸¤ÎÁ÷¿®½èÍý */
281 static void sendmsg(kz_msgbox *mboxp, kz_thread *thp, int size, char *p)
285 /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ð¥Ã¥Õ¥¡¤ÎºîÀ® */
286 mp = (kz_msgbuf *)kzmem_alloc(sizeof(*mp));
291 mp->param.size = size;
294 /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ü¥Ã¥¯¥¹¤ÎËöÈø¤Ë¥á¥Ã¥»¡¼¥¸¤òÀܳ¤¹¤ë */
296 mboxp->tail->next = mp;
303 /* ¥á¥Ã¥»¡¼¥¸¤Î¼õ¿®½èÍý */
304 static void recvmsg(kz_msgbox *mboxp)
307 kz_syscall_param_t *p;
309 /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ü¥Ã¥¯¥¹¤ÎÀèƬ¤Ë¤¢¤ë¥á¥Ã¥»¡¼¥¸¤òÈ´¤½Ð¤¹ */
311 mboxp->head = mp->next;
312 if (mboxp->head == NULL)
316 /* ¥á¥Ã¥»¡¼¥¸¤ò¼õ¿®¤¹¤ë¥¹¥ì¥Ã¥É¤ËÊÖ¤¹ÃͤòÀßÄꤹ¤ë */
317 p = mboxp->receiver->syscall.param;
318 p->un.recv.ret = (kz_thread_id_t)mp->sender;
319 if (p->un.recv.sizep)
320 *(p->un.recv.sizep) = mp->param.size;
322 *(p->un.recv.pp) = mp->param.p;
324 /* ¼õ¿®ÂÔ¤Á¥¹¥ì¥Ã¥É¤Ï¤¤¤Ê¤¯¤Ê¤Ã¤¿¤Î¤Ç¡¤NULL¤ËÌ᤹ */
325 mboxp->receiver = NULL;
327 /* ¥á¥Ã¥»¡¼¥¸¡¦¥Ð¥Ã¥Õ¥¡¤Î²òÊü */
331 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_send():¥á¥Ã¥»¡¼¥¸Á÷¿®) */
332 static int thread_send(kz_msgbox_id_t id, int size, char *p)
334 kz_msgbox *mboxp = &msgboxes[id];
337 sendmsg(mboxp, current, size, p); /* ¥á¥Ã¥»¡¼¥¸¤ÎÁ÷¿®½èÍý */
339 /* ¼õ¿®ÂÔ¤Á¥¹¥ì¥Ã¥É¤¬Â¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¼õ¿®½èÍý¤ò¹Ô¤¦ */
340 if (mboxp->receiver) {
341 current = mboxp->receiver; /* ¼õ¿®ÂÔ¤Á¥¹¥ì¥Ã¥É */
342 recvmsg(mboxp); /* ¥á¥Ã¥»¡¼¥¸¤Î¼õ¿®½èÍý */
343 putcurrent(); /* ¼õ¿®¤Ë¤è¤êÆ°ºî²Äǽ¤Ë¤Ê¤Ã¤¿¤Î¤Ç¡¤¥Ö¥í¥Ã¥¯²ò½ü¤¹¤ë */
349 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_recv():¥á¥Ã¥»¡¼¥¸¼õ¿®) */
350 static kz_thread_id_t thread_recv(kz_msgbox_id_t id, int *sizep, char **pp)
352 kz_msgbox *mboxp = &msgboxes[id];
354 if (mboxp->receiver) /* ¾¤Î¥¹¥ì¥Ã¥É¤¬¤¹¤Ç¤Ë¼õ¿®ÂÔ¤Á¤·¤Æ¤¤¤ë */
357 mboxp->receiver = current; /* ¼õ¿®ÂÔ¤Á¥¹¥ì¥Ã¥É¤ËÀßÄê */
359 if (mboxp->head == NULL) {
361 * ¥á¥Ã¥»¡¼¥¸¡¦¥Ü¥Ã¥¯¥¹¤Ë¥á¥Ã¥»¡¼¥¸¤¬Ìµ¤¤¤Î¤Ç¡¤¥¹¥ì¥Ã¥É¤ò
362 * ¥¹¥ê¡¼¥×¤µ¤»¤ë¡¥(¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤¬¥Ö¥í¥Ã¥¯¤¹¤ë)
367 recvmsg(mboxp); /* ¥á¥Ã¥»¡¼¥¸¤Î¼õ¿®½èÍý */
368 putcurrent(); /* ¥á¥Ã¥»¡¼¥¸¤ò¼õ¿®¤Ç¤¤¿¤Î¤Ç¡¤¥ì¥Ç¥£¡¼¾õÂ֤ˤ¹¤ë */
370 return current->syscall.param->un.recv.ret;
373 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý(kz_setintr():³ä¹þ¤ß¥Ï¥ó¥É¥éÅÐÏ¿) */
374 static int thread_setintr(softvec_type_t type, kz_handler_t handler)
376 static void thread_intr(softvec_type_t type, unsigned long sp);
379 * ³ä¹þ¤ß¤ò¼õ¤±ÉÕ¤±¤ë¤¿¤á¤Ë¡¤¥½¥Õ¥È¥¦¥¨¥¢¡¦³ä¹þ¤ß¥Ù¥¯¥¿¤Ë
380 * OS¤Î³ä¹þ¤ß½èÍý¤ÎÆþ¸ý¤È¤Ê¤ë´Ø¿ô¤òÅÐÏ¿¤¹¤ë¡¥
382 softvec_setintr(type, thread_intr);
384 handlers[type] = handler; /* OS¦¤«¤é¸Æ¤Ó½Ð¤¹³ä¹þ¤ß¥Ï¥ó¥É¥é¤òÅÐÏ¿ */
390 static void call_functions(kz_syscall_type_t type, kz_syscall_param_t *p)
392 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î¼Â¹ÔÃæ¤Ëcurrent¤¬½ñ¤´¹¤ï¤ë¤Î¤ÇÃí°Õ */
394 case KZ_SYSCALL_TYPE_RUN: /* kz_run() */
395 p->un.run.ret = thread_run(p->un.run.func, p->un.run.name,
396 p->un.run.priority, p->un.run.stacksize,
397 p->un.run.argc, p->un.run.argv);
399 case KZ_SYSCALL_TYPE_EXIT: /* kz_exit() */
400 /* TCB¤¬¾Ãµî¤µ¤ì¤ë¤Î¤Ç¡¤Ìá¤êÃͤò½ñ¤¹þ¤ó¤Ç¤Ï¤¤¤±¤Ê¤¤ */
403 case KZ_SYSCALL_TYPE_WAIT: /* kz_wait() */
404 p->un.wait.ret = thread_wait();
406 case KZ_SYSCALL_TYPE_SLEEP: /* kz_sleep() */
407 p->un.sleep.ret = thread_sleep();
409 case KZ_SYSCALL_TYPE_WAKEUP: /* kz_wakeup() */
410 p->un.wakeup.ret = thread_wakeup(p->un.wakeup.id);
412 case KZ_SYSCALL_TYPE_GETID: /* kz_getid() */
413 p->un.getid.ret = thread_getid();
415 case KZ_SYSCALL_TYPE_CHPRI: /* kz_chpri() */
416 p->un.chpri.ret = thread_chpri(p->un.chpri.priority);
418 case KZ_SYSCALL_TYPE_KMALLOC: /* kz_kmalloc() */
419 p->un.kmalloc.ret = thread_kmalloc(p->un.kmalloc.size);
421 case KZ_SYSCALL_TYPE_KMFREE: /* kz_kmfree() */
422 p->un.kmfree.ret = thread_kmfree(p->un.kmfree.p);
424 case KZ_SYSCALL_TYPE_SEND: /* kz_send() */
425 p->un.send.ret = thread_send(p->un.send.id,
426 p->un.send.size, p->un.send.p);
428 case KZ_SYSCALL_TYPE_RECV: /* kz_recv() */
429 p->un.recv.ret = thread_recv(p->un.recv.id,
430 p->un.recv.sizep, p->un.recv.pp);
432 case KZ_SYSCALL_TYPE_SETINTR: /* kz_setintr() */
433 p->un.setintr.ret = thread_setintr(p->un.setintr.type,
434 p->un.setintr.handler);
441 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î½èÍý */
442 static void syscall_proc(kz_syscall_type_t type, kz_syscall_param_t *p)
445 * ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤ò¸Æ¤Ó½Ð¤·¤¿¥¹¥ì¥Ã¥É¤ò¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤«¤é
446 * ³°¤·¤¿¾õÂ֤ǽèÍý´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¡¥¤³¤Î¤¿¤á¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤ò
447 * ¸Æ¤Ó½Ð¤·¤¿¥¹¥ì¥Ã¥É¤ò¤½¤Î¤Þ¤ÞÆ°ºî·Ñ³¤µ¤»¤¿¤¤¾ì¹ç¤Ë¤Ï¡¤
448 * ½èÍý´Ø¿ô¤ÎÆâÉô¤Ç putcurrent() ¤ò¹Ô¤¦É¬Íפ¬¤¢¤ë¡¥
451 call_functions(type, p);
454 /* ¥µ¡¼¥Ó¥¹¡¦¥³¡¼¥ë¤Î½èÍý */
455 static void srvcall_proc(kz_syscall_type_t type, kz_syscall_param_t *p)
458 * ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤È¥µ¡¼¥Ó¥¹¡¦¥³¡¼¥ë¤Î½èÍý´Ø¿ô¤ÎÆâÉô¤Ç¡¤
459 * ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¤Î¼Â¹Ô¤·¤¿¥¹¥ì¥Ã¥ÉID¤òÆÀ¤ë¤¿¤á¤Ë current ¤ò
460 * »²¾È¤·¤Æ¤¤¤ëÉôʬ¤¬¤¢¤ê(¤¿¤È¤¨¤Ð thread_send() ¤Ê¤É)¡¤
461 * current ¤¬»Ä¤Ã¤Æ¤¤¤ë¤È¸íÆ°ºî¤¹¤ë¤¿¤á NULL ¤ËÀßÄꤹ¤ë¡¥
462 * ¥µ¡¼¥Ó¥¹¡¦¥³¡¼¥ë¤Ï thread_intrvec() ÆâÉô¤Î³ä¹þ¤ß¥Ï¥ó¥É¥é¸Æ¤Ó½Ð¤·¤Î
463 * ±äĹ¤Ç¸Æ¤Ð¤ì¤Æ¤¤¤ë¤Ï¤º¤Ç¤Ê¤Î¤Ç¡¤¸Æ¤Ó½Ð¤·¸å¤Ë thread_intrvec() ¤Ç
464 * ¥¹¥±¥¸¥å¡¼¥ê¥ó¥°½èÍý¤¬¹Ô¤ï¤ì¡¤current ¤ÏºÆÀßÄꤵ¤ì¤ë¡¥
467 call_functions(type, p);
470 /* ¥¹¥ì¥Ã¥É¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥° */
471 static void schedule(void)
476 * Í¥Àè½ç°Ì¤Î¹â¤¤½ç(Í¥ÀèÅ٤οôÃͤµ¤¤½ç)¤Ë¥ì¥Ç¥£¡¼¡¦¥¥å¡¼¤ò¸«¤Æ¡¤
477 * Æ°ºî²Äǽ¤Ê¥¹¥ì¥Ã¥É¤ò¸¡º÷¤¹¤ë¡¥
479 for (i = 0; i < PRIORITY_NUM; i++) {
480 if (readyque[i].head) /* ¸«¤Ä¤«¤Ã¤¿ */
483 if (i == PRIORITY_NUM) /* ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿ */
486 current = readyque[i].head; /* ¥«¥ì¥ó¥È¡¦¥¹¥ì¥Ã¥É¤ËÀßÄꤹ¤ë */
489 static void syscall_intr(void)
491 syscall_proc(current->syscall.type, current->syscall.param);
494 static void softerr_intr(void)
498 getcurrent(); /* ¥ì¥Ç¥£¡¼¥¥å¡¼¤«¤é³°¤¹ */
499 thread_exit(); /* ¥¹¥ì¥Ã¥É½ªÎ»¤¹¤ë */
502 /* ³ä¹þ¤ß½èÍý¤ÎÆþ¸ý´Ø¿ô */
503 static void thread_intr(softvec_type_t type, unsigned long sp)
505 /* ¥«¥ì¥ó¥È¡¦¥¹¥ì¥Ã¥É¤Î¥³¥ó¥Æ¥¥¹¥È¤òÊݸ¤¹¤ë */
506 current->context.sp = sp;
509 * ³ä¹þ¤ß¤´¤È¤Î½èÍý¤ò¼Â¹Ô¤¹¤ë¡¥
510 * SOFTVEC_TYPE_SYSCALL, SOFTVEC_TYPE_SOFTERR ¤Î¾ì¹ç¤Ï
511 * syscall_intr(), softerr_intr() ¤¬¥Ï¥ó¥É¥é¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤
512 * ¤½¤ì¤é¤¬¼Â¹Ô¤µ¤ì¤ë¡¥
513 * ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¤kz_setintr()¤Ë¤è¤Ã¤Æ¥æ¡¼¥¶ÅÐÏ¿¤µ¤ì¤¿¥Ï¥ó¥É¥é¤¬
519 schedule(); /* ¥¹¥ì¥Ã¥É¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥° */
522 * ¥¹¥ì¥Ã¥É¤Î¥Ç¥£¥¹¥Ñ¥Ã¥Á
523 * (dispatch()´Ø¿ô¤ÎËÜÂΤÏstartup.s¤Ë¤¢¤ê¡¤¥¢¥»¥ó¥Ö¥é¤Çµ½Ò¤µ¤ì¤Æ¤¤¤ë)
525 dispatch(¤t->context);
526 /* ¤³¤³¤Ë¤ÏÊ֤äƤ³¤Ê¤¤ */
529 void kz_start(kz_func_t func, char *name, int priority, int stacksize,
530 int argc, char *argv[])
532 kzmem_init(); /* ưŪ¥á¥â¥ê¤Î½é´ü²½ */
535 * °Ê¹ß¤Ç¸Æ¤Ó½Ð¤¹¥¹¥ì¥Ã¥É´ØÏ¢¤Î¥é¥¤¥Ö¥é¥ê´Ø¿ô¤ÎÆâÉô¤Ç current ¤ò
536 * ¸«¤Æ¤¤¤ë¾ì¹ç¤¬¤¢¤ë¤Î¤Ç¡¤current ¤ò NULL ¤Ë½é´ü²½¤·¤Æ¤ª¤¯¡¥
540 memset(readyque, 0, sizeof(readyque));
541 memset(threads, 0, sizeof(threads));
542 memset(handlers, 0, sizeof(handlers));
543 memset(msgboxes, 0, sizeof(msgboxes));
545 /* ³ä¹þ¤ß¥Ï¥ó¥É¥é¤ÎÅÐÏ¿ */
546 thread_setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë */
547 thread_setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); /* ¥À¥¦¥óÍ×°øȯÀ¸ */
549 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ëȯ¹ÔÉԲĤʤΤÇľÀÜ´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤Æ¥¹¥ì¥Ã¥ÉºîÀ®¤¹¤ë */
550 current = (kz_thread *)thread_run(func, name, priority, stacksize,
553 /* ºÇ½é¤Î¥¹¥ì¥Ã¥É¤òµ¯Æ° */
554 dispatch(¤t->context);
556 /* ¤³¤³¤Ë¤ÏÊ֤äƤ³¤Ê¤¤ */
559 void kz_sysdown(void)
561 puts("system error!\n");
566 /* ¥·¥¹¥Æ¥à¡¦¥³¡¼¥ë¸Æ¤Ó½Ð¤·Íѥ饤¥Ö¥é¥ê´Ø¿ô */
567 void kz_syscall(kz_syscall_type_t type, kz_syscall_param_t *param)
569 current->syscall.type = type;
570 current->syscall.param = param;
571 asm volatile ("trapa #0"); /* ¥È¥é¥Ã¥×³ä¹þ¤ßȯ¹Ô */
574 /* ¥µ¡¼¥Ó¥¹¡¦¥³¡¼¥ë¸Æ¤Ó½Ð¤·Íѥ饤¥Ö¥é¥ê´Ø¿ô */
575 void kz_srvcall(kz_syscall_type_t type, kz_syscall_param_t *param)
577 srvcall_proc(type, param);