3 * Architecture specific cpu init code
13 static Mword kern_ds() { return _kern_ds; }
14 static Mword kern_es() { return _kern_es; }
16 static Tss *tss asm ("CPU_TSS");
18 static unsigned long _gs asm ("CPU_GS");
19 static unsigned long _fs asm ("CPU_FS");
20 static Mword _kern_ds asm ("KERN_DS");
21 static Mword _kern_es asm ("KERN_ES");
26 // -----------------------------------------------------------------------
35 #include "emulation.h"
37 #include "initcalls.h"
38 #include "processor.h"
42 Proc::Status volatile Proc::virtual_processor_state = 0;
44 int Cpu::msr_dev = -1;
45 unsigned long Cpu::_gs; // for mp: percpu
46 unsigned long Cpu::_fs; // for mp: percpu
47 unsigned long Cpu::_kern_ds;
48 unsigned long Cpu::_kern_es;
50 IMPLEMENT FIASCO_INIT_CPU
56 // Get original es and ds to be used for RESET_KERNEL_SEGMENTS_FORCE_DS_ES
60 // No Sysenter Support for Fiasco-UX
61 _features &= ~FEAT_SEP;
63 // Determine CPU frequency
65 if ((fp = fopen ("/proc/cpuinfo", "r")) != NULL)
70 while (fgets (buffer, sizeof (buffer), fp))
71 if (sscanf (buffer, "cpu MHz%*[^:]: %f", &val) == 1)
73 _frequency = (Unsigned64)(val * 1000) * 1000;
74 scaler_tsc_to_ns = muldiv (1 << 27, 1000000000, _frequency);
75 scaler_tsc_to_us = muldiv (1 << 27, 32 * 1000000, _frequency);
76 scaler_ns_to_tsc = muldiv (1 << 27, _frequency, 1000000000);
83 if (this == _boot_cpu)
86 msr_dev = open("/dev/msr", O_RDWR);
88 msr_dev = open("/dev/cpu/0/msr", O_RDWR);
91 _tid = phys_id_direct();
98 printf ("CPU[%u:%u]: %s (%X:%X:%X:%X) Model: %s at %llu MHz\n\n",
99 cxx::int_value<Cpu_number>(id()),
100 cxx::int_value<Cpu_phys_id>(phys_id()),
101 vendor_str(), family(), model(), stepping(), brand(), model_str(),
102 div32(frequency(), 1000000));
112 Cpu::set_fast_entry (void (*)(void))
115 PUBLIC static FIASCO_INIT
117 Cpu::init_tss (Address tss_mem)
119 tss = reinterpret_cast<Tss*>(tss_mem);
120 tss->_ss0 = Gdt::gdt_data_kernel;
136 Cpu::can_wrmsr() const
138 return msr_dev != -1;
143 Cpu::rdmsr (Unsigned32 reg)
147 if (lseek(msr_dev, reg, SEEK_SET) >= 0)
148 read(msr_dev, &msr, sizeof(msr));
155 Cpu::rdpmc (Unsigned32, Unsigned32 reg)
162 Cpu::wrmsr (Unsigned64 msr, Unsigned32 reg)
164 if (lseek(msr_dev, reg, SEEK_SET) >= 0)
165 write(msr_dev, &msr, sizeof(msr));
170 Cpu::wrmsr (Unsigned32 low, Unsigned32 high, Unsigned32 reg)
172 Unsigned64 msr = ((Unsigned64)high << 32) | low;
178 Cpu::debugctl_enable()
183 Cpu::debugctl_disable()
188 Cpu::set_fs(Unsigned32 val)
193 Cpu::set_gs(Unsigned32 val)
206 // ------------------------------------------------------------------------
207 IMPLEMENTATION[ux && !mp]:
211 Cpu::phys_id_direct()
212 { return Cpu_phys_id(0); }
214 // ------------------------------------------------------------------------
215 IMPLEMENTATION[ux && mp]:
217 PUBLIC static inline NEEDS["emulation.h"]
219 Cpu::phys_id_direct()
220 { return Cpu_phys_id(Emulation::gettid()); }