some debug messages related to timing

This commit is contained in:
cheat-engine 2019-07-17 00:52:50 +02:00
parent 8f69e58165
commit 4f452ce015
3 changed files with 157 additions and 6 deletions

View File

@ -20,6 +20,58 @@ brk:
ret
global timeCheck
timeCheck:
;rdi is a pointer to an array of 5 qwords
sub rsp,64+8
mov [rsp+0],r8
mov [rsp+0x08],r9
mov [rsp+0x10],r10
mov [rsp+0x18],r11
mov [rsp+0x20],r12
rdtsc
mov r8d,edx
shl r8,32
or r8d,eax
rdtsc
mov r9d,edx
shl r9,32
or r9d,eax
rdtsc
mov r10d,edx
shl r10,32
or r10d,eax
rdtsc
mov r11d,edx
shl r11,32
or r11d,eax
rdtsc
mov r12d,edx
shl r12,32
mov r12d,eax
mov [rdi],r8
mov [rdi+0x8],r9
mov [rdi+0x10],r10
mov [rdi+0x18],r11
mov [rdi+0x20],r12
mov r8,[rsp+0]
mov r9,[rsp+0x08]
mov r10,[rsp+0x10]
mov r11,[rsp+0x18]
mov r12,[rsp+0x20]
add rsp,64+8
ret
global readMSR
readMSR:
xchg ecx,edi
@ -29,6 +81,25 @@ readMSR:
xchg ecx,edi
ret
global writeMSR
writeMSR:
xchg ecx,edi
mov eax,esi
mov rdx,rsi
shr rdx,32
wrmsr ;write edx:eax into ecx
xchg ecx,edi
ret
global setCR0
setCR0:
mov cr0,rdi
ret
global getCR0
getCR0:
mov rax,cr0
@ -218,6 +289,16 @@ getR15:
mov rax,r15
ret
GLOBAL getTSC
getTSC:
xor rax,rax
xor rdx,rdx
rdtsc
shl rdx,32
or rax,rdx
ret
GLOBAL getAccessRights
getAccessRights:
xor rax,rax

View File

@ -83,9 +83,11 @@ extern int testfunction(void);
extern int brk(void);
extern unsigned long long readMSR(int msr);
extern void writeMSR(int msr, unsigned long long value);
VOID *AllocatePersistentMemory(int size);
EFI_STATUS AllocatePages(IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN NoPages, OUT EFI_PHYSICAL_ADDRESS *Memory );
extern void setCR0(UINT64 newcr0);
extern UINT64 getCR0(void);
extern UINT64 getCR2(void);
extern UINT64 getCR3(void);
@ -137,6 +139,9 @@ extern void disableInterrupts(void);
extern void enableInterrupts(void);
extern UINT64 dovmcall(void *vmcallinfo, unsigned int level1pass);
extern UINT64 getTSC(void);
extern void timeCheck(UINT64 *arr);
extern UINTN cpucount;

View File

@ -125,14 +125,33 @@ inline uint64_t rdmsr(uint32_t msr_id)
EFIAPI VOID FunctionX (IN VOID *Buffer)
{
Print(L"AP CPU %d: I am alive\n", (int)Buffer);
UINT64 t1,t2,t3, a;
t1=getTSC();
t2=readMSR(0x10);
t3=getTSC();
a=readMSR(0x3b);
Print(L"AP CPU %d:\n\t%ld - %ld - %ld\n\tAdjust:%ld\n", (int)Buffer, t1,t2,t3, a);
writeMSR(0x3b,-getTSC());
t1=getTSC();
t2=readMSR(0x10);
t3=getTSC();
a=readMSR(0x3b);
Print(L"AP CPU %d:\n\t%ld - %ld - %ld\n\tAdjust:%ld\n", (int)Buffer, t1,t2,t3, a);
}
EFIAPI VOID LaunchDBVMAP (IN VOID *Buffer)
{
writeMSR(0x3b,0);
Print(L"AP CPU %d entering DBVM mode\n", (int)Buffer);
Print(L"CR0 before = 0x%lx\n", getCR0());
LaunchDBVM();
Print(L"CR0 after = 0x%lx\n", getCR0());
Print(L"AP CPU %d is alive\n", (int)Buffer);
}
@ -152,23 +171,56 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
InitializeLib(ImageHandle, SystemTable);
initFunctions(ImageHandle, SystemTable);
UINT64 tx[5];
Print(L"efi_main at %lx\n",(UINT64)efi_main);
FunctionX(NULL);
tx[0]=0;
tx[1]=0;
tx[2]=0;
tx[3]=0;
tx[4]=0;
timeCheck(tx);
{
int i;
for (i=0; i<5; i++)
{
int delta;
if (i>0)
{
delta=tx[i]-tx[i-1];
Print(L"tx[%d]=%ld (delta=%d)\n", i, tx[i], delta);
}
else
Print(L"tx[%d]=%ld\n", i, tx[i]);
}
int avg=(tx[4]-tx[0]) / 5;
Print(L"Avg time=%d\n", avg);
}
Input(L"Type something : ", something, 200);
EFI_MP_SERVICES_PROTOCOL *MpProto=NULL;
EFI_GUID z=EFI_MP_SERVICES_PROTOCOL_GUID;
s=LocateProtocol(&z, NULL, (void *)&MpProto);
if(EFI_ERROR(s)){Print(L"Unable to locate the MpService procotol:%r\n",s);}
if(EFI_ERROR(s)){Print(L"Unable to locate the MpService protocol:%r\n",s);}
Print(L"MpProto=%lx\n", (UINT64)MpProto);
if (MpProto)
{
UINTN NumProc, NumEnabled;
UINTN NumEnabled;
//s=uefi_call_wrapper(MpProto->GetNumberOfProcessors,3,MpProto,&NumProc,&NumEnabled);
s=MpProto->GetNumberOfProcessors(MpProto,&cpucount,&NumEnabled);
@ -342,11 +394,24 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
if (StrnCmp(something,L"Q",2)!=0)
{
Print(L"launching DBVM\n");
writeMSR(0x3b,0);
setCR0(getCR0() | (1 << 5));
Print(L"WEEE\n");
Print(L"CR0 before = 0x%lx\n", getCR0());
LaunchDBVM();
Print(L"CR0 after = 0x%lx\n", getCR0());
Print(L"Main DBVM CPU loaded. Loading AP cpu\'s:");
Input(L"Type something : ", something, 200);
int i;
//cpucount=1; //test while I fix something
for (i=1; i<cpucount; i++)
{
s=MpProto->StartupThisAP(MpProto, LaunchDBVMAP,i,NULL,0,(void*)(uintptr_t)i,NULL);