Hello Levente,

You wrote:
I have a similar hack to check if the cpu is 64 or 32 bits. Let me know if 
someone needs it.
Please send it.

cheers,
-a
Since there are some people who are interested in them I provide my little
monstrosities. I do it in the good faith that if someone finds them useful,
he will work on them and turn them into something neat that is consistent with
ipxe code base (which is a remarkably well organized piece of software).

A few words of warning concerning these *hacks* (since that's what they are,
don't be mistaken):
-local hdd count: Don't be surprised if your usb sticks (sdcards, whatever) are counted as hdds. Standard PC-BIOS puts the number of devices it considers 'hdd's at 0x00000475. Now, BIOSes tend to list usb mass storage devices as hard drives. To my knowledge there is no standard api in PC-BIOS that is implemented at least by a reasonable number of BIOSes that lets one read hardware information on hdds (otherwise perfectly
 well known to the BIOS).
-32/64 bitness: Please be warned that the code below works only on ia32/amd64 cpus from about Pentium onwards (I think). Other x86 cpus (286,386 or 486) will probably crash on this code. If somebody takes the time to implement a proper ipxe setting please follow the (lengthy and painful) procedure in the Intel docs according to the
 rules of chivalry.

Below is the recipie for the 'iscpu64' stuff:
In the file src/core/main.c:

-add  the include
#include <realmode.h>

-add these variables in main() to the variable declarations:
    unsigned long  is_cpu_64bit;
    char        sname[32];
    char        sval[32];

-still in main() search for the call to initialise() and startup(), and
 put this code after them:

    //this is a bit loose here,
    //we assume cpuid works (i.e. we have pentium or newer cpu)
    is_cpu_64bit = 0xbabeface;
    __asm__ __volatile__ ( "push %%ebx\n\t"
                   "movl $0x80000000,%%eax\n\t"
                   "cpuid\n\t"
                   "cmpl $0x80000001,%%eax\n\t"
                   "jb 1f\n\t"
                   "movl $0x80000001,%%eax\n\t"
                   "cpuid\n\t"
                   "andl $0x20000000,%%edx\n\t"
                   "jmp 2f\n\t"
                   "\n1:\n\t"
                   "xorl %%edx,%%edx\n\t"
                   "\n2:\n\t"
                   "pop %%ebx\n\t"
                  : "=d" ( is_cpu_64bit )
                  :
                  : "eax", "ecx" );
    memset ( sname, 0, sizeof ( sname ) );
    strncpy ( sname, "iscpu64", sizeof ( sname ) - 1 );
    memset ( sval, 0, sizeof ( sval ) );
    sval[0] = ( is_cpu_64bit ) ? '1' : '0';
    storef_named_setting ( sname, sval );

/levente
_______________________________________________
ipxe-devel mailing list
[email protected]
https://lists.ipxe.org/mailman/listinfo/ipxe-devel

Reply via email to