Skip to content

Commit f561757

Browse files
committed
Add shadow stack to around CALL operations in registerStub
It is required on Windows x64
1 parent 0c353f4 commit f561757

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

src/main/java/com/yasuenag/ffmasm/internal/amd64/AMD64NativeRegister.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,25 @@ private static void setupRegisterStub() throws Throwable{
7575
/* mov %rsp, arg2 */ .movMR(Register.RSP, regs.arg2(), OptionalInt.empty()) // count
7676
/* mov addr, arg1 */ .movImm(regs.arg1(), jvmtiEnv.getRawAddress()) // address of jvmtiEnv
7777
/* mov addr, tmpReg1 */ .movImm(regs.tmpReg1(), jvmtiEnv.getLoadedClassesAddr().address()) // address of GetLoadedClasses()
78-
/* sub $8, %rsp */ .sub(Register.RSP, 8, OptionalInt.empty()) // for stack alignment
78+
/* sub $40, %rsp */ .sub(Register.RSP, 40, OptionalInt.empty()) // Shadow stack (for Windows: 32 bytes) + stack alignment (8 bytes)
7979
/* call tmpReg1 */ .call(regs.tmpReg1())
80-
/* add $8, %rsp */ .add(Register.RSP, 8, OptionalInt.empty()) // for stack alignment
80+
/* add $40, %rsp */ .add(Register.RSP, 40, OptionalInt.empty()) // Recover shadow stack + stack alignments
8181
// call callback(jclass *classes, jint class_count)
8282
/* pop arg2 */ .pop(regs.arg2(), OptionalInt.empty())
8383
/* mov (%rsp), arg1 */ .movRM(regs.arg1(), Register.RSP, OptionalInt.of(0))
8484
/* mov returnReg, arg3 */ .movMR(regs.returnReg(), regs.arg3(), OptionalInt.empty()) // result of GetLoadedClasses()
8585
/* mov savedReg1, arg4 */ .movMR(regs.savedReg1(), regs.arg4(), OptionalInt.empty()) // callbackParam
8686
/* mov addr, tmpReg1 */ .movImm(regs.tmpReg1(), cbStub.address()) // address of callback
87+
/* sub $32, %rsp */ .sub(Register.RSP, 32, OptionalInt.empty()) // Shadow stack (for Windows: 32 bytes)
8788
/* call tmpReg1 */ .call(regs.tmpReg1())
89+
/* add $32, %rsp */ .add(Register.RSP, 32, OptionalInt.empty()) // Recover shadow stack
8890
// call Deallocate()
8991
/* mov addr, arg1 */ .movImm(regs.arg1(), jvmtiEnv.getRawAddress()) // address of jvmtiEnv
9092
/* pop arg2 */ .pop(regs.arg2(), OptionalInt.empty()) // classes
9193
/* mov addr, tmpReg1 */ .movImm(regs.tmpReg1(), jvmtiEnv.deallocateAddr().address()) // address of Deallocate()
92-
/* sub $8, %rsp */ .sub(Register.RSP, 8, OptionalInt.empty()) // for stack alignment
94+
/* sub $40, %rsp */ .sub(Register.RSP, 40, OptionalInt.empty()) // Shadow stack (for Windows: 32 bytes) + stack alignment (8 bytes)
9395
/* call tmpReg1 */ .call(regs.tmpReg1())
94-
/* add $8, %rsp */ .add(Register.RSP, 8, OptionalInt.empty()) // for stack alignment
96+
/* add $40, %rsp */ .add(Register.RSP, 40, OptionalInt.empty()) // Recover shadow stack + stack alignments
9597
// epilogue
9698
/* pop savedReg1 */ .pop(regs.savedReg1(), OptionalInt.empty())
9799
/* leave */ .leave()

0 commit comments

Comments
 (0)