{"id":238,"url":"http://patchwork.ozlabs.org/api/1.1/patches/238/?format=json","web_url":"http://patchwork.ozlabs.org/project/cbe-oss-dev/patch/48C972D7.3030009@am.sony.com/","project":{"id":1,"url":"http://patchwork.ozlabs.org/api/1.1/projects/1/?format=json","name":"Cell Broadband Engine development","link_name":"cbe-oss-dev","list_id":"cbe-oss-dev.ozlabs.org","list_email":"cbe-oss-dev@ozlabs.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<48C972D7.3030009@am.sony.com>","date":"2008-09-11T19:34:47","name":"MARS: Kernel syscall add get workload by id","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"448fc6f45d988ce5ba287a548d7321bf2d3fae0e","submitter":{"id":127,"url":"http://patchwork.ozlabs.org/api/1.1/people/127/?format=json","name":"Yuji Mano","email":"yuji.mano@am.sony.com"},"delegate":{"id":26,"url":"http://patchwork.ozlabs.org/api/1.1/users/26/?format=json","username":"ymano","first_name":"Yuji","last_name":"Mano","email":"yuji.mano@am.sony.com"},"mbox":"http://patchwork.ozlabs.org/project/cbe-oss-dev/patch/48C972D7.3030009@am.sony.com/mbox/","series":[],"comments":"http://patchwork.ozlabs.org/api/patches/238/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/238/checks/","tags":{},"headers":{"Return-Path":"<cbe-oss-dev-bounces+patchwork=ozlabs.org@ozlabs.org>","X-Original-To":["patchwork@ozlabs.org","cbe-oss-dev@ozlabs.org"],"Delivered-To":["patchwork@ozlabs.org","cbe-oss-dev@ozlabs.org"],"Received":["from ozlabs.org (localhost [127.0.0.1])\n\tby ozlabs.org (Postfix) with ESMTP id C69D9DE417\n\tfor <patchwork@ozlabs.org>; Fri, 12 Sep 2008 06:37:43 +1000 (EST)","from WA4EHSOBE002.bigfish.com (outbound-wa4.frontbridge.com\n\t[216.32.181.16]) by ozlabs.org (Postfix) with ESMTP id CE836DE00B\n\tfor <cbe-oss-dev@ozlabs.org>; Fri, 12 Sep 2008 06:37:14 +1000 (EST)","from mail175-wa4-R.bigfish.com (10.8.14.253) by\n\tWA4EHSOBE002.bigfish.com (10.8.40.22) with Microsoft SMTP Server id\n\t8.1.291.1; Thu, 11 Sep 2008 20:37:11 +0000","from mail175-wa4 (localhost.localdomain [127.0.0.1])\tby\n\tmail175-wa4-R.bigfish.com (Postfix) with ESMTP id B1180A285A7\tfor\n\t<cbe-oss-dev@ozlabs.org>; Thu, 11 Sep 2008 20:37:11 +0000 (UTC)","by mail175-wa4 (MessageSwitch) id 1221165429300407_22161; Thu, 11\n\tSep 2008 20:37:09 +0000 (UCT)","from mail8.fw-sd.sony.com (mail8.fw-sd.sony.com [160.33.66.75])\tby\n\tmail175-wa4.bigfish.com (Postfix) with ESMTP id 2FB74158058\tfor\n\t<cbe-oss-dev@ozlabs.org>; Thu, 11 Sep 2008 20:37:09 +0000 (UTC)","from mail3.sjc.in.sel.sony.com (mail3.sjc.in.sel.sony.com\n\t[43.134.1.211])\tby mail8.fw-sd.sony.com (8.14.2/8.14.2) with ESMTP id\n\tm8BKb8Il021155\tfor <cbe-oss-dev@ozlabs.org>;\n\tThu, 11 Sep 2008 20:37:08 GMT","from USSDIXIM02.am.sony.com (ussdixim02.am.sony.com\n\t[43.130.140.34])\n\tby mail3.sjc.in.sel.sony.com (8.12.11/8.12.11) with ESMTP id\n\tm8BKb7t9021726\n\tfor <cbe-oss-dev@ozlabs.org>; Thu, 11 Sep 2008 20:37:08 GMT","from ussdixms03.am.sony.com ([43.130.140.23]) by\n\tUSSDIXIM02.am.sony.com with Microsoft SMTPSVC(5.0.2195.6713);\n\tThu, 11 Sep 2008 13:37:07 -0700","from [43.135.148.175] ([43.135.148.175]) by ussdixms03.am.sony.com\n\twith Microsoft SMTPSVC(5.0.2195.6713);\n\tThu, 11 Sep 2008 13:37:07 -0700"],"X-BigFish":"VS3(zzzz10c0j10d3izzz2dh6bh61h)","X-Spam-TCS-SCL":"0:0","X-FB-SS":"5,","Message-ID":"<48C972D7.3030009@am.sony.com>","Date":"Thu, 11 Sep 2008 12:34:47 -0700","From":"Yuji Mano <yuji.mano@am.sony.com>","User-Agent":"Thunderbird 2.0.0.5 (X11/20070719)","MIME-Version":"1.0","To":"CBE Development <cbe-oss-dev@ozlabs.org>","X-Enigmail-Version":"0.95.7","X-OriginalArrivalTime":"11 Sep 2008 20:37:07.0241 (UTC)\n\tFILETIME=[28456190:01C9144E]","X-SEL-encryption-scan":"scanned","Subject":"[Cbe-oss-dev] [PATCH 05/11]MARS: Kernel syscall add get workload by\n\tid","X-BeenThere":"cbe-oss-dev@ozlabs.org","X-Mailman-Version":"2.1.11","Precedence":"list","List-Id":"Discussion about Open Source Software for the Cell Broadband Engine\n\t<cbe-oss-dev.ozlabs.org>","List-Unsubscribe":"<https://ozlabs.org/mailman/options/cbe-oss-dev>,\n\t<mailto:cbe-oss-dev-request@ozlabs.org?subject=unsubscribe>","List-Archive":"<http://ozlabs.org/pipermail/cbe-oss-dev>","List-Post":"<mailto:cbe-oss-dev@ozlabs.org>","List-Help":"<mailto:cbe-oss-dev-request@ozlabs.org?subject=help>","List-Subscribe":"<https://ozlabs.org/mailman/listinfo/cbe-oss-dev>,\n\t<mailto:cbe-oss-dev-request@ozlabs.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Sender":"cbe-oss-dev-bounces+patchwork=ozlabs.org@ozlabs.org","Errors-To":"cbe-oss-dev-bounces+patchwork=ozlabs.org@ozlabs.org"},"content":"This adds a new MARS kernel syscall 'mars_get_workload_by_id' to allow for the\ntask library to grab an instance of a workload context other than the one\ncurrently running. This is needed when a task waits for completion of another\ntask, and needs to obtain the exit_code of the completed task from the task\ncontext.\n\nThis also renames the previously existing MARS kernel syscall\n'mars_get_workload_context' to 'mars_get_workload'.\n\nSigned-off-by: Yuji Mano <yuji.mano@am.sony.com>","diff":"--- a/include/mpu/mars/mars_kernel.h\n+++ b/include/mpu/mars/mars_kernel.h\n@@ -62,7 +62,9 @@ struct mars_kernel_syscalls {\n \tuint32_t (*get_kernel_id)(void);\n \tuint16_t (*get_workload_id)(void);\n \tuint64_t (*get_workload_ea)(void);\n-\tstruct mars_workload_context *(*get_workload_context)(void);\n+\tstruct mars_workload_context *(*get_workload)(void);\n+\tstruct mars_workload_context *(*get_workload_by_id)\n+\t\t(uint16_t workload_id);\n \n \tvoid (*init)(void);\n \tvoid (*exit)(void);\n@@ -86,7 +88,8 @@ uint64_t syscall_get_mars_context_ea(voi\n uint32_t syscall_get_kernel_id(void);\n uint16_t syscall_get_workload_id(void);\n uint64_t syscall_get_workload_ea(void);\n-struct mars_workload_context *syscall_get_workload_context(void);\n+struct mars_workload_context *syscall_get_workload(void);\n+struct mars_workload_context *syscall_get_workload_by_id(uint16_t workload_id);\n \n void syscall_setup(void);\n void syscall_init(void);\n@@ -107,7 +110,8 @@ void registers_restore(void);\n /* workload specific functions */\n uint16_t workload_get_id(void);\n uint64_t workload_get_ea(void);\n-struct mars_workload_context * workload_get_context(void);\n+struct mars_workload_context *workload_get(void);\n+struct mars_workload_context *workload_get_by_id(uint16_t workload_id);\n \n void workload_exec(void);\n void workload_exit(void);\n--- a/include/mpu/mars/mars_syscalls.h\n+++ b/include/mpu/mars/mars_syscalls.h\n@@ -48,7 +48,8 @@ uint64_t mars_get_mars_context_ea(void);\n uint32_t mars_get_kernel_id(void);\n uint16_t mars_get_workload_id(void);\n uint64_t mars_get_workload_ea(void);\n-struct mars_workload_context *mars_get_workload_context(void);\n+struct mars_workload_context *mars_get_workload(void);\n+struct mars_workload_context *mars_get_workload_by_id(uint16_t workload_id);\n \n void mars_init(void);\n void mars_exit(void);\n--- a/src/mpu/kernel/mars_kernel_syscalls.c\n+++ b/src/mpu/kernel/mars_kernel_syscalls.c\n@@ -53,7 +53,8 @@ void syscall_setup(void)\n \tkernel_syscalls.get_kernel_id\t\t= syscall_get_kernel_id;\n \tkernel_syscalls.get_workload_id\t\t= syscall_get_workload_id;\n \tkernel_syscalls.get_workload_ea\t\t= syscall_get_workload_ea;\n-\tkernel_syscalls.get_workload_context\t= syscall_get_workload_context;\n+\tkernel_syscalls.get_workload\t\t= syscall_get_workload;\n+\tkernel_syscalls.get_workload_by_id\t= syscall_get_workload_by_id;\n \tkernel_syscalls.init\t\t\t= syscall_init;\n \tkernel_syscalls.exit\t\t\t= syscall_exit;\n \tkernel_syscalls.yield\t\t\t= syscall_yield;\n@@ -85,9 +86,14 @@ uint64_t syscall_get_workload_ea(void)\n \treturn workload_get_ea();\n }\n \n-struct mars_workload_context *syscall_get_workload_context(void)\n+struct mars_workload_context *syscall_get_workload(void)\n {\n-\treturn workload_get_context();\n+\treturn workload_get();\n+}\n+\n+struct mars_workload_context *syscall_get_workload_by_id(uint16_t workload_id)\n+{\n+\treturn workload_get_by_id(workload_id);\n }\n \n void syscall_init(void)\n--- a/src/mpu/kernel/mars_kernel_workload.c\n+++ b/src/mpu/kernel/mars_kernel_workload.c\n@@ -55,11 +55,35 @@ uint64_t workload_get_ea(void)\n \treturn workload_ea;\n }\n \n-struct mars_workload_context *workload_get_context(void)\n+struct mars_workload_context *workload_get(void)\n {\n \treturn &workload;\n }\n \n+struct mars_workload_context *workload_get_by_id(uint16_t workload_id)\n+{\n+\tMARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, NULL);\n+\n+\tstatic struct mars_workload_context requested_workload;\n+\tuint64_t requested_workload_ea;\n+\n+\t/* workload id is same as current workload so return local copy */\n+\tif (workload_id == workload_index)\n+\t\treturn &workload;\n+\n+\t/* get ea of workload to get */\n+\trequested_workload_ea = queue_header.context_ea +\n+\t\t\tworkload_id * sizeof(struct mars_workload_context);\n+\n+\t/* dma the workload context code into LS from main memory */\n+\tmars_dma_get_and_wait((void *)&requested_workload,\n+\t\t\t\trequested_workload_ea,\n+\t\t\t\tsizeof(struct mars_workload_context),\n+\t\t\t\tMARS_DMA_TAG);\n+\n+\treturn &requested_workload;\n+}\n+\n void workload_exec(void)\n {\n \t/* set current workload state to running */\n--- a/src/mpu/lib/mars_syscalls.c\n+++ b/src/mpu/lib/mars_syscalls.c\n@@ -60,9 +60,14 @@ uint64_t mars_get_workload_ea(void)\n \treturn (*mars_kernel_syscalls->get_workload_ea)();\n }\n \n-struct mars_workload_context *mars_get_workload_context(void)\n+struct mars_workload_context *mars_get_workload(void)\n {\n-\treturn (*mars_kernel_syscalls->get_workload_context)();\n+\treturn (*mars_kernel_syscalls->get_workload)();\n+}\n+\n+struct mars_workload_context *mars_get_workload_by_id(uint16_t workload_id)\n+{\n+\treturn (*mars_kernel_syscalls->get_workload_by_id)(workload_id);\n }\n \n void mars_init(void)\n--- a/src/mpu/lib/mars_task.c\n+++ b/src/mpu/lib/mars_task.c\n@@ -50,7 +50,7 @@ int mars_task_yield(void)\n {\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n@@ -77,7 +77,7 @@ int mars_task_wait(struct mars_task_id *\n \tint ret;\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n@@ -107,7 +107,7 @@ const struct mars_task_id *mars_task_get\n {\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \treturn &task->id;\n }\n@@ -116,7 +116,7 @@ const char *mars_task_get_name(void)\n {\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \treturn (const char *)task->id.name;\n }\n--- a/src/mpu/lib/mars_task_barrier.c\n+++ b/src/mpu/lib/mars_task_barrier.c\n@@ -75,7 +75,7 @@ int mars_task_barrier_notify(uint64_t ba\n \tint i;\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n@@ -157,7 +157,7 @@ int mars_task_barrier_wait(uint64_t barr\n \tint i;\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n--- a/src/mpu/lib/mars_task_event_flag.c\n+++ b/src/mpu/lib/mars_task_event_flag.c\n@@ -172,7 +172,7 @@ int mars_task_event_flag_wait(uint64_t e\n \tint wait = 0;\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n--- a/src/mpu/lib/mars_task_queue.c\n+++ b/src/mpu/lib/mars_task_queue.c\n@@ -296,7 +296,7 @@ static int pop(uint64_t queue_ea, void *\n \n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n--- a/src/mpu/lib/mars_task_semaphore.c\n+++ b/src/mpu/lib/mars_task_semaphore.c\n@@ -75,7 +75,7 @@ int mars_task_semaphore_acquire(uint64_t\n \n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n--- a/src/mpu/lib/mars_task_signal.c\n+++ b/src/mpu/lib/mars_task_signal.c\n@@ -52,7 +52,7 @@ int mars_task_signal_wait(void)\n {\n \tstruct mars_task_context *task;\n \n-\ttask = (struct mars_task_context *)mars_get_workload_context();\n+\ttask = (struct mars_task_context *)mars_get_workload();\n \n \t/* make sure task context has a context save area */\n \tMARS_CHECK_RET(task->context_save_size && task->context_save_area,\n","prefixes":[]}