phantom_device_t * driver_etc_smbios_probe( const char *name, int stage ) { (void) stage; struct smbios_eps * ep = smbios_identify(); if( seq_number || ep == 0 ) return 0; if(smbios_cksum(ep)) { SHOW_ERROR0( 0, "SMBios checksum failed"); //error = ENXIO; return 0; } SHOW_INFO( 0, "SMBios Version: %u.%u", ep->SMBIOS_Major, ep->SMBIOS_Minor); if(bcd2bin(ep->SMBIOS_BCD_Revision)) SHOW_INFO( 4, "SMBios BCD Revision: %u.%u", bcd2bin(ep->SMBIOS_BCD_Revision >> 4), bcd2bin(ep->SMBIOS_BCD_Revision & 0x0f)); phantom_device_t * dev = malloc(sizeof(phantom_device_t)); dev->name = name; dev->seq_number = seq_number++; dev->drv_private = ep; dev->dops.read = smbios_read; /* dev->dops.stop = beep_stop; dev->dops.write = beep_write; */ return dev; }
static int smbios_find_eps(void) { uintptr_t addr; u_int8_t major, minor; if (smbios_eps == 0xffff) return 0; /* already set */ if (smbios_eps > 0) return 1; addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN, SMBIOS_STEP, SMBIOS_OFF); if (addr != 0) { smbios_eps = BIOS_PADDRTOVADDR(addr); if (smbios_cksum(smbios_eps)) { printf("SMBIOS checksum failed.\n"); smbios_eps = 0xffff; return 0; } else { printf("SMBIOS found\n"); major = *((u_int8_t *)(smbios_eps + 0x6)); minor = *((u_int8_t *)(smbios_eps + 0x7)); printf("SMBIOS %i.%i found\n", major, minor); return 1; } } printf("SMBIOS Signature not found\n"); smbios_eps = 0xffff; return 0; }