arm_dyncom_run.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright 2012 Michael Kang, 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <assert.h>
  5. #include "core/arm/skyeye_common/armdefs.h"
  6. void switch_mode(arm_core_t *core, uint32_t mode) {
  7. if (core->Mode == mode)
  8. return;
  9. if (mode != USERBANK) {
  10. switch (core->Mode) {
  11. case USER32MODE:
  12. core->Reg_usr[0] = core->Reg[13];
  13. core->Reg_usr[1] = core->Reg[14];
  14. break;
  15. case IRQ32MODE:
  16. core->Reg_irq[0] = core->Reg[13];
  17. core->Reg_irq[1] = core->Reg[14];
  18. core->Spsr[IRQBANK] = core->Spsr_copy;
  19. break;
  20. case SVC32MODE:
  21. core->Reg_svc[0] = core->Reg[13];
  22. core->Reg_svc[1] = core->Reg[14];
  23. core->Spsr[SVCBANK] = core->Spsr_copy;
  24. break;
  25. case ABORT32MODE:
  26. core->Reg_abort[0] = core->Reg[13];
  27. core->Reg_abort[1] = core->Reg[14];
  28. core->Spsr[ABORTBANK] = core->Spsr_copy;
  29. break;
  30. case UNDEF32MODE:
  31. core->Reg_undef[0] = core->Reg[13];
  32. core->Reg_undef[1] = core->Reg[14];
  33. core->Spsr[UNDEFBANK] = core->Spsr_copy;
  34. break;
  35. case FIQ32MODE:
  36. core->Reg_firq[0] = core->Reg[13];
  37. core->Reg_firq[1] = core->Reg[14];
  38. core->Spsr[FIQBANK] = core->Spsr_copy;
  39. break;
  40. }
  41. switch (mode) {
  42. case USER32MODE:
  43. core->Reg[13] = core->Reg_usr[0];
  44. core->Reg[14] = core->Reg_usr[1];
  45. core->Bank = USERBANK;
  46. break;
  47. case IRQ32MODE:
  48. core->Reg[13] = core->Reg_irq[0];
  49. core->Reg[14] = core->Reg_irq[1];
  50. core->Spsr_copy = core->Spsr[IRQBANK];
  51. core->Bank = IRQBANK;
  52. break;
  53. case SVC32MODE:
  54. core->Reg[13] = core->Reg_svc[0];
  55. core->Reg[14] = core->Reg_svc[1];
  56. core->Spsr_copy = core->Spsr[SVCBANK];
  57. core->Bank = SVCBANK;
  58. break;
  59. case ABORT32MODE:
  60. core->Reg[13] = core->Reg_abort[0];
  61. core->Reg[14] = core->Reg_abort[1];
  62. core->Spsr_copy = core->Spsr[ABORTBANK];
  63. core->Bank = ABORTBANK;
  64. break;
  65. case UNDEF32MODE:
  66. core->Reg[13] = core->Reg_undef[0];
  67. core->Reg[14] = core->Reg_undef[1];
  68. core->Spsr_copy = core->Spsr[UNDEFBANK];
  69. core->Bank = UNDEFBANK;
  70. break;
  71. case FIQ32MODE:
  72. core->Reg[13] = core->Reg_firq[0];
  73. core->Reg[14] = core->Reg_firq[1];
  74. core->Spsr_copy = core->Spsr[FIQBANK];
  75. core->Bank = FIQBANK;
  76. break;
  77. }
  78. core->Mode = mode;
  79. } else {
  80. LOG_CRITICAL(Core_ARM11, "user mode");
  81. exit(-2);
  82. }
  83. }