[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lost] [Patch] sysinfo



stultus / dunklermeuchler wrote:
> Und direkt den Patch vergessen anzuhängen. Seis drum, hier ist er!
> ------------------------------------------------------------------------
>
> Index: src/modules/sysinfo/include/cpuid.h
> ===================================================================
> --- src/modules/sysinfo/include/cpuid.h	(Revision 0)
> +++ src/modules/sysinfo/include/cpuid.h	(Revision 0)
> +/**
> + * Struktur für die Infos aus CPUID, Level 0
>   
Umlaut...
> + * Enthaelt max_level (maximaler level in cpuid) und die vendorID (Hersteller)
> + */
> +typedef struct {
> +    dword max_level;
> +    char  vendorID[13];
> +} cpuid_0;
> +
> +/**
> + * Struktur für die Infos aus CPUID, Level 1
>   
Nochmal
> + * Enthaelt Infos ueber den APIC (ebx) sowie die Standardflags (edx, ecx)
> + */
> +typedef struct {
> +    dword eax;
> +    union {
> +        dword ebx;
> +	    struct  {
> +	        byte apic_id;
> +	        byte cpu_count;
> +	        byte clflush;
> +	        byte brand_id;
> +	    };
>   
Die Einrückung hier ist etwas seltsam.
> +    };
> +    dword ecx;
> +    dword edx;
> +} cpuid_1;
> +
> +/**
> + * Struktur für die Infos aus CPUID, Extended Level 0
>   
....
> + * Enthaelt max_level und vendorID, wie Level 0
> + */
> +typedef struct {
> +    dword max_level;
> +    char vendorID[13];
> +} cpuid_e0;
> +
> +/**
> + * Struktur für die Infos aus CPUID, Extended Level 1
>   
Wann lernst du es denn endlich? ;-)
> + * Enthaelt die erweiterten Flags in edx und ecx
> + */
> +typedef struct {
> +    dword eax;
> +    dword ebx;
> +    dword ecx;
> +    dword edx;
> +} cpuid_e1;
> +
> +/**
> + * Struktur für die Infos aus CPUID, Extended Level 2-4
>   
Und nochmal...
> + * Enthaelt den Processor Brand String, eine Markenangabe des Prozessors.
> + */
> +typedef struct {
> +    dword eax;
> +    char proc_brand_string[49];
> +} cpuid_e2_e4;
> +
> +// Funktionen
> +
> +/**
> + * Prueft ob CPUID vorhanden ist.
> + *
> + * @return true wenn cpuid funktioniert, sonst false
>   
TRUE und FALSE schreibt sich bei uns gross. ;-)
> + */
> +bool has_cpuid();
> +
> +/**
> + * Macht einen Aufruf an CPUID. Die Eingangswerte enthalten die Rueckgaben
>   
Sprachlich überzeugt diese Beschreibung nicht wirklich. *g*
> + *
> + * @param eax Pointer auf Werte fuer eax. Eingangswert: Level von CPUID
> + * @param ebx Pointer auf Rueckgabewert fuer ebx
> + * @param ecx Pointer auf Rueckgabewert fuer ecx
> + * @param edx Pointer auf Rueckgabewert fuer edx
> + */
> +void cpuid(dword* eax, dword* ebx, dword* ecx, dword* edx);
> +
> +/**
> + * Fragt CPUID Level 0 ab
> + *
> + * @see cpuid_0
> + * @return cpuid_0, enthaelt alle Infos von Level 0
> + */
> +cpuid_0 cpuid_level_0();
> +
> +/**
> + * Fragt CPUID Level 1 ab
> + *
> + * @see cpuid_1
> + * @return cpuid_1, enthaelt alle Infos von Level 1 (APIC Infos, Flags)
> + */
> +cpuid_1 cpuid_level_1();
> +
> +/**
> + * Fragt CPUID Extended Level 0 ab
> + *
> + * @see cpuid_e0
> + * @return cpuid_e0, enthaelt alle Infos von Extended Level 0 (aehnlich Level 0)
> + */
> +cpuid_e0 cpuid_level_e0();
> +
> +/**
> + * Fragt CPUID Extended Level 1 ab
> + *
> + * @see cpuid_e1
> + * @return cpuid_e1, enthaelt alle Infos von Extended Level 1 (Flags)
> + */
> +cpuid_e1 cpuid_level_e1();
> +
> +/**
> + * Fragt CPUID Extended Level 2 bis 4 ab
> + *
> + * @see cpuid_e2_e4
> + * @return cpuid_e2_e4, alle Infos dieser Level (den Processor Brand String)
> + */
> +cpuid_e2_e4 cpuid_level_e2_e4();
> +
> +// Flags Level 1 - EDX - Alle CPUs
> +
> +#define CPUID_FLAG_FPU 		( 1 << 0 )
>   
Nein, wir rücken noch immer mit 4 Leerschlägen ein. Ausserdem wäre es
meiner Meinung nach noch schön, wenn man den Makros ansehen würde, zu
welchem Level sie gehören
> +#define CPUID_FLAG_VME 		( 1 << 1 )
>   
...
> +
> +// Strings (zur Verwendung in der Ausgabe)
> +
> +extern char flags_01_edx[32][6];
> +extern char flags_01_ecx[32][6];
> +extern char flags_e01_ecx_amd[32][20];
> +extern char flags_e01_edx_amd[32][20];
> +
> +#endif
> Index: src/modules/sysinfo/cpuid.c
> ===================================================================
> --- src/modules/sysinfo/cpuid.c	(Revision 698)
> +++ src/modules/sysinfo/cpuid.c	(Arbeitskopie)
> @@ -1,12 +1,77 @@
> -#define _USE_START_
> -#include "init.h"
> +/*  
> + * Copyright (c) 2008 The LOST Project. All rights reserved.
> + *
> + * This code is derived from software contributed to the LOST Project
> + * by Alexander Siol.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *     This product includes software developed by the LOST Project
> + *     and its contributors.
> + * 4. Neither the name of the LOST Project nor the names of its
> + *    contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
> + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
> + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR 
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
> + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
> + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
> + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
> + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
> + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> + #include "types.h"
> +#include "syscall.h"
> +#include "stdlib.h"
>  #include "stdio.h"
> +#include "string.h"
>  
> -struct cpu {
> -    int MHZ;
> -};
> +#include "cpuid.h"
>  
> -bool cpuid_is()
> +#define DEBUG_MSG(s) printf("[ CPUID ] debug: %s() '%s'\n", __FUNCTION__, s)
> +
> +// Hier werden die Strings fuer die diversen Flags definiert
> +
> +// Basic Flags, auf allen Prozessoren identisch
> +char flags_01_edx[32][6] = { "fpu", "vme", "de", "pse", "tsc", "msr", "pae",
> +                                "mce", "cx8", "", "apic", "sep", "mtrr", "pge",
> +                                "mca", "cmov", "pat", "pse36", "psn", "clfl",
> +                                "", "dtes", "acpi", "mmx", "fxsr", "sse",
> +                                "sse2", "ss", "htt", "tm1", "ia-64", "pbe" };
> +char flags_01_ecx[32][6] = { "sse3", "", "", "mon", "dscpl", "vmx", "smx",
> +                                "est", "tm2", "ssse3", "cid", "", "", "cx16",
> +                                "etprd", "pdcm", "", "", "dca", "sse4.1",
> +                                "sse4.2", "x2apic", "", "popcnt", "", "", "",
> +                                "", "", "", "", "" };
>   
Hier müsstest du die neuen Zeilen meiner Meinung nach nicht soweit
einrücken. Einmal reicht da vollkommen. Dann braucht das ganze etwas
weniger Platz.
> +
> +// Extended Flags für AMD-Prozessoren - unterscheiden sich von denen von Intel
>   
Und mal wieder ein Umlaut. ;-)
> +char flags_e01_ecx_amd[32][20] = { "lahfsahf", "cmplegacy", "svm", "extapic",
> +                                    "altmovcr8", "abm", "sse4a", "misalignsse",
> +                                    "3dnowprefetch", "osvw", "", "", "skinit",
> +                                    "wdt" };
> +char flags_e01_edx_amd[32][20] = { "", "", "", "", "", "", "", "", "", "", "",
> +                                    "", "", "", "", "", "", "", "", "", "nx",
> +                                    "", "mmxext", "", "", "ffxsr", "page1gb",
> +                                    "rdtscp", "lm", "3dnowext", "3dnow" };
> +
> +/**
> + * Prueft ob CPUID vorhanden ist.
> + *
> + * @return true wenn cpuid funktioniert, sonst false
> + */
> +bool has_cpuid()
>  {
>      int result;
>      asm (
> @@ -24,26 +89,121 @@
>      return result;
>  }
>  
> +/**
> + * Macht einen Aufruf an CPUID. Die Eingangswerte enthalten die Rueckgaben
> + *
> + * @param eax Pointer auf Werte fuer eax. Eingangswert: Level von CPUID
> + * @param ebx Pointer auf Rueckgabewert fuer ebx
> + * @param ecx Pointer auf Rueckgabewert fuer ecx
> + * @param edx Pointer auf Rueckgabewert fuer edx
> + */
>   
Hm warum hast du eigentlich die ganzen Kommentare doppelt drin, im
Header und im Source? Glaubst du tatsächlich, dass die beide aktuell
gehalten werden? ;-)
Wenn ich wirklich einen Kommentar zu einer Funktion oder sonst was
machen will, nehme ich da die Kurzform für Doxygen-Kommentare, mit "///
". Und da beschreibe ich dann auch nur was die Funktion ungefähr macht.
Die Parameter kommen nicht rein.
>  void cpuid(dword* eax, dword* ebx, dword* ecx, dword* edx)
>  {
>      asm volatile("cpuid"
> -                : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
> -                : "a"(eax), "b"(ebx), "c"(ecx), "d"(edx));
> +                : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
> +                : "a"(*eax), "b"(*ebx), "c"(*ecx), "d"(*edx)
> +		);
>  }
>  
> -int main(int argc, char* argv[])
> +/**
> + * Fragt CPUID Level 0 ab
> + *
> + * @see cpuid_0
> + * @return cpuid_0, enthaelt alle Infos von Level 0
> + */
> +cpuid_0 cpuid_level_0()
>  {
> -    puts("|CPUID| Module loaded.\n");
> -    if(!cpuid_is())
> -    {
> -        puts("Sorry, der CPU unterstütz kein CPUID.\n");
> +    cpuid_0 result;
> +    result.max_level = 0;
> +    result.vendorID[12] = '\0';
> +    cpuid(&result.max_level,
> +            (dword*)(&result.vendorID[0]),
> +            (dword*)(&result.vendorID[8]),
> +            (dword*)(&result.vendorID[4]));
> +    return result;
> +}
> +
> +/**
> + * Fragt CPUID Level 1 ab
> + *
> + * @see cpuid_1
> + * @return cpuid_1, enthaelt alle Infos von Level 1 (APIC Infos, Flags)
> + */
> +cpuid_1 cpuid_level_1()
> +{
> +    cpuid_1 result;
> +    result.eax = 1;
> +    cpuid(&result.eax, &result.ebx, &result.ecx, &result.edx);
> +    return result;
> +}
> +
> +/**
> + * Fragt CPUID Extended Level 0 ab
> + *
> + * @see cpuid_e0
> + * @return cpuid_e0, enthaelt alle Infos von Extended Level 0 (aehnlich Level 0)
> + */
> +cpuid_e0 cpuid_level_e0() 
> +{
> +    cpuid_e0 result;
> +    result.max_level = 0x80000000;
> +    result.vendorID[12] = '\0';
> +    cpuid(&result.max_level,
> +            (dword*)(&result.vendorID[0]),
> +            (dword*)(&result.vendorID[8]),
> +            (dword*)(&result.vendorID[4]));
>   
Wenn das hier schon umgebrochen werden muss, dann wenigstens nicht
übetreiben mit dem Einrücken, einmal reicht doch. ;-)
> +    // Wenn eigentlich dieser Aufruf schon ungueltig war, (Level garnicht
>   
Das "eigentlich" da, könnte man doch eigentlich auch wegstreichen. ;-)
> +    // unterstuetzt) Maximalen Extended Level auf 0 setzen, um keine Zufaelligen
> +    // Werte zu hinterlassen.
> +    if (result.max_level < 0x8000000) {
> +        result.max_level = 0;
>      }
> -    else
> -    {
> -        puts("Yeah, der CPU unterstütz CPUID ;-).\n");
> -    }
> -    
> -    while(1) {
> -        wait_for_rpc();
> -    }
> +    return result;
>  }
> +
> +/**
> + * Fragt CPUID Extended Level 1 ab
> + *
> + * @see cpuid_e1
> + * @return cpuid_e1, enthaelt alle Infos von Extended Level 1 (Flags)
> + */
> +cpuid_e1 cpuid_level_e1()
> +{
> +    cpuid_e1 result;
> +    result.eax = 0x80000001;
> +    cpuid(&result.eax, &result.ebx, &result.ecx, &result.edx);
> +    return result;
> +}
> +
> +/**
> + * Fragt CPUID Extended Level 2 bis 4 ab
> + *
> + * @see cpuid_e2_e4
> + * @return cpuid_e2_e4, alle Infos dieser Level (den Processor Brand String)
> + */
>   
Warum nicht gleich eine Funktion für den brand string?
> +cpuid_e2_e4 cpuid_level_e2_e4()
> +{
> +    cpuid_e2_e4 result;
> +    result.eax = 0x80000002;
> +    cpuid(&result.eax,
> +            (dword*)(&result.proc_brand_string[0]),
> +            (dword*)(&result.proc_brand_string[4]),
> +            (dword*)(&result.proc_brand_string[8]));
> +    result.eax++;
> +    cpuid(&result.eax,
> +            (dword*)(&result.proc_brand_string[12]),
> +            (dword*)(&result.proc_brand_string[16]),
> +            (dword*)(&result.proc_brand_string[24]));
> +    result.eax++;
> +    cpuid(&result.eax,
> +            (dword*)(&result.proc_brand_string[28]),
> +            (dword*)(&result.proc_brand_string[32]),
> +            (dword*)(&result.proc_brand_string[36]));
> +    result.eax++;
> +    cpuid(&result.eax,
> +            (dword*)(&result.proc_brand_string[40]),
> +            (dword*)(&result.proc_brand_string[44]),
> +            (dword*)(&result.proc_brand_string[48]));
> +    result.proc_brand_string[49] = '\0';
> +    return result;
> +}
>
> Eigenschaftsänderungen: src/modules/sysinfo/cpuid.c
> ___________________________________________________________________
> Name: svn:executable
>    - *
>   
Hm hast du das noch immer nicht weg gekriegt?
> Index: src/modules/sysinfo/sysinfo.c
> ===================================================================
> --- src/modules/sysinfo/sysinfo.c	(Revision 0)
> +++ src/modules/sysinfo/sysinfo.c	(Revision 0)
> @@ -0,0 +1,158 @@
> +/*  
> + * Copyright (c) 2008 The LOST Project. All rights reserved.
> + *
> + * This code is derived from software contributed to the LOST Project
> + * by Alexander Siol.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. All advertising materials mentioning features or use of this software
> + *    must display the following acknowledgement:
> + *     This product includes software developed by the LOST Project
> + *     and its contributors.
> + * 4. Neither the name of the LOST Project nor the names of its
> + *    contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
> + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
> + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR 
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
> + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
> + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
> + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
> + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
> + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include "stdio.h"
> +#include "types.h"
> +#include "stdlib.h"
> +#include "lostio.h"
> +#include "string.h"
> +
> +#include "cpuid.h"
> +
> +#define _USE_START_
> +#include "init.h"
> +
> +
> +/**
> + * Legt /cpu im vfstree an, und fuellt die Datei mit Inhalt.
> + */
> +void sysinfo_create_cpuid_file()
> +{
> +    char filename[] = "/cpu";
> +    char *content = malloc(4096);
>   
Ich mag den Stern lieber beim Typen, da macht er meiner Meinung nach
mehr Sinn.
> +    int size;
> +    
> +    cpuid_0 basic;
> +    cpuid_1 basic_flags;
> +    cpuid_e0 extended;
> +    cpuid_e1 extended_flags;
> +    cpuid_e2_e4 brand;
> +    
> +    // Alle Infos via cpuid abfragen
> +    basic = cpuid_level_0();
> +    basic_flags = cpuid_level_1();
> +    extended = cpuid_level_e0();
> +    extended_flags = cpuid_level_e1();
> +    brand = cpuid_level_e2_e4();
> +
> +    // Wenn der extended level 0x8000004 garnicht unterstuetzt ist, ist auch der
> +    // processorBrandString ungueltig. Dieser ist dann zu ueberschreiben, um den
> +    // Benutzer nicht mit einer leeren (oder gar zufälligen) ausgabe zu
>   
Umlaut
> +    // konfrontieren.
> +    if (extended.max_level < 0x80000004) {
> +        sprintf((char*)&brand.proc_brand_string,"Unsupported.\0");
> +    }
> +  
> +    // Infoblock schreiben.
> +    size = sprintf(content, "%s: %s\n%s: %s\n%s: %i\n%s: 0x%#08X\n%s:", 
> +    				"VendorID",  basic.vendorID, 
> +                    "Brand Name", brand.proc_brand_string, 
> +                    "Standardlevel", basic.max_level, 
> +                    "Erweitertes Level", extended.max_level, 
> +                    "Flags");
>   
Auch hier wieder die Einrückerei...
> +
> +    // Die Diversen Flags ausgeben
> +    int i = 0;
> +
> +    // Basic Flags Register EDX überpruefen
>   
Umlaut
> +    for (i = 0; i < 32; i++) {
> +        if ((basic_flags.edx & (1 << i)) == (1 << i)) {
> +            size += sprintf(content+size, " %s", flags_01_edx[i]);
> +        }
> +    }
> +
> +    // Basic Flags Register ECX überpruefen
>   
Nochmal
> +    for (i = 0; i < 32; i++) {
> +        if ((basic_flags.ecx & (1 << i)) == (1 << i)) {
> +            size += sprintf(content+size, " %s", flags_01_ecx[i]);
> +        }
> +    } 
> +
> +    // Extended Flags abfragen
> +
> +    // Extended Flags von AMD
> +    if (strncmp(basic.vendorID,"AuthenticAMD",12) == 0) {
> +        // Register EDX
> +        for (i = 0; i < 32; i++) {
> +            if ((extended_flags.edx & (1 << i)) == (1 << i)) {
> +                size += sprintf(content+size, " %s", flags_e01_edx_amd[i]);
> +            }
> +        } 
> +
> +        // Register ECX
> +        for (i = 0; i < 32; i++) {
> +            if ((extended_flags.ecx & (1 << i)) == (1 << i)) {
> +                size += sprintf(content+size, " %s", flags_e01_ecx_amd[i]);
> +            }
> +        }
> +    } 
> +
> +    // Neue Linie als Dateiende
>   
Zeile ist irgendwie schon schöner. ;-)
> +    size += sprintf(content+size,"\n");
> +
> +    // Datei registrieren, Groeße ist Laenge aller geschriebenen Daten.
>   
Und ein weiterer Umlaut.
> +    vfstree_create_node(filename, LOSTIO_TYPES_RAMFILE, size, content, 0);
> +}
> +
> +/**
> + * main von sysinfo. Initialisiert LostIO und exportiert alle vorhandenen
> + * Systeminfos nach aussen.
> + *
> + * @param argc Argumentzaehler. Hier Irrelevant.
> + * @param argv Argumente. Hier Irrelevant.
> + * @return Beendigungsstatus des Moduls.
> + */
> +int main(int argc, char* argv[])
> +{
> +    // LostIO initialisieren
> +    lostio_init();
> +
> +    // LostIO Standardtypen einbinden
> +    lostio_type_ramfile_use();
> +    lostio_type_directory_use();
> +
> +    // /cpu anlegen - enthaelt Infos ueber die CPU, Basis hierfuer ist cpuid.c
> +    sysinfo_create_cpuid_file();
> +
> +    // Letztendlich bei Init registrieren
> +    init_service_register("sysinfo");
> +
> +    // Warteschleife
> +    while(1) {
> +        wait_for_rpc();
> +    }
> +
> +    return 0;
> +}
>   
> ------------------------------------------------------------------------
So ich hoffe ich habe nichts gravierendes übersehen. ;-)

Im Vergleich zu console ist dieser Code schon viel angenehmer zu lesen.