Go to the source code of this file.
◆ CPUSTATE_BOOTED
#define CPUSTATE_BOOTED 1 |
Definition at line 6 of file mp.h.
◆ CPUSTATE_HALTED
#define CPUSTATE_HALTED 2 |
Definition at line 7 of file mp.h.
◆ CPUSTATE_MAX
Definition at line 8 of file mp.h.
◆ CPUSTATE_NOT_PRESENT
#define CPUSTATE_NOT_PRESENT 0 |
Definition at line 5 of file mp.h.
◆ THISCPU
Definition at line 21 of file mp.h.
◆ CrossCallCB
typedef int(* CrossCallCB) (void *) |
Definition at line 16 of file mp.h.
◆ LAPIC_CPU()
Definition at line 93 of file lapic.c.
94{
97 else
98 return 0;
99}
uint32_t LAPIC_Read(uint16_t reg)
◆ MP_CrossCall()
Definition at line 168 of file mp.c.
169{
171
172
173 memset((
void *)&frame, 0,
sizeof(frame));
174 frame.cb = cb;
175 frame.arg = arg;
176 frame.count = 1;
177
179
181 cpuid(0, 0, 0, 0, 0);
182
184 return -1;
185
186
187 frame.status[
CPU()] = cb(arg);
188 frame.done[
CPU()] = 1;
189
190
191 while (frame.count <
lastCPU) {
192
193
194
195 }
197 cpuid(0, 0, 0, 0, 0);
198
200
201 return 0;
202}
static INLINE void cpuid(uint32_t info, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
int LAPIC_Broadcast(int vector)
static volatile int lastCPU
static volatile CPUState cpus[MAX_CPUS]
void * memset(void *dst, int c, size_t len)
◆ MP_CrossCallTrap()
void MP_CrossCallTrap |
( |
| ) |
|
Definition at line 140 of file mp.c.
141{
142 int c;
143
144 cpuid(0, 0, 0, 0, 0);
145
147
148 for (c = 0; c <=
lastCPU; c++) {
151 continue;
152
154 continue;
155
158
159
160 __sync_add_and_fetch(&frame->
count, 1);
161 }
162
164}
volatile int status[MAX_CPUS]
volatile int done[MAX_CPUS]
◆ MP_GetCPUs()
Definition at line 134 of file mp.c.
◆ MP_Init()
Definition at line 91 of file mp.c.
92{
93 int i;
95
98
102 }
103
104
105
106
107
111 break;
112
114 }
116}
#define CPUSTATE_NOT_PRESENT
int kprintf(const char *fmt,...)
static int MPBootAP(int procNo)
◆ MP_InitAP()
Definition at line 119 of file mp.c.
120{
124}
static volatile bool booted
◆ MP_SetState()
void MP_SetState |
( |
int |
state | ) |
|
Definition at line 127 of file mp.c.