Fix the arm11 exception handlers on < 7.x
This commit is contained in:
parent
5f93724845
commit
bd6c7b7fdb
@ -18,7 +18,7 @@ dir_build := build
|
|||||||
dir_out := ../../$(dir_build)
|
dir_out := ../../$(dir_build)
|
||||||
|
|
||||||
ASFLAGS := -mcpu=mpcore -mfpu=vfp
|
ASFLAGS := -mcpu=mpcore -mfpu=vfp
|
||||||
CFLAGS := -Wall -Wextra -MMD -MP -mthumb -mthumb-interwork $(ASFLAGS) -fno-builtin -std=c11 -Wno-main -O2 -flto -ffast-math
|
CFLAGS := -Wall -Wextra -MMD -MP -mthumb -mthumb-interwork $(ASFLAGS) -fno-builtin -std=c11 -Wno-main -Os -flto -ffast-math
|
||||||
LDFLAGS := -nostdlib
|
LDFLAGS := -nostdlib
|
||||||
|
|
||||||
objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
|
||||||
|
@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
#include "handlers.h"
|
#include "handlers.h"
|
||||||
|
|
||||||
#define FINAL_BUFFER 0xE5000000 //0x25000000
|
|
||||||
|
|
||||||
#define REG_DUMP_SIZE 4 * 23
|
#define REG_DUMP_SIZE 4 * 23
|
||||||
#define CODE_DUMP_SIZE 48
|
#define CODE_DUMP_SIZE 48
|
||||||
|
|
||||||
@ -49,7 +47,8 @@ void __attribute__((noreturn)) mainHandler(u32 *regs, u32 type, u32 cpuId)
|
|||||||
|
|
||||||
u32 registerDump[REG_DUMP_SIZE / 4];
|
u32 registerDump[REG_DUMP_SIZE / 4];
|
||||||
u8 codeDump[CODE_DUMP_SIZE];
|
u8 codeDump[CODE_DUMP_SIZE];
|
||||||
u8 *final = (u8 *)FINAL_BUFFER;
|
u8 *const finalBuffer = cannotAccessVA((const void *)0xE5000000) ? (u8 *)0xF5000000 : (u8 *)0xE5000000; //VA for 0x25000000
|
||||||
|
u8 *final = finalBuffer;
|
||||||
|
|
||||||
while(*(vu32 *)final == 0xDEADC0DE && *((vu32 *)final + 1) == 0xDEADCAFE);
|
while(*(vu32 *)final == 0xDEADC0DE && *((vu32 *)final + 1) == 0xDEADCAFE);
|
||||||
|
|
||||||
@ -81,7 +80,7 @@ void __attribute__((noreturn)) mainHandler(u32 *regs, u32 type, u32 cpuId)
|
|||||||
dumpHeader.codeDumpSize = copyMemory(codeDump, instr, dumpHeader.codeDumpSize, ((cpsr & 0x20) != 0) ? 2 : 4);
|
dumpHeader.codeDumpSize = copyMemory(codeDump, instr, dumpHeader.codeDumpSize, ((cpsr & 0x20) != 0) ? 2 : 4);
|
||||||
|
|
||||||
//Copy register dump and code dump
|
//Copy register dump and code dump
|
||||||
final = (u8 *)(FINAL_BUFFER + sizeof(ExceptionDumpHeader));
|
final = (u8 *)(finalBuffer + sizeof(ExceptionDumpHeader));
|
||||||
final += copyMemory(final, registerDump, dumpHeader.registerDumpSize, 1);
|
final += copyMemory(final, registerDump, dumpHeader.registerDumpSize, 1);
|
||||||
final += copyMemory(final, codeDump, dumpHeader.codeDumpSize, 1);
|
final += copyMemory(final, codeDump, dumpHeader.codeDumpSize, 1);
|
||||||
|
|
||||||
@ -103,7 +102,7 @@ void __attribute__((noreturn)) mainHandler(u32 *regs, u32 type, u32 cpuId)
|
|||||||
dumpHeader.totalSize = sizeof(ExceptionDumpHeader) + dumpHeader.registerDumpSize + dumpHeader.codeDumpSize + dumpHeader.stackDumpSize + dumpHeader.additionalDataSize;
|
dumpHeader.totalSize = sizeof(ExceptionDumpHeader) + dumpHeader.registerDumpSize + dumpHeader.codeDumpSize + dumpHeader.stackDumpSize + dumpHeader.additionalDataSize;
|
||||||
|
|
||||||
//Copy header (actually optimized by the compiler)
|
//Copy header (actually optimized by the compiler)
|
||||||
*(ExceptionDumpHeader *)FINAL_BUFFER = dumpHeader;
|
*(ExceptionDumpHeader *)finalBuffer = dumpHeader;
|
||||||
|
|
||||||
cleanInvalidateDCacheAndDMB();
|
cleanInvalidateDCacheAndDMB();
|
||||||
mcuReboot(); //Also contains DCache-cleaning code
|
mcuReboot(); //Also contains DCache-cleaning code
|
||||||
|
Reference in New Issue
Block a user