6#include <sys/kassert.h>
7#include <sys/kconfig.h>
13#include <machine/amd64.h>
14#include <machine/amd64op.h>
15#include <machine/pmap.h>
16#include <machine/lapic.h>
17#include <machine/mp.h>
18#include <machine/trap.h>
25#define MP_WAITTIME 250000000ULL
62 kprintf(
"Starting processor %d\n", procNo);
68 kprintf(
"CR3: %016llx RSP: %016llx\n", args[0], args[1]);
80 kprintf(
"Processor %d did not respond in %d ms\n",
144 cpuid(0, 0, 0, 0, 0);
148 for (c = 0; c <=
lastCPU; c++) {
160 __sync_add_and_fetch(&frame->
count, 1);
173 memset((
void *)&frame, 0,
sizeof(frame));
181 cpuid(0, 0, 0, 0, 0);
197 cpuid(0, 0, 0, 0, 0);
218 for (i = 0; i < 32; i++) {
224 kprintf(
"Average CrossCall Latency: %llu ns\n",
225 (stopTS - startTS) / 32ULL);
#define CPUSTATE_NOT_PRESENT
int(* CrossCallCB)(void *)
static INLINE void cpuid(uint32_t info, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
int kprintf(const char *fmt,...)
#define REGISTER_DBGCMD(_NAME, _DESC, _FUNC)
void PAlloc_Release(void *pg)
void * PAlloc_AllocPage()
UnixEpochNS KTime_GetEpochNS()
int LAPIC_Broadcast(int vector)
void LAPIC_StartAP(uint8_t apicid, uint32_t addr)
static volatile int lastCPU
static int MPPing(void *arg)
static volatile bool booted
static volatile CPUState cpus[MAX_CPUS]
volatile int status[MAX_CPUS]
static void Debug_CPU(int argc, const char *argv[])
volatile int done[MAX_CPUS]
const char * CPUStateToString[]
void MP_SetState(int state)
static void Debug_CPUS(int argc, const char *argv[])
static int MPBootAP(int procNo)
static void Debug_CrossCall(int argc, const char *argv[])
int MP_CrossCall(CrossCallCB cb, void *arg)
void * memset(void *dst, int c, size_t len)
void * memcpy(void *dst, const void *src, size_t len)