20#define INIT_CORE_MAGIC 0x00EEDDAB
21#define INIT_CORE_ENTRYPOINT 0x8000
40 core_data[
id].canary = (
id + 0x56) ^ 0x595e9fbd94fda766;
76cpuTrampolinePhase2(
uint64_t core_id);
80cpuTrampolinePhase2(
uint64_t core_id) {
102 __asm__
volatile(
"hlt");
109 __asm__
volatile(
"cpuid"
110 :
"=a"(eax),
"=b"(ebx),
"=c"(ecx),
"=d"(edx)
112 return (ebx >> 24) & 0xFF;
116 __asm__
volatile(
"mfence" :::
"memory");
127 __asm__
volatile(
"pause");
135 __asm__
volatile(
"pause");
143 __asm__
volatile(
"pause");
151 __asm__
volatile(
"pause");
158 icr |= (0b101ULL << 8);
161 LOG_DEBUG(
"APIC",
"ICR INIT assert = 0x%x", icr);
168 icr |= (0b110ULL << 8);
171 LOG_DEBUG(
"APIC",
"ICR SIPI #1 = 0x%x", icr);
178 icr |= (0b110ULL << 8);
181 LOG_DEBUG(
"APIC",
"ICR SIPI #2 = 0x%x", icr);
189 LOG_INFO(
"CORE",
"preparing to send IPI");
199 entrypoint_addr, aligned_size, 0x3);
201 memcopy((
void*)entrypoint_addr,
205 volatile uint64_t* trampoline_data =
213 LOG_DEBUG(
"CORE",
"terdeteksi %d core", jum_core);
214 for (
uint8_t i = 0; i < jum_core; i++) {
219 auto cpu_id = core_info->apicid;
236 per_core_data_vaddr, per_core_data_paddr, 1,
243 (
volatile uint64_t*)per_core_data_vaddr;
244 core_handshake[0] = (
uint64_t)cpuTrampolinePhase2;
245 core_handshake[1] = stack_top;
246 core_handshake[2] = 0;
249 trampoline_data[3] = (
uint64_t)per_core_data_vaddr;
251 LOG_DEBUG(
"CORE",
"kirim sipi ke CPU Core %d", cpu_id);
255 while (__atomic_load_n(&core_handshake[2], __ATOMIC_SEQ_CST) ==
struct cpu_core * vxGetCpuInfo(uint8_t apicid)
uint8_t vxGetNumberOfCores()
uint8_t x2_apic_supported
void apic_write(uint32_t reg, uint32_t value)
uint32_t apic_read(uint32_t reg)
uint8_t vxGetActiveCoreCount()
uintptr_t __stack_chk_guard
char _binary_hal_cpu_core_ap_bin_start[]
void vxInitializeAPICTimer()
#define INIT_CORE_ENTRYPOINT
char __cpu_trampoline_end[]
each_core_data * get_current_core_data(void)
char _binary_hal_cpu_core_ap_bin_end[]
void initGdt(init_context_t *_)
void initTimer(init_context_t *_)
uint8_t ap_stack_top[VOXIA_MAX_CORE][65536]
each_core_data core_data[VOXIA_MAX_CORE]
static uint32_t get_bsp_apic_id(void)
char __cpu_trampoline_start[]
void initSIMD(init_context_t *_)
static void sipi_sequential(uint32_t apic_id, uint64_t entrypoint_addr)
static volatile uint8_t active_core_count
each_core_data * vxGetCoreDataByCoreID(uint8_t core_id)
void update_core_gs(uint8_t id)
boolean_t multicore_start
void vxHPETSleep(uint64_t ns)
uint8_t get_current_core_cpuid()
void irq_setup(uint16_t core)
void serial2_printf(const char *fmt,...)
uintptr_t msrReadGSBase()
void vxWRSR(uint32_t msr, uint64_t value)
void msrSetGSBase(uint64_t base)
void msrSetKernelGSBase(uint64_t base)
void paging_reload(page_t p)
page_t paging_get_highest_page_map(void)
void vxMultipleMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t size, uint64_t flags)
void * phys_base_alloc(uint64_t block)
scheduler_core_t * vxGetSchedulerCore(uint16_t core)
void vxStartScheduler(void)
#define LOG_INFO(mod, fmt,...)
#define LOG_DEBUG(mod, fmt,...)
void memcopy(void *dest, void *src, size_t size)
void setup_timer_interrupt()
uintptr_t vma_lookup_free_vaddr(struct virtual_memory_page *page, mem_vma_region region, size_t size)
void vma_register(struct virtual_memory_page *page, uintptr_t phys_address, uintptr_t virt_addr, size_t size)
struct virtual_memory_page * get_kernel_vmm_page()