-
Notifications
You must be signed in to change notification settings - Fork 68
/
VMARMStackAlignmentTest.class.st
146 lines (109 loc) · 3.91 KB
/
VMARMStackAlignmentTest.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Class {
#name : #VMARMStackAlignmentTest,
#superclass : #VMSimpleStackBasedCogitAbstractTest,
#instVars : [
'instructions'
],
#pools : [
'CogAbstractRegisters'
],
#category : #'VMMakerTests-JitTests'
}
{ #category : #'building suites' }
VMARMStackAlignmentTest class >> wordSizeParameters [
^ ParametrizedTestMatrix new
addCase: { #ISA -> #'aarch64'. #wordSize -> 8};
yourself
]
{ #category : #'as yet unclassified' }
VMARMStackAlignmentTest >> addInstruction: anInstruction [
instructions add: anInstruction
]
{ #category : #'as yet unclassified' }
VMARMStackAlignmentTest >> disassembleInstructions [
^ self disassembleFrom: cogInitialAddress opcodes: instructions size
]
{ #category : #'as yet unclassified' }
VMARMStackAlignmentTest >> runInstructions [
^ self runFrom: cogInitialAddress until: cogInitialAddress + (instructions size * 4)
]
{ #category : #tests }
VMARMStackAlignmentTest >> setUp [
super setUp.
instructions := OrderedCollection new.
machineSimulator stackPointerRegisterValue: interpreter rumpCStackAddress
]
{ #category : #tests }
VMARMStackAlignmentTest >> testUnAlignedStackWriteShouldGenerateError [
"To start the stack pointer should be aligned"
"Precondition for all tests. SP should be aligned to the stack alignment required by the platform"
[ self stackPointerRegisterValue \\ cogit stackPointerAlignment = 0 ]
whileFalse: [
self pushAddress: 16rBEEF "a small integer to mark..." ].
self
assert: machineSimulator stackPointerRegisterValue
\\ cogit stackPointerAlignment
equals: 0.
machineSimulator
writeRegister: UcARM64Registers sp
value: machineSimulator stackPointerRegisterValue.
self addInstruction: (cogit backend
movSize: 1
destinationRegister: ReceiverResultReg
imm: 12345
shift: 0).
self addInstruction: (cogit backend
strSize: 1
baseRegister: 31
signedOffset: -8
sourceRegister: ReceiverResultReg
preIndex: 1). "word size, size of the elements in the stack" "Access before incrementing"
self addInstruction: (cogit backend
strSize: 1
baseRegister: 31
signedOffset: -8
sourceRegister: ReceiverResultReg
preIndex: 1). "word size, size of the elements in the stack" "Access before incrementing"
self writeInstructions.
[ self runInstructions.
self fail ]
on: UnicornError
do: [ :e |
self
assert: e messageText
equals: 'Unhandled CPU exception (UC_ERR_EXCEPTION)' ]
]
{ #category : #tests }
VMARMStackAlignmentTest >> testUnAlignedStackWriteShouldPass [
"To start the stack pointer should be aligned"
"Precondition for all tests. SP should be aligned to the stack alignment required by the platform"
[self stackPointerRegisterValue \\ cogit stackPointerAlignment = 0]
whileFalse: [ self pushAddress: 16rBEEF "a small integer to mark..." ].
self assert: machineSimulator stackPointerRegisterValue \\ cogit stackPointerAlignment equals: 0.
machineSimulator writeRegister: UcARM64Registers sp value: machineSimulator stackPointerRegisterValue.
self addInstruction:
(cogit backend
movSize: 1
destinationRegister: ReceiverResultReg
imm: 12345 shift: 0).
self addInstruction:
(cogit backend strSize: 1
baseRegister: SPReg
signedOffset: 16 "word size, size of the elements in the stack"
sourceRegister: ReceiverResultReg
preIndex: 1 "Access before incrementing").
self addInstruction:
(cogit backend strSize: 1
baseRegister: SPReg
signedOffset: 16 "word size, size of the elements in the stack"
sourceRegister: ReceiverResultReg
preIndex: 1 "Access before incrementing").
self writeInstructions.
self shouldnt: [self runInstructions] raise: Error.
]
{ #category : #'as yet unclassified' }
VMARMStackAlignmentTest >> writeInstructions [
cogInitialAddress := cogit methodZone allocate: instructions size * 4 .
instructions withIndexDo: [ :instruction :index |
memory uint32AtPointer: cogInitialAddress + (index - 1 * 4) put: instruction ].
]