diff options
author | Kazunori Asayama <asayama@sm.sony.co.jp> | 2009-02-05 18:32:09 -0800 |
---|---|---|
committer | Yuji Mano <yuji.mano@am.sony.com> | 2009-02-11 11:37:43 -0800 |
commit | 896a5254262364ef2890086717424642b5a9b5aa (patch) | |
tree | 4f4224db084b34b274fe4f3176c8c06b6b148e05 | |
parent | 43ccfdac856ba255ff6d31d0d0bc704507a48883 (diff) | |
download | mars-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.am | 1 | ||||
-rw-r--r-- | task/src/mpu/module/task_module.c | 42 |
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, |