[Cbe-oss-dev] [PATCH 14/23]MARS/base: asm sched func
Yuji Mano
yuji.mano at am.sony.com
Sat Mar 14 12:18:47 EST 2009
Rewrite part of kernel in assembly language
This patch reimplement part of kernel in assembly language to
guarantee particular stack layout.
Signed-off-by: Kazunori Asayama <asayama at sm.sony.co.jp>
Signed-off-by: Yuji Mano <yuji.mano at am.sony.com>
---
base/src/common/kernel_internal_types.h | 3 -
base/src/mpu/kernel/Makefile.am | 3 -
base/src/mpu/kernel/kernel.c | 47 +++++++-----------
base/src/mpu/kernel/switch.S | 80 ++++++++++++++++++++++++++++++++
base/src/mpu/lib/Makefile.am | 1
base/src/mpu/lib/entry.S | 50 ++++++++++++++++++++
base/src/mpu/lib/module.c | 30 +++---------
7 files changed, 161 insertions(+), 53 deletions(-)
--- a/base/src/common/kernel_internal_types.h
+++ b/base/src/common/kernel_internal_types.h
@@ -123,7 +123,4 @@ int dma_get(void *ls, uint64_t ea, uint3
int dma_put(const void *ls, uint64_t ea, uint32_t size, uint32_t tag);
int dma_wait(uint32_t tag);
-/* mars module entry */
-void mars_module_entry(struct mars_kernel_syscalls *syscalls);
-
#endif
--- a/base/src/mpu/kernel/Makefile.am
+++ b/base/src/mpu/kernel/Makefile.am
@@ -98,6 +98,7 @@ mars_kernel_SOURCES = \
$(srcdir)/../../../src/common/*.h \
dma.c \
kernel.c \
- mutex.c
+ mutex.c \
+ switch.S
CLEANFILES = *.map
--- a/base/src/mpu/kernel/kernel.c
+++ b/base/src/mpu/kernel/kernel.c
@@ -48,7 +48,6 @@
#include "workload_internal_types.h"
/* kernel */
-void *__kernel_stack;
union mars_kernel_buffer kernel_buffer;
static struct mars_kernel_params kernel_params;
@@ -75,6 +74,14 @@ static struct mars_workload_module cache
typedef void (*module_entry)(
const struct mars_kernel_syscalls *kernel_syscalls);
+/* defined in switch.S */
+extern void workload_run(void);
+extern void workload_exit(uint8_t state);
+
+/* called by switch.S */
+void __workload_run(void);
+void __workload_exit(uint8_t state);
+
static int kernel_memcmp(const void *s1, const void *s2, int size)
{
__vector const int *vptr_1 = (__vector const int *)s1;
@@ -329,22 +336,6 @@ static int change_state(uint16_t id,
callback);
}
-
-static void __attribute__((noinline)) save_workload_state(uint8_t state)
-{
- workload_state = state;
-}
-
-static void workload_exit(uint8_t state)
-{
- register void *sp asm("$sp");
-
- save_workload_state(state);
-
- /* restore kernel stack pointer */
- sp = __kernel_stack;
-}
-
static int workload_query(uint16_t id, int query)
{
uint64_t bits = get_block_bits(id);
@@ -545,6 +536,17 @@ static struct mars_kernel_syscalls kerne
dma_wait
};
+void __workload_run(void)
+{
+ /* call module entry function */
+ ((module_entry)workload_module->entry)(&kernel_syscalls);
+}
+
+void __workload_exit(uint8_t state)
+{
+ workload_state = state;
+}
+
static int search_block(int block, int ready)
{
int i;
@@ -773,17 +775,6 @@ static void workload_release(void)
notify_host_bits(block_ea, index);
}
-static void __attribute__((noinline)) workload_run(void)
-{
- register void *sp asm("$sp");
-
- /* save kernel stack pointer */
- __kernel_stack = sp;
-
- /* call module entry function */
- ((module_entry)workload_module->entry)(&kernel_syscalls);
-}
-
static void workload_module_load(void)
{
__vector unsigned char *bss_ptr, *bss_end;
--- /dev/null
+++ b/base/src/mpu/kernel/switch.S
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2009 Sony Corporation of America
+ *
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this Library and associated documentation files (the
+ * "Library"), to deal in the Library without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Library, and to
+ * permit persons to whom the Library is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Library.
+ *
+ * If you modify the Library, you may copy and distribute your modified
+ * version of the Library in object code or as an executable provided
+ * that you also do one of the following:
+ *
+ * Accompany the modified version of the Library with the complete
+ * corresponding machine-readable source code for the modified version
+ * of the Library; or,
+ *
+ * Accompany the modified version of the Library with a written offer
+ * for a complete machine-readable copy of the corresponding source
+ * code of the modified version of the Library.
+ *
+ *
+ * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
+ */
+
+.data
+
+/* void *__kernel_stack */
+.align 4
+.globl __kernel_stack
+__kernel_stack:
+.space 4
+
+
+.text
+
+/* void workload_run(void) */
+.global workload_run
+.type workload_run, @function
+workload_run:
+ stqd $LR, 16($SP) /* save link register */
+ stqd $SP, -32($SP) /* save back chain */
+ ai $SP, $SP, -32 /* push stack frame */
+
+ stqr $SP, __kernel_stack /* save kernel stack pointer */
+ brsl $LR, __workload_run /* call body of workload_run */
+
+ ai $SP, $SP, 32 /* pop stack frame */
+ lqd $LR, 16($SP) /* restore link register */
+ bi $LR /* return */
+.size workload_run, .-workload_run
+
+
+/* void workload_exit(uint8_t state) */
+.global workload_exit
+.type workload_exit, @function
+workload_exit:
+ stqd $LR, 16($SP) /* save link register */
+ stqd $SP, -32($SP) /* save back chain */
+ ai $SP, $SP, -32 /* push stack frame */
+
+ brsl $LR, __workload_exit /* call body of workload_exit */
+ lqr $SP, __kernel_stack /* restore kernel stack */
+
+ ai $SP, $SP, 32 /* pop stack frame */
+ lqd $LR, 16($SP) /* restore link register */
+ bi $LR /* return */
+.size workload_exit, .-workload_exit
--- a/base/src/mpu/lib/Makefile.am
+++ b/base/src/mpu/lib/Makefile.am
@@ -92,4 +92,5 @@ lib_LTLIBRARIES = libmars_base.la
libmars_base_la_SOURCES = \
$(srcdir)/../../../src/common/*.h \
+ entry.S \
module.c
--- /dev/null
+++ b/base/src/mpu/lib/entry.S
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2009 Sony Corporation of America
+ *
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this Library and associated documentation files (the
+ * "Library"), to deal in the Library without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Library, and to
+ * permit persons to whom the Library is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Library.
+ *
+ * If you modify the Library, you may copy and distribute your modified
+ * version of the Library in object code or as an executable provided
+ * that you also do one of the following:
+ *
+ * Accompany the modified version of the Library with the complete
+ * corresponding machine-readable source code for the modified version
+ * of the Library; or,
+ *
+ * Accompany the modified version of the Library with a written offer
+ * for a complete machine-readable copy of the corresponding source
+ * code of the modified version of the Library.
+ *
+ *
+ * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
+ */
+
+.text
+
+/* void mars_module_entry(struct mars_kernel_syscalls *syscalls) */
+.global mars_module_entry
+.type mars_module_entry, @function
+mars_module_entry:
+ ila $SP, __stack /* switch to module stack */
+ il $LR, 0 /* set module link register to NULL */
+ stqd $LR, 0($SP) /* initialize back chain to NULL */
+ stqd $SP, -32($SP) /* initialize stack frame */
+ ai $SP, $SP, -32 /* push stack frame */
+ brsl $LR, __module_entry /* call module entry body */
+.size mars_module_entry, .-mars_module_entry
--- a/base/src/mpu/lib/module.c
+++ b/base/src/mpu/lib/module.c
@@ -42,32 +42,20 @@
#include "kernel_internal_types.h"
#include "workload_internal_types.h"
+/* global kernel syscalls pointer */
static struct mars_kernel_syscalls *kernel_syscalls;
-void mars_module_entry(struct mars_kernel_syscalls *syscalls)
+/* defined in crt */
+extern void _init(void);
+
+/* called by entry.S */
+void __module_entry(struct mars_kernel_syscalls *syscalls);
+
+void __module_entry(struct mars_kernel_syscalls *syscalls)
{
kernel_syscalls = syscalls;
- asm volatile (
- /* switch to module stack */
- "ila $sp, __stack;"
-
- /* set module link register to NULL */
- "il $lr, 0;"
-
- /* initialize back chain to NULL */
- "stqd $lr, 0($sp);"
-
- /* initialize module stack frame */
- "stqd $sp, -32($sp);"
- "ai $sp, $sp, -32;"
-
- /* save link register in link register save area */
- "stqd $lr, 16($sp);"
-
- /* call _init function */
- "brsl $lr, _init;"
- );
+ _init();
mars_module_main();
More information about the cbe-oss-dev
mailing list