changeset 437:fd44dbd049aa

overlay...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 24 Sep 2009 22:40:58 +0900
parents 9a95b60ad5fb
children 9ebb44b7b15d
files TaskManager/kernel/schedule/Scheduler.cc TaskManager/kernel/schedule/Scheduler.h example/get_segment/Func.h example/get_segment/spe/Hello.cc example/get_segment/spe/Hello1.cc example/get_segment/spe/Makefile example/get_segment/spe/spe-main.cc
diffstat 7 files changed, 46 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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 を登録 */
--- 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 */
--- 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,
 };
 
--- 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)
--- 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)
--- 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)
 
--- 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);
 }