Run Nindent on com32/modules/ifcpu64.c
[people/sha0/syslinux.git] / com32 / modules / ifcpu64.c
index def43b3..634a3c5 100644 (file)
 #include <cpuid.h>
 #include <syslinux/boot.h>
 
-static bool cpu_has_cpuid(void)
+static bool __constfunc cpu_has_cpuid(void)
 {
-  return cpu_has_eflag(X86_EFLAGS_ID);
+    return cpu_has_eflag(X86_EFLAGS_ID);
 }
 
-static bool cpu_has_level(uint32_t level)
+static bool __constfunc cpu_has_level(uint32_t level)
 {
-  uint32_t group = level & 0xffff0000;
-  uint32_t limit = cpuid_eax(group);
-  if ((limit & 0xffff0000) != group)
-    return false;
-  if (level > limit)
-    return false;
-
-  return true;
-}
+    uint32_t group;
+    uint32_t limit;
 
-static bool cpu_has_pae(void)
-{
-  if (!cpu_has_cpuid())
-    return false;
+    if (!cpu_has_cpuid())
+       return false;
+
+    group = level & 0xffff0000;
+    limit = cpuid_eax(group);
 
-  if (!cpu_has_level(0x00000001))
-    return false;
+    if ((limit & 0xffff0000) != group)
+       return false;
 
-  return !!(cpuid_edx(0x00000001) & (X86_FEATURE_PAE & 31));
+    if (level > limit)
+       return false;
+
+    return true;
 }
 
-static bool cpu_has_lm(void)
+/* This only supports feature groups 0 and 1, corresponding to the
+   Intel and AMD EDX bit vectors.  We can add more later if need be. */
+static bool __constfunc cpu_has_feature(int x)
 {
-  if (!cpu_has_cpuid())
-    return false;
-
-  if (!cpu_has_level(0x80000001))
-    return false;
+    uint32_t level = ((x & 1) << 31) | 1;
 
-  return !!(cpuid_edx(0x80000001) & (X86_FEATURE_LM & 31));
+    return cpu_has_level(level) && ((cpuid_edx(level) >> (x & 31) & 1));
 }
 
 /* XXX: this really should be librarized */
 static void boot_args(char **args)
 {
-  int len = 0;
-  char **pp;
-  const char *p;
-  char c, *q, *str;
-
-  for (pp = args; *pp; pp++)
-    len += strlen(*pp);
-
-  q = str = alloca(len+1);
-  for (pp = args; *pp; pp++) {
-    p = *pp;
-    while ((c = *p++))
-      *q++ = c;
-  }
-  *q = '\0';
-
-  if (!str[0])
-    syslinux_run_default();
-  else
-    syslinux_run_command(str);
+    int len = 0;
+    char **pp;
+    const char *p;
+    char c, *q, *str;
+
+    for (pp = args; *pp; pp++)
+       len += strlen(*pp);
+
+    q = str = alloca(len + 1);
+    for (pp = args; *pp; pp++) {
+       p = *pp;
+       while ((c = *p++))
+           *q++ = c;
+    }
+    *q = '\0';
+
+    if (!str[0])
+       syslinux_run_default();
+    else
+       syslinux_run_command(str);
 }
 
 int main(int argc, char *argv[])
 {
-  char **args[3];
-  int i;
-  int n;
-
-  for (i = 0; i < 3; i++)
-    args[i] = &argv[1];
-
-  n = 1;
-  for (i = 1; i < argc; i++) {
-    if (!strcmp(argv[i], "--")) {
-      argv[i] = NULL;
-      args[n++] = &argv[i+1];
+    char **args[3];
+    int i;
+    int n;
+
+    args[0] = &argv[1];
+    n = 1;
+    for (i = 1; i < argc; i++) {
+       if (!strcmp(argv[i], "--")) {
+           argv[i] = NULL;
+           args[n++] = &argv[i + 1];
+       }
+       if (n >= 3)
+           break;
     }
-    if (n >= 3)
-      break;
-  }
-
-  boot_args(cpu_has_lm()  ? args[0] :
-           cpu_has_pae() ? args[1] :
-           args[2]);
-  return -1;
+    while (n < 3) {
+       args[n] = args[n - 1];
+       n++;
+    }
+
+    boot_args(cpu_has_feature(X86_FEATURE_LM) ? args[0] :
+             cpu_has_feature(X86_FEATURE_PAE) ? args[1] : args[2]);
+    return -1;
 }