diff --git a/src/arm/midr.c b/src/arm/midr.c index 1c84895..805ec47 100644 --- a/src/arm/midr.c +++ b/src/arm/midr.c @@ -237,7 +237,7 @@ struct cpuInfo* get_cpu_info_linux(struct cpuInfo* cpu) { cpu->num_cpus = sockets; cpu->hv = emalloc(sizeof(struct hypervisor)); cpu->hv->present = false; - cpu->soc = get_soc(); + cpu->soc = get_soc(cpu); cpu->peak_performance = get_peak_performance(cpu); return cpu; @@ -374,19 +374,19 @@ struct cpuInfo* get_cpu_info_mach(struct cpuInfo* cpu) { // the CPU is an Apple SoC if(cpu_family == CPUFAMILY_ARM_FIRESTORM_ICESTORM) { fill_cpu_info_firestorm_icestorm(cpu, pcores, ecores); - cpu->soc = get_soc(); + cpu->soc = get_soc(cpu); cpu->peak_performance = get_peak_performance(cpu); } else if(cpu_family == CPUFAMILY_ARM_AVALANCHE_BLIZZARD) { fill_cpu_info_avalanche_blizzard(cpu, pcores, ecores); - cpu->soc = get_soc(); + cpu->soc = get_soc(cpu); cpu->peak_performance = get_peak_performance(cpu); } else if(cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH || cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH_PRO || cpu_family == CPUFAMILY_ARM_EVEREST_SAWTOOTH_MAX) { fill_cpu_info_everest_sawtooth(cpu, pcores, ecores); - cpu->soc = get_soc(); + cpu->soc = get_soc(cpu); cpu->peak_performance = get_peak_performance(cpu); } else { diff --git a/src/arm/soc.c b/src/arm/soc.c index d62fa30..0399daf 100644 --- a/src/arm/soc.c +++ b/src/arm/soc.c @@ -6,6 +6,7 @@ #include "soc.h" #include "socs.h" #include "udev.h" +#include "uarch.h" #include "../common/global.h" #if defined(__APPLE__) || defined(__MACH__) @@ -801,6 +802,38 @@ struct system_on_chip* guess_soc_from_nvmem(struct system_on_chip* soc) { return soc; } +struct system_on_chip* guess_soc_from_uarch(struct system_on_chip* soc, struct cpuInfo* cpu) { + // Currently we only support CPUs with only one uarch (in other words, one socket) + struct uarch* arch = cpu->arch; + if (arch == NULL) { + printWarn("guess_soc_from_uarch: uarch is NULL"); + return soc; + } + + typedef struct { + MICROARCH u; + struct system_on_chip soc; + } uarchToSoC; + + uarchToSoC socFromUarch[] = { + {UARCH_TAISHAN_V110, {SOC_KUNPENG_920, SOC_VENDOR_KUNPENG, 7, "920", NULL} }, + {UARCH_TAISHAN_V200, {SOC_KUNPENG_930, SOC_VENDOR_KUNPENG, 7, "930", NULL} }, // manufacturing process is not well-known + {UARCH_UNKNOWN, {UNKNOWN, SOC_VENDOR_UNKNOWN, -1, "", NULL} } + }; + + int index = 0; + while(socFromUarch[index].u != UARCH_UNKNOWN) { + if(socFromUarch[index].u == get_uarch(arch)) { + fill_soc(soc, socFromUarch[index].soc.soc_name, socFromUarch[index].soc.soc_model, socFromUarch[index].soc.process); + return soc; + } + index++; + } + + printWarn("guess_soc_from_uarch: No uarch matched the list"); + return soc; +} + int hex2int(char c) { if (c >= '0' && c <= '9') return c - '0'; @@ -935,7 +968,7 @@ struct system_on_chip* guess_soc_apple(struct system_on_chip* soc) { } #endif -struct system_on_chip* get_soc(void) { +struct system_on_chip* get_soc(struct cpuInfo* cpu) { struct system_on_chip* soc = emalloc(sizeof(struct system_on_chip)); soc->raw_name = NULL; soc->soc_vendor = SOC_VENDOR_UNKNOWN; @@ -975,6 +1008,10 @@ struct system_on_chip* get_soc(void) { if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) { soc = guess_soc_from_nvmem(soc); } + // If everything else failed, try infering it from the microarchitecture + if(soc->soc_vendor == SOC_VENDOR_UNKNOWN) { + soc = guess_soc_from_uarch(soc, cpu); + } } #elif defined __APPLE__ || __MACH__ soc = guess_soc_apple(soc); diff --git a/src/arm/soc.h b/src/arm/soc.h index b2607e7..1098963 100644 --- a/src/arm/soc.h +++ b/src/arm/soc.h @@ -5,6 +5,6 @@ #include "../common/soc.h" #include -struct system_on_chip* get_soc(void); +struct system_on_chip* get_soc(struct cpuInfo* cpu); #endif diff --git a/src/arm/socs.h b/src/arm/socs.h index cfba29b..4ba1066 100644 --- a/src/arm/socs.h +++ b/src/arm/socs.h @@ -29,6 +29,9 @@ enum { SOC_HISILICON_3670, SOC_HISILICON_3680, SOC_HISILICON_3690, + // Kunpeng // + SOC_KUNPENG_920, + SOC_KUNPENG_930, // Exynos // SOC_EXYNOS_3475, SOC_EXYNOS_4210, @@ -367,6 +370,7 @@ enum { inline static VENDOR get_soc_vendor_from_soc(SOC soc) { if(soc >= SOC_BCM_2835 && soc <= SOC_BCM_2712) return SOC_VENDOR_BROADCOM; else if(soc >= SOC_HISILICON_3620 && soc <= SOC_HISILICON_3690) return SOC_VENDOR_KIRIN; + else if(soc >= SOC_KUNPENG_920 && soc <= SOC_KUNPENG_930) return SOC_VENDOR_KUNPENG; else if(soc >= SOC_EXYNOS_3475 && soc <= SOC_EXYNOS_880) return SOC_VENDOR_EXYNOS; else if(soc >= SOC_MTK_MT6893 && soc <= SOC_MTK_MT8783) return SOC_VENDOR_MEDIATEK; else if(soc >= SOC_SNAPD_QSD8650 && soc <= SOC_SNAPD_SM8450) return SOC_VENDOR_SNAPDRAGON; diff --git a/src/arm/uarch.c b/src/arm/uarch.c index cbfc941..5fab29b 100644 --- a/src/arm/uarch.c +++ b/src/arm/uarch.c @@ -10,7 +10,6 @@ // Data not available #define NA -1 -typedef uint32_t MICROARCH; typedef uint32_t ISA; struct uarch { @@ -37,89 +36,6 @@ enum { ISA_ARMv9_A }; -enum { - UARCH_UNKNOWN, - // ARM - UARCH_ARM7, - UARCH_ARM9, - UARCH_ARM1136, - UARCH_ARM1156, - UARCH_ARM1176, - UARCH_ARM11MPCORE, - UARCH_CORTEX_A5, - UARCH_CORTEX_A7, - UARCH_CORTEX_A8, - UARCH_CORTEX_A9, - UARCH_CORTEX_A12, - UARCH_CORTEX_A15, - UARCH_CORTEX_A17, - UARCH_CORTEX_A32, - UARCH_CORTEX_A35, - UARCH_CORTEX_A53, - UARCH_CORTEX_A55r0, // ARM Cortex-A55 revision 0 (restricted dual-issue capabilities compared to revision 1+). - UARCH_CORTEX_A55, - UARCH_CORTEX_A57, - UARCH_CORTEX_A65, - UARCH_CORTEX_A72, - UARCH_CORTEX_A73, - UARCH_CORTEX_A75, - UARCH_CORTEX_A76, - UARCH_CORTEX_A77, - UARCH_CORTEX_A78, - UARCH_CORTEX_A510, - UARCH_CORTEX_A710, - UARCH_CORTEX_A715, - UARCH_CORTEX_X1, - UARCH_CORTEX_X2, - UARCH_CORTEX_X3, - UARCH_NEOVERSE_N1, - UARCH_NEOVERSE_E1, - UARCH_NEOVERSE_V1, - UARCH_SCORPION, - UARCH_KRAIT, - UARCH_KYRO, - UARCH_FALKOR, - UARCH_SAPHIRA, - UARCH_DENVER, - UARCH_DENVER2, - UARCH_CARMEL, - // SAMSUNG - UARCH_EXYNOS_M1, // Samsung Exynos M1 (Exynos 8890 big cores) - UARCH_EXYNOS_M2, // Samsung Exynos M2 (Exynos 8895 big cores) - UARCH_EXYNOS_M3, // Samsung Exynos M3 (Exynos 9810 big cores) - UARCH_EXYNOS_M4, // Samsung Exynos M4 (Exynos 9820 big cores) - UARCH_EXYNOS_M5, // Samsung Exynos M5 (Exynos 9830 big cores) - // APPLE - UARCH_SWIFT, // Apple A6 and A6X processors. - UARCH_CYCLONE, // Apple A7 processor. - UARCH_TYPHOON, // Apple A8 and A8X processor - UARCH_TWISTER, // Apple A9 and A9X processor. - UARCH_HURRICANE, // Apple A10 and A10X processor. - UARCH_MONSOON, // Apple A11 processor (big cores). - UARCH_MISTRAL, // Apple A11 processor (little cores). - UARCH_VORTEX, // Apple A12 processor (big cores). - UARCH_TEMPEST, // Apple A12 processor (big cores). - UARCH_LIGHTNING, // Apple A13 processor (big cores). - UARCH_THUNDER, // Apple A13 processor (little cores). - UARCH_ICESTORM, // Apple M1 processor (little cores). - UARCH_FIRESTORM, // Apple M1 processor (big cores). - UARCH_BLIZZARD, // Apple M2 processor (little cores). - UARCH_AVALANCHE, // Apple M2 processor (big cores). - UARCH_SAWTOOTH, // Apple M3 processor (little cores). - UARCH_EVEREST, // Apple M3 processor (big cores). - // CAVIUM - UARCH_THUNDERX, // Cavium ThunderX - UARCH_THUNDERX2, // Cavium ThunderX2 (originally Broadcom Vulkan). - // MARVELL - UARCH_PJ4, - UARCH_BRAHMA_B15, - UARCH_BRAHMA_B53, - UARCH_XGENE, // Applied Micro X-Gene. - UARCH_TAISHAN_V110, // HiSilicon TaiShan v110 (Huawei Kunpeng 920 series processors). - // PHYTIUM - UARCH_XIAOMI, // Not to be confused with Xiaomi Inc -}; - static const ISA isas_uarch[] = { [UARCH_ARM1136] = ISA_ARMv6, [UARCH_ARM1156] = ISA_ARMv6_T2, @@ -159,6 +75,7 @@ static const ISA isas_uarch[] = { [UARCH_THUNDERX] = ISA_ARMv8_A, [UARCH_THUNDERX2] = ISA_ARMv8_1_A, [UARCH_TAISHAN_V110] = ISA_ARMv8_2_A, + [UARCH_TAISHAN_V200] = ISA_ARMv8_2_A, // Not confirmed [UARCH_DENVER] = ISA_ARMv8_A, [UARCH_DENVER2] = ISA_ARMv8_A, [UARCH_CARMEL] = ISA_ARMv8_A, @@ -284,8 +201,9 @@ struct uarch* get_uarch_from_midr(uint32_t midr, struct cpuInfo* cpu) { CHECK_UARCH(arch, cpu, 'C', 0x0A3, NA, NA, "ThunderX 81XX", UARCH_THUNDERX, CPU_VENDOR_CAVIUM) CHECK_UARCH(arch, cpu, 'C', 0x0AF, NA, NA, "ThunderX2 99XX", UARCH_THUNDERX2, CPU_VENDOR_CAVIUM) - CHECK_UARCH(arch, cpu, 'H', 0xD01, NA, NA, "TaiShan v110", UARCH_TAISHAN_V110, CPU_VENDOR_HUAWUEI) // Kunpeng 920 series - CHECK_UARCH(arch, cpu, 'H', 0xD40, NA, NA, "Cortex-A76", UARCH_CORTEX_A76, CPU_VENDOR_ARM) // Kirin 980 Big/Medium cores -> Cortex-A76 + CHECK_UARCH(arch, cpu, 'H', 0xD01, NA, NA, "TaiShan v110", UARCH_TAISHAN_V110, CPU_VENDOR_HUAWEI) // Kunpeng 920 series + CHECK_UARCH(arch, cpu, 'H', 0xD02, NA, NA, "TaiShan v200", UARCH_TAISHAN_V200, CPU_VENDOR_HUAWEI) // Kunpeng 930 series (found in openeuler: https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/XQCV7NX2UKRIUWUFKRF4PO3QENCOUFR3) + CHECK_UARCH(arch, cpu, 'H', 0xD40, NA, NA, "Cortex-A76", UARCH_CORTEX_A76, CPU_VENDOR_ARM) // Kirin 980 Big/Medium cores -> Cortex-A76 CHECK_UARCH(arch, cpu, 'N', 0x000, NA, NA, "Denver", UARCH_DENVER, CPU_VENDOR_NVIDIA) CHECK_UARCH(arch, cpu, 'N', 0x003, NA, NA, "Denver2", UARCH_DENVER2, CPU_VENDOR_NVIDIA) @@ -437,6 +355,10 @@ char* get_str_uarch(struct cpuInfo* cpu) { return cpu->arch->uarch_str; } +MICROARCH get_uarch(struct uarch* arch) { + return arch->uarch; +} + void free_uarch_struct(struct uarch* arch) { free(arch->uarch_str); free(arch); diff --git a/src/arm/uarch.h b/src/arm/uarch.h index eb0efb7..ffc681b 100644 --- a/src/arm/uarch.h +++ b/src/arm/uarch.h @@ -5,11 +5,98 @@ #include "midr.h" +enum { + UARCH_UNKNOWN, + // ARM + UARCH_ARM7, + UARCH_ARM9, + UARCH_ARM1136, + UARCH_ARM1156, + UARCH_ARM1176, + UARCH_ARM11MPCORE, + UARCH_CORTEX_A5, + UARCH_CORTEX_A7, + UARCH_CORTEX_A8, + UARCH_CORTEX_A9, + UARCH_CORTEX_A12, + UARCH_CORTEX_A15, + UARCH_CORTEX_A17, + UARCH_CORTEX_A32, + UARCH_CORTEX_A35, + UARCH_CORTEX_A53, + UARCH_CORTEX_A55r0, // ARM Cortex-A55 revision 0 (restricted dual-issue capabilities compared to revision 1+). + UARCH_CORTEX_A55, + UARCH_CORTEX_A57, + UARCH_CORTEX_A65, + UARCH_CORTEX_A72, + UARCH_CORTEX_A73, + UARCH_CORTEX_A75, + UARCH_CORTEX_A76, + UARCH_CORTEX_A77, + UARCH_CORTEX_A78, + UARCH_CORTEX_A510, + UARCH_CORTEX_A710, + UARCH_CORTEX_A715, + UARCH_CORTEX_X1, + UARCH_CORTEX_X2, + UARCH_CORTEX_X3, + UARCH_NEOVERSE_N1, + UARCH_NEOVERSE_E1, + UARCH_NEOVERSE_V1, + UARCH_SCORPION, + UARCH_KRAIT, + UARCH_KYRO, + UARCH_FALKOR, + UARCH_SAPHIRA, + UARCH_DENVER, + UARCH_DENVER2, + UARCH_CARMEL, + // SAMSUNG + UARCH_EXYNOS_M1, // Samsung Exynos M1 (Exynos 8890 big cores) + UARCH_EXYNOS_M2, // Samsung Exynos M2 (Exynos 8895 big cores) + UARCH_EXYNOS_M3, // Samsung Exynos M3 (Exynos 9810 big cores) + UARCH_EXYNOS_M4, // Samsung Exynos M4 (Exynos 9820 big cores) + UARCH_EXYNOS_M5, // Samsung Exynos M5 (Exynos 9830 big cores) + // APPLE + UARCH_SWIFT, // Apple A6 and A6X processors. + UARCH_CYCLONE, // Apple A7 processor. + UARCH_TYPHOON, // Apple A8 and A8X processor + UARCH_TWISTER, // Apple A9 and A9X processor. + UARCH_HURRICANE, // Apple A10 and A10X processor. + UARCH_MONSOON, // Apple A11 processor (big cores). + UARCH_MISTRAL, // Apple A11 processor (little cores). + UARCH_VORTEX, // Apple A12 processor (big cores). + UARCH_TEMPEST, // Apple A12 processor (big cores). + UARCH_LIGHTNING, // Apple A13 processor (big cores). + UARCH_THUNDER, // Apple A13 processor (little cores). + UARCH_ICESTORM, // Apple M1 processor (little cores). + UARCH_FIRESTORM, // Apple M1 processor (big cores). + UARCH_BLIZZARD, // Apple M2 processor (little cores). + UARCH_AVALANCHE, // Apple M2 processor (big cores). + UARCH_SAWTOOTH, // Apple M3 processor (little cores). + UARCH_EVEREST, // Apple M3 processor (big cores). + // CAVIUM + UARCH_THUNDERX, // Cavium ThunderX + UARCH_THUNDERX2, // Cavium ThunderX2 (originally Broadcom Vulkan). + // MARVELL + UARCH_PJ4, + UARCH_BRAHMA_B15, + UARCH_BRAHMA_B53, + UARCH_XGENE, // Applied Micro X-Gene. + UARCH_TAISHAN_V110, // HiSilicon TaiShan v110 + UARCH_TAISHAN_V200, // HiSilicon TaiShan v200 + // PHYTIUM + UARCH_XIAOMI, // Not to be confused with Xiaomi Inc +}; + +typedef uint32_t MICROARCH; + struct uarch* get_uarch_from_midr(uint32_t midr, struct cpuInfo* cpu); int get_number_of_vpus(struct cpuInfo* cpu); int get_vpus_width(struct cpuInfo* cpu); bool has_fma_support(struct cpuInfo* cpu); char* get_str_uarch(struct cpuInfo* cpu); void free_uarch_struct(struct uarch* arch); +MICROARCH get_uarch(struct uarch* arch); #endif diff --git a/src/common/ascii.h b/src/common/ascii.h index 259526e..1171712 100644 --- a/src/common/ascii.h +++ b/src/common/ascii.h @@ -145,6 +145,25 @@ $C2 Exynos \ $C2 \ $C2 " +#define ASCII_KUNPENG \ +"$C1 . \ +$C1 .. \ +$C1 .## \ +$C1 . .###. \ +$C1 .. #####. \ +$C1 .## .#######. \ +$C1 .####. .#######. \ +$C1 ..######* .#######. . \ +$C1 .#########* .#######* . \ +$C1 ######* .#######. .#. \ +$C1######### .#######. *##. \ +$C1 ##* .#######. ####### \ +$C1 ###. .##. ... \ +$C1 *##########... \ +$C1 *######## \ +$C1 #####. \ +$C1 *###. " + #define ASCII_KIRIN \ "$C1 ####### \ $C1 ##### #################### \ @@ -485,6 +504,7 @@ asciiL logo_snapd = { ASCII_SNAPD, 39, 16, false, {C_FG_RED, C_FG_WH asciiL logo_mtk = { ASCII_MTK, 59, 5, false, {C_FG_BLUE, C_FG_YELLOW}, {C_FG_BLUE, C_FG_YELLOW} }; asciiL logo_exynos = { ASCII_EXYNOS, 22, 13, true, {C_BG_BLUE, C_FG_WHITE}, {C_FG_BLUE, C_FG_WHITE} }; asciiL logo_kirin = { ASCII_KIRIN, 53, 12, false, {C_FG_RED}, {C_FG_WHITE, C_FG_RED} }; +asciiL logo_kunpeng = { ASCII_KUNPENG, 47, 17, false, {C_FG_RED}, {C_FG_WHITE, C_FG_RED} }; asciiL logo_broadcom = { ASCII_BROADCOM, 44, 19, false, {C_FG_WHITE, C_FG_RED}, {C_FG_WHITE, C_FG_RED} }; asciiL logo_arm = { ASCII_ARM, 42, 5, false, {C_FG_CYAN}, {C_FG_WHITE, C_FG_CYAN} }; asciiL logo_ibm = { ASCII_IBM, 42, 9, false, {C_FG_CYAN, C_FG_WHITE}, {C_FG_CYAN, C_FG_WHITE} }; diff --git a/src/common/cpu.h b/src/common/cpu.h index fcd9c02..4965747 100644 --- a/src/common/cpu.h +++ b/src/common/cpu.h @@ -16,7 +16,7 @@ enum { CPU_VENDOR_NVIDIA, CPU_VENDOR_APM, CPU_VENDOR_QUALCOMM, - CPU_VENDOR_HUAWUEI, + CPU_VENDOR_HUAWEI, CPU_VENDOR_SAMSUNG, CPU_VENDOR_MARVELL, CPU_VENDOR_PHYTIUM, diff --git a/src/common/printer.c b/src/common/printer.c index a98a241..884af7e 100644 --- a/src/common/printer.c +++ b/src/common/printer.c @@ -364,6 +364,8 @@ void choose_ascii_art(struct ascii* art, struct color** cs, struct terminal* ter art->art = &logo_exynos; else if(art->vendor == SOC_VENDOR_KIRIN) art->art = &logo_kirin; + else if(art->vendor == SOC_VENDOR_KUNPENG) + art->art = &logo_kunpeng; else if(art->vendor == SOC_VENDOR_BROADCOM) art->art = &logo_broadcom; else if(art->vendor == SOC_VENDOR_APPLE) diff --git a/src/common/soc.c b/src/common/soc.c index 1785a96..2837d27 100644 --- a/src/common/soc.c +++ b/src/common/soc.c @@ -15,6 +15,7 @@ static char* soc_trademark_string[] = { [SOC_VENDOR_MEDIATEK] = "MediaTek ", [SOC_VENDOR_EXYNOS] = "Exynos ", [SOC_VENDOR_KIRIN] = "Kirin ", + [SOC_VENDOR_KUNPENG] = "Kunpeng ", [SOC_VENDOR_BROADCOM] = "Broadcom BCM", [SOC_VENDOR_APPLE] = "Apple ", [SOC_VENDOR_ROCKCHIP] = "Rockchip ", diff --git a/src/common/soc.h b/src/common/soc.h index 31451c8..7544984 100644 --- a/src/common/soc.h +++ b/src/common/soc.h @@ -19,6 +19,7 @@ enum { SOC_VENDOR_MEDIATEK, SOC_VENDOR_EXYNOS, SOC_VENDOR_KIRIN, + SOC_VENDOR_KUNPENG, SOC_VENDOR_BROADCOM, SOC_VENDOR_APPLE, SOC_VENDOR_ROCKCHIP, @@ -39,7 +40,7 @@ struct system_on_chip { char* raw_name; }; -struct system_on_chip* get_soc(void); +struct system_on_chip* get_soc(struct cpuInfo* cpu); char* get_soc_name(struct system_on_chip* soc); VENDOR get_soc_vendor(struct system_on_chip* soc); bool match_soc(struct system_on_chip* soc, char* raw_name, char* expected_name, char* soc_name, SOC soc_model, int32_t process); diff --git a/src/riscv/riscv.c b/src/riscv/riscv.c index af43066..c9e1b1f 100644 --- a/src/riscv/riscv.c +++ b/src/riscv/riscv.c @@ -163,7 +163,7 @@ struct cpuInfo* get_cpu_info(void) { cpu->ext = get_extensions_from_str(ext_str); if(cpu->ext->str != NULL && cpu->ext->mask == 0) return NULL; cpu->arch = get_uarch_from_cpuinfo_str(cpuinfo_str, cpu); - cpu->soc = get_soc(); + cpu->soc = get_soc(cpu); cpu->freq = get_frequency_info(0); cpu->peak_performance = get_peak_performance(cpu); diff --git a/src/riscv/soc.c b/src/riscv/soc.c index d59ad2a..291074f 100644 --- a/src/riscv/soc.c +++ b/src/riscv/soc.c @@ -65,7 +65,7 @@ struct system_on_chip* guess_soc_from_devtree(struct system_on_chip* soc) { return soc; } -struct system_on_chip* get_soc(void) { +struct system_on_chip* get_soc(struct cpuInfo* cpu) { struct system_on_chip* soc = emalloc(sizeof(struct system_on_chip)); soc->raw_name = NULL; soc->soc_vendor = SOC_VENDOR_UNKNOWN; diff --git a/src/riscv/soc.h b/src/riscv/soc.h index cd1925f..fa14eb1 100644 --- a/src/riscv/soc.h +++ b/src/riscv/soc.h @@ -5,6 +5,6 @@ #include "../common/cpu.h" #include -struct system_on_chip* get_soc(void); +struct system_on_chip* get_soc(struct cpuInfo* cpu); #endif