@@ -75,23 +75,25 @@ private static void setupRegisterStub() throws Throwable{
75
75
/* mov %rsp, arg2 */ .movMR (Register .RSP , regs .arg2 (), OptionalInt .empty ()) // count
76
76
/* mov addr, arg1 */ .movImm (regs .arg1 (), jvmtiEnv .getRawAddress ()) // address of jvmtiEnv
77
77
/* 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)
79
79
/* 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
81
81
// call callback(jclass *classes, jint class_count)
82
82
/* pop arg2 */ .pop (regs .arg2 (), OptionalInt .empty ())
83
83
/* mov (%rsp), arg1 */ .movRM (regs .arg1 (), Register .RSP , OptionalInt .of (0 ))
84
84
/* mov returnReg, arg3 */ .movMR (regs .returnReg (), regs .arg3 (), OptionalInt .empty ()) // result of GetLoadedClasses()
85
85
/* mov savedReg1, arg4 */ .movMR (regs .savedReg1 (), regs .arg4 (), OptionalInt .empty ()) // callbackParam
86
86
/* 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)
87
88
/* call tmpReg1 */ .call (regs .tmpReg1 ())
89
+ /* add $32, %rsp */ .add (Register .RSP , 32 , OptionalInt .empty ()) // Recover shadow stack
88
90
// call Deallocate()
89
91
/* mov addr, arg1 */ .movImm (regs .arg1 (), jvmtiEnv .getRawAddress ()) // address of jvmtiEnv
90
92
/* pop arg2 */ .pop (regs .arg2 (), OptionalInt .empty ()) // classes
91
93
/* 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)
93
95
/* 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
95
97
// epilogue
96
98
/* pop savedReg1 */ .pop (regs .savedReg1 (), OptionalInt .empty ())
97
99
/* leave */ .leave ()
0 commit comments