modified: BrainLILODrv.cpp

This commit is contained in:
Chiharu Shirasaka 2020-09-29 22:23:30 +09:00
parent 62b9a96a87
commit c3c333e6cf
1 changed files with 76 additions and 22 deletions

View File

@ -70,6 +70,47 @@ typedef LPVOID (*AllocPhysMemProc)(DWORD,DWORD,DWORD,DWORD,PULONG);
typedef void (*NKForceCleanBootProc)(BOOL); typedef void (*NKForceCleanBootProc)(BOOL);
//UART
#define UART_BASE_ADDR 0x80074000
unsigned int *UARTMappedAddr;
static serialout(char text){
*UARTMappedAddr=(unsigned int)text;
return;
}
static void print(char *string) {
do {
serialout(*string);
string++;
} while (*string != '\0');
}
static int pow(int base, int exponent) {
int ans = 1;
for (int i = 0; i < exponent; i++) {
ans *= base;
}
return ans;
}
static void printhex(int num) {
unsigned char digit=8;
print("0x");
while (digit) {
int weight = pow(16, digit - 1);
int ans = num / weight;
if (ans < 10){
serialout('0' + ans);
}
else{
serialout('A' + ans - 10);
}
num -= ans * weight;
digit--;
}
}
static void disableInterrupts(){ static void disableInterrupts(){
asm volatile("mrs r0, cpsr\n" asm volatile("mrs r0, cpsr\n"
"orr r0,r0,#0x80\n" "orr r0,r0,#0x80\n"
@ -110,10 +151,11 @@ static void EDNA2_physicalInvoker(){
static void EDNA2_installPhysicalInvoker(){ static void EDNA2_installPhysicalInvoker(){
void *ptr=(void *)0xa8000000; void *ptr=(void *)0xa8000000;
wchar_t buf[256]; print("BrainLILO: Invoker copying to ",1);
swprintf(buf, L"ResetKit: copying to 0x%08x from 0x%08x\n", printhex((int)(ptr),1);
(int)(ptr), (int)(&EDNA2_physicalInvoker)); print(" from ",1);
OutputDebugString(buf); printhex((int)(&EDNA2_physicalInvoker),1);
print("\n",1);
memcpy(ptr, (const void *)&EDNA2_physicalInvoker, 64*4); memcpy(ptr, (const void *)&EDNA2_physicalInvoker, 64*4);
//clearCache(); //clearCache();
} }
@ -126,12 +168,14 @@ static void EDNA2_runPhysicalInvoker(unsigned long bootloaderphysaddr,DWORD size
"mrc p15,0,r0,c1,c0,0\n" // read ctrl regs "mrc p15,0,r0,c1,c0,0\n" // read ctrl regs
"bic r0, r0, #8192\n" // reset vector to lower "bic r0, r0, #8192\n" // reset vector to lower
"mcr p15,0,r0,c1,c0,0\n" // write ctrl regs "mcr p15,0,r0,c1,c0,0\n" // write ctrl regs
"mrc p15,0,r10,c1,c0,0\n" // read ctrl regs
"bic r10, r10, #5\n" // disable MMU/DCache
"mcr p15,0,r10,c1,c0,0\n" // write ctrl regs
); );
print("BrainLILO: U-Boot copying to ");
printhex(0x40002000);
print(" from ");
printhex((int)(bootloaderphysaddr));
print("\n");
for(unsigned int i=0;i<size;i++)*((char *)(0x40002000+i))=*((char *)(bootloaderphysaddr+i)); for(unsigned int i=0;i<size;i++)*((char *)(0x40002000+i))=*((char *)(bootloaderphysaddr+i));
print("BrainLILO: U-Boot copied. Jump!\n");
asm volatile("ldr r0, =0x0000\n" asm volatile("ldr r0, =0x0000\n"
"ldr r1, =0x0000\n" "ldr r1, =0x0000\n"
"ldr r2, =0x0000\n" "ldr r2, =0x0000\n"
@ -142,6 +186,10 @@ static void EDNA2_runPhysicalInvoker(unsigned long bootloaderphysaddr,DWORD size
"ldr r7, =0x0000\n" "ldr r7, =0x0000\n"
"ldr r8, =0x40002000\n" "ldr r8, =0x40002000\n"
"ldr r9, =0x0000\n" "ldr r9, =0x0000\n"
"mrc p15,0,r10,c1,c0,0\n" // read ctrl regs
"bic r10, r10, #5\n" // disable MMU/DCache
"mcr p15,0,r10,c1,c0,0\n" // write ctrl regs
"swi #0\n" // jump! "swi #0\n" // jump!
); );
@ -151,12 +199,11 @@ static void EDNA2_runPhysicalInvoker(unsigned long bootloaderphysaddr,DWORD size
__attribute__((noreturn)) __attribute__((noreturn))
static DWORD EDNA2_callKernelEntryPoint(unsigned long bootloaderphysaddr,DWORD size){ static DWORD EDNA2_callKernelEntryPoint(unsigned long bootloaderphysaddr,DWORD size){
OutputDebugString(L"BrainLILO: disabling interrupts"); print(L"BrainLILO: disabling interrupts\n");
disableInterrupts(); disableInterrupts();
OutputDebugString(L"BrainLILO: injecting code to internal ram"); print(L"BrainLILO: injecting code to internal ram\n");
EDNA2_installPhysicalInvoker(); EDNA2_installPhysicalInvoker();
OutputDebugString(L"BrainLILO: invoking"); print(L"BrainLILO: invoking\n");
Sleep(100);
EDNA2_runPhysicalInvoker(bootloaderphysaddr,size); EDNA2_runPhysicalInvoker(bootloaderphysaddr,size);
} }
@ -172,19 +219,19 @@ static bool doLinux(){
dll=LoadLibrary(TEXT("COREDLL.DLL")); dll=LoadLibrary(TEXT("COREDLL.DLL"));
if (dll == NULL) { if (dll == NULL) {
OutputDebugString(L"Cant load DLL"); print(L"Cant load DLL\n");
return false; return false;
} }
AllocPhysMem=(AllocPhysMemProc)GetProcAddress(dll,TEXT("AllocPhysMem")); AllocPhysMem=(AllocPhysMemProc)GetProcAddress(dll,TEXT("AllocPhysMem"));
if (AllocPhysMem == NULL) { if (AllocPhysMem == NULL) {
OutputDebugString(L"Cant load AllocPhysMem function"); print(L"Cant load AllocPhysMem function\n");
return false; return false;
} }
OutputDebugString(L"BrainLILO: loading bootloader."); print(L"BrainLILO: loading bootloader.\n");
hFile = CreateFile(bootloaderFileName , GENERIC_READ , 0 , NULL ,OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL); hFile = CreateFile(bootloaderFileName , GENERIC_READ , 0 , NULL ,OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
if (hFile == INVALID_HANDLE_VALUE) { if (hFile == INVALID_HANDLE_VALUE) {
OutputDebugString(L"Cant load bootloader"); print(L"Cant load bootloader\n");
return false; return false;
} }
bootloaderdata = (char *)malloc(GetFileSize(hFile , NULL)); bootloaderdata = (char *)malloc(GetFileSize(hFile , NULL));
@ -192,11 +239,13 @@ static bool doLinux(){
CloseHandle(hFile); CloseHandle(hFile);
bootloaderptr=(PULONG)AllocPhysMem(wReadSize,PAGE_EXECUTE_READWRITE,0,0,&bootloaderphysaddr); bootloaderptr=(PULONG)AllocPhysMem(wReadSize,PAGE_EXECUTE_READWRITE,0,0,&bootloaderphysaddr);
wchar_t buf[256]; print("BrainLILO: preloading bootloader to ");
swprintf(buf, L"BrainLILO: copying bootloader to 0x%08x from 0x%08x\n",(int)(bootloaderptr), (int)(bootloaderdata)); printhex((int)(bootloaderptr));
OutputDebugString(buf); print(" from ");
printhex((int)(bootloaderdata));
print("\n");
memcpy(bootloaderptr,bootloaderdata,wReadSize); memcpy(bootloaderptr,bootloaderdata,wReadSize);
OutputDebugString(L"BrainLILO: bootloader copied"); print(L"BrainLILO: bootloader preloaded\n");
free(bootloaderdata); free(bootloaderdata);
FreeLibrary(dll); FreeLibrary(dll);
EDNA2_callKernelEntryPoint(bootloaderphysaddr,wReadSize); EDNA2_callKernelEntryPoint(bootloaderphysaddr,wReadSize);
@ -239,7 +288,7 @@ extern "C" BRAINLILODRV_API DWORD LIN_Seek(DWORD handle, long lDistance, DWORD d
extern "C" BRAINLILODRV_API void LIN_PowerUp(void){ extern "C" BRAINLILODRV_API void LIN_PowerUp(void){
OutputDebugString(L"BrainLILO: resuming."); print(L"BrainLILO: resuming.");
} }
@ -287,7 +336,7 @@ extern "C" BOOL APIENTRY DllMainCRTStartup( HANDLE hModule,
switch (ul_reason_for_call) switch (ul_reason_for_call)
{ {
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:
KernelIoControl=(KernelIoControlProc) KernelIoControl=(KernelIoControlProc)
GetProcAddress(LoadLibrary(L"COREDLL"), GetProcAddress(LoadLibrary(L"COREDLL"),
L"KernelIoControl"); L"KernelIoControl");
@ -299,6 +348,11 @@ extern "C" BOOL APIENTRY DllMainCRTStartup( HANDLE hModule,
FileSystemPowerFunction=(FileSystemPowerFunctionProc) FileSystemPowerFunction=(FileSystemPowerFunctionProc)
GetProcAddress(LoadLibrary(L"COREDLL"), GetProcAddress(LoadLibrary(L"COREDLL"),
L"FileSystemPowerFunction"); L"FileSystemPowerFunction");
UARTMappedAddr=MmMapIoSpace(UART_BASE_ADDR,0x48,FALSE);//Map to Virtual Addr
*(UARTMappedAddr+0x38)=0;//Interrupt Disable
*(UARTMappedAddr+0x30)=0b0100000100000001;//RTS Hardware Flow Control, Transmit, UART Enable
case DLL_THREAD_DETACH: case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH: