On 1/12/26 19:07, Bibo Mao wrote:
+#if defined(CONFIG_KVM)
+static int read_cpuinfo(const char *field, char *value, int len)
+{
+ FILE *f;
+ int ret = -1;
+ int field_len = strlen(field);
+ char line[512];
+
+ f = fopen("/proc/cpuinfo", "r");
+ if (!f) {
+ return -1;
+ }
+
+ do {
+ if (!fgets(line, sizeof(line), f)) {
+ break;
+ }
+ if (!strncmp(line, field, field_len)) {
+ strncpy(value, line, len);
+ ret = 0;
+ break;
+ }
+ } while (*line);
+
+ fclose(f);
+
+ return ret;
+}
+
+static uint64_t get_host_cpu_model(void)
+{
+ char line[512];
+ char *ns;
+ static uint64_t cpuid;
+
+ if (cpuid) {
+ return cpuid;
+ }
+
+ if (read_cpuinfo("Model Name", line, sizeof(line))) {
+ return 0;
+ }
+
+ ns = strchr(line, ':');
+ if (!ns) {
+ return 0;
+ }
+
+ ns = strstr(ns, "Loongson-");
+ if (!ns) {
+ return 0;
+ }
+
+ ns += strlen("Loongson-");
+ memccpy((void *)&cpuid, ns, 0, 8);
+ return cpuid;
+}
+
+static uint32_t get_host_cpucfg(int number)
+{
+ unsigned int data = 0;
+
+#ifdef __loongarch__
+ asm volatile("cpucfg %[val], %[reg]"
+ : [val] "=r" (data)
+ : [reg] "r" (number)
+ : "memory");
+#endif
+
+ return data;
+}
Are you sure you should be bypassing KVM for this? Other targets start a scratch vcpu and
then read the values via KVM_GET_ONE_REG.
I'm not sure how much trap-and-emulate support LoongArch has for such ID
registers.
r~