diff TaskManager/kernel/ppe/Task.h @ 0:04e28d8d3c6f

first commit
author Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp>
date Mon, 08 Nov 2010 01:23:25 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/ppe/Task.h	Mon Nov 08 01:23:25 2010 +0900
@@ -0,0 +1,148 @@
+#ifndef INCLUDED_TASK
+#define INCLUDED_TASK
+
+#include "base.h"
+#include "types.h"
+#include "ListData.h"
+#include "SimpleTask.h"
+
+class SchedTask;
+class Scheduler;
+
+class Task {
+public: // variables
+    int task_size;
+    int command;
+    int param_count;
+    int inData_count;
+    int outData_count;
+    int inData_offset;
+    int outData_offset;
+    void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); 
+
+public: // functions
+
+    void print(Scheduler *s);
+
+    memaddr *param(int index) {
+	memaddr p =  (memaddr)data + sizeof(memaddr)*index;
+	return (memaddr *)p;
+    }
+
+    ListElement *inData(int index) {
+	memaddr p = (memaddr)data + inData_offset;
+	p += sizeof(ListElement)*index;
+	return (ListElement*)p;
+    }
+
+    ListElement *outData(int index) {
+	memaddr p = (memaddr)data + outData_offset;
+	p += sizeof(ListElement)* index;
+	return (ListElement*)p;
+    }
+
+    static int calc_size(int params, int ins, int outs) {
+	int size = round_up16(sizeof(Task))
+	   + round_up16(sizeof(memaddr)*params)
+           + round_up16(sizeof(ListElement)*ins)
+           + round_up16(sizeof(ListElement)*outs);
+	return size;
+    }
+
+    void init(int task_id, int params, int ins, int outs) {
+	set_task_id(task_id);
+	param_count = params;
+	inData_count = ins;
+	outData_count = outs;
+	inData_offset = round_up16(sizeof(memaddr)*params);
+	outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins);
+	//task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs);
+
+	task_size = round_up16(sizeof(Task))
+	   + round_up16(sizeof(memaddr)*params)
+           + round_up16(sizeof(ListElement)*ins)
+           + round_up16(sizeof(ListElement)*outs);
+
+    }
+
+    int size() {
+	return task_size;
+    }
+
+    int inData_total_size() {
+	int size = 0;
+	ListElement *in= inData(0);
+	for(int i=0; i< inData_count; i++) {
+	    size += in[i].size;
+	}
+	return size;
+    }
+    int outData_total_size() {
+	int size = 0;
+	ListElement *out= outData(0);
+	for(int i=0; i< outData_count; i++) {
+	    size += out[i].size;
+	}
+	return size;
+    }
+
+    void set_inData_t( int index, memaddr addr, int size) {
+	ListElement *list = inData(index);
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+          printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                 command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; int b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
+#ifdef __CERIUM_CELL__
+	list->addr = (uint32)addr;
+#else
+	list->addr = addr;
+#endif
+	list->size = size;
+    }
+
+    void set_outData_t(int index, memaddr addr, int size) {
+	ListElement *list = outData(index);
+#ifdef EARLY_TOUCH
+        if ((unsigned long)addr&0xf) {
+          printf("inData is not aligned. command = %d, index = %d, addr = 0x%lx, size = %d\n",
+                 command, index, (unsigned long)addr, size);
+        }
+        char *p = (char *)addr; int b = *p;
+        p = (char *)(addr+size-1); b += *p;
+#endif
+#ifdef __CERIUM_CELL__
+	list->addr = (uint32)addr;
+#else
+	list->addr = addr;
+#endif
+	list->size = size;
+    }
+    void set_task_id(int id) { command = id; }
+    void set_param_t(int index, memaddr param) {
+	memaddr *p = (memaddr*)this->param(index);
+	*p = param;
+    }
+
+    Task * next()
+    {
+	char *p = (char*)this;
+	p += size();
+	return (Task*)p;
+    }
+
+
+#define set_param(index,param) set_param_t(index, (memaddr) (param))
+
+#define set_inData(index, addr, size)			\
+    set_inData_t(index, (memaddr)(addr), (size));
+#define set_outData(index, addr, size)			\
+    set_outData_t(index, (memaddr)(addr), (size));
+} __attribute__ ((aligned (DEFAULT_ALIGNMENT))) ;
+
+typedef Task* TaskPtr;
+
+#endif