mirror of
https://github.com/brain-hackers/brainlilo
synced 2024-12-22 12:10:05 +09:00
modified: BrainLILODrv.cpp
This commit is contained in:
parent
62b9a96a87
commit
c3c333e6cf
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user