3 #include "per_cpu_data.h"
9 void init(bool is_boot_cpu = false);
10 static void early_init();
12 static Per_cpu<Cpu> cpus;
13 static Cpu *boot_cpu() { return _boot_cpu; }
15 Cpu(Cpu_number cpu) { set_id(cpu); }
18 static Cpu *_boot_cpu;
20 static unsigned long _ns_per_cycle;
31 Default_attribs = Kp //Ks | Kp,
34 //------------------------------------------------------------------------------
35 IMPLEMENTATION [ppc32]:
38 #include "boot_info.h"
43 DEFINE_PER_CPU Per_cpu<Cpu> Cpu::cpus(Per_cpu_data::Cpu_num);
45 unsigned long Cpu::_ns_per_cycle;
47 PUBLIC static inline unsigned Cpu::phys_bits() { return 32; }
51 Cpu::init(bool is_boot_cpu)
59 _phys_id = Cpu_phys_id(0); //Proc::cpu_id();
60 _ns_per_cycle = 1000000000 / Boot_info::get_time_base();
61 printf("Timebase: %lu\n", Boot_info::get_time_base());
73 asm volatile( "mtmsr %[msr] \n" //set kernel msr (disables paging)
74 "mtdbatu 0, %[zero] \n" //clear bat registers (good bye OF)
75 "mtdbatu 1, %[zero] \n"
76 "mtdbatu 2, %[zero] \n"
77 "mtdbatu 3, %[zero] \n"
78 "mtibatu 0, %[zero] \n"
79 "mtibatu 1, %[zero] \n"
80 "mtibatu 2, %[zero] \n"
81 "mtibatu 3, %[zero] \n"
82 : : [msr]"r" (Msr::Msr_kernel), [zero]"r" (0)
88 Cpu::read_vsid(unsigned sr = 0)
91 asm volatile ("mfsrin %[vsid], %[sr] \n"
96 return (vsid & 0xffffff);
99 /* set segment register 0-15 */
100 PUBLIC static inline //NEEDS["paging.h"]
102 Cpu::set_vsid(Mword vsid)
104 vsid |= Segment::Default_attribs;
107 asm volatile ( " isync \n"
114 " mtsrin %[vsid], %%r5 \n" //set srX
115 " addi %[vsid], %[vsid], 1 \n" //inc vsid
116 " addi %%r6, %%r6, 1 \n"
117 " rlwinm %%r5, %%r6, 28, 0, 3 \n" //extract sr index
119 // " isync \n" //rfi should be
123 : "r5", "r6", "memory"
130 Cpu::stack_align(Mword stack)
131 { return stack & ~0xf; }
135 Cpu::have_superpages()
138 //------------------------------------------------------------------------------
142 * Read time base registers
148 Unsigned32 tb_upper, tb_lower;
150 asm volatile ( "1: \n"
154 " cmpw %[upper], %%r12 \n"
156 : [upper]"=r" (tb_upper),
157 [lower]"=r" (tb_lower)
162 return (tb << 32) | tb_lower;
167 Cpu::busy_wait_ns(Unsigned64 ns)
169 Unsigned64 stop = rdtsc() + ns_to_tsc(ns);
171 while(rdtsc() < stop)
177 Cpu::ns_to_tsc(Unsigned64 ns)
179 return ns / _ns_per_cycle;
184 Cpu::tsc_to_ns(Unsigned64 tsc)
186 return tsc * _ns_per_cycle;
191 Cpu::get_scaler_tsc_to_ns()
196 Cpu::get_scaler_tsc_to_us()
201 Cpu::get_scaler_ns_to_tsc()
209 //------------------------------------------------------------------------------
214 Cpu::debugctl_enable()
219 Cpu::debugctl_disable()