aux/cpuid: hack for amd64
This commit is contained in:
parent
2c5c784255
commit
152c9d525b
|
@ -11,17 +11,26 @@ typedef struct Res {
|
||||||
Biobuf *out;
|
Biobuf *out;
|
||||||
|
|
||||||
uchar _cpuid[] = {
|
uchar _cpuid[] = {
|
||||||
0x8B, 0x44, 0x24, 0x08, /* MOV 8(SP), AX */
|
0x5E, /* POP SI (PC) */
|
||||||
|
0x5D, /* POP BP (Res&) */
|
||||||
|
0x58, /* POP AX */
|
||||||
|
0x59, /* POP CX */
|
||||||
|
|
||||||
|
0x51, /* PUSH CX */
|
||||||
|
0x50, /* PUSH AX */
|
||||||
|
0x55, /* PUSH BP */
|
||||||
|
0x56, /* PUSH SI */
|
||||||
|
|
||||||
0x31, 0xDB, /* XOR BX, BX */
|
0x31, 0xDB, /* XOR BX, BX */
|
||||||
0x8B, 0x4C, 0x24, 0x0C, /* MOV 12(SP), CX */
|
|
||||||
0x31, 0xD2, /* XOR DX, DX */
|
0x31, 0xD2, /* XOR DX, DX */
|
||||||
|
|
||||||
0x0F, 0xA2, /* CPUID */
|
0x0F, 0xA2, /* CPUID */
|
||||||
0x8B, 0x7C, 0x24, 0x04, /* MOV 4(SP), DI */
|
|
||||||
0x89, 0x07, /* MOV AX, (DI) */
|
0x89, 0x45, 0x00, /* MOV AX, 0(BP) */
|
||||||
0x89, 0x5F, 0x04, /* MOV BX, 4(DI) */
|
0x89, 0x5d, 0x04, /* MOV BX, 4(BP) */
|
||||||
0x89, 0x4F, 0x08, /* MOV CX, 8(DI) */
|
0x89, 0x4d, 0x08, /* MOV CX, 8(BP) */
|
||||||
0x89, 0x57, 0x0C, /* MOV DX, 12(DI) */
|
0x89, 0x55, 0x0C, /* MOV DX, 12(BP) */
|
||||||
0xC3 /* RET */
|
0xC3, /* RET */
|
||||||
};
|
};
|
||||||
|
|
||||||
Res (*cpuid)(ulong ax, ulong cx) = (Res(*)(ulong, ulong)) _cpuid;
|
Res (*cpuid)(ulong ax, ulong cx) = (Res(*)(ulong, ulong)) _cpuid;
|
||||||
|
@ -215,10 +224,18 @@ main(int argc, char **argv)
|
||||||
case 'a': aflag++; break;
|
case 'a': aflag++; break;
|
||||||
} ARGEND;
|
} ARGEND;
|
||||||
notify(notehand);
|
notify(notehand);
|
||||||
w = *(ulong *)0x1000;
|
/* first long in a.out header */
|
||||||
|
w = *(ulong *)(((uintptr)main)&~0xfff);
|
||||||
notify(nil);
|
notify(nil);
|
||||||
if(w != 0xeb010000)
|
switch(w){
|
||||||
|
default:
|
||||||
sysfatal(Egreg);
|
sysfatal(Egreg);
|
||||||
|
case 0x978a0000: /* amd64 */
|
||||||
|
/* patch out POP BP -> POP AX */
|
||||||
|
_cpuid[1] = 0x58;
|
||||||
|
case 0xeb010000: /* 386 */
|
||||||
|
break;
|
||||||
|
}
|
||||||
Binit(&buf, 1, OWRITE);
|
Binit(&buf, 1, OWRITE);
|
||||||
out = &buf;
|
out = &buf;
|
||||||
r = cpuid(0, 0);
|
r = cpuid(0, 0);
|
||||||
|
|
Loading…
Reference in a new issue