5 class Jdb_kern_info_bench : public Jdb_kern_info_module
8 static Unsigned64 get_time_now();
9 static void show_arch();
12 //---------------------------------------------------------------------------
15 static Jdb_kern_info_bench k_a INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
18 Jdb_kern_info_bench::Jdb_kern_info_bench()
19 : Jdb_kern_info_module('b', "Benchmark privileged instructions")
21 Jdb_kern_info::register_subcmd(this);
26 Jdb_kern_info_bench::show()
32 //---------------------------------------------------------------------------
37 Jdb_kern_info_bench::do_mp_benchmark()
40 //---------------------------------------------------------------------------
41 IMPLEMENTATION [mp && (ia32 || amd64)]:
47 Jdb_kern_info_bench::stop_timer()
49 Timer_tick::set_vectors_stop();
52 //---------------------------------------------------------------------------
53 IMPLEMENTATION [mp && !(ia32 || amd64)]:
57 Jdb_kern_info_bench::stop_timer()
60 //---------------------------------------------------------------------------
65 static int volatile ipi_bench_spin_done;
70 Jdb_kern_info_bench::wait_for_ipi(unsigned cpu, void *)
72 Jdb::restore_irqs(cpu);
76 while (!ipi_bench_spin_done)
80 Jdb::save_disable_irqs(cpu);
85 Jdb_kern_info_bench::empty_func(unsigned, void *)
92 Jdb_kern_info_bench::do_ipi_bench(unsigned my_cpu, void *_partner)
95 unsigned partner = (unsigned long)_partner;
99 Rounds = (1 << Runs2) + Warmup,
106 for (i = 0; i < Warmup; ++i)
107 Jdb::remote_work_ipi(my_cpu, partner, empty_func, 0, true);
109 time = get_time_now();
110 for (i = 0; i < (1 << Runs2); i++)
111 Jdb::remote_work_ipi(my_cpu, partner, empty_func, 0, true);
113 printf(" %2u:%8lld", partner, (get_time_now() - time) >> Runs2);
115 if (ipi_cnt != Rounds)
116 printf("\nCounter mismatch: cnt=%d v %d\n", ipi_cnt, Rounds);
118 ipi_bench_spin_done = 1;
124 Jdb_kern_info_bench::do_mp_benchmark()
127 printf("IPI round-trips:\n");
128 for (unsigned u = 0; u < Config::Max_num_cpus; ++u)
133 for (unsigned v = 0; v < Config::Max_num_cpus; ++v)
137 printf(" %2u:%8s", u, "X");
140 ipi_bench_spin_done = 0;
142 // v is waiting for IPIs
144 Jdb::remote_work(v, wait_for_ipi, 0, false);
146 // u is doing benchmark
148 do_ipi_bench(0, (void *)v);
150 Jdb::remote_work(u, do_ipi_bench, (void *)v, false);
152 // v is waiting for IPIs
158 while (!ipi_bench_spin_done)