📄 oeminit.c
字号:
{
mov dx, 0cf8h
mov eax, PCIAddr
out dx, eax
mov dx, 0cfch
mov eax, 2000h
out dx, eax
}
PCIAddr += 0x60;
__asm
{
mov dx, 0cf8h
mov eax, PCIAddr
out dx, eax
mov dx, 0cfch
in eax, dx
and ax, 0fffeh
mov usUSBIoBase, ax
mov dx, ax
xor ax, ax
out dx, ax
}
for ( i = 0; i < 0x1000; i++)
{
__asm
{
mov ax, usUSBIoBase
add ax, 2
mov dx, ax
in ax, dx
mov usUSBStatus, ax
out dx, ax
}
if (usUSBStatus & 0x20)
break;
}
DEBUGMSG(1, (TEXT("VIA USB2 IoBase %x\r\n"), usUSBIoBase));
DEBUGMSG(1, (TEXT("VIA USB Status %x, Loop %d\r\n"), usUSBStatus, i));
PCIAddr += 0xa0;
__asm
{
mov dx, 0cf8h
mov eax, PCIAddr
out dx, eax
mov dx, 0cfch
mov eax, 2000h
out dx, eax
}
// Check 8235
PCIAddr += 0x100;
PCIAddr -= 0xc0;
__asm
{
mov dx, 0cf8h
mov eax, PCIAddr
out dx, eax
mov dx, 0cfch
in eax, dx
mov PCIData, eax
}
if (PCIData==0x30381106)
{
// For VT8235
PCIAddr += 0x20;
__asm
{
mov dx, 0cf8h
mov eax, PCIAddr
out dx, eax
mov dx, 0cfch
in eax, dx
and ax, 0fffeh
mov usUSBIoBase, ax
mov dx, ax
xor ax, ax
out dx, ax
}
for ( i = 0; i < 0x1000; i++)
{
__asm
{
mov ax, usUSBIoBase
add ax, 2
mov dx, ax
in ax, dx
mov usUSBStatus, ax
out dx, ax
}
if (usUSBStatus & 0x20)
break;
}
DEBUGMSG(1, (TEXT("VIA USB3 IoBase %x\r\n"), usUSBIoBase));
DEBUGMSG(1, (TEXT("VIA USB Status %x, Loop %d\r\n"), usUSBStatus, i));
PCIAddr += 0xa0;
__asm
{
mov dx, 0cf8h
mov eax, PCIAddr
out dx, eax
mov dx, 0cfch
mov eax, 2000h
out dx, eax
}
}
bUHCI = TRUE;
break;
}
}
if (bUHCI)
break;
}
if (bUHCI)
break;
}
CheckC5XL();
// initialize memory (detect extra ram, MTRR/PAT etc.)
x86InitMemory ();
// initialize pKDIoControl is hardware debugging is supported
if (g_fSupportHwDbg) {
pKDIoControl = OEMKDIoControl;
}
// Reserve 128kB memory for Watson Dumps
dwNKDrWatsonSize = (128 * 1024);
x86InitRomChain();
// Add two Lines, VIA PowerSaver
RETAILMSG(1, (TEXT("VIA PowerSaver: %s, %s"),TEXT(__DATE__), TEXT(__TIME__)));
CheckCPU( );
#ifdef DEBUG
lpWriteDebugStringFunc(TEXT("Firmware Init Done.\r\n"));
#endif
}
BOOL x86IoCtlPostInit (
UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf,
UINT32 nOutBufSize, UINT32 *lpBytesReturned
) {
// Critical sections to be initialized
extern CRITICAL_SECTION RTC_critsect;
// Initialize critical sections
InitializeCriticalSection(&RTC_critsect);
g_fPostInit = TRUE;
return TRUE;
}
#include "pehdr.h"
#include "romldr.h"
#include "romxip.h"
/*
Initialize the rom chain
*/
#define NOT_FIXEDUP (DWORD*)-1
extern ROMChain_t *OEMRomChain;
DWORD *pdwXIPLoc = NOT_FIXEDUP;
static void x86InitRomChain (void)
{
// Added for MultiXIP stuff
static ROMChain_t s_pNextRom[MAX_ROM] = {0};
DWORD dwRomCount = 0;
DWORD dwChainCount = 0;
DWORD * pdwCurXIP;
DWORD dwNumXIPs;
PXIPCHAIN_ENTRY pChainEntry = NULL;
#ifdef DEBUG
TCHAR szXIPName[XIP_NAMELEN];
int i; // loop ctr
#endif
#ifdef DEBUG
lpWriteDebugStringFunc(TEXT("Looking for rom chain\n"));
#endif
if(pdwXIPLoc == NOT_FIXEDUP){
#ifdef DEBUG
lpWriteDebugStringFunc(TEXT("Rom chain NOT found\n"));
#endif
return; // no chain or not fixed up properly
}
#ifdef DEBUG
lpWriteDebugStringFunc(TEXT("Rom chain found\n"));
#endif
// set the top bit to mark it as a virtual address
pdwCurXIP = (DWORD*)(((DWORD)pdwXIPLoc) | 0x80000000);
// first DWORD is number of XIPs
dwNumXIPs = (*pdwCurXIP);
if(dwNumXIPs > MAX_ROM){
lpWriteDebugStringFunc(TEXT("ERROR: Number of XIPs exceeds MAX\n"));
return;
}
pChainEntry = (PXIPCHAIN_ENTRY)(pdwCurXIP + 1);
while(dwChainCount < dwNumXIPs)
{
if ((pChainEntry->usFlags & ROMXIP_OK_TO_LOAD) && // flags indicates valid XIP
*(LPDWORD)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)
{
s_pNextRom[dwRomCount].pTOC = *(ROMHDR **)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET + 4);
s_pNextRom[dwRomCount].pNext = NULL;
#ifdef DEBUG
lpWriteDebugStringFunc( _T("XIP found: ") );
for (i = 0; (i< (XIP_NAMELEN-1)) && (pChainEntry->szName[i] != '\0'); ++i)
{
szXIPName[i] = (TCHAR)pChainEntry->szName[i];
}
szXIPName[i] = TEXT('\0');
lpWriteDebugStringFunc( szXIPName );
lpWriteDebugStringFunc( _T("\n") );
#endif
if (dwRomCount != 0)
{
s_pNextRom[dwRomCount-1].pNext = &s_pNextRom[dwRomCount];
}
else
{
OEMRomChain = s_pNextRom;
}
dwRomCount++;
}
else
{
lpWriteDebugStringFunc( _T("Invalid XIP found\n") );
}
++pChainEntry;
dwChainCount++;
}
#ifdef DEBUG
{
ROMChain_t *pchain = OEMRomChain;
lpWriteDebugStringFunc( _T("chain contents...\n") );
while(pchain){
lpWriteDebugStringFunc( _T("found item\n") );
pchain = pchain->pNext;
}
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -