Main Page | Directories | File List | Globals

smbios.c

Go to the documentation of this file.
00001 /*
00002  * kernel_arch/i386/kernel/bios/smbios.c
00003  *
00004  * Copyright (c) 2003-2004 Lukasz Dembinski <dembol@nasa.com.pl>
00005  * All Rights Reserved
00006  * 
00007  * Date:        2004/01
00008  * Author:      Lukasz Dembinski
00009  * Info:        smbios.c core file
00010  * Contact:     mailto: <dembol@nasa.com.pl>
00011  *
00012  */
00013 
00014 #include <agnix/agnix.h>
00015 #include <agnix/init.h>
00016 #include <agnix/bios/bios.h>
00017 #include <agnix/console.h>
00018 #include <agnix/memory.h>
00019 #include <asm/paging.h>
00020 
00021 #define MOD_NAME        "SMBIOS: "
00022 
00023 u8 count_sum(char *buf, int len)
00024 {
00025     int i;
00026     u8 sum = 0;
00027     
00028     for (i = 0; i < len; i++)
00029         sum += buf[i];
00030     
00031     return sum;
00032 }
00033 
00034 int __init smbios_find_table(void)
00035 {
00036     u32 range_cur = 0xF0000;
00037     u32 range_end = 0xFFFFF;
00038     struct smbios_eps_s *eps;
00039     
00040     do {
00041         eps = (struct smbios_eps_s *)phys_to_virt(range_cur);
00042 
00043         if (!memcmp(eps->ident, _SM_, 4)) {
00044             if (count_sum((char *)eps, sizeof(struct smbios_eps_s))) {
00045                 printk(MOD_NAME "invalid checksum!!!\n");
00046                 return -1;
00047             } else {
00048                 printk(MOD_NAME "Found SMBIOS ver. %d.%d\n", eps->smbios_major, eps->smbios_minor);
00049                 return 0;
00050             }
00051         }
00052 
00053         range_cur += 16;
00054     } while(range_cur < range_end);
00055     
00056     return -1;
00057 }
00058 
00059 int __init smbios_init(void)
00060 {
00061     smbios_find_table();        
00062 
00063     return 0;
00064 }
Dokumentacje wygenerowano programem Doxygen 1.4.2 dla projektu Agnix