aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/arm/dyncom/arm_dyncom_run.cpp
diff options
context:
space:
mode:
authorGravatar Lioncash <mathew1800@gmail.com>2015-02-12 15:11:39 -0500
committerGravatar Lioncash <mathew1800@gmail.com>2015-02-12 21:54:28 -0500
commitb7fac494cdda9efb65168b116b1673af4ab9f242 (patch)
tree54eed2ab999ddb5063a5f0b52a72b27c8159cb44 /src/core/arm/dyncom/arm_dyncom_run.cpp
parentc3211c9c802309a1b391d75934cc18cad98cdcb9 (diff)
dyncom: Switch the app and system cores into the correct mode at initialization
Diffstat (limited to 'src/core/arm/dyncom/arm_dyncom_run.cpp')
-rw-r--r--src/core/arm/dyncom/arm_dyncom_run.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom_run.cpp b/src/core/arm/dyncom/arm_dyncom_run.cpp
index 15677da2..d79e3e4b 100644
--- a/src/core/arm/dyncom/arm_dyncom_run.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_run.cpp
@@ -2,9 +2,6 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
-#include <assert.h>
-
-#include "common/logging/log.h"
#include "core/arm/skyeye_common/armdefs.h"
void switch_mode(arm_core_t *core, uint32_t mode) {
@@ -13,6 +10,7 @@ void switch_mode(arm_core_t *core, uint32_t mode) {
if (mode != USERBANK) {
switch (core->Mode) {
+ case SYSTEM32MODE: // Shares registers with user mode
case USER32MODE:
core->Reg_usr[0] = core->Reg[13];
core->Reg_usr[1] = core->Reg[14];
@@ -42,7 +40,6 @@ void switch_mode(arm_core_t *core, uint32_t mode) {
core->Reg_firq[1] = core->Reg[14];
core->Spsr[FIQBANK] = core->Spsr_copy;
break;
-
}
switch (mode) {
@@ -81,11 +78,15 @@ void switch_mode(arm_core_t *core, uint32_t mode) {
core->Spsr_copy = core->Spsr[FIQBANK];
core->Bank = FIQBANK;
break;
-
+ case SYSTEM32MODE: // Shares registers with user mode.
+ core->Reg[13] = core->Reg_usr[0];
+ core->Reg[14] = core->Reg_usr[1];
+ core->Bank = SYSTEMBANK;
+ break;
}
+
+ // Set the mode bits in the APSR
+ core->Cpsr = (core->Cpsr & ~core->Mode) | mode;
core->Mode = mode;
- } else {
- LOG_CRITICAL(Core_ARM11, "user mode");
- exit(-2);
}
}