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(Cpu_number 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(Cpu_number, void *)
92 Jdb_kern_info_bench::do_ipi_bench(Cpu_number my_cpu, void *_partner)
95 Cpu_number partner = Cpu_number((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", cxx::int_value<Cpu_number>(partner),
114 (get_time_now() - time) >> Runs2);
116 if (ipi_cnt != Rounds)
117 printf("\nCounter mismatch: cnt=%d v %d\n", ipi_cnt, Rounds);
119 ipi_bench_spin_done = 1;
125 Jdb_kern_info_bench::do_mp_benchmark()
128 printf("IPI round-trips:\n");
129 for (Cpu_number u = Cpu_number::first(); u < Config::max_num_cpus(); ++u)
132 printf("l%2u: ", cxx::int_value<Cpu_number>(u));
134 for (Cpu_number v = Cpu_number::first(); v < Config::max_num_cpus(); ++v)
138 printf(" %2u:%8s", cxx::int_value<Cpu_number>(u), "X");
141 ipi_bench_spin_done = 0;
143 // v is waiting for IPIs
144 if (v != Cpu_number::boot_cpu())
145 Jdb::remote_work(v, wait_for_ipi, 0, false);
147 // u is doing benchmark
148 if (u == Cpu_number::boot_cpu())
149 do_ipi_bench(Cpu_number::boot_cpu(),
150 (void *)(long)cxx::int_value<Cpu_number>(v));
152 Jdb::remote_work(u, do_ipi_bench,
153 (void *)(long)cxx::int_value<Cpu_number>(v), false);
155 // v is waiting for IPIs
156 if (v == Cpu_number::boot_cpu())
157 wait_for_ipi(Cpu_number::boot_cpu(), 0);
161 while (!ipi_bench_spin_done)