# HG changeset patch # User Shinji KONO # Date 1253799658 -32400 # Node ID fd44dbd049aa9f1f0194c491ef76a0d64cec23f0 # Parent 9a95b60ad5fb9e1a1fe6c1133f8e80be29894783 overlay... diff -r 9a95b60ad5fb -r fd44dbd049aa TaskManager/kernel/schedule/Scheduler.cc --- a/TaskManager/kernel/schedule/Scheduler.cc Thu Sep 24 21:09:27 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Thu Sep 24 22:40:58 2009 +0900 @@ -331,15 +331,18 @@ void Scheduler::allocate_code_segment(int count, int size) { + // 既に overlay 領域があるので、それを追加する必要がある... code_segment_pool = createMemList(count, size); } static void load_task(Scheduler *m, int task_id) { + fprintf(stderr,"loadng task id %d\n",task_id); MemorySegment *s = m->get_segment( task_list[task_id].location, - m->code_segment_pool); + m->code_segment_pool, + task_list[task_id].end-task_list[task_id].location); task_list[task_id].segment = s; } @@ -351,6 +354,7 @@ static void wait_load(Scheduler *m, int task_id) { + fprintf(stderr,"wait load task id %d\n",task_id); // wait for code segment load m->wait_segment(task_list[task_id].segment); // calcurate call address @@ -433,6 +437,13 @@ MemorySegment * Scheduler::get_segment(memaddr addr, MemList *m) { + return get_segment(addr, m, m->size); +} + +MemorySegment * +Scheduler::get_segment(memaddr addr, MemList *m, int size) +{ + // memory segment のsizeをoverride する場合がある MemorySegment *s = hash->get(addr); if (s) { /* 既に load されている */ @@ -447,7 +458,7 @@ memaddr old_addr = s->address; s->tag = get_tag(); dma_load(s->data, addr, - s->size, s->tag); + size, s->tag); /* 前のをhashから削除 */ hash->remove(old_addr); /* 新しいaddress を登録 */ diff -r 9a95b60ad5fb -r fd44dbd049aa TaskManager/kernel/schedule/Scheduler.h --- a/TaskManager/kernel/schedule/Scheduler.h Thu Sep 24 21:09:27 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Thu Sep 24 22:40:58 2009 +0900 @@ -152,6 +152,7 @@ void *mainMem_get(int id); MemorySegment * get_segment(memaddr addr, MemList *m); + MemorySegment * get_segment(memaddr addr, MemList *m, int size); void allocate_code_segment(int count, int size); virtual uint32 get_tag(); @@ -199,17 +200,26 @@ return new str(); \ } +#ifndef NO_OVERLAY #define SchedExternDynamicTask(str,segment) \ extern char __load_start_##segment[], \ __load_stop_##segment[]; \ extern void spe_load_entry(); \ - extern SchedTask* createTask_##str(Scheduler *manager); + extern SchedTask* createTask_##str(Scheduler *manager); \ + extern unsigned long long _EAR_; +#else +#define SchedExternDynamicTask(str,segment) SchedExternTask(str,segment) +#endif +#ifndef NO_OVERLAY #define SchedRegisterDynamicTask(cmd, str, segment) \ - register_dynamic_task(cmd, (memaddr)__load_start_##segment, \ - (memaddr)__load_stop_##segment,\ + register_dynamic_task(cmd, _EAR_+(memaddr)__load_start_##segment, \ + _EAR_+(memaddr)__load_stop_##segment,\ ((char *)createTask_##str)-(char *)spe_load_entry); +#else +#define SchedRegisterDynamicTask(cmd, str, segment) SchedRegisterTask(cmd, str) +#endif /* end */ diff -r 9a95b60ad5fb -r fd44dbd049aa example/get_segment/Func.h --- a/example/get_segment/Func.h Thu Sep 24 21:09:27 2009 +0900 +++ b/example/get_segment/Func.h Thu Sep 24 22:40:58 2009 +0900 @@ -1,6 +1,6 @@ enum { + RUN_FINISH, HELLO_TASK, HELLO_TASK1, - RUN_FINISH, }; diff -r 9a95b60ad5fb -r fd44dbd049aa example/get_segment/spe/Hello.cc --- a/example/get_segment/spe/Hello.cc Thu Sep 24 21:09:27 2009 +0900 +++ b/example/get_segment/spe/Hello.cc Thu Sep 24 22:40:58 2009 +0900 @@ -3,7 +3,11 @@ #include "Func.h" /* これは必須 */ +#if OVLY SchedDefineDynamicTask(Hello,segment1); +#else +SchedDefineTask(Hello); +#endif int Hello::run(SchedTask *smanager, void *rbuf, void *wbuf) diff -r 9a95b60ad5fb -r fd44dbd049aa example/get_segment/spe/Hello1.cc --- a/example/get_segment/spe/Hello1.cc Thu Sep 24 21:09:27 2009 +0900 +++ b/example/get_segment/spe/Hello1.cc Thu Sep 24 22:40:58 2009 +0900 @@ -3,7 +3,11 @@ #include "Func.h" /* これは必須 */ +#if OVLY SchedDefineDynamicTask(Hello1,segment2); +#else +SchedDefineTask(Hello1); +#endif int Hello1::run(SchedTask *smanager, void *rbuf, void *wbuf) diff -r 9a95b60ad5fb -r fd44dbd049aa example/get_segment/spe/Makefile --- a/example/get_segment/spe/Makefile Thu Sep 24 21:09:27 2009 +0900 +++ b/example/get_segment/spe/Makefile Thu Sep 24 22:40:58 2009 +0900 @@ -9,7 +9,7 @@ CC = spu-g++ INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I.. -CFLAGS = $(INCLUDE) -O0 -g -Wall -fno-exceptions -fno-rtti#-DDEBUG +CFLAGS = -DOVLY=1 $(INCLUDE) -O0 -g -Wall -fno-exceptions -fno-rtti#-DDEBUG LIBS = -L../${CERIUM}/TaskManager -lspemanager -Wl,--gc-sections SPELIBS = -Wl,-T,$(LDSCRIPT) -Wl,-N $(LIBS) diff -r 9a95b60ad5fb -r fd44dbd049aa example/get_segment/spe/spe-main.cc --- a/example/get_segment/spe/spe-main.cc Thu Sep 24 21:09:27 2009 +0900 +++ b/example/get_segment/spe/spe-main.cc Thu Sep 24 22:40:58 2009 +0900 @@ -2,8 +2,13 @@ #include "Scheduler.h" #include "LoadEntry.h" +#if OVLY SchedExternDynamicTask(Hello,segment1); SchedExternDynamicTask(Hello1,segment2); +#else +SchedExternTask(Hello); +SchedExternTask(Hello1); +#endif /** * この関数は SpeScheduler から呼ばれるので @@ -12,7 +17,12 @@ void task_init(Scheduler *scheduler) { +#if OVLY SchedRegisterDynamicTask(HELLO_TASK, Hello, segment1); SchedRegisterDynamicTask(HELLO_TASK1, Hello1, segment2); +#else + SchedRegisterTask(HELLO_TASK, Hello); + SchedRegisterTask(HELLO_TASK1, Hello1); +#endif scheduler->allocate_code_segment(4,1024); }