[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.