aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazunori Asayama <asayama@sm.sony.co.jp>2009-02-05 18:32:09 -0800
committerYuji Mano <yuji.mano@am.sony.com>2009-02-11 11:37:43 -0800
commit896a5254262364ef2890086717424642b5a9b5aa (patch)
tree4f4224db084b34b274fe4f3176c8c06b6b148e05
parent43ccfdac856ba255ff6d31d0d0bc704507a48883 (diff)
downloadmars-src-896a5254262364ef2890086717424642b5a9b5aa.tar.gz
task: Prevent use of non volatile regs
Guarantee non-volatile regs are not broken during context switching This patch guarantees non-volatile registers are not broken during context switching is performed by using -mfixed-range compiler option. This patch also removes unnecessary 'noinline' attributes in the task module implementation. Signed-off-by: Kazunori Asayama <asayama@sm.sony.co.jp> Signed-off-by: Yuji Mano <yuji.mano@am.sony.com>
-rw-r--r--task/src/mpu/module/Makefile.am1
-rw-r--r--task/src/mpu/module/task_module.c42
2 files changed, 17 insertions, 26 deletions
diff --git a/task/src/mpu/module/Makefile.am b/task/src/mpu/module/Makefile.am
index 93369e0..da2bff2 100644
--- a/task/src/mpu/module/Makefile.am
+++ b/task/src/mpu/module/Makefile.am
@@ -75,6 +75,7 @@ AM_CCASFLAGS = \
AM_CFLAGS = \
$(extra_cflags) \
+ -mfixed-range=80-127 \
-W \
-Wall \
-Wunused \
diff --git a/task/src/mpu/module/task_module.c b/task/src/mpu/module/task_module.c
index ab9b14e..3da59bb 100644
--- a/task/src/mpu/module/task_module.c
+++ b/task/src/mpu/module/task_module.c
@@ -112,7 +112,7 @@ static struct mars_task_context *get_task_by_id(struct mars_task_id *task_id)
mars_module_get_workload_by_id(task_id->workload_id);
}
-static void __attribute__((noinline)) registers_save(void)
+static void registers_save(void)
{
/* push non-volatile registers on to the workload stack */
asm volatile (
@@ -169,7 +169,7 @@ static void __attribute__((noinline)) registers_save(void)
);
}
-static void __attribute__((noinline)) registers_restore(void)
+static void registers_restore(void)
{
/* pop non-volatile registers from saved workload stack */
asm volatile (
@@ -276,21 +276,6 @@ static void __attribute__((noinline)) context_restore(void)
registers_restore();
}
-static void __attribute__((noinline)) context_yield(void)
-{
- /* save task stack pointer and restore module stack pointer */
- asm volatile (
- "stqa $sp, _task_stack;"
- "lqa $sp, _module_stack;"
- );
-
- /* save task context */
- context_save();
-
- /* yield workload and put into ready state */
- mars_module_workload_yield();
-}
-
static void __attribute__((noinline)) context_wait(void)
{
/* save task stack pointer and restore module stack pointer */
@@ -320,25 +305,30 @@ static void __attribute__((noinline)) context_resume(void)
spu_sync();
}
-static void __attribute__((noinline)) context_finish(void)
+static void task_yield(void *task_heap)
{
- /* restore module stack pointer */
+ /* save task stack pointer and restore module stack pointer */
asm volatile (
+ "stqa $sp, _task_stack;"
"lqa $sp, _module_stack;"
);
- /* put workload into finished state */
- mars_module_workload_finish();
+ /* save task context */
+ context_save(task_heap);
+
+ /* yield workload and put into ready state */
+ mars_module_workload_yield();
}
static void task_exit(void)
{
- context_finish();
-}
+ /* restore module stack pointer */
+ asm volatile (
+ "lqa $sp, _module_stack;"
+ );
-static void task_yield(void)
-{
- context_yield();
+ /* put workload into finished state */
+ mars_module_workload_finish();
}
static int task_schedule(uint16_t workload_id, struct mars_task_args *args,