diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/arm/arm_interface.h | 9 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 9 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 1 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.cpp | 9 | ||||
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 18 |
6 files changed, 17 insertions, 30 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index de5e9c8fa..480c90e66 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -122,15 +122,6 @@ public: | |||
| 122 | virtual void AddTicks(u64 ticks) = 0; | 122 | virtual void AddTicks(u64 ticks) = 0; |
| 123 | 123 | ||
| 124 | /** | 124 | /** |
| 125 | * Initializes a CPU context for use on this CPU | ||
| 126 | * @param context Thread context to reset | ||
| 127 | * @param stack_top Pointer to the top of the stack | ||
| 128 | * @param entry_point Entry point for execution | ||
| 129 | * @param arg User argument for thread | ||
| 130 | */ | ||
| 131 | virtual void ResetContext(Core::ThreadContext& context, u32 stack_top, u32 entry_point, u32 arg) = 0; | ||
| 132 | |||
| 133 | /** | ||
| 134 | * Saves the current CPU context | 125 | * Saves the current CPU context |
| 135 | * @param ctx Thread context to save | 126 | * @param ctx Thread context to save |
| 136 | */ | 127 | */ |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 46b4d6103..a9cb973df 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -130,15 +130,6 @@ void ARM_Dynarmic::ExecuteInstructions(int num_instructions) { | |||
| 130 | AddTicks(num_instructions); | 130 | AddTicks(num_instructions); |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | void ARM_Dynarmic::ResetContext(Core::ThreadContext& context, u32 stack_top, u32 entry_point, u32 arg) { | ||
| 134 | memset(&context, 0, sizeof(Core::ThreadContext)); | ||
| 135 | |||
| 136 | context.cpu_registers[0] = arg; | ||
| 137 | context.pc = entry_point; | ||
| 138 | context.sp = stack_top; | ||
| 139 | context.cpsr = USER32MODE | ((entry_point & 1) << 5); // Usermode and THUMB mode | ||
| 140 | } | ||
| 141 | |||
| 142 | void ARM_Dynarmic::SaveContext(Core::ThreadContext& ctx) { | 133 | void ARM_Dynarmic::SaveContext(Core::ThreadContext& ctx) { |
| 143 | memcpy(ctx.cpu_registers, jit->Regs().data(), sizeof(ctx.cpu_registers)); | 134 | memcpy(ctx.cpu_registers, jit->Regs().data(), sizeof(ctx.cpu_registers)); |
| 144 | memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers)); | 135 | memcpy(ctx.fpu_registers, jit->ExtRegs().data(), sizeof(ctx.fpu_registers)); |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index 58323135d..d493cabd5 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -36,7 +36,6 @@ public: | |||
| 36 | 36 | ||
| 37 | void AddTicks(u64 ticks) override; | 37 | void AddTicks(u64 ticks) override; |
| 38 | 38 | ||
| 39 | void ResetContext(Core::ThreadContext& context, u32 stack_top, u32 entry_point, u32 arg) override; | ||
| 40 | void SaveContext(Core::ThreadContext& ctx) override; | 39 | void SaveContext(Core::ThreadContext& ctx) override; |
| 41 | void LoadContext(const Core::ThreadContext& ctx) override; | 40 | void LoadContext(const Core::ThreadContext& ctx) override; |
| 42 | 41 | ||
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index 976e81480..d84917529 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp | |||
| @@ -93,15 +93,6 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) { | |||
| 93 | AddTicks(ticks_executed); | 93 | AddTicks(ticks_executed); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | void ARM_DynCom::ResetContext(Core::ThreadContext& context, u32 stack_top, u32 entry_point, u32 arg) { | ||
| 97 | memset(&context, 0, sizeof(Core::ThreadContext)); | ||
| 98 | |||
| 99 | context.cpu_registers[0] = arg; | ||
| 100 | context.pc = entry_point; | ||
| 101 | context.sp = stack_top; | ||
| 102 | context.cpsr = USER32MODE | ((entry_point & 1) << 5); // Usermode and THUMB mode | ||
| 103 | } | ||
| 104 | |||
| 105 | void ARM_DynCom::SaveContext(Core::ThreadContext& ctx) { | 96 | void ARM_DynCom::SaveContext(Core::ThreadContext& ctx) { |
| 106 | memcpy(ctx.cpu_registers, state->Reg.data(), sizeof(ctx.cpu_registers)); | 97 | memcpy(ctx.cpu_registers, state->Reg.data(), sizeof(ctx.cpu_registers)); |
| 107 | memcpy(ctx.fpu_registers, state->ExtReg.data(), sizeof(ctx.fpu_registers)); | 98 | memcpy(ctx.fpu_registers, state->ExtReg.data(), sizeof(ctx.fpu_registers)); |
diff --git a/src/core/arm/dyncom/arm_dyncom.h b/src/core/arm/dyncom/arm_dyncom.h index cc040b174..70f71a828 100644 --- a/src/core/arm/dyncom/arm_dyncom.h +++ b/src/core/arm/dyncom/arm_dyncom.h | |||
| @@ -38,7 +38,6 @@ public: | |||
| 38 | 38 | ||
| 39 | void AddTicks(u64 ticks) override; | 39 | void AddTicks(u64 ticks) override; |
| 40 | 40 | ||
| 41 | void ResetContext(Core::ThreadContext& context, u32 stack_top, u32 entry_point, u32 arg) override; | ||
| 42 | void SaveContext(Core::ThreadContext& ctx) override; | 41 | void SaveContext(Core::ThreadContext& ctx) override; |
| 43 | void LoadContext(const Core::ThreadContext& ctx) override; | 42 | void LoadContext(const Core::ThreadContext& ctx) override; |
| 44 | 43 | ||
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 9dea995f4..f1e5cf3cb 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -441,6 +441,22 @@ std::tuple<u32, u32, bool> GetFreeThreadLocalSlot(std::vector<std::bitset<8>>& t | |||
| 441 | return std::make_tuple(0, 0, true); | 441 | return std::make_tuple(0, 0, true); |
| 442 | } | 442 | } |
| 443 | 443 | ||
| 444 | /** | ||
| 445 | * Resets a thread context, making it ready to be scheduled and run by the CPU | ||
| 446 | * @param context Thread context to reset | ||
| 447 | * @param stack_top Address of the top of the stack | ||
| 448 | * @param entry_point Address of entry point for execution | ||
| 449 | * @param arg User argument for thread | ||
| 450 | */ | ||
| 451 | static void ResetThreadContext(Core::ThreadContext& context, u32 stack_top, u32 entry_point, u32 arg) { | ||
| 452 | memset(&context, 0, sizeof(Core::ThreadContext)); | ||
| 453 | |||
| 454 | context.cpu_registers[0] = arg; | ||
| 455 | context.pc = entry_point; | ||
| 456 | context.sp = stack_top; | ||
| 457 | context.cpsr = USER32MODE | ((entry_point & 1) << 5); // Usermode and THUMB mode | ||
| 458 | } | ||
| 459 | |||
| 444 | ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, s32 priority, | 460 | ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, s32 priority, |
| 445 | u32 arg, s32 processor_id, VAddr stack_top) { | 461 | u32 arg, s32 processor_id, VAddr stack_top) { |
| 446 | if (priority < THREADPRIO_HIGHEST || priority > THREADPRIO_LOWEST) { | 462 | if (priority < THREADPRIO_HIGHEST || priority > THREADPRIO_LOWEST) { |
| @@ -525,7 +541,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, | |||
| 525 | 541 | ||
| 526 | // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used | 542 | // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used |
| 527 | // to initialize the context | 543 | // to initialize the context |
| 528 | Core::g_app_core->ResetContext(thread->context, stack_top, entry_point, arg); | 544 | ResetThreadContext(thread->context, stack_top, entry_point, arg); |
| 529 | 545 | ||
| 530 | ready_queue.push_back(thread->current_priority, thread.get()); | 546 | ready_queue.push_back(thread->current_priority, thread.get()); |
| 531 | thread->status = THREADSTATUS_READY; | 547 | thread->status = THREADSTATUS_READY; |