@@ -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);
@@ -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);
@@ -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)
@@ -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 */
@@ -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)
@@ -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;
}
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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,
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@am.sony.com>