# HG changeset patch # User gongo # Date 1202461221 -32400 # Node ID 41ccd4b38184739276a0eefb17b4742d3ed50ac6 # Parent b658f8ca440825bb912bd4a76bade755c814f4c8 *** empty log message *** diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/Fifo/FifoDmaManager.cc --- a/TaskManager/Fifo/FifoDmaManager.cc Fri Feb 08 09:55:20 2008 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.cc Fri Feb 08 18:00:21 2008 +0900 @@ -5,12 +5,14 @@ void FifoDmaManager::dma_load(void *buf, unsigned int addr, int size, int mask) { + if (buf == NULL || (void*)addr == NULL) return; memcpy(buf, (void*)addr, size); } void FifoDmaManager::dma_store(void *buf, unsigned int addr, int size, int mask) { + if (buf == NULL || (void*)addr == NULL) return; memcpy((void*)addr, buf, size); } diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Feb 08 09:55:20 2008 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Feb 08 18:00:21 2008 +0900 @@ -52,6 +52,13 @@ return list; } +void +FifoTaskManagerImpl::run_task(HTaskPtr task) +{ + TaskManagerImpl::run_task(task); + //run(); +} + // ../spe/main.cpp extern MailQueuePtr spe_main(MailManager*, MailQueuePtr); diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/Fifo/spe-main.cc --- a/TaskManager/Fifo/spe-main.cc Fri Feb 08 09:55:20 2008 +0900 +++ b/TaskManager/Fifo/spe-main.cc Fri Feb 08 18:00:21 2008 +0900 @@ -20,7 +20,7 @@ connect->mailManager = _mailManager; manager->set_connect((DmaManager*)connect); - //printf("[FIFO] start\n"); + printf("[FIFO] start\n"); manager->init(); manager->run(); diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/Test/Sum/main.cpp --- a/TaskManager/Test/Sum/main.cpp Fri Feb 08 09:55:20 2008 +0900 +++ b/TaskManager/Test/Sum/main.cpp Fri Feb 08 18:00:21 2008 +0900 @@ -4,27 +4,106 @@ #define MAX 1024 +TaskManager *manager; + +//SymTable *TaskManager::symtb; + +int add(void*, void*); +int sub(void*, void*); +int mul(void*, void*); +int div(void*, void*); +int sum(void*, void*); +int sum2(void*, void*); + int data[MAX] __attribute__((aligned(16))); int buff[MAX] __attribute__((aligned(16))); int out[MAX] __attribute__((aligned(16))); +int +add(void *wbuf, void *rbuf) +{ + int *ret = (int*)wbuf; + int *data = (int*)rbuf; -typedef unsigned long long Uint64; -typedef unsigned int Uint32; + *ret = data[0] + data[1]; + + return sizeof(int); +} + +int +sub(void *wbuf, void *rbuf) +{ + int *ret = (int*)wbuf; + int *data = (int*)rbuf; + + *ret = data[0]-data[1]; + + return sizeof(int); +} + +int +mul(void *wbuf, void *rbuf) +{ + int *ret = (int*)wbuf; + int *data = (int*)rbuf; + + *ret = data[0]*data[1]; + + return sizeof(int); +} int -main(void) +Div(void *wbuf, void *rbuf) +{ + int *ret = (int*)wbuf; + int *data = (int*)rbuf; + + *ret = data[0]/data[1]; + + return sizeof(int); +} + +int +sum(void *wbuf, void *rbuf) { + int *ret = (int*)wbuf; + int *data = (int*)rbuf; int i; + + *ret = 0; + + for (i = 0; i < 16; i++) { + *ret += data[i]; + } + + return sizeof(int); +} + +int +sum2(void *wbuf, void *rbuf) +{ + int *ret = (int*)wbuf; + int *data = (int*)rbuf; + int i; + + *ret = 0; + + for (i = 0; i < 64; i++) { + *ret += data[i*4]; + } + + return sizeof(int); +} + +int +init2(void *w, void *r) +{ + int i, fd; int div = MAX/16; - TaskManager *manager; HTaskPtr *task = new HTaskPtr[div]; HTaskPtr last; - manager = new TaskManager(1); - manager->init(); - for (i = 0; i < MAX; i++) { data[i] = i; } @@ -32,17 +111,20 @@ memset(buff, 0, sizeof(int)*1024); memset(out, 0, sizeof(int)*1024); + fd = manager->open("Sum"); for (i = 0; i < div; i++) { - task[i] = manager->create_task(4, sizeof(int)*16, - (Uint32)&data[i*16], - (Uint32)&buff[i*4], + task[i] = manager->create_task(fd, sizeof(int)*16, + (unsigned int)&data[i*16], + (unsigned int)&buff[i*4], NULL); } - last = manager->create_task(5, sizeof(int)*256, - (Uint32)buff, (Uint32)&out[0], NULL); + fd = manager->open("Sum2"); + last = manager->create_task(fd, sizeof(int)*256, + (unsigned int)buff, + (unsigned int)&out[0], NULL); -#if 1 +#if 0 for (i = 0; i < div-1; i++) { manager->set_task_depend(task[i], task[i+1]); } @@ -60,14 +142,22 @@ manager->run_task(task[i]); } manager->run_task(last); -#endif +#endif + manager->run(); + return 0; +} + + +int +result(void *w, void *r) +{ printf("manager : %d\n", out[0]); out[0] = 0; - for (i = 0; i < MAX; i++) { + for (int i = 0; i < MAX; i++) { out[0] += i; } @@ -75,3 +165,42 @@ return 0; } + +int +init(void *w, void *r) +{ + HTaskPtr init_task, finish_task; + + int fd; + + fd = manager->open("Init2"); + init_task = manager->create_task(fd, 0, 0, 0, NULL); + manager->run_task(init_task); + + fd = manager->open("Result"); + finish_task = manager->create_task(fd, 0, 0, 0, NULL); + manager->set_task_depend(init_task, finish_task); + manager->run_task(finish_task); + + return 0; +} + +int +main(void) +{ + manager = new TaskManager(1); + manager->init(); + + // 本当は、ここは user 側で書かない + // 設定ファイルかなにかで読むとか?違うな + manager->set_symbol("Init", (void*)init); + manager->set_symbol("Init2", (void*)init2); + manager->set_symbol("Result", (void*)result); + manager->set_symbol("Sum", (void*)sum); + manager->set_symbol("Sum2", (void*)sum2); + + manager->set_init_task("Init"); + manager->run(); + + return 0; +} diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/kernel/ppe/SymTable.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/ppe/SymTable.cc Fri Feb 08 18:00:21 2008 +0900 @@ -0,0 +1,46 @@ +#include +#include "SymTable.h" + +void +SymTable::init(void) +{ + symtb = new SymTb[SYM_MAX_SIZE]; + symtb_index = 0; +} + +void +SymTable::set_symbol(const char *sym, void *addr) +{ + SymTbPtr tb = &symtb[symtb_index++]; + + tb->sym = new char[strlen(sym)+1]; + memcpy(tb->sym, sym, strlen(sym)+1); + tb->address = addr; +} + +void* +SymTable::get_address(int fd) +{ + if (fd >= symtb_index) { + // Fix me + // error process + } + + return symtb[fd].address; +} + + +int +SymTable::get_fd(const char *sym) +{ + SymTbPtr tb; + + for (int i = 0; i < SYM_MAX_SIZE; i++) { + tb = &symtb[i]; + if (strcmp(tb->sym, sym) == 0) { + return i; + } + } + + return -1; +} diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/kernel/ppe/TaskManager.cc --- a/TaskManager/kernel/ppe/TaskManager.cc Fri Feb 08 09:55:20 2008 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.cc Fri Feb 08 18:00:21 2008 +0900 @@ -1,4 +1,5 @@ #include "TaskManager.h" +#include "SymTable.h" TaskManager::TaskManager(int num) { @@ -28,6 +29,9 @@ { m_impl = create_impl(machineNum); m_impl->init(); + + symtb = new SymTable; + symtb->init(); } /** @@ -64,3 +68,44 @@ { m_impl->run(); } + +/** + * initialize task だから(?)、 + * read/write/post/func はなしって最初から決めうちだけど + * いいのかな。いいのか? + */ +void +TaskManager::set_init_task(const char *sym) +{ + HTaskPtr init; + int init_fd; + + init_fd = open(sym); + init = m_impl->create_task(init_fd, 0, 0, 0, 0); + run_task(init); +} + + + +// ここは、バイナリから自動的に読めるとうれしいけど +// どうやるんだろうね。ユーザに追加させるのはめんどくさい +void +TaskManager::set_symbol(const char *sym, void *addr) +{ + symtb->set_symbol(sym, addr); +} + +/** + * open というか、今は topen (task open) ? 違うな + */ +int +TaskManager::open(const char *sym) +{ + return symtb->get_fd(sym); +} + +void* +TaskManager::get_address(int fd) +{ + return symtb->get_address(fd); +} diff -r b658f8ca4408 -r 41ccd4b38184 TaskManager/kernel/spe/SpeTask.cc --- a/TaskManager/kernel/spe/SpeTask.cc Fri Feb 08 09:55:20 2008 +0900 +++ b/TaskManager/kernel/spe/SpeTask.cc Fri Feb 08 18:00:21 2008 +0900 @@ -4,92 +4,10 @@ #include "SpeNop2Ready.h" #include "DmaManager.h" #include "error.h" - -int add(void*, void*); -int sub(void*, void*); -int mul(void*, void*); -int div(void*, void*); -int sum(void*, void*); -int sum2(void*, void*); - -int (*func_list[16])(void* wbuf, void* rbuf) = {add, sub, mul, div, sum, sum2, 0}; - -int -add(void *wbuf, void *rbuf) -{ - int *ret = (int*)wbuf; - int *data = (int*)rbuf; - - *ret = data[0] + data[1]; - - return sizeof(int); -} - -int -sub(void *wbuf, void *rbuf) -{ - int *ret = (int*)wbuf; - int *data = (int*)rbuf; - - *ret = data[0]-data[1]; - - return sizeof(int); -} - -int -mul(void *wbuf, void *rbuf) -{ - int *ret = (int*)wbuf; - int *data = (int*)rbuf; - - *ret = data[0]*data[1]; - - return sizeof(int); -} +#include "TaskManager.h" +#include "SymTable.h" -int -div(void *wbuf, void *rbuf) -{ - int *ret = (int*)wbuf; - int *data = (int*)rbuf; - - *ret = data[0]/data[1]; - - return sizeof(int); -} - -int -sum(void *wbuf, void *rbuf) -{ - int *ret = (int*)wbuf; - int *data = (int*)rbuf; - int i; - - *ret = 0; - - for (i = 0; i < 16; i++) { - *ret += data[i]; - } - - return sizeof(int); -} - -int -sum2(void *wbuf, void *rbuf) -{ - int *ret = (int*)wbuf; - int *data = (int*)rbuf; - int i; - - *ret = 0; - - for (i = 0; i < 64; i++) { - *ret += data[i*4]; - } - - return sizeof(int); -} - +SymTable *TaskManager::symtb; SpeTask::SpeTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf, DmaManager* cn) @@ -126,7 +44,14 @@ printf(" list->length = 0x%x\n", (unsigned int)list->length); #endif - task->in_size = func_list[task->command](writebuf, readbuf); + // obsolute + // task->in_size = func_list[task->command](writebuf, readbuf); + + // ごちゃごちゃしてるな + // 最初から void* じゃなくて 関数ポインタ としていれるべきか? + int (*func)(void*, void*) + = (int (*)(void*,void*))TaskManager::get_address(task->command); + task->in_size = func(writebuf, readbuf); connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE); } @@ -166,3 +91,14 @@ connector); } } + +#if 0 +SpeTask +createSpeTask(TaskListPtr list, void *rbuf, void *wbuf, DmaManager *cn) +{ + TaskPtr task; + + task = &list->tasks[--list->length]; + +} +#endif diff -r b658f8ca4408 -r 41ccd4b38184 include/TaskManager/FifoTaskManagerImpl.h --- a/include/TaskManager/FifoTaskManagerImpl.h Fri Feb 08 09:55:20 2008 +0900 +++ b/include/TaskManager/FifoTaskManagerImpl.h Fri Feb 08 18:00:21 2008 +0900 @@ -19,6 +19,7 @@ void init(void); void run(void); + void run_task(HTaskPtr); TaskListPtr set_task(void); private: diff -r b658f8ca4408 -r 41ccd4b38184 include/TaskManager/SymTable.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/TaskManager/SymTable.h Fri Feb 08 18:00:21 2008 +0900 @@ -0,0 +1,22 @@ +#ifndef INCLUDED_SYMTABLE +#define INCLUDED_SYMTABLE + +#define SYM_MAX_SIZE 64 + +typedef struct sym_table { + char *sym; + void *address; +} SymTb, *SymTbPtr; + +class SymTable { +public: + SymTbPtr symtb; + int symtb_index; + + void init(void); + void set_symbol(const char *sym, void *addr); + int get_fd(const char *sym); + void* get_address(int fd); +}; + +#endif diff -r b658f8ca4408 -r 41ccd4b38184 include/TaskManager/TaskManager.h --- a/include/TaskManager/TaskManager.h Fri Feb 08 09:55:20 2008 +0900 +++ b/include/TaskManager/TaskManager.h Fri Feb 08 18:00:21 2008 +0900 @@ -5,6 +5,10 @@ # include "TaskManagerImpl.h" #endif +#ifndef INCLUDED_SYMTABLE +# include "SymTable.h" +#endif + class TaskManager { public: /* constructor */ @@ -12,6 +16,7 @@ /* variables */ TaskManagerImpl *m_impl; + static SymTable *symtb; /* functions */ void init(void); @@ -21,6 +26,12 @@ void run_task(HTaskPtr); void run(void); + void set_init_task(const char *sym); + + void set_symbol(const char *sym, void *addr); + int open(const char *sym); + static void* get_address(int fd); + private: int machineNum; }; diff -r b658f8ca4408 -r 41ccd4b38184 include/TaskManager/TaskManagerImpl.h --- a/include/TaskManager/TaskManagerImpl.h Fri Feb 08 09:55:20 2008 +0900 +++ b/include/TaskManager/TaskManagerImpl.h Fri Feb 08 18:00:21 2008 +0900 @@ -18,12 +18,12 @@ /* functions */ virtual void init(void) = 0; virtual void run(void) = 0; - + HTaskPtr create_task(int cmd, int siz, unsigned long long in_addr, unsigned long long out_addr, void (*func)(void)); void set_task_depend(HTaskPtr master, HTaskPtr slave); - void run_task(HTaskPtr); + virtual void run_task(HTaskPtr); }; #endif