mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2025-02-25 08:13:33 +01:00
-changed up some booting code to hopefully fix those random freezes on game and homebrew bootup
This commit is contained in:
parent
3b1dcf389a
commit
d7aed43333
@ -1,22 +1,76 @@
|
|||||||
# Copyright 2008-2009 Segher Boessenkool <segher@kernel.crashing.org>
|
# Copyright 2008-2009 Segher Boessenkool <segher@kernel.crashing.org>
|
||||||
# This code is licensed to you under the terms of the GNU GPL, version 2;
|
# This code is licensed to you under the terms of the GNU GPL, version 2;
|
||||||
# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4;
|
||||||
|
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9;
|
||||||
|
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14;
|
||||||
|
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19;
|
||||||
|
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24;
|
||||||
|
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29;
|
||||||
|
.set r30,30; .set r31,31;
|
||||||
|
|
||||||
.extern _main
|
.extern _main
|
||||||
.globl _start
|
.globl _start
|
||||||
_start:
|
_start:
|
||||||
|
# Disable interrupts
|
||||||
|
mfmsr r3
|
||||||
|
rlwinm r3,r3,0,17,15
|
||||||
|
mtmsr r3
|
||||||
|
isync
|
||||||
|
|
||||||
# Disable interrupts, enable FP.
|
# Reset our registers
|
||||||
mfmsr 3 ; rlwinm 3,3,0,17,15 ; ori 3,3,0x2000 ; mtmsr 3 ; isync
|
bl __init_registers
|
||||||
|
|
||||||
# Setup stack.
|
|
||||||
lis 1,_stack_top@ha ; addi 1,1,_stack_top@l ; li 0,0 ; stwu 0,-64(1)
|
|
||||||
|
|
||||||
# Clear BSS.
|
# Clear BSS.
|
||||||
lis 3,__bss_start@ha ; addi 3,3,__bss_start@l
|
lis r3,__bss_start@h
|
||||||
li 4,0
|
ori r3,r3,__bss_start@l
|
||||||
lis 5,__bss_end@ha ; addi 5,5,__bss_end@l ; sub 5,5,3
|
li r4,0
|
||||||
bl memset
|
lis r5,__bss_end@h
|
||||||
|
ori r5,r5,__bss_end@l
|
||||||
|
subf r5,r3,r5
|
||||||
|
bl _memset
|
||||||
|
|
||||||
# Go!
|
# Go!
|
||||||
bl _main
|
bl _main
|
||||||
|
|
||||||
|
#thanks to megazig for that
|
||||||
|
__init_registers:
|
||||||
|
li r0,0
|
||||||
|
li r3,0
|
||||||
|
li r4,0
|
||||||
|
li r5,0
|
||||||
|
li r6,0
|
||||||
|
li r7,0
|
||||||
|
li r8,0
|
||||||
|
li r9,0
|
||||||
|
li r10,0
|
||||||
|
li r11,0
|
||||||
|
li r12,0
|
||||||
|
li r14,0
|
||||||
|
li r15,0
|
||||||
|
li r16,0
|
||||||
|
li r17,0
|
||||||
|
li r18,0
|
||||||
|
li r19,0
|
||||||
|
li r20,0
|
||||||
|
li r21,0
|
||||||
|
li r22,0
|
||||||
|
li r23,0
|
||||||
|
li r24,0
|
||||||
|
li r25,0
|
||||||
|
li r26,0
|
||||||
|
li r27,0
|
||||||
|
li r28,0
|
||||||
|
li r29,0
|
||||||
|
li r30,0
|
||||||
|
li r31,0
|
||||||
|
lis r1,__stack_top@h
|
||||||
|
ori r1,r1,__stack_top@l
|
||||||
|
addi r1,r1,-4
|
||||||
|
stw r0,0(r1)
|
||||||
|
stwu r1,-0x38(r1)
|
||||||
|
lis r2,0
|
||||||
|
ori r2,r2,0x8000
|
||||||
|
lis r13,0
|
||||||
|
ori r13,r13,0x8000
|
||||||
|
blr
|
||||||
|
@ -22,6 +22,6 @@ SECTIONS {
|
|||||||
. = ALIGN(0x40);
|
. = ALIGN(0x40);
|
||||||
.stack : {
|
.stack : {
|
||||||
. += 0x8000;
|
. += 0x8000;
|
||||||
_stack_top = .;
|
__stack_top = .;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "usbgecko.h"
|
#include "usbgecko.h"
|
||||||
@ -11,7 +9,7 @@ void _main(void)
|
|||||||
{
|
{
|
||||||
usbgecko_init();
|
usbgecko_init();
|
||||||
gprintf("Copying External Booter...\n");
|
gprintf("Copying External Booter...\n");
|
||||||
memcpy(start, buffer, 0xF0000); //960kb safe copying of booter
|
_memcpy(start, buffer, 0xF0000); //960kb safe copying of booter
|
||||||
sync_before_exec(start, 0xF0000);
|
sync_before_exec(start, 0xF0000);
|
||||||
gprintf("Done! Jumping to Entrypoint...\n");
|
gprintf("Done! Jumping to Entrypoint...\n");
|
||||||
exeEntryPoint();
|
exeEntryPoint();
|
||||||
|
@ -2,11 +2,9 @@
|
|||||||
// This code is licensed to you under the terms of the GNU GPL, version 2;
|
// This code is licensed to you under the terms of the GNU GPL, version 2;
|
||||||
// see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
// see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
|
||||||
#include <stdio.h>
|
void * _memset(void *b, int c, unsigned int len)
|
||||||
|
|
||||||
void *memset(void *b, int c, size_t len)
|
|
||||||
{
|
{
|
||||||
size_t i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
((unsigned char *)b)[i] = c;
|
((unsigned char *)b)[i] = c;
|
||||||
@ -14,9 +12,9 @@ void *memset(void *b, int c, size_t len)
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *memcpy(void *dst, const void *src, size_t len)
|
void * _memcpy(void *dst, const void *src, unsigned int len)
|
||||||
{
|
{
|
||||||
size_t i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
|
((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
#ifndef STRING_H_
|
#ifndef STRING_H_
|
||||||
#define STRING_H_
|
#define STRING_H_
|
||||||
|
|
||||||
#include <stdio.h>
|
void * _memcpy(void *dst, const void *src, unsigned int len);
|
||||||
|
void * _memset(void *b, int c, unsigned int len);
|
||||||
void *memcpy(void *dst, const void *src, size_t len);
|
|
||||||
void *memset(void *b, int c, size_t len);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,9 +51,18 @@ void AddBootArgument(const char * argv)
|
|||||||
|
|
||||||
bool LoadAppBooter(const char *filepath)
|
bool LoadAppBooter(const char *filepath)
|
||||||
{
|
{
|
||||||
appbooter_ptr = fsop_ReadFile(filepath, &appbooter_size);
|
u8 *tmp_ptr = fsop_ReadFile(filepath, &appbooter_size);
|
||||||
if(appbooter_size == 0 || appbooter_ptr == NULL)
|
if(appbooter_size == 0 || tmp_ptr == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
appbooter_ptr = (u8*)MEM2_lo_alloc(appbooter_size); /* safety because upper mem2 is dol */
|
||||||
|
if(appbooter_ptr == NULL)
|
||||||
|
{
|
||||||
|
free(tmp_ptr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
memcpy(appbooter_ptr, tmp_ptr, appbooter_size);
|
||||||
|
DCFlushRange(appbooter_ptr, appbooter_size);
|
||||||
|
free(tmp_ptr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,9 +143,21 @@ void BootHomebrew()
|
|||||||
JumpToEntry(BOOTER_ENTRY);
|
JumpToEntry(BOOTER_ENTRY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" { extern void __exception_closeall(); }
|
||||||
|
u32 AppEntrypoint = 0;
|
||||||
void JumpToEntry(entry EntryPoint)
|
void JumpToEntry(entry EntryPoint)
|
||||||
{
|
{
|
||||||
gprintf("Jumping to %08x\n", EntryPoint);
|
AppEntrypoint = (u32)EntryPoint;
|
||||||
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
gprintf("Jumping to %08x\n", AppEntrypoint);
|
||||||
__lwp_thread_stopmultitasking(EntryPoint);
|
u32 level = IRQ_Disable();
|
||||||
|
__IOS_ShutdownSubsystems();
|
||||||
|
__exception_closeall();
|
||||||
|
asm volatile (
|
||||||
|
"lis %r3, AppEntrypoint@h\n"
|
||||||
|
"ori %r3, %r3, AppEntrypoint@l\n"
|
||||||
|
"lwz %r3, 0(%r3)\n"
|
||||||
|
"mtlr %r3\n"
|
||||||
|
"blr\n"
|
||||||
|
);
|
||||||
|
IRQ_Restore(level);
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user