summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
new file mode 100644
index 000000000..fc494fe30
--- /dev/null
+++ b/src/core/hle/kernel/kernel.cpp
@@ -0,0 +1,142 @@
1// Copyright 2014 Citra Emulator Project / PPSSPP Project
2// Licensed under GPLv2
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <string.h>
8
9#include "common/common.h"
10
11#include "core/hle/kernel/kernel.h"
12#include "core/hle/kernel/thread.h"
13
14KernelObjectPool g_kernel_objects;
15
16void __KernelInit() {
17 __KernelThreadingInit();
18}
19
20void __KernelShutdown() {
21 __KernelThreadingShutdown();
22}
23
24KernelObjectPool::KernelObjectPool() {
25 memset(occupied, 0, sizeof(bool) * MAX_COUNT);
26 next_id = INITIAL_NEXT_ID;
27}
28
29UID KernelObjectPool::Create(KernelObject *obj, int range_bottom, int range_top) {
30 if (range_top > MAX_COUNT) {
31 range_top = MAX_COUNT;
32 }
33 if (next_id >= range_bottom && next_id < range_top) {
34 range_bottom = next_id++;
35 }
36 for (int i = range_bottom; i < range_top; i++) {
37 if (!occupied[i]) {
38 occupied[i] = true;
39 pool[i] = obj;
40 pool[i]->uid = i + HANDLE_OFFSET;
41 return i + HANDLE_OFFSET;
42 }
43 }
44 ERROR_LOG(HLE, "Unable to allocate kernel object, too many objects slots in use.");
45 return 0;
46}
47
48bool KernelObjectPool::IsValid(UID handle)
49{
50 int index = handle - HANDLE_OFFSET;
51 if (index < 0)
52 return false;
53 if (index >= MAX_COUNT)
54 return false;
55
56 return occupied[index];
57}
58
59void KernelObjectPool::Clear()
60{
61 for (int i = 0; i < MAX_COUNT; i++)
62 {
63 //brutally clear everything, no validation
64 if (occupied[i])
65 delete pool[i];
66 occupied[i] = false;
67 }
68 memset(pool, 0, sizeof(KernelObject*)*MAX_COUNT);
69 next_id = INITIAL_NEXT_ID;
70}
71
72KernelObject *&KernelObjectPool::operator [](UID handle)
73{
74 _dbg_assert_msg_(KERNEL, IsValid(handle), "GRABBING UNALLOCED KERNEL OBJ");
75 return pool[handle - HANDLE_OFFSET];
76}
77
78void KernelObjectPool::List() {
79 for (int i = 0; i < MAX_COUNT; i++) {
80 if (occupied[i]) {
81 if (pool[i]) {
82 INFO_LOG(KERNEL, "KO %i: %s \"%s\"", i + HANDLE_OFFSET, pool[i]->GetTypeName(),
83 pool[i]->GetName());
84 }
85 }
86 }
87}
88
89int KernelObjectPool::GetCount()
90{
91 int count = 0;
92 for (int i = 0; i < MAX_COUNT; i++)
93 {
94 if (occupied[i])
95 count++;
96 }
97 return count;
98}
99
100KernelObject *KernelObjectPool::CreateByIDType(int type) {
101 // Used for save states. This is ugly, but what other way is there?
102 switch (type) {
103 //case SCE_KERNEL_TMID_Alarm:
104 // return __KernelAlarmObject();
105 //case SCE_KERNEL_TMID_EventFlag:
106 // return __KernelEventFlagObject();
107 //case SCE_KERNEL_TMID_Mbox:
108 // return __KernelMbxObject();
109 //case SCE_KERNEL_TMID_Fpl:
110 // return __KernelMemoryFPLObject();
111 //case SCE_KERNEL_TMID_Vpl:
112 // return __KernelMemoryVPLObject();
113 //case PPSSPP_KERNEL_TMID_PMB:
114 // return __KernelMemoryPMBObject();
115 //case PPSSPP_KERNEL_TMID_Module:
116 // return __KernelModuleObject();
117 //case SCE_KERNEL_TMID_Mpipe:
118 // return __KernelMsgPipeObject();
119 //case SCE_KERNEL_TMID_Mutex:
120 // return __KernelMutexObject();
121 //case SCE_KERNEL_TMID_LwMutex:
122 // return __KernelLwMutexObject();
123 //case SCE_KERNEL_TMID_Semaphore:
124 // return __KernelSemaphoreObject();
125 //case SCE_KERNEL_TMID_Callback:
126 // return __KernelCallbackObject();
127 //case SCE_KERNEL_TMID_Thread:
128 // return __KernelThreadObject();
129 //case SCE_KERNEL_TMID_VTimer:
130 // return __KernelVTimerObject();
131 //case SCE_KERNEL_TMID_Tlspl:
132 // return __KernelTlsplObject();
133 //case PPSSPP_KERNEL_TMID_File:
134 // return __KernelFileNodeObject();
135 //case PPSSPP_KERNEL_TMID_DirList:
136 // return __KernelDirListingObject();
137
138 default:
139 ERROR_LOG(COMMON, "Unable to load state: could not find object type %d.", type);
140 return NULL;
141 }
142}