wok-current rev 17057
syslinux/c32box: x86_64 auto select
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Thu Aug 21 09:56:57 2014 +0200 (2014-08-21) |
parents | 6dd4a6865e2e |
children | d5b427eca7f3 |
files | syslinux/stuff/extra/md5sum.c |
line diff
1.1 --- a/syslinux/stuff/extra/md5sum.c Thu Aug 21 03:51:54 2014 +0200 1.2 +++ b/syslinux/stuff/extra/md5sum.c Thu Aug 21 09:56:57 2014 +0200 1.3 @@ -680,6 +680,7 @@ 1.4 #include <stdio.h> 1.5 #include <string.h> 1.6 #include <console.h> 1.7 +#include <cpuid.h> 1.8 #include <syslinux/loadfile.h> 1.9 #include <syslinux/linux.h> 1.10 #include <syslinux/pxe.h> 1.11 @@ -757,6 +758,72 @@ 1.12 return cmdline; 1.13 } 1.14 1.15 +static bool __constfunc cpu_has_cpuid(void) 1.16 +{ 1.17 + return cpu_has_eflag(X86_EFLAGS_ID); 1.18 +} 1.19 + 1.20 +static bool __constfunc cpu_has_level(uint32_t level) 1.21 +{ 1.22 + uint32_t group; 1.23 + uint32_t limit; 1.24 + 1.25 + if (!cpu_has_cpuid()) 1.26 + return false; 1.27 + 1.28 + group = level & 0xffff0000; 1.29 + limit = cpuid_eax(group); 1.30 + 1.31 + if ((limit & 0xffff0000) != group) 1.32 + return false; 1.33 + 1.34 + if (level > limit) 1.35 + return false; 1.36 + 1.37 + return true; 1.38 +} 1.39 + 1.40 +/* This only supports feature groups 0 and 1, corresponding to the 1.41 + Intel and AMD EDX bit vectors. We can add more later if need be. */ 1.42 +static bool __constfunc cpu_has_feature(int x) 1.43 +{ 1.44 + uint32_t level = ((x & 1) << 31) | 1; 1.45 + 1.46 + return cpu_has_level(level) && ((cpuid_edx(level) >> (x & 31) & 1)); 1.47 +} 1.48 + 1.49 +static char *extfilename(char *filename, char *ext, int feature) 1.50 +{ 1.51 +#define NEWFILENAMESZ 80 1.52 + static char newfilename[NEWFILENAMESZ+1]; 1.53 + char *found = filename; 1.54 + FILE *fp; 1.55 + 1.56 + if (strlen(filename) + strlen(ext) <= NEWFILENAMESZ) { 1.57 + strcpy(newfilename, filename, NEWFILENAMESZ); 1.58 + if (cpu_has_feature(feature)) { 1.59 + strcat(newfilename, ext); 1.60 + fp = fopen(newfilename, "r"); 1.61 + if (fp) 1.62 + found = newfilename; 1.63 + fclose(fp); 1.64 + } 1.65 + } 1.66 + return found; 1.67 +} 1.68 + 1.69 +static char *bestextfilename(char *filename) 1.70 +{ 1.71 + char *found; 1.72 + 1.73 + //found = extfilename(filename, "fpu", X86_FEATURE_FPU); 1.74 + //found = extfilename(filename, "686", X86_FEATURE_CMOV); 1.75 + //found = extfilename(filename, "pae", X86_FEATURE_PAE); 1.76 + found = extfilename(filename, "64", X86_FEATURE_LM); 1.77 + //found = extfilename(filename, "guest", X86_FEATURE_HYPERVISOR); 1.78 + return found; 1.79 +} 1.80 + 1.81 static int setup_data_file(struct setup_data *setup_data, 1.82 uint32_t type, const char *filename, 1.83 bool opt_quiet) 1.84 @@ -780,6 +847,7 @@ 1.85 static int main_linux(int argc, char *argv[]) 1.86 { 1.87 const char *kernel_name; 1.88 + const char *initrd_name; 1.89 struct initramfs *initramfs; 1.90 struct setup_data *setup_data; 1.91 char *cmdline; 1.92 @@ -812,7 +880,7 @@ 1.93 return 1; 1.94 } 1.95 1.96 - kernel_name = arg; 1.97 + kernel_name = bestextfilename(arg); 1.98 1.99 errno = 0; 1.100 boot_image = malloc(strlen(kernel_name) + 12); 1.101 @@ -863,12 +931,13 @@ 1.102 if (p) 1.103 *p = '\0'; 1.104 1.105 + initrd_name = bestextfilename(arg); 1.106 if (!opt_quiet) 1.107 - printf("Loading %s... ", arg); 1.108 + printf("Loading %s... ", initrd_name); 1.109 errno = 0; 1.110 - if (initramfs_load_archive(initramfs, arg)) { 1.111 + if (initramfs_load_archive(initramfs, initrd_name)) { 1.112 if (opt_quiet) 1.113 - printf("Loading %s ", kernel_name); 1.114 + printf("Loading %s ", initrd_name); 1.115 printf("failed: "); 1.116 goto bail; 1.117 }