summaryrefslogtreecommitdiff
path: root/core/minute-ia/task.c
diff options
context:
space:
mode:
authorHyungwoo Yang <hyungwoo.yang@intel.com>2019-01-30 12:30:47 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-02-26 05:09:12 -0800
commitdecc9452e981a7c8ce5c6b8983061a054057c615 (patch)
treeeaea7bba6491f96bc06a77e2af2fd43d4b210894 /core/minute-ia/task.c
parent0a3f44e4f508d0c6a96519e6db97b2f2fd4bfb23 (diff)
downloadchrome-ec-decc9452e981a7c8ce5c6b8983061a054057c615.tar.gz
ish: save/restore FPU context only for the task uses FPU
Currently we save/retore FPU H/W context for every task on every contxt switch. This hurts overall performance of ISH. This patch allows save and restore FPU H/W context only for a task that declares it uses FPU. BRANCH=none BUG=none TEST=verified in Atlas platform Change-Id: Ic2f0bbf59f655661e2dd788c688edc4e83068c1c Signed-off-by: Hyungwoo Yang <hyungwoo.yang@intel.com> Reviewed-on: https://chromium-review.googlesource.com/1448818 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Hyungwoo Yang <hyungwoo.yang@intel.corp-partner.google.com> Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'core/minute-ia/task.c')
-rw-r--r--core/minute-ia/task.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/core/minute-ia/task.c b/core/minute-ia/task.c
index 2836d40975..9975cc62d7 100644
--- a/core/minute-ia/task.c
+++ b/core/minute-ia/task.c
@@ -26,7 +26,7 @@
#define STACK_UNUSED_VALUE 0xdeadd00d
/* declare task routine prototypes */
-#define TASK(n, r, d, s) void r(void *);
+#define TASK(n, r, d, s, f) void r(void *);
void __idle(void);
CONFIG_TASK_LIST
CONFIG_TEST_TASK_LIST
@@ -36,7 +36,7 @@ CONFIG_TEST_TASK_LIST
extern volatile uint32_t __in_isr;
/* Task names for easier debugging */
-#define TASK(n, r, d, s) #n,
+#define TASK(n, r, d, s, f) #n,
static const char * const task_names[] = {
"<< idle >>",
CONFIG_TASK_LIST
@@ -90,17 +90,19 @@ static void task_exit_trap(void)
}
/* Startup parameters for all tasks. */
-#define TASK(n, r, d, s) { \
+#define TASK(n, r, d, s, f) { \
.r0 = (uint32_t)d, \
.pc = (uint32_t)r, \
.stack_size = s, \
+ .flags = f, \
},
static const struct {
uint32_t r0;
uint32_t pc;
uint16_t stack_size;
+ uint32_t flags;
} tasks_init[] = {
- TASK(IDLE, __idle, 0, IDLE_TASK_STACK_SIZE)
+ TASK(IDLE, __idle, 0, IDLE_TASK_STACK_SIZE, 0)
CONFIG_TASK_LIST
CONFIG_TEST_TASK_LIST
};
@@ -115,9 +117,9 @@ BUILD_ASSERT(TASK_ID_COUNT < (1 << (sizeof(task_id_t) * 8)));
/* Stacks for all tasks */
-#define TASK(n, r, d, s) + s
+#define TASK(n, r, d, s, f) + s
uint8_t task_stacks[0
- TASK(IDLE, __idle, 0, IDLE_TASK_STACK_SIZE)
+ TASK(IDLE, __idle, 0, IDLE_TASK_STACK_SIZE, 0)
CONFIG_TASK_LIST
CONFIG_TEST_TASK_LIST
] __aligned(8);
@@ -474,10 +476,18 @@ void task_print_list(void)
{
int i;
+#ifdef CONFIG_FPU
+ ccputs("Task Ready Name Events Time (s) "
+ " StkUsed UseFPU\n");
+#else
ccputs("Task Ready Name Events Time (s) StkUsed\n");
+#endif
for (i = 0; i < TASK_ID_COUNT; i++) {
char is_ready = (tasks_ready & (1<<i)) ? 'R' : ' ';
+#ifdef CONFIG_FPU
+ char use_fpu = tasks[i].use_fpu ? 'Y' : 'N';
+#endif
uint32_t *sp;
int stackused = tasks_init[i].stack_size;
@@ -487,9 +497,16 @@ void task_print_list(void)
sp++)
stackused -= sizeof(uint32_t);
+#ifdef CONFIG_FPU
+ ccprintf("%4d %c %-16s %08x %11.6ld %3d/%3d %c\n", i, is_ready,
+ task_names[i], tasks[i].events, tasks[i].runtime,
+ stackused, tasks_init[i].stack_size, use_fpu);
+#else
ccprintf("%4d %c %-16s %08x %11.6ld %3d/%3d\n", i, is_ready,
task_names[i], tasks[i].events, tasks[i].runtime,
stackused, tasks_init[i].stack_size);
+#endif
+
cflush();
}
}
@@ -606,6 +623,9 @@ void task_pre_init(void)
/* Copy default x86 FPU state for each task */
memcpy(tasks[i].fp_ctx, default_fp_ctx,
sizeof(default_fp_ctx));
+
+ if (tasks_init[i].flags & MIA_TASK_FLAG_USE_FPU)
+ tasks[i].use_fpu = 1;
#endif
/* Fill unused stack; also used to detect stack overflow. */
for (sp = stack_next; sp < (uint32_t *)tasks[i].sp; sp++)
@@ -618,7 +638,6 @@ void task_pre_init(void)
/* Initialize IRQs */
init_interrupts();
-
}
void task_clear_fp_used(void)