Changeset 108

Show
Ignore:
Timestamp:
02/14/06 18:14:42 (3 years ago)
Author:
ludo
Message:

v 1.30: smbios inventory improved (from r3051)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/client/src_revoboot/builtins_lbs.c

    r99 r108  
    10421042__u16 smbios_num = 0; 
    10431043__u8 *smbios_base =  NULL; 
    1044  
     1044__u8 smbios_ver = 0; 
    10451045 
    10461046 
     
    10681068#else 
    10691069            grub_printf("SMBios found. version %d.%d\n", *(check+6), *(check+7) ); 
     1070            smbios_ver = (*(check+6)) * 10 + (*(check+7)); 
    10701071#endif 
    10711072            return 1; 
     
    11301131__u8 *smbios_get(int rtype, __u8 **rnext) 
    11311132{ 
    1132   int i = 0; 
    1133   __u8 *ptr; 
    1134   __u8 *next; 
    1135  
    1136   //  if (ptr == NULL) 
    1137     ptr = smbios_base; 
    1138  
     1133  static int i = 0; 
     1134  static __u8 *next; 
     1135  static __u8 *ptr = NULL; 
     1136 
     1137  if (rtype == -1) { 
     1138        ptr = NULL; 
     1139        return NULL;       
     1140  } 
     1141  if (ptr == NULL) { 
     1142        ptr = smbios_base; 
     1143        i = 0; 
     1144  } 
     1145     
    11391146  while (i < smbios_num) 
    11401147    { 
     
    11441151      len = ptr[1]; 
    11451152      handle = *(__u16 *)(ptr+2); 
    1146  
    1147       if (len == 0) { 
    1148         //xif (*rnext != NULL) *rnext = NULL; 
    1149         return NULL; 
    1150       } 
    11511153 
    11521154      next = ptr + len; 
     
    11551157#ifdef DEBUG 
    11561158      grub_printf("%d %d %x\n", type, len, handle); 
     1159      getkey(); 
    11571160#endif 
    11581161 
    11591162      if (type == rtype)  
    11601163        { 
    1161           //if (*rnext != NULL) *rnext = next + 2; 
    1162           return ptr; 
     1164          __u8 *oldptr;  
     1165           
     1166          oldptr = ptr; 
     1167          next += 2; 
     1168          ptr = next; 
     1169          i++; 
     1170          return oldptr; 
    11631171        } 
    11641172      next += 2; 
     
    11671175    } 
    11681176  //if (*rnext != NULL) *rnext = NULL; 
     1177  ptr = NULL; 
    11691178  return NULL; 
    11701179} 
     
    12271236} 
    12281237 
     1238/* 
     1239 * Returns pointers to: Size in MB, Form factor, Location, Type, Speed in MHZ 
     1240 */ 
     1241int smbios_get_memory(int *size, int *form, char **location, int *type, int *speed)  
     1242{ 
     1243  __u8 *ptr; 
     1244   
     1245  ptr = smbios_get(17, NULL); 
     1246  if (ptr == NULL) return 0; 
     1247  *size = *(__u16  *)(ptr + 0xC); 
     1248  if (*size & 0x8000) { 
     1249        *size &= 0x7FFF; 
     1250        *size *= -1; 
     1251  } 
     1252  *form = ptr[0xE]; 
     1253  *location = smbios_string(ptr, ptr[0x10]); 
     1254  *type = ptr[0x12] | (ptr[0x14]<<8) | (ptr[0x13]<<16); 
     1255#ifdef DEBUG 
     1256  printf("Size: %d\n", *size); 
     1257  printf("Form: %d\n", *form); 
     1258  printf("Location: %s\n", *location); 
     1259  printf("Type: %X\n", *type); 
     1260  printf("Type: %d\n", *type); 
     1261#endif 
     1262  if (smbios_ver >= 23) { 
     1263        *speed = *(__u16  *)(ptr + 0x15); 
     1264#ifdef DEBUG 
     1265        printf("Speed: %d\n", *speed); 
     1266#endif 
     1267  } else { 
     1268        *speed = 0;   
     1269  } 
     1270  return 1; 
     1271} 
     1272 
     1273/* Get the number of CPUs (count the number of type 4 structures) */ 
     1274int smbios_get_numcpu(void) 
     1275{ 
     1276   int num = 0; 
     1277    
     1278   smbios_get(-1, NULL); 
     1279   while (smbios_get(4, NULL)) num++; 
     1280   if (num == 0) num++; 
     1281   return num; 
     1282} 
    12291283 
    12301284/* Translate a special key to a common ascii code.  */ 
  • trunk/client/src_revoboot/common.c

    r99 r108  
    4040/* This saves the maximum size of extended memory (in KB).  */ 
    4141unsigned long extended_memory; 
     42/* */ 
     43int done_inventory = 0; 
    4244 
    4345/* 
     
    327329#endif 
    328330 
    329 #define BOOTINFO 
    330  
    331 #ifdef BOOTINFO 
    332   // INFO AT STARTUP to PORT 999 
    333   // 
     331  /* INFO AT STARTUP to PORT 1001 */ 
     332  if (!done_inventory) 
    334333  { 
    335    char *buffer; unsigned int i; 
    336    extern unsigned char X86; 
    337    unsigned char *ptr=&X86; 
    338    extern unsigned char *udp_packet_r; 
    339    extern char lbsname[]; 
    340    int sz=0, port; 
    341  
    342   udp_init(); 
    343  
    344   /* tell the LBS that we have booted */ 
    345   udp_send_lbs("L0", 2); 
    346  
    347   /* begin */ 
    348   buffer=(char *)PASSWORD_BUF; 
    349   *buffer++=0xAA; 
    350   grub_sprintf(buffer,"M:%x,U:%x\n",mbi.mem_lower,mbi.mem_upper); while (*buffer) buffer++; 
    351   eth_pci_init(buffer); while (*buffer) buffer++; 
    352   grub_sprintf(buffer,"C:"); while (*buffer) buffer++; 
    353   cpuinfo(); for(i=0;i<24;i++) {grub_sprintf(buffer,"%x,",ptr[i]); while (*buffer) buffer++;} 
    354   *(buffer-1)='\n'; 
    355   grub_sprintf(buffer,"F:%d\n",cpuspeed()); while (*buffer) buffer++; 
    356  
    357   drive_info(buffer); 
    358  
    359   /* smbios infos */ 
    360   if ( smbios_init() ) 
    361     { 
    362       unsigned char *p1, *p2, *p3, *p4, *p; 
    363       int i; 
    364       char hex[]="0123456789ABCDEF"; 
    365  
    366       smbios_get_sysinfo(&p1, &p2, &p3, &p4, &p); 
    367       while (*buffer) buffer++; 
    368       grub_sprintf(buffer, "S1:%s|%s|%s|%s|",p1, p2, p3, p4); 
    369        
    370       while (*buffer) buffer++; 
    371       for (i = 0; i<16; i++)    /* UUID */ 
    372         { 
    373           *buffer++ = hex[p[i]>>4]; 
    374           *buffer++ = hex[p[i]&15]; 
    375         } 
    376       *buffer++ = '\n'; 
    377  
    378       smbios_get_biosinfo(&p1, &p2, &p3); 
    379       grub_sprintf(buffer, "S0:%s|%s|%s\n",p1, p2, p3); 
    380       while (*buffer) buffer++; 
    381  
    382       smbios_get_enclosure(&p1, &p2); 
    383       grub_sprintf(buffer, "S3:%s|%d\n",p1, *p2); 
    384        
    385     } 
    386    
    387   /* send inventory */ 
    388   buffer=(char *)PASSWORD_BUF; 
    389   udp_send_withmac((char *)PASSWORD_BUF,strlen(buffer)+1,1001,1001); 
    390       
    391   /* I want my name */ 
    392   /* Some buggy PXE bioses need a read before sending... (SMC cards) */  
    393   udp_get(NULL, &sz, 1001, &port); 
    394   udp_send_lbs("\x1A", 1); 
    395   i = currticks(); 
    396   while (i+15 > currticks()) { 
    397     sz = 0; 
    398     udp_get(NULL, &sz, 1001, &port); 
    399     if (sz) break; 
    400   }; 
    401     
    402   if (sz) { 
    403         /* grub_strcpy does not work here ?!? */ 
    404         for (i = 0; i < 32; i++) { 
    405             lbsname[i] = udp_packet_r[i]; 
    406         } 
    407         lbsname[sz] = 0; 
    408         lbsname[31] = 0;         
    409     } 
    410    udp_close(); 
     334        char *buffer; unsigned int i; 
     335        extern unsigned char X86; 
     336        unsigned char *ptr=&X86; 
     337        extern unsigned char *udp_packet_r; 
     338        extern char lbsname[]; 
     339        int sz=0, port; 
     340 
     341        udp_init(); 
     342 
     343        /* tell the LBS that we have booted */ 
     344        udp_send_lbs("L0", 2); 
     345 
     346        /* begin */ 
     347        buffer=(char *)PASSWORD_BUF; 
     348        *buffer++=0xAA; 
     349        buffer += grub_sprintf(buffer,"M:%x,U:%x\n",mbi.mem_lower,mbi.mem_upper); 
     350        eth_pci_init(buffer); while (*buffer) buffer++; 
     351 
     352        drive_info(buffer); 
     353        while (*buffer) buffer++; 
     354 
     355        /* smbios infos */ 
     356        if ( smbios_init() ) 
     357            { 
     358              unsigned char *p1, *p2, *p3, *p4, *p; 
     359              int i, i1, i2, i3, i4; 
     360              char hex[]="0123456789ABCDEF"; 
     361 
     362              smbios_get_biosinfo(&p1, &p2, &p3); 
     363              buffer += grub_sprintf(buffer, "S0:%s|%s|%s\n",p1, p2, p3); 
     364 
     365              smbios_get_sysinfo(&p1, &p2, &p3, &p4, &p); 
     366              buffer += grub_sprintf(buffer, "S1:%s|%s|%s|%s|",p1, p2, p3, p4); 
     367 
     368              /* while (*buffer) buffer++; */ 
     369              for (i = 0; i<16; i++)    /* UUID */ 
     370                { 
     371                  *buffer++ = hex[p[i]>>4]; 
     372                  *buffer++ = hex[p[i]&15]; 
     373                } 
     374 
     375              smbios_get_enclosure(&p1, &p2); 
     376              buffer += grub_sprintf(buffer, "\nS3:%s|%d\n",p1, *p2 & 0x7F); 
     377 
     378              while (smbios_get_memory(&i1, &i2, &p1, &i3, &i4)) { 
     379                 buffer += grub_sprintf(buffer, "SM:%d:%x:%s:%x:%d\n", i1, i2, p1, i3, i4); 
     380              } 
     381              buffer += grub_sprintf(buffer, "S4:%d\n", smbios_get_numcpu()); 
     382        } 
     383 
     384        buffer += grub_sprintf(buffer,"C:"); 
     385        cpuinfo();  
     386        for (i=0;i<24;i++) { 
     387                buffer += grub_sprintf(buffer,"%x,",ptr[i]); 
     388        } 
     389        buffer--; 
     390        buffer += grub_sprintf(buffer,"\nF:%d\n",cpuspeed());  
     391 
     392        /* send inventory */ 
     393        buffer=(char *)PASSWORD_BUF; 
     394        udp_send_withmac((char *)PASSWORD_BUF,strlen(buffer)+1,1001,1001); 
     395 
     396        /* I want my name */ 
     397        /* Some buggy PXE bioses need a read before sending... (SMC cards) */  
     398        udp_get(NULL, &sz, 1001, &port); 
     399        udp_send_lbs("\x1A", 1); 
     400        i = currticks(); 
     401        /* wait one sec */ 
     402        while (i+15 > currticks()) { 
     403            sz = 0; 
     404            udp_get(NULL, &sz, 1001, &port); 
     405            if (sz) break; 
     406        }; 
     407 
     408        if (sz) { 
     409                /* grub_strcpy does not work here ?!? */ 
     410                for (i = 0; i < 32; i++) { 
     411                    lbsname[i] = udp_packet_r[i]; 
     412                } 
     413                lbsname[sz] = 0; 
     414                lbsname[31] = 0;         
     415        } 
     416        udp_close(); 
     417        done_inventory = 1; 
    411418  } 
    412419   
    413 #endif 
    414420 
    415421  current_drive = saved_drive; 
  • trunk/client/src_revoboot/config.h

    r99 r108  
    1010 
    1111#define PACKAGE "LinboxBootLoader" 
    12 #define VERSION "1.23
     12#define VERSION "1.30
  • trunk/client/src_revoboot/pxe.size

    r99 r108  
    1 95324 
     195836