One-liners ftw

This commit is contained in:
Aurora 2016-07-01 20:36:43 +02:00
parent 136e0d8974
commit 29d8e637d8
3 changed files with 14 additions and 18 deletions

View File

@ -4,6 +4,7 @@
*/ */
#pragma once #pragma once
#include "types.h" #include "types.h"
/*** /***
@ -17,6 +18,5 @@
void flushEntireDCache(void); //actually: "clean and flush" void flushEntireDCache(void); //actually: "clean and flush"
void flushDCacheRange(void *startAddress, u32 size); void flushDCacheRange(void *startAddress, u32 size);
void flushEntireICache(void); void flushEntireICache(void);
void flushICacheRange(void *startAddress, u32 size); void flushICacheRange(void *startAddress, u32 size);

View File

@ -12,69 +12,65 @@
.global flushEntireDCache .global flushEntireDCache
.type flushEntireDCache, %function .type flushEntireDCache, %function
flushEntireDCache: flushEntireDCache:
@ Adpated from http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0155a/ch03s03s05.html , @ Adapted from http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0155a/ch03s03s05.html,
@ and https://github.com/gemarcano/libctr9_io/blob/master/src/ctr_system_ARM.c#L39 as well @ and https://github.com/gemarcano/libctr9_io/blob/master/src/ctr_system_ARM.c#L39 as well
@ Note: ARM's example is actually for a 8KB DCache (which is what the 3DS has) @ Note: ARM's example is actually for a 8KB DCache (which is what the 3DS has)
@ Implemented in bootROM at address 0xffff0830 @ Implemented in bootROM at address 0xffff0830
mov r1, #0 @ segment counter mov r1, #0 @ segment counter
outer_loop: outer_loop:
mov r0, #0 @ line counter mov r0, #0 @ line counter
inner_loop: inner_loop:
orr r2, r1, r0 @ generate segment and line address orr r2, r1, r0 @ generate segment and line address
mcr p15, 0, r2, c7, c14, 2 @ clean and flush the line mcr p15, 0, r2, c7, c14, 2 @ clean and flush the line
add r0, #0x20 @ increment to next line add r0, #0x20 @ increment to next line
cmp r0, #0x400 cmp r0, #0x400
bne inner_loop bne inner_loop
add r1, #0x40000000 add r1, #0x40000000
cmp r1, #0 cmp r1, #0
bne outer_loop bne outer_loop
mcr p15, 0, r1, c7, c10, 4 @ drain write buffer mcr p15, 0, r1, c7, c10, 4 @ drain write buffer
bx lr bx lr
.global flushDCacheRange .global flushDCacheRange
.type flushDCacheRange, %function .type flushDCacheRange, %function
flushDCacheRange: flushDCacheRange:
@ Implemented in bootROM at address 0xffff08a0 @ Implemented in bootROM at address 0xffff08a0
add r1, r0, r1 @ end address add r1, r0, r1 @ end address
bic r0, #0x1f @ align source address to cache line size (32 bytes) bic r0, #0x1f @ align source address to cache line size (32 bytes)
flush_dcache_range_loop: flush_dcache_range_loop:
mcr p15, 0, r0, c7, c14, 1 @ clean and flush the line corresponding to the address r0 is holding mcr p15, 0, r0, c7, c14, 1 @ clean and flush the line corresponding to the address r0 is holding
add r0, #0x20 add r0, #0x20
cmp r0, r1 cmp r0, r1
blo flush_dcache_range_loop blo flush_dcache_range_loop
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
bx lr bx lr
.global flushEntireICache .global flushEntireICache
.type flushEntireICache, %function .type flushEntireICache, %function
flushEntireICache: flushEntireICache:
@ Implemented in bootROM at address 0xffff0ab4 @ Implemented in bootROM at address 0xffff0ab4
mov r0, #0 mov r0, #0
mcr p15, 0, r0, c7, c5, 0 mcr p15, 0, r0, c7, c5, 0
bx lr bx lr
.global flushICacheRange .global flushICacheRange
.type flushICacheRange, %function .type flushICacheRange, %function
flushICacheRange: flushICacheRange:
@ Implemented in bootROM at address 0xffff0ac0 @ Implemented in bootROM at address 0xffff0ac0
add r1, r0, r1 @ end address add r1, r0, r1 @ end address
bic r0, #0x1f @ align source address to cache line size (32 bytes) bic r0, #0x1f @ align source address to cache line size (32 bytes)
flush_icache_range_loop: flush_icache_range_loop:
mcr p15, 0, r0, c7, c5, 1 @ flush the line corresponding to the address r0 is holding mcr p15, 0, r0, c7, c5, 1 @ flush the line corresponding to the address r0 is holding
add r0, #0x20 add r0, #0x20
cmp r0, r1 cmp r0, r1
blo flush_icache_range_loop blo flush_icache_range_loop
bx lr bx lr

View File

@ -24,7 +24,7 @@ void configureCFW(const char *configPath)
"( ) SysNAND is updated (A9LH-only)", "( ) SysNAND is updated (A9LH-only)",
"( ) Force A9LH detection", "( ) Force A9LH detection",
"( ) Use second EmuNAND as default", "( ) Use second EmuNAND as default",
"( ) Enable region/language emu. and external .code loading", "( ) Enable region/language emu. and ext. .code",
"( ) Show current NAND in System Settings", "( ) Show current NAND in System Settings",
"( ) Show GBA boot screen in patched AGB_FIRM", "( ) Show GBA boot screen in patched AGB_FIRM",
"( ) Enable splash screen with no screen-init" }; "( ) Enable splash screen with no screen-init" };