static void query_harts(const char* config_string) { for (int core = 0, hart; ; core++) { for (hart = 0; ; hart++) { char buf[32]; snprintf(buf, sizeof buf, "core{%d{%d{ipi", core, hart); query_result res = query_config_string(config_string, buf); if (!res.start) break; hls_t* hls = hls_init(num_harts); hls->ipi = (void*)(uintptr_t)get_uint(res); snprintf(buf, sizeof buf, "core{%d{%d{timecmp", core, hart); res = query_config_string(config_string, buf); assert(res.start); hls->timecmp = (void*)(uintptr_t)get_uint(res); num_harts++; } if (!hart) break; } assert(num_harts); assert(num_harts <= MAX_HARTS); }
void machine_init(uint32_t hart_id) { hls_init(hart_id); mstatus_init(); fp_init(); if (hart_id == 0) init_first_hart(); else init_other_hart(); }
static void query_harts(const char* config_string) { for (int core = 0, hart; ; core++) { for (hart = 0; ; hart++) { char buf[32]; snprintf(buf, sizeof buf, "core{%d{%d{addr", core, hart); query_result res = query_config_string(config_string, buf); if (!res.start) break; csr_t* base = (csr_t*)get_uint(res); uintptr_t hart_id = base[CSR_MHARTID]; hls_init(hart_id, base); num_harts++; assert(hart_id == num_harts-1); } if (!hart) break; } assert(num_harts); assert(num_harts <= MAX_HARTS); }