static void rtswitch_ktask(void *cookie) { struct taskarg *arg = (struct taskarg *) cookie; rtswitch_context_t *ctx = arg->ctx; rtswitch_task_t *task = arg->task; unsigned to, i = 0; to = task->base.index; rtswitch_pend_rt(ctx, task->base.index); for(;;) { if (task->base.flags & RTTST_SWTEST_USE_FPU) fp_regs_set(task->base.index + i * 1000); switch(i % 3) { case 0: /* to == from means "return to last task" */ rtswitch_to_rt(ctx, task->base.index, task->base.index); break; case 1: if (++to == task->base.index) ++to; if (to > ctx->tasks_count - 1) to = 0; if (to == task->base.index) ++to; /* Fall through. */ case 2: rtswitch_to_rt(ctx, task->base.index, to); } if (task->base.flags & RTTST_SWTEST_USE_FPU) { unsigned fp_val, expected; expected = task->base.index + i * 1000; fp_val = fp_regs_check(expected); if (fp_val != expected) { if (task->base.flags & RTTST_SWTEST_FREEZE) xntrace_user_freeze(0, 0); handle_ktask_error(ctx, fp_val); } } if (++i == 4000000) i = 0; } }
static int rtswitch_ioctl_rt(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, unsigned int request, void *arg) { rtswitch_context_t *ctx = (rtswitch_context_t *) context->dev_private; struct rttst_swtest_task task; struct rttst_swtest_dir fromto; switch (request) { case RTTST_RTIOC_SWTEST_REGISTER_UTASK: case RTTST_RTIOC_SWTEST_CREATE_KTASK: case RTTST_RTIOC_SWTEST_GET_SWITCHES_COUNT: return -ENOSYS; case RTTST_RTIOC_SWTEST_PEND: if (!rtdm_read_user_ok(user_info, arg, sizeof(task))) return -EFAULT; rtdm_copy_from_user(user_info, &task, arg, sizeof(task)); return rtswitch_pend_rt(ctx, task.index); case RTTST_RTIOC_SWTEST_SWITCH_TO: if (!rtdm_read_user_ok(user_info, arg, sizeof(fromto))) return -EFAULT; rtdm_copy_from_user(user_info, &fromto, arg, sizeof(fromto)); return rtswitch_to_rt(ctx, fromto.from, fromto.to); case RTTST_RTIOC_SWTEST_GET_LAST_ERROR: if (!rtdm_rw_user_ok(user_info, arg, sizeof(ctx->error))) return -EFAULT; rtdm_copy_to_user(user_info, arg, &ctx->error, sizeof(ctx->error)); return 0; default: return -ENOTTY; } }
static void rtswitch_ktask(void *cookie) { struct taskarg *arg = (struct taskarg *) cookie; rtswitch_context_t *ctx = arg->ctx; rtswitch_task_t *task = arg->task; unsigned to, i = 0; to = task->base.index; rtswitch_pend_rt(ctx, task->base.index); for(;;) { if (++to == task->base.index) ++to; if (to > ctx->tasks_count - 1) to = 0; if (to == task->base.index) ++to; if (task->base.flags & RTTST_SWTEST_USE_FPU) fp_regs_set(task->base.index + i * 1000); rtswitch_to_rt(ctx, task->base.index, to); if (task->base.flags & RTTST_SWTEST_USE_FPU) { unsigned fp_val, expected; expected = task->base.index + i * 1000; fp_val = fp_regs_check(expected); if (fp_val != expected) handle_ktask_error(ctx, fp_val); } if (++i == 4000000) i = 0; } }