|
▼tsukasamさん:
>その後のさらなる改造で多段のVID変更要求でも自身で1段ずつ変更できるようになりました。ただし20ms/段の時間を必要とします。20ms/段ってのは長すぎだろーって自分でも思ってますが、確実に動作させたかったのでとりあえず。
>それで、3.3.7.152の LoveHammer()の case 7:の倍率上げ時の P->SysInfo->SetData(LH_SET_FID, FID); の直前に、if(flag){Sleep((vid-VID)*20);} をつっこみました。
先ほどはなるほどと思ったのですが、電圧の変更は CpuInfo.cpp の SetData で呼び出した先で行っており、SetData を呼び出す直前にスリープしても特に意味はありません。詳細は CpuInfo.cpp ですが、一部を抜粋すると
{
if( data == 15 || data == 31 ){
break;
}
DWORD count = 32;
while( count-- ){
DWORD CurrentVID = 0;
DWORD NextVID = 0;
ReadMSR(0xC0010042,&EAX,&EDX);
CurrentVID = EDX & 0x1F;
if(data > CurrentVID){
NextVID = CurrentVID + 1;
if( NextVID == 15 ){
NextVID++;
}
}else if(data < CurrentVID){
NextVID = CurrentVID - 1;
if( NextVID == 15 ){
NextVID--;
}
}else{
break;
}
if( NextVID == 31 || NextVID < 0 || NextVID > 31 ){
break;
}
ReadMSR(0xC0010041,&EAX,&EDX);
EAX &= 0xFFFFE0FF;
EAX |= 0x00020000; // Set bit 17 (VID)
EAX &= 0xFFFEFFFF; // Clear bit 16 (FID)
EDX = 0x64; // Allow minimum 100 ms settling time
EAX |= ( NextVID << 8 );
WriteMSR(0xC0010041,&EAX,&EDX);
do{
ReadMSR(0xC0010042,&EAX,&EDX);
}while( (EAX >> 31) & 0x1 );
}
}
って感じです。一段階の電圧を変化させる度に、
do{
ReadMSR(0xC0010042,&EAX,&EDX);
}while( (EAX >> 31) & 0x1 );
で電圧が安定するのを待っています。(詳細は BIOS & Kernel Developer's Manual 参照)
多段階電圧変更を一段ずつ行うようになったのは SysInfo.dll 148 からなので、それ以前のバージョンに比べると一部の環境で安定度が増したと思われます。
|
|