changeset 14:41ccd4b38184

*** empty log message ***
author gongo
date Fri, 08 Feb 2008 18:00:21 +0900
parents b658f8ca4408
children b7f2822c947c
files TaskManager/Fifo/FifoDmaManager.cc TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Fifo/spe-main.cc TaskManager/Test/Sum/main.cpp TaskManager/kernel/ppe/SymTable.cc TaskManager/kernel/ppe/TaskManager.cc TaskManager/kernel/spe/SpeTask.cc include/TaskManager/FifoTaskManagerImpl.h include/TaskManager/SymTable.h include/TaskManager/TaskManager.h include/TaskManager/TaskManagerImpl.h
diffstat 11 files changed, 303 insertions(+), 104 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }
 
--- 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);
 
--- 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();
--- 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;
+}
--- /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 <string.h>
+#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;
+}
--- 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);
+}
--- 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
--- 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:
--- /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
--- 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;
 };
--- 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