Skip to content

Commit 6f972d5

Browse files
committed
VM (new pixeltower): 线程本地存储 (混合栈 stage 1)
1 parent 1bb26ad commit 6f972d5

8 files changed

Lines changed: 99 additions & 38 deletions

File tree

include/openminecraft/vm/pixeltower/v0/om_pixeltower.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ class OMPixelTower
1717
void init(std::string basePath);
1818
void load(std::string path);
1919
void init(std::vector<std::shared_ptr<std::istream>> &streams);
20-
void testAppendMethod();
20+
void stackTest(OMMethod *method);
2121
OMKlassLoader *loader;
2222
OMPixelTowerHeap *heap;
2323
OMPixelTowerHeap *metaspace;
2424

25+
void initCurrentThread(uint64_t tlsSize);
26+
void destroyCurrentThread();
27+
2528
private:
2629
log::OMLogger logger;
2730
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef OM_PIXELTOWER_FRAME_HPP
2+
#define OM_PIXELTOWER_FRAME_HPP
3+
4+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_method.hpp"
5+
namespace openminecraft::vm::pixeltower::v0
6+
{
7+
struct OMFrame
8+
{
9+
OMMethod *method;
10+
void *stackPointer;
11+
void *returnAddr;
12+
jint locals[0];
13+
};
14+
} // namespace openminecraft::vm::pixeltower::v0
15+
16+
#endif

include/openminecraft/vm/pixeltower/v0/om_pixeltower_klass.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@ class OMKlass
3737

3838
OMPixelTowerHeap *heap;
3939

40-
void *allocateInstance()
40+
OMOOPDesc *allocateInstance()
4141
{
4242
assert(kind == OMKlassKind::Normal);
43-
return heap->allocate(sizeof(OMOOPDesc) + length);
43+
auto obj = (OMOOPDesc *)heap->allocate(sizeof(OMOOPDesc) + length);
44+
obj->klass = this;
45+
return obj;
4446
}
4547
};
4648
} // namespace openminecraft::vm::pixeltower::v0

include/openminecraft/vm/pixeltower/v0/om_pixeltower_method.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct OMMethod
1616
jint maxLocals;
1717
jint maxStack;
1818
jint codeSize;
19-
uint8_t code[0];
19+
jbyte code[0];
2020
// code space
2121
};
2222
} // namespace openminecraft::vm::pixeltower::v0
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef OM_PIXELTOWER_THREADS_HPP
2+
#define OM_PIXELTOWER_THREADS_HPP
3+
4+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_frame.hpp"
5+
#include <string>
6+
#include <thread>
7+
namespace openminecraft::vm::pixeltower::v0
8+
{
9+
class OMPixelTowerThread
10+
{
11+
public:
12+
OMPixelTowerThread() = default;
13+
~OMPixelTowerThread() = default;
14+
15+
std::thread::id id;
16+
std::string name;
17+
jbyte *pc;
18+
OMFrame *currentFrame;
19+
void *stack;
20+
};
21+
22+
extern thread_local OMPixelTowerThread currentThread;
23+
} // namespace openminecraft::vm::pixeltower::v0
24+
25+
#endif

src/boot/entrypoint.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <chrono>
99
#include <csetjmp>
1010
#include <cstdlib>
11+
#include <cstring>
1112
#include <ctime>
1213
#include <filesystem>
1314
#include <fstream>
@@ -154,11 +155,22 @@ int boot(std::vector<std::string> args)
154155
case "pixeltower"_hash: {
155156
if (commandBuffer.size() >= 3 && commandBuffer[1] == "init")
156157
{
158+
tower->initCurrentThread(1ul * 1024 * 1024);
157159
tower->init(commandBuffer[2]);
158160
tower->load("../Test.class");
159161
tower->loader->loadClass("openminecraft/Test");
160162
auto cls = tower->loader->fetchClass("openminecraft/Test");
161-
logger->info("{}", (void *)cls);
163+
auto met = cls->methods;
164+
while (met != nullptr)
165+
{
166+
if (strcmp(met->name, "main") == 0 && strcmp(met->desc, "([Ljava/lang/String;)V") == 0)
167+
{
168+
tower->stackTest(met);
169+
break;
170+
}
171+
met = met->next;
172+
}
173+
tower->destroyCurrentThread();
162174
commandBuffer.clear();
163175

164176
break;

src/vm/pixeltower/v0/om_pixeltower.cpp

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#include "openminecraft/vm/pixeltower/v0/om_pixeltower.hpp"
22
#include "openminecraft/log/om_log_common.hpp"
3+
#include "openminecraft/mem/om_mem_allocator.hpp"
34
#include "openminecraft/util/om_util_result.hpp"
45
#include "openminecraft/vm/classfile/om_class_file.hpp"
6+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_base.hpp"
7+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_frame.hpp"
58
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_heap.hpp"
69
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_method.hpp"
10+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_threads.hpp"
711
#include <filesystem>
812
#include <fstream>
913
#include <memory>
@@ -23,41 +27,16 @@ OMPixelTower::~OMPixelTower()
2327
delete metaspace;
2428
}
2529

26-
void OMPixelTower::testAppendMethod()
30+
void OMPixelTower::stackTest(OMMethod *method)
2731
{
28-
auto alloc = (OMMethod *)metaspace->allocate(sizeof(OMMethod) + 128);
29-
loader->loadClass("java/lang/Object");
30-
alloc->klass = loader->fetchClass("java/lang/Object");
31-
alloc->name = "equals";
32-
alloc->desc = "(Ljava/lang/Object;)Z";
33-
alloc->accessFlags = JVM_Acc_Public;
34-
alloc->codeSize = 128;
35-
alloc->lineNumberTable = nullptr;
32+
auto frame = (OMFrame *)(currentThread.currentFrame == nullptr ? currentThread.stack
33+
: currentThread.currentFrame->stackPointer);
34+
frame->stackPointer = (jbyte *)currentThread.stack + sizeof(OMFrame);
35+
frame->returnAddr = (void *)33550336;
36+
frame->method = method;
3637

37-
for (auto i = 0; i < 128; i++)
38-
{
39-
alloc->code[i] = 0xcc;
40-
}
41-
logger.debug("function inserted at {}", (void *)alloc);
42-
43-
if (alloc == metaspace->heapBase())
44-
{
45-
return;
46-
}
47-
48-
auto currentMet = (OMMethod *)metaspace->heapBase();
49-
while (true)
50-
{
51-
if (currentMet->next == nullptr)
52-
{
53-
currentMet->next = alloc;
54-
break;
55-
}
56-
else
57-
{
58-
currentMet = currentMet->next;
59-
}
60-
}
38+
currentThread.currentFrame = frame;
39+
currentThread.pc = method->code;
6140
}
6241

6342
void OMPixelTower::init(std::string basePath)
@@ -97,4 +76,22 @@ void OMPixelTower::init(std::vector<std::shared_ptr<std::istream>> &streams)
9776
loader->stagClass(target.unwrap());
9877
}
9978
}
79+
80+
void OMPixelTower::initCurrentThread(uint64_t tlsSize)
81+
{
82+
if (currentThread.stack)
83+
{
84+
return;
85+
}
86+
87+
currentThread.stack = mem::allocator::tracedCallocVMData(1, tlsSize);
88+
}
89+
90+
void OMPixelTower::destroyCurrentThread()
91+
{
92+
if (currentThread.stack)
93+
{
94+
mem::allocator::tracedFreeVMData(currentThread.stack);
95+
}
96+
}
10097
} // namespace openminecraft::vm::pixeltower::v0
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include "openminecraft/vm/pixeltower/v0/om_pixeltower_threads.hpp"
2+
3+
namespace openminecraft::vm::pixeltower::v0
4+
{
5+
thread_local OMPixelTowerThread currentThread;
6+
}

0 commit comments

Comments
 (0)