[Cbe-oss-dev] [PATCH 05/11]MARS: Kernel syscall add get workload by id
Yuji Mano
yuji.mano at am.sony.com
Fri Sep 12 05:34:47 EST 2008
This adds a new MARS kernel syscall 'mars_get_workload_by_id' to allow for the
task library to grab an instance of a workload context other than the one
currently running. This is needed when a task waits for completion of another
task, and needs to obtain the exit_code of the completed task from the task
context.
This also renames the previously existing MARS kernel syscall
'mars_get_workload_context' to 'mars_get_workload'.
Signed-off-by: Yuji Mano <yuji.mano at am.sony.com>
---
include/mpu/mars/mars_kernel.h | 10 +++++++---
include/mpu/mars/mars_syscalls.h | 3 ++-
src/mpu/kernel/mars_kernel_syscalls.c | 12 +++++++++---
src/mpu/kernel/mars_kernel_workload.c | 26 +++++++++++++++++++++++++-
src/mpu/lib/mars_syscalls.c | 9 +++++++--
src/mpu/lib/mars_task.c | 8 ++++----
src/mpu/lib/mars_task_barrier.c | 4 ++--
src/mpu/lib/mars_task_event_flag.c | 2 +-
src/mpu/lib/mars_task_queue.c | 2 +-
src/mpu/lib/mars_task_semaphore.c | 2 +-
src/mpu/lib/mars_task_signal.c | 2 +-
11 files changed, 60 insertions(+), 20 deletions(-)
--- a/include/mpu/mars/mars_kernel.h
+++ b/include/mpu/mars/mars_kernel.h
@@ -62,7 +62,9 @@ struct mars_kernel_syscalls {
uint32_t (*get_kernel_id)(void);
uint16_t (*get_workload_id)(void);
uint64_t (*get_workload_ea)(void);
- struct mars_workload_context *(*get_workload_context)(void);
+ struct mars_workload_context *(*get_workload)(void);
+ struct mars_workload_context *(*get_workload_by_id)
+ (uint16_t workload_id);
void (*init)(void);
void (*exit)(void);
@@ -86,7 +88,8 @@ uint64_t syscall_get_mars_context_ea(voi
uint32_t syscall_get_kernel_id(void);
uint16_t syscall_get_workload_id(void);
uint64_t syscall_get_workload_ea(void);
-struct mars_workload_context *syscall_get_workload_context(void);
+struct mars_workload_context *syscall_get_workload(void);
+struct mars_workload_context *syscall_get_workload_by_id(uint16_t workload_id);
void syscall_setup(void);
void syscall_init(void);
@@ -107,7 +110,8 @@ void registers_restore(void);
/* workload specific functions */
uint16_t workload_get_id(void);
uint64_t workload_get_ea(void);
-struct mars_workload_context * workload_get_context(void);
+struct mars_workload_context *workload_get(void);
+struct mars_workload_context *workload_get_by_id(uint16_t workload_id);
void workload_exec(void);
void workload_exit(void);
--- a/include/mpu/mars/mars_syscalls.h
+++ b/include/mpu/mars/mars_syscalls.h
@@ -48,7 +48,8 @@ uint64_t mars_get_mars_context_ea(void);
uint32_t mars_get_kernel_id(void);
uint16_t mars_get_workload_id(void);
uint64_t mars_get_workload_ea(void);
-struct mars_workload_context *mars_get_workload_context(void);
+struct mars_workload_context *mars_get_workload(void);
+struct mars_workload_context *mars_get_workload_by_id(uint16_t workload_id);
void mars_init(void);
void mars_exit(void);
--- a/src/mpu/kernel/mars_kernel_syscalls.c
+++ b/src/mpu/kernel/mars_kernel_syscalls.c
@@ -53,7 +53,8 @@ void syscall_setup(void)
kernel_syscalls.get_kernel_id = syscall_get_kernel_id;
kernel_syscalls.get_workload_id = syscall_get_workload_id;
kernel_syscalls.get_workload_ea = syscall_get_workload_ea;
- kernel_syscalls.get_workload_context = syscall_get_workload_context;
+ kernel_syscalls.get_workload = syscall_get_workload;
+ kernel_syscalls.get_workload_by_id = syscall_get_workload_by_id;
kernel_syscalls.init = syscall_init;
kernel_syscalls.exit = syscall_exit;
kernel_syscalls.yield = syscall_yield;
@@ -85,9 +86,14 @@ uint64_t syscall_get_workload_ea(void)
return workload_get_ea();
}
-struct mars_workload_context *syscall_get_workload_context(void)
+struct mars_workload_context *syscall_get_workload(void)
{
- return workload_get_context();
+ return workload_get();
+}
+
+struct mars_workload_context *syscall_get_workload_by_id(uint16_t workload_id)
+{
+ return workload_get_by_id(workload_id);
}
void syscall_init(void)
--- a/src/mpu/kernel/mars_kernel_workload.c
+++ b/src/mpu/kernel/mars_kernel_workload.c
@@ -55,11 +55,35 @@ uint64_t workload_get_ea(void)
return workload_ea;
}
-struct mars_workload_context *workload_get_context(void)
+struct mars_workload_context *workload_get(void)
{
return &workload;
}
+struct mars_workload_context *workload_get_by_id(uint16_t workload_id)
+{
+ MARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, NULL);
+
+ static struct mars_workload_context requested_workload;
+ uint64_t requested_workload_ea;
+
+ /* workload id is same as current workload so return local copy */
+ if (workload_id == workload_index)
+ return &workload;
+
+ /* get ea of workload to get */
+ requested_workload_ea = queue_header.context_ea +
+ workload_id * sizeof(struct mars_workload_context);
+
+ /* dma the workload context code into LS from main memory */
+ mars_dma_get_and_wait((void *)&requested_workload,
+ requested_workload_ea,
+ sizeof(struct mars_workload_context),
+ MARS_DMA_TAG);
+
+ return &requested_workload;
+}
+
void workload_exec(void)
{
/* set current workload state to running */
--- a/src/mpu/lib/mars_syscalls.c
+++ b/src/mpu/lib/mars_syscalls.c
@@ -60,9 +60,14 @@ uint64_t mars_get_workload_ea(void)
return (*mars_kernel_syscalls->get_workload_ea)();
}
-struct mars_workload_context *mars_get_workload_context(void)
+struct mars_workload_context *mars_get_workload(void)
{
- return (*mars_kernel_syscalls->get_workload_context)();
+ return (*mars_kernel_syscalls->get_workload)();
+}
+
+struct mars_workload_context *mars_get_workload_by_id(uint16_t workload_id)
+{
+ return (*mars_kernel_syscalls->get_workload_by_id)(workload_id);
}
void mars_init(void)
--- a/src/mpu/lib/mars_task.c
+++ b/src/mpu/lib/mars_task.c
@@ -50,7 +50,7 @@ int mars_task_yield(void)
{
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
@@ -77,7 +77,7 @@ int mars_task_wait(struct mars_task_id *
int ret;
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
@@ -107,7 +107,7 @@ const struct mars_task_id *mars_task_get
{
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
return &task->id;
}
@@ -116,7 +116,7 @@ const char *mars_task_get_name(void)
{
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
return (const char *)task->id.name;
}
--- a/src/mpu/lib/mars_task_barrier.c
+++ b/src/mpu/lib/mars_task_barrier.c
@@ -75,7 +75,7 @@ int mars_task_barrier_notify(uint64_t ba
int i;
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
@@ -157,7 +157,7 @@ int mars_task_barrier_wait(uint64_t barr
int i;
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
--- a/src/mpu/lib/mars_task_event_flag.c
+++ b/src/mpu/lib/mars_task_event_flag.c
@@ -172,7 +172,7 @@ int mars_task_event_flag_wait(uint64_t e
int wait = 0;
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
--- a/src/mpu/lib/mars_task_queue.c
+++ b/src/mpu/lib/mars_task_queue.c
@@ -296,7 +296,7 @@ static int pop(uint64_t queue_ea, void *
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
--- a/src/mpu/lib/mars_task_semaphore.c
+++ b/src/mpu/lib/mars_task_semaphore.c
@@ -75,7 +75,7 @@ int mars_task_semaphore_acquire(uint64_t
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
--- a/src/mpu/lib/mars_task_signal.c
+++ b/src/mpu/lib/mars_task_signal.c
@@ -52,7 +52,7 @@ int mars_task_signal_wait(void)
{
struct mars_task_context *task;
- task = (struct mars_task_context *)mars_get_workload_context();
+ task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
MARS_CHECK_RET(task->context_save_size && task->context_save_area,
More information about the cbe-oss-dev
mailing list