From 815633221d44dbae40a111e6ca8a86361329aeb3 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Mon, 23 Oct 2023 11:59:45 +0200 Subject: [PATCH] Port nOS-V model to task bodies The nOS-V events are modified in two ways: 1) to create a parallel task the new VTC event must be used and 2) all task events for both normal (VTc) and parallel (VTC) tasks require an extra argument in the payload to indicate the body id. As a consequence, the nOS-V model version is now increased to 2.0.0. Additionally, all the channel PRV flags are set to PRV_SKIPDUPNULL, so duplicates are only emitted if they are not null. It solves the problem when a task switches to another task with the same body id. A new Paraver configuration is added for the body id. --- CHANGELOG.md | 7 + cfg/cpu/nosv/body-id.cfg | 42 ++++++ cfg/thread/nosv/body-id.cfg | 42 ++++++ doc/user/emulation/events.md | 22 +-- doc/user/emulation/fig/body-model.dot | 9 ++ doc/user/emulation/fig/body-model.svg | 69 +++++++++ doc/user/emulation/fig/parallel-tasks.svg | 176 ++++++++++++++++++++++ doc/user/emulation/nosv.md | 37 ++++- src/emu/emu_prv.h | 1 + src/emu/nosv/event.c | 100 ++++++++---- src/emu/nosv/nosv_priv.h | 3 +- src/emu/nosv/setup.c | 34 +++-- test/emu/nosv/CMakeLists.txt | 2 +- 13 files changed, 485 insertions(+), 59 deletions(-) create mode 100644 cfg/cpu/nosv/body-id.cfg create mode 100644 cfg/thread/nosv/body-id.cfg create mode 100644 doc/user/emulation/fig/body-model.dot create mode 100644 doc/user/emulation/fig/body-model.svg create mode 100644 doc/user/emulation/fig/parallel-tasks.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 456528b..e25dad7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add new body model to support parallel tasks in nOS-V (used in taskfor). +- Add the ability to restrict transitions in the task model states. +- Add nOS-V support for parallel tasks reading the body id from the + event payload. + ### Changed - The task model now requires the previous task body to be paused before nesting diff --git a/cfg/cpu/nosv/body-id.cfg b/cfg/cpu/nosv/body-id.cfg new file mode 100644 index 0000000..1d04787 --- /dev/null +++ b/cfg/cpu/nosv/body-id.cfg @@ -0,0 +1,42 @@ +#ParaverCFG +ConfigFile.Version: 3.4 +ConfigFile.NumWindows: 1 + + +################################################################################ +< NEW DISPLAYING WINDOW CPU: nOS-V task body ID of the RUNNING thread > +################################################################################ +window_name CPU: nOS-V task body ID of the RUNNING thread +window_type single +window_id 1 +window_position_x 0 +window_position_y 0 +window_width 600 +window_height 150 +window_comm_lines_enabled true +window_flags_enabled false +window_noncolor_mode true +window_color_mode window_in_null_gradient_mode +window_logical_filtered true +window_physical_filtered false +window_comm_fromto true +window_comm_tagsize true +window_comm_typeval true +window_units Microseconds +window_maximum_y 1000.0 +window_minimum_y 1.0 +window_compute_y_max true +window_level thread +window_scale_relative 1.000000000000 +window_end_time_relative 1.000000000000 +window_object appl { 1, { All } } +window_begin_time_relative 0.000000000000 +window_open true +window_drawmode draw_randnotzero +window_drawmode_rows draw_randnotzero +window_pixel_size 1 +window_labels_to_draw 1 +window_selected_functions { 14, { {cpu, Active Thd}, {appl, Adding}, {task, Adding}, {thread, Last Evt Val}, {node, Adding}, {system, Adding}, {workload, Adding}, {from_obj, All}, {to_obj, All}, {tag_msg, All}, {size_msg, All}, {bw_msg, All}, {evt_type, =}, {evt_value, All} } } +window_compose_functions { 9, { {compose_cpu, As Is}, {compose_appl, As Is}, {compose_task, As Is}, {compose_thread, As Is}, {compose_node, As Is}, {compose_system, As Is}, {compose_workload, As Is}, {topcompose1, As Is}, {topcompose2, As Is} } } +window_filter_module evt_type 1 15 +window_filter_module evt_type_label 1 "CPU: nOS-V task body ID of the RUNNING thread" diff --git a/cfg/thread/nosv/body-id.cfg b/cfg/thread/nosv/body-id.cfg new file mode 100644 index 0000000..4bb9915 --- /dev/null +++ b/cfg/thread/nosv/body-id.cfg @@ -0,0 +1,42 @@ +#ParaverCFG +ConfigFile.Version: 3.4 +ConfigFile.NumWindows: 1 + + +################################################################################ +< NEW DISPLAYING WINDOW Thread: nOS-V task body ID of the RUNNING thread > +################################################################################ +window_name Thread: nOS-V task body ID of the RUNNING thread +window_type single +window_id 1 +window_position_x 0 +window_position_y 0 +window_width 600 +window_height 150 +window_comm_lines_enabled true +window_flags_enabled false +window_noncolor_mode true +window_color_mode window_in_null_gradient_mode +window_logical_filtered true +window_physical_filtered false +window_comm_fromto true +window_comm_tagsize true +window_comm_typeval true +window_units Microseconds +window_maximum_y 1000.0 +window_minimum_y 1.0 +window_compute_y_max true +window_level thread +window_scale_relative 1.000000000000 +window_end_time_relative 1.000000000000 +window_object appl { 1, { All } } +window_begin_time_relative 0.000000000000 +window_open true +window_drawmode draw_randnotzero +window_drawmode_rows draw_randnotzero +window_pixel_size 1 +window_labels_to_draw 1 +window_selected_functions { 14, { {cpu, Active Thd}, {appl, Adding}, {task, Adding}, {thread, Last Evt Val}, {node, Adding}, {system, Adding}, {workload, Adding}, {from_obj, All}, {to_obj, All}, {tag_msg, All}, {size_msg, All}, {bw_msg, All}, {evt_type, =}, {evt_value, All} } } +window_compose_functions { 9, { {compose_cpu, As Is}, {compose_appl, As Is}, {compose_task, As Is}, {compose_thread, As Is}, {compose_node, As Is}, {compose_system, As Is}, {compose_workload, As Is}, {topcompose1, As Is}, {topcompose2, As Is} } } +window_filter_module evt_type 1 15 +window_filter_module evt_type_label 1 "Thread: nOS-V task body ID of the RUNNING thread" diff --git a/doc/user/emulation/events.md b/doc/user/emulation/events.md index 02f0456..c8c2aa5 100644 --- a/doc/user/emulation/events.md +++ b/doc/user/emulation/events.md @@ -1,7 +1,7 @@ # Emulator events This is a exhaustive list of the events recognized by the emulator. -Built on Feb 15 2024. +Built on Mar 13 2024. ## Model nanos6 @@ -615,18 +615,20 @@ List of events for the model *tampi* with identifier **`T`** at version `1.0.0`: ## Model nosv -List of events for the model *nosv* with identifier **`V`** at version `1.1.0`: +List of events for the model *nosv* with identifier **`V`** at version `2.0.0`:
VTc(u32 taskid, u32 typeid)
creates task %{taskid} with type %{typeid}
-
VTx(u32 taskid)
-
executes the task %{taskid}
-
VTe(u32 taskid)
-
ends the task %{taskid}
-
VTp(u32 taskid)
-
pauses the task %{taskid}
-
VTr(u32 taskid)
-
resumes the task %{taskid}
+
VTC(u32 taskid, u32 typeid)
+
creates parallel task %{taskid} with type %{typeid}
+
VTx(u32 taskid, u32 bodyid)
+
executes the task %{taskid} with bodyid %{bodyid}
+
VTe(u32 taskid, u32 bodyid)
+
ends the task %{taskid} with bodyid %{bodyid}
+
VTp(u32 taskid, u32 bodyid)
+
pauses the task %{taskid} with bodyid %{bodyid}
+
VTr(u32 taskid, u32 bodyid)
+
resumes the task %{taskid} with bodyid %{bodyid}
VYc+(u32 typeid, str label)
creates task type %{typeid} with label "%{label}"
VSr
diff --git a/doc/user/emulation/fig/body-model.dot b/doc/user/emulation/fig/body-model.dot new file mode 100644 index 0000000..d179340 --- /dev/null +++ b/doc/user/emulation/fig/body-model.dot @@ -0,0 +1,9 @@ +digraph { + graph [size="6!", ranksep="0.7", nodesep="1"]; + + Created -> Running; + Running -> Paused [label=BODY_FLAG_PAUSE]; + Paused -> Running; + Running -> Dead; + Dead -> Running [label="BODY_FLAG_RESURRECT\niteration++"]; +} diff --git a/doc/user/emulation/fig/body-model.svg b/doc/user/emulation/fig/body-model.svg new file mode 100644 index 0000000..0f575a4 --- /dev/null +++ b/doc/user/emulation/fig/body-model.svg @@ -0,0 +1,69 @@ + + + + + + + + + +Created + +Created + + + +Running + +Running + + + +Created->Running + + + + + +Paused + +Paused + + + +Running->Paused + + +BODY_FLAG_PAUSE + + + +Dead + +Dead + + + +Running->Dead + + + + + +Paused->Running + + + + + +Dead->Running + + +BODY_FLAG_RESURRECT +iteration++ + + + diff --git a/doc/user/emulation/fig/parallel-tasks.svg b/doc/user/emulation/fig/parallel-tasks.svg new file mode 100644 index 0000000..3a85b3c --- /dev/null +++ b/doc/user/emulation/fig/parallel-tasks.svg @@ -0,0 +1,176 @@ + + + + + + + + + + + + Normal task + + Body 1 + + Parallel task + + Body 1 + + Body 2 + + ... + + diff --git a/doc/user/emulation/nosv.md b/doc/user/emulation/nosv.md index a9ebfc4..054d5b2 100644 --- a/doc/user/emulation/nosv.md +++ b/doc/user/emulation/nosv.md @@ -1,9 +1,42 @@ # nOS-V model +The [nOS-V library][nosv] implements a user space runtime that can schedule +tasks to run in multiple CPUs. The nOS-V library is instrumented to +track the internal state of the runtime as well as emit information +about the tasks that are running. + +[nosv]: https://github.com/bsc-pm/nos-v + +## Task model + The nOS-V runtime is composed of tasks that can be scheduled to run in threads. Tasks can be paused and resumed, leaving the CPUs free to -execute other tasks. The nOS-V model tracks the state of each task as -well as the state of the runtime internal state. +execute other tasks. + +In nOS-V, parallel tasks can also be scheduled multiple times and the +same task may run concurrently in several CPUs. To model this scenario, +we introduce the concept of *body*, which maps to each execution of the +same task, with a unique body id. + +![Parallel tasks](fig/parallel-tasks.svg) + +A normal task only has one body, while a parallel task (created with +`TASK_FLAG_PARALLEL`) can have more than one body. Each body holds the +execution state, and can transition to different execution states +following this state diagram: + +![Body model](fig/body-model.svg) + +Bodies begin in the Created state and transition to Running when they +begin the execution. Bodies that can be paused (created with the flag +`BODY_FLAG_PAUSE` can transition to the Paused state. + +Additionally, bodies can run multiple times if they are created with the +`BODY_FLAG_RESURRECT`, and transition from Dead to Running. This +transition is required to model the tasks that implement the taskiter in +NODES, which will be submitted multiple times for execution reusing the +same task id and body id. Every time a body runs again, the iteration +number is increased. ## Task type colors diff --git a/src/emu/emu_prv.h b/src/emu/emu_prv.h index 664ac0b..48b6010 100644 --- a/src/emu/emu_prv.h +++ b/src/emu/emu_prv.h @@ -18,6 +18,7 @@ enum emu_prv_types { PRV_NOSV_APPID = 12, PRV_NOSV_SUBSYSTEM = 13, PRV_NOSV_RANK = 14, + PRV_NOSV_BODYID = 15, PRV_TAMPI_SUBSYSTEM = 20, PRV_MPI_FUNCTION = 25, PRV_NODES_SUBSYSTEM = 30, diff --git a/src/emu/nosv/event.c b/src/emu/nosv/event.c index bfe5051..cca6fe6 100644 --- a/src/emu/nosv/event.c +++ b/src/emu/nosv/event.c @@ -97,12 +97,16 @@ simple(struct emu *emu) } static int -chan_task_stopped(struct emu *emu) +chan_body_stopped(struct emu *emu) { struct nosv_thread *th = EXT(emu->thread, 'V'); struct chan *ch = th->m.ch; struct value null = value_null(); + if (chan_set(&ch[CH_BODYID], null) != 0) { + err("chan_set taskid failed"); + return -1; + } if (chan_set(&ch[CH_TASKID], null) != 0) { err("chan_set taskid failed"); return -1; @@ -128,8 +132,9 @@ chan_task_stopped(struct emu *emu) } static int -chan_task_running(struct emu *emu, struct task *task) +chan_body_running(struct emu *emu, struct body *body) { + struct task *task = body_get_task(body); struct nosv_thread *th = EXT(emu->thread, 'V'); struct proc *proc = emu->proc; struct chan *ch = th->m.ch; @@ -147,6 +152,10 @@ chan_task_running(struct emu *emu, struct task *task) return -1; } + if (chan_set(&ch[CH_BODYID], value_int64(body_get_id(body))) != 0) { + err("chan_set bodyid failed"); + return -1; + } if (chan_set(&ch[CH_TASKID], value_int64(task->id)) != 0) { err("chan_set taskid failed"); return -1; @@ -171,22 +180,24 @@ chan_task_running(struct emu *emu, struct task *task) } static int -chan_task_switch(struct emu *emu, struct task *prev, struct task *next) +chan_body_switch(struct emu *emu, struct body *bprev, struct body *bnext) { struct nosv_thread *th = EXT(emu->thread, 'V'); struct chan *ch = th->m.ch; struct proc *proc = emu->proc; - if (!prev || !next) { - err("cannot switch to or from a NULL task"); + if (!bprev || !bnext) { + err("cannot switch to or from a NULL body"); return -1; } - if (prev == next) { - err("cannot switch to the same task"); + if (bprev == bnext) { + err("cannot switch to the same body"); return -1; } + struct task *next = body_get_task(bnext); + if (next->id == 0) { err("next task id cannot be 0"); return -1; @@ -197,11 +208,10 @@ chan_task_switch(struct emu *emu, struct task *prev, struct task *next) return -1; } - if (prev->thread != next->thread) { - err("cannot switch to a task of another thread"); + if (chan_set(&ch[CH_BODYID], value_int64(body_get_id(bnext))) != 0) { + err("chan_set taskid failed"); return -1; } - if (chan_set(&ch[CH_TASKID], value_int64(next->id)) != 0) { err("chan_set taskid failed"); return -1; @@ -235,12 +245,15 @@ update_task_state(struct emu *emu) uint32_t task_id = emu->ev->payload->u32[0]; + if (emu->ev->payload_size < 8) { + err("missing body id in payload"); + return -1; + } + struct nosv_thread *th = EXT(emu->thread, 'V'); struct nosv_proc *proc = EXT(emu->proc, 'V'); - struct task_info *info = &proc->task_info; struct task_stack *stack = &th->task_stack; - struct task *task = task_find(info->tasks, task_id); if (task == NULL) { @@ -248,19 +261,37 @@ update_task_state(struct emu *emu) return -1; } + uint32_t body_id = emu->ev->payload->u32[1]; + + if (task_is_parallel(task)) { + if (body_id == 0) { + err("the body_id must be > 0 for parallel task %u", + task_get_id(task)); + return -1; + } + } else { + if (body_id != 0) { + err("the body_id must be 0 for non-parallel task %u", + task_get_id(task)); + return -1; + } + /* We use body_id = 1 internally, as they cannot be zero. */ + body_id = 1; + } + int ret = 0; switch (emu->ev->v) { case 'x': - ret = task_execute(stack, task); + ret = task_execute(stack, task, body_id); break; case 'e': - ret = task_end(stack, task); + ret = task_end(stack, task, body_id); break; case 'p': - ret = task_pause(stack, task); + ret = task_pause(stack, task, body_id); break; case 'r': - ret = task_resume(stack, task); + ret = task_resume(stack, task, body_id); break; default: err("unexpected nOS-V task event"); @@ -297,22 +328,22 @@ expand_transition_value(struct emu *emu, int was_running, int runs_now, char *tr } static int -update_task_channels(struct emu *emu, char tr, struct task *prev, struct task *next) +update_task_channels(struct emu *emu, char tr, struct body *bprev, struct body *bnext) { int ret = 0; switch (tr) { case 'x': case 'r': - ret = chan_task_running(emu, next); + ret = chan_body_running(emu, bnext); break; case 'e': case 'p': - ret = chan_task_stopped(emu); + ret = chan_body_stopped(emu); break; /* Additional nested transitions */ case 'X': case 'E': - ret = chan_task_switch(emu, prev, next); + ret = chan_body_switch(emu, bprev, bnext); break; default: err("unexpected transition value %c", tr); @@ -328,7 +359,7 @@ update_task_channels(struct emu *emu, char tr, struct task *prev, struct task *n } static int -enforce_task_rules(struct emu *emu, char tr, struct task *next) +enforce_task_rules(struct emu *emu, char tr, struct body *next) { if (tr != 'x' && tr != 'X') return 0; @@ -336,8 +367,8 @@ enforce_task_rules(struct emu *emu, char tr, struct task *next) /* If a task has just entered the running state, it must show * the running task body subsystem */ - if (next->state != TASK_ST_RUNNING) { - err("task not in running state on begin"); + if (body_get_state(next) != BODY_ST_RUNNING) { + err("body not in running state on begin"); return -1; } @@ -384,7 +415,7 @@ update_task(struct emu *emu) struct nosv_thread *th = EXT(emu->thread, 'V'); struct task_stack *stack = &th->task_stack; - struct task *prev = task_get_running(stack); + struct body *prev = task_get_running(stack); /* Update the emulator state, but don't modify the channels */ if (update_task_state(emu) != 0) { @@ -392,7 +423,7 @@ update_task(struct emu *emu) return -1; } - struct task *next = task_get_running(stack); + struct body *next = task_get_running(stack); /* Update the subsystem channel */ if (update_task_ss_channel(emu, emu->ev->v) != 0) { @@ -423,9 +454,9 @@ update_task(struct emu *emu) } static int -create_task(struct emu *emu) +create_task(struct emu *emu, char value) { - if (emu->ev->payload_size != 8) { + if (emu->ev->payload_size < 8) { err("unexpected payload size"); return -1; } @@ -433,10 +464,20 @@ create_task(struct emu *emu) uint32_t task_id = emu->ev->payload->u32[0]; uint32_t type_id = emu->ev->payload->u32[1]; + int is_parallel = (value == 'C'); + + uint32_t flags; + + /* Parallel tasks cannot pause or resurrect */ + if (is_parallel) + flags = TASK_FLAG_PARALLEL; + else + flags = TASK_FLAG_RESURRECT | TASK_FLAG_PAUSE; + struct nosv_proc *proc = EXT(emu->proc, 'V'); struct task_info *info = &proc->task_info; - if (task_create(info, type_id, task_id) != 0) { + if (task_create(info, type_id, task_id, flags) != 0) { err("task_create failed"); return -1; } @@ -451,8 +492,9 @@ pre_task(struct emu *emu) { int ret = 0; switch (emu->ev->v) { + case 'C': case 'c': - ret = create_task(emu); + ret = create_task(emu, emu->ev->v); break; case 'x': case 'e': diff --git a/src/emu/nosv/nosv_priv.h b/src/emu/nosv/nosv_priv.h index cef68e7..01f523a 100644 --- a/src/emu/nosv/nosv_priv.h +++ b/src/emu/nosv/nosv_priv.h @@ -12,7 +12,8 @@ /* Private enums */ enum nosv_chan { - CH_TASKID = 0, + CH_BODYID = 0, + CH_TASKID, CH_TYPE, CH_APPID, CH_SUBSYSTEM, diff --git a/src/emu/nosv/setup.c b/src/emu/nosv/setup.c index fd4bfeb..36464da 100644 --- a/src/emu/nosv/setup.c +++ b/src/emu/nosv/setup.c @@ -32,10 +32,11 @@ enum { model_id = 'V' }; static struct ev_decl model_evlist[] = { { "VTc(u32 taskid, u32 typeid)", "creates task %{taskid} with type %{typeid}" }, - { "VTx(u32 taskid)", "executes the task %{taskid}" }, - { "VTe(u32 taskid)", "ends the task %{taskid}" }, - { "VTp(u32 taskid)", "pauses the task %{taskid}" }, - { "VTr(u32 taskid)", "resumes the task %{taskid}" }, + { "VTC(u32 taskid, u32 typeid)", "creates parallel task %{taskid} with type %{typeid}" }, + { "VTx(u32 taskid, u32 bodyid)", "executes the task %{taskid} with bodyid %{bodyid}" }, + { "VTe(u32 taskid, u32 bodyid)", "ends the task %{taskid} with bodyid %{bodyid}" }, + { "VTp(u32 taskid, u32 bodyid)", "pauses the task %{taskid} with bodyid %{bodyid}" }, + { "VTr(u32 taskid, u32 bodyid)", "resumes the task %{taskid} with bodyid %{bodyid}" }, { "VYc+(u32 typeid, str label)", "creates task type %{typeid} with label \"%{label}\"" }, @@ -72,7 +73,7 @@ static struct ev_decl model_evlist[] = { struct model_spec model_nosv = { .name = model_name, - .version = "1.1.0", + .version = "2.0.0", .evlist = model_evlist, .model = model_id, .create = model_nosv_create, @@ -85,6 +86,7 @@ struct model_spec model_nosv = { /* ----------------- channels ------------------ */ static const char *chan_name[CH_MAX] = { + [CH_BODYID] = "bodyid", [CH_TASKID] = "taskid", [CH_TYPE] = "task_type", [CH_APPID] = "appid", @@ -97,6 +99,7 @@ static const int chan_stack[CH_MAX] = { }; static const int chan_dup[CH_MAX] = { + [CH_BODYID] = 1, /* Switch to another task with body 1 */ [CH_APPID] = 1, [CH_TYPE] = 1, [CH_RANK] = 1, @@ -108,6 +111,7 @@ static const int chan_dup[CH_MAX] = { /* ----------------- pvt ------------------ */ static const int pvt_type[CH_MAX] = { + [CH_BODYID] = PRV_NOSV_BODYID, [CH_TASKID] = PRV_NOSV_TASKID, [CH_TYPE] = PRV_NOSV_TYPE, [CH_APPID] = PRV_NOSV_APPID, @@ -116,6 +120,7 @@ static const int pvt_type[CH_MAX] = { }; static const char *pcf_prefix[CH_MAX] = { + [CH_BODYID] = "nOS-V task body ID", [CH_TASKID] = "nOS-V task ID", [CH_TYPE] = "nOS-V task type", [CH_APPID] = "nOS-V task AppID", @@ -152,11 +157,12 @@ static const struct pcf_value_label *pcf_labels[CH_MAX] = { }; static const long prv_flags[CH_MAX] = { - [CH_TASKID] = PRV_SKIPDUP, - [CH_TYPE] = PRV_EMITDUP, /* Switch to task of same type */ - [CH_APPID] = PRV_EMITDUP, /* Switch to task of same appid */ - [CH_SUBSYSTEM] = PRV_SKIPDUP, - [CH_RANK] = PRV_EMITDUP, /* Switch to task of same rank */ + [CH_BODYID] = PRV_SKIPDUPNULL, /* Switch to different task, same bodyid */ + [CH_TASKID] = PRV_SKIPDUPNULL, /* Switch to another body of the same task */ + [CH_TYPE] = PRV_SKIPDUPNULL, /* Switch to task of same type */ + [CH_APPID] = PRV_SKIPDUPNULL, /* Switch to task of same appid */ + [CH_SUBSYSTEM] = PRV_SKIPDUPNULL, + [CH_RANK] = PRV_SKIPDUPNULL, /* Switch to task of same rank */ }; static const struct model_pvt_spec pvt_spec = { @@ -169,6 +175,7 @@ static const struct model_pvt_spec pvt_spec = { /* ----------------- tracking ------------------ */ static const int th_track[CH_MAX] = { + [CH_BODYID] = TRACK_TH_RUN, [CH_TASKID] = TRACK_TH_RUN, [CH_TYPE] = TRACK_TH_RUN, [CH_APPID] = TRACK_TH_RUN, @@ -177,6 +184,7 @@ static const int th_track[CH_MAX] = { }; static const int cpu_track[CH_MAX] = { + [CH_BODYID] = TRACK_TH_RUN, [CH_TASKID] = TRACK_TH_RUN, [CH_TYPE] = TRACK_TH_RUN, [CH_APPID] = TRACK_TH_RUN, @@ -256,12 +264,6 @@ model_nosv_create(struct emu *emu) return -1; } - /* Init task stack thread pointer */ - for (struct thread *t = sys->threads; t; t = t->gnext) { - struct nosv_thread *th = EXT(t, model_id); - th->task_stack.thread = t; - } - for (struct proc *p = sys->procs; p; p = p->gnext) { if (init_proc(p) != 0) { err("init_proc failed"); diff --git a/test/emu/nosv/CMakeLists.txt b/test/emu/nosv/CMakeLists.txt index 9e11a54..ee32e30 100644 --- a/test/emu/nosv/CMakeLists.txt +++ b/test/emu/nosv/CMakeLists.txt @@ -5,7 +5,7 @@ test_emu(attach.c) test_emu(attach-old.c) test_emu(nested-tasks.c) test_emu(nested-tasks-bad.c SHOULD_FAIL - REGEX "cannot execute task 1: state is not created") + REGEX "body_execute: body 1 state must be Created but is Running") test_emu(task-types.c MP) test_emu(pause.c MP) #test_emu(mp-rank.c MP)