some debug messages related to timing
This commit is contained in:
parent
8f69e58165
commit
4f452ce015
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user