Rodrigo Arias
354f2f50eb
Until now, emulation models were always being registered via probe(), which causes the emulator to initialize all the channels. To reduce the overhead, the channels were not connected or registered in the bay until the first event of that model was received. This delayed connect was causing issues in muxes where the newly connected model required refreshing the touched channels. Which in turn was causing unexpected PRV events. By determining which models we need to enable, we can remove the delayed connect mechanism and just enable those models at initialization time, and connect the channels.
54 lines
1.4 KiB
C
54 lines
1.4 KiB
C
/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
|
|
* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include "common.h"
|
|
#include "emu_prv.h"
|
|
#include "instr.h"
|
|
#include "instr_nanos6.h"
|
|
#include "nanos6/nanos6_priv.h"
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
instr_start(0, 1);
|
|
instr_nanos6_init();
|
|
|
|
/* Until here, the nanos6 model has not been connected to the
|
|
* patchbay yet. The next event will cause the subsystem mux to
|
|
* be connected to the patchbay. We need to ensure that at that
|
|
* moment the select channel is evaluated, otherwise the mux
|
|
* will remain selecting a null input until the thread state
|
|
* changes. */
|
|
|
|
instr_nanos6_worker_loop_enter();
|
|
|
|
/* Match the PRV line in the trace */
|
|
FILE *f = fopen("match.sh", "w");
|
|
if (f == NULL)
|
|
die("fopen failed:");
|
|
|
|
/* Ensure that after the Nanos6 connect phase, the CPU subsystem mux has
|
|
* selected the correct input, based on the running thread */
|
|
int type = PRV_NANOS6_SUBSYSTEM;
|
|
int64_t t = get_delta();
|
|
int value = ST_WORKER_LOOP;
|
|
fprintf(f, "grep ':%ld:%d:%d$' ovni/thread.prv\n", t, type, value);
|
|
fprintf(f, "grep ':%ld:%d:%d$' ovni/cpu.prv\n", t, type, value);
|
|
|
|
instr_nanos6_worker_loop_exit();
|
|
|
|
/* Also test when exitting the stacked subsystem */
|
|
t = get_delta();
|
|
value = 0;
|
|
fprintf(f, "grep ':%ld:%d:%d$' ovni/thread.prv\n", t, type, value);
|
|
fprintf(f, "grep ':%ld:%d:%d$' ovni/cpu.prv\n", t, type, value);
|
|
|
|
fclose(f);
|
|
|
|
instr_end();
|
|
|
|
return 0;
|
|
}
|