2007-04-02 16:05:16 +02:00
|
|
|
#include "types.h"
|
|
|
|
#include "cpu.h"
|
|
|
|
#include "cpuid.h"
|
|
|
|
#include "memory.h"
|
|
|
|
#include "string.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static u8 *msg[] =
|
2018-07-24 04:04:07 +02:00
|
|
|
{
|
2007-04-02 16:05:16 +02:00
|
|
|
"mmx",
|
|
|
|
"mmx2",
|
|
|
|
"sse",
|
|
|
|
"sse2",
|
|
|
|
"sse3",
|
|
|
|
"fpu",
|
|
|
|
"3dNow!",
|
|
|
|
"3dNow Extended!",
|
|
|
|
"HyperThreading",
|
|
|
|
"apic",
|
2018-07-24 04:04:07 +02:00
|
|
|
};
|
2007-04-02 16:05:16 +02:00
|
|
|
|
|
|
|
static u8 space[]=" ";
|
|
|
|
|
2018-07-24 04:04:07 +02:00
|
|
|
bool cansetflag (u32 flag)
|
2007-04-02 16:05:16 +02:00
|
|
|
{
|
2018-07-24 04:04:07 +02:00
|
|
|
u32 r1, r2;
|
|
|
|
asm("pushfl\n"
|
|
|
|
"popl %0\n"
|
|
|
|
"movl %0, %1\n"
|
|
|
|
"xorl %2, %0\n"
|
|
|
|
"pushl %0\n"
|
|
|
|
"popfl\n"
|
|
|
|
"pushfl\n"
|
|
|
|
"popl %0\n"
|
|
|
|
"pushl %1\n"
|
|
|
|
"popfl\n"
|
|
|
|
: "=&r" (r1), "=&r" (r2)
|
|
|
|
: "ir" (flag)
|
|
|
|
);
|
|
|
|
return ((r1 ^ r2) & flag) != 0;
|
|
|
|
}
|
2007-04-02 16:05:16 +02:00
|
|
|
|
2018-07-24 04:04:07 +02:00
|
|
|
void cpuid(u32 op, u32 *eax, u32 *ebx,u32 *ecx, u32 *edx)
|
|
|
|
{
|
|
|
|
asm("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc");
|
2007-04-02 16:05:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
u8 getcpuinfos(cpuinfo *proc)
|
|
|
|
{
|
|
|
|
u32 i,maxfunction,maxextended,unused,regeax,regebx,regecx,regedx;
|
|
|
|
bool *boolean;
|
|
|
|
|
|
|
|
if (!cansetflag (0x00040000)) return 1; /*386 processor - no cpuid*/
|
|
|
|
if (!cansetflag (0x00200000)) return 2; /*486 processor with no cpuid*/
|
|
|
|
|
2018-07-24 04:04:07 +02:00
|
|
|
cpuid(0, &maxfunction, &unused, &unused, &unused);
|
|
|
|
maxfunction &= 0xffff;
|
|
|
|
cpuid(0x80000000, &maxextended, &unused, &unused, &unused);
|
|
|
|
maxextended &= 0xffff;
|
|
|
|
if (maxfunction >= 1)
|
|
|
|
{
|
|
|
|
cpuid(1, ®eax, ®ebx, ®ecx, ®edx);
|
|
|
|
proc->stepping = (regeax & 0x0000000F);
|
|
|
|
proc->models = ((regeax>>4) & 0x0000000F);
|
|
|
|
proc->family = ((regeax>>8) & 0x0000000F);
|
|
|
|
proc->types = ((regeax>>12) & 0x00000003);
|
|
|
|
proc->emodels = ((regeax>>16) & 0x0000000F);
|
|
|
|
proc->efamily = ((regeax>>20) & 0x000000FF);
|
2007-04-02 16:05:16 +02:00
|
|
|
|
2018-07-24 04:04:07 +02:00
|
|
|
proc->brandid = (regeax & 0xF);
|
|
|
|
proc->linesize = ((regeax>>8) & 0xF);
|
|
|
|
proc->count = ((regeax>>16) & 0xF);
|
|
|
|
proc->apicid = ((regeax>>24) & 0xF);
|
2007-04-02 16:05:16 +02:00
|
|
|
|
2018-07-24 04:04:07 +02:00
|
|
|
proc->mmx=((regedx>>23) & 0x00000001);
|
|
|
|
proc->sse=((regedx>>25) & 0x00000001);
|
|
|
|
proc->sse2=((regedx>>26) & 0x00000001);
|
|
|
|
proc->sse3=(regecx & 0x00000001);
|
|
|
|
proc->fpu=(regedx & 0x00000001);
|
|
|
|
proc->htt=((regedx>>28) & 0x00000001);
|
|
|
|
|
|
|
|
}
|
|
|
|
if (maxextended >= 1)
|
|
|
|
{
|
|
|
|
cpuid(0x80000001, ®eax, ®ebx, ®ecx, ®edx);
|
|
|
|
proc->mmx2=((regedx>>22) & 0x00000001);
|
|
|
|
proc->apic=((regedx>>9) & 0x00000001);
|
|
|
|
proc->now3d=((regedx>>30) & 0x00000001);
|
|
|
|
proc->now3d2=((regedx>>31) & 0x00000001);
|
|
|
|
}
|
|
|
|
if (maxextended >= 4)
|
|
|
|
{
|
2007-04-02 16:05:16 +02:00
|
|
|
int i;
|
|
|
|
for(i=0;i<3;i++)
|
2018-07-24 04:04:07 +02:00
|
|
|
{
|
|
|
|
cpuid(0x80000002+i, ®eax, ®ebx, ®ecx, ®edx);
|
|
|
|
memcpy(®eax,&proc->detectedname[0+i*16],4,1);
|
|
|
|
memcpy(®ebx,&proc->detectedname[4+i*16],4,1);
|
|
|
|
memcpy(®ecx,&proc->detectedname[8+i*16],4,1);
|
|
|
|
memcpy(®edx,&proc->detectedname[12+i*16],4,1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
boolean=&proc->mmx;
|
|
|
|
i=0;
|
|
|
|
|
|
|
|
for(i=0;i<10;i++)
|
|
|
|
if (*(boolean++)==1)
|
|
|
|
{
|
|
|
|
strcat(msg[i],&proc->techs);
|
|
|
|
strcat(space,&proc->techs);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 viewstack(u32 number)
|
2007-04-02 16:05:16 +02:00
|
|
|
{
|
2018-07-24 04:04:07 +02:00
|
|
|
u32 stack = 0;
|
|
|
|
asm (
|
|
|
|
"movl %[a1],%%esi;"
|
|
|
|
"addl %%esp,%%esi;"
|
|
|
|
"movl (%%esi), %[a1] ;"
|
|
|
|
:[result] "=r" (stack)
|
|
|
|
:[a1] "r" (number)
|
|
|
|
:"%esi"
|
|
|
|
);
|
|
|
|
return stack;
|
2007-04-02 16:05:16 +02:00
|
|
|
}
|
2018-07-24 04:04:07 +02:00
|
|
|
|
|
|
|
void dump_regs()
|
|
|
|
{
|
|
|
|
u32 eax = 0;
|
|
|
|
u32 ebx = 0;
|
|
|
|
u32 ecx = 0;
|
|
|
|
u32 edx = 0;
|
|
|
|
u32 esi = 0;
|
|
|
|
u32 edi = 0;
|
|
|
|
u32 ebp = 0;
|
|
|
|
u32 esp = 0;
|
|
|
|
u16 cs = 0;
|
|
|
|
u16 ds = 0;
|
|
|
|
u16 es = 0;
|
|
|
|
u16 fs = 0;
|
|
|
|
u16 gs = 0;
|
|
|
|
u16 ss = 0;
|
|
|
|
u32 flags = 0;
|
|
|
|
asm (
|
|
|
|
"movl %%eax, %[a1] ;"
|
|
|
|
"movl %%ebx, %[b1] ;"
|
|
|
|
"movl %%ecx, %[c1] ;"
|
|
|
|
"movl %%edx, %[d1] ;"
|
|
|
|
"movl %%esi, %[e1] ;"
|
|
|
|
"movl %%edi, %[f1] ;"
|
|
|
|
"movl %%esp, %[g1] ;"
|
|
|
|
"movl %%ebp, %[h1] ;"
|
|
|
|
"movw %%cs, %[i1] ;"
|
|
|
|
"movw %%ds, %[j1] ;"
|
|
|
|
"movw %%es, %[k1] ;"
|
|
|
|
"movw %%fs, %[l1] ;"
|
|
|
|
"movw %%gs, %[m1] ;"
|
|
|
|
"movw %%ss, %[n1] ;"
|
|
|
|
:
|
|
|
|
[a1] "=m" (eax), [b1] "=m" (ebx), [c1] "=m" (ecx), [d1] "=m" (edx), [e1] "=m" (esi), [f1] "=m" (edi),
|
|
|
|
[g1] "=m" (ebp), [h1] "=m" (esp), [i1] "=m" (cs), [j1] "=m" (ds), [k1] "=m" (es), [l1] "=m" (fs), [m1] "=m" (gs), [n1] "=m" (ss)
|
|
|
|
);
|
|
|
|
|
|
|
|
printf("eax=%x ebx=%x ecx=%x eax=%x\r\n", eax,ebx,ecx,edx);
|
|
|
|
printf("esi=%x edi=%x\r\n", esi,edi);
|
|
|
|
printf("cs=%x ds=%x es=%x fs=%x gs=%x\r\n", cs,ds,es,fs,gs);
|
|
|
|
printf("ss=%x esp=%x ebp=%x\r\n",ss,esp,ebp);
|
|
|
|
|
|
|
|
asm (
|
|
|
|
"pushf ;"
|
|
|
|
"pop %[f1] ;"
|
|
|
|
:
|
|
|
|
[f1] "=m" (flags)
|
|
|
|
);
|
|
|
|
|
|
|
|
printf("FLAGS");
|
|
|
|
|
|
|
|
if(flags & (1 << 0)) // Carry
|
|
|
|
printf(" (C1");
|
|
|
|
else
|
|
|
|
printf(" (C0");
|
|
|
|
|
|
|
|
if(flags & (1 << 2)) // Parity
|
|
|
|
printf(" P1");
|
|
|
|
else
|
|
|
|
printf(" P0");
|
|
|
|
|
|
|
|
if(flags & (1 << 4)) // Adjust
|
|
|
|
printf(" A1");
|
|
|
|
else
|
|
|
|
printf(" A0");
|
|
|
|
|
|
|
|
if(flags & (1 << 6)) // Zero
|
|
|
|
printf(" Z1");
|
|
|
|
else
|
|
|
|
printf(" Z0");
|
|
|
|
|
|
|
|
if(flags & (1 << 7)) // Sign
|
|
|
|
printf(" S1");
|
|
|
|
else
|
|
|
|
printf(" S0");
|
|
|
|
|
|
|
|
if(flags & (1 << 11)) // Overflow
|
|
|
|
printf(" O1)\n");
|
|
|
|
else
|
|
|
|
printf(" O0)\n");
|
|
|
|
|
|
|
|
printf("STACK\r\n");
|
|
|
|
for(u8 i=0;i<25;i++)
|
|
|
|
printf("+%d\t\t%x\r\n",i,viewstack(i*4));
|
|
|
|
|
|
|
|
|
2007-04-02 16:05:16 +02:00
|
|
|
}
|
|
|
|
|