25
26 /* Main procedures for sparc FPU simulator. */
27
28 #include <sys/fpu/fpu_simulator.h>
29 #include <sys/fpu/globals.h>
30 #include <sys/fpu/fpusystm.h>
31 #include <sys/proc.h>
32 #include <sys/signal.h>
33 #include <sys/siginfo.h>
34 #include <sys/thread.h>
35 #include <sys/cpuvar.h>
36 #include <sys/cmn_err.h>
37 #include <sys/atomic.h>
38 #include <sys/privregs.h>
39 #include <sys/vis_simulator.h>
40
41 #define FPUINFO_KSTAT(opcode) { \
42 extern void __dtrace_probe___fpuinfo_##opcode(uint64_t *); \
43 uint64_t *stataddr = &fpuinfo.opcode.value.ui64; \
44 __dtrace_probe___fpuinfo_##opcode(stataddr); \
45 atomic_add_64(&fpuinfo.opcode.value.ui64, 1); \
46 }
47
48 #define FPUINFO_KSTAT_PREC(prec, kstat_s, kstat_d, kstat_q) \
49 if (prec < 2) { \
50 FPUINFO_KSTAT(kstat_s); \
51 } else if (prec == 2) { \
52 FPUINFO_KSTAT(kstat_d); \
53 } else { \
54 FPUINFO_KSTAT(kstat_q); \
55 }
56
57 /*
58 * FPU simulator global kstat data
59 */
60 struct fpuinfo_kstat fpuinfo = {
61 { "fpu_sim_fmovs", KSTAT_DATA_UINT64},
62 { "fpu_sim_fmovd", KSTAT_DATA_UINT64},
63 { "fpu_sim_fmovq", KSTAT_DATA_UINT64},
64 { "fpu_sim_fnegs", KSTAT_DATA_UINT64},
65 { "fpu_sim_fnegd", KSTAT_DATA_UINT64},
774 fpuinfo_kstat->ks_data = (void *)&fpuinfo;
775 kstat_install(fpuinfo_kstat);
776 }
777 ASSERT(visinfo_kstat == NULL);
778 if ((visinfo_kstat = kstat_create("unix", 0, "vis_info", "misc",
779 KSTAT_TYPE_NAMED, visinfo_ndata, KSTAT_FLAG_VIRTUAL)) == NULL) {
780 cmn_err(CE_WARN, "CPU%d: kstat_create for vis_info failed",
781 CPU->cpu_id);
782 } else {
783 visinfo_kstat->ks_data = (void *)&visinfo;
784 kstat_install(visinfo_kstat);
785 }
786 }
787
788 void
789 fp_kstat_update(enum ftt_type ftt)
790 {
791 ASSERT((ftt == ftt_ieee) || (ftt == ftt_unfinished) ||
792 (ftt == ftt_unimplemented));
793 if (ftt == ftt_ieee)
794 atomic_add_64(&fpustat.fpu_ieee_traps.value.ui64, 1);
795 else if (ftt == ftt_unfinished)
796 atomic_add_64(&fpustat.fpu_unfinished_traps.value.ui64, 1);
797 else if (ftt == ftt_unimplemented)
798 atomic_add_64(&fpustat.fpu_unimplemented_traps.value.ui64, 1);
799 }
|
25
26 /* Main procedures for sparc FPU simulator. */
27
28 #include <sys/fpu/fpu_simulator.h>
29 #include <sys/fpu/globals.h>
30 #include <sys/fpu/fpusystm.h>
31 #include <sys/proc.h>
32 #include <sys/signal.h>
33 #include <sys/siginfo.h>
34 #include <sys/thread.h>
35 #include <sys/cpuvar.h>
36 #include <sys/cmn_err.h>
37 #include <sys/atomic.h>
38 #include <sys/privregs.h>
39 #include <sys/vis_simulator.h>
40
41 #define FPUINFO_KSTAT(opcode) { \
42 extern void __dtrace_probe___fpuinfo_##opcode(uint64_t *); \
43 uint64_t *stataddr = &fpuinfo.opcode.value.ui64; \
44 __dtrace_probe___fpuinfo_##opcode(stataddr); \
45 atomic_inc_64(&fpuinfo.opcode.value.ui64); \
46 }
47
48 #define FPUINFO_KSTAT_PREC(prec, kstat_s, kstat_d, kstat_q) \
49 if (prec < 2) { \
50 FPUINFO_KSTAT(kstat_s); \
51 } else if (prec == 2) { \
52 FPUINFO_KSTAT(kstat_d); \
53 } else { \
54 FPUINFO_KSTAT(kstat_q); \
55 }
56
57 /*
58 * FPU simulator global kstat data
59 */
60 struct fpuinfo_kstat fpuinfo = {
61 { "fpu_sim_fmovs", KSTAT_DATA_UINT64},
62 { "fpu_sim_fmovd", KSTAT_DATA_UINT64},
63 { "fpu_sim_fmovq", KSTAT_DATA_UINT64},
64 { "fpu_sim_fnegs", KSTAT_DATA_UINT64},
65 { "fpu_sim_fnegd", KSTAT_DATA_UINT64},
774 fpuinfo_kstat->ks_data = (void *)&fpuinfo;
775 kstat_install(fpuinfo_kstat);
776 }
777 ASSERT(visinfo_kstat == NULL);
778 if ((visinfo_kstat = kstat_create("unix", 0, "vis_info", "misc",
779 KSTAT_TYPE_NAMED, visinfo_ndata, KSTAT_FLAG_VIRTUAL)) == NULL) {
780 cmn_err(CE_WARN, "CPU%d: kstat_create for vis_info failed",
781 CPU->cpu_id);
782 } else {
783 visinfo_kstat->ks_data = (void *)&visinfo;
784 kstat_install(visinfo_kstat);
785 }
786 }
787
788 void
789 fp_kstat_update(enum ftt_type ftt)
790 {
791 ASSERT((ftt == ftt_ieee) || (ftt == ftt_unfinished) ||
792 (ftt == ftt_unimplemented));
793 if (ftt == ftt_ieee)
794 atomic_inc_64(&fpustat.fpu_ieee_traps.value.ui64);
795 else if (ftt == ftt_unfinished)
796 atomic_inc_64(&fpustat.fpu_unfinished_traps.value.ui64);
797 else if (ftt == ftt_unimplemented)
798 atomic_inc_64(&fpustat.fpu_unimplemented_traps.value.ui64);
799 }
|