-
Notifications
You must be signed in to change notification settings - Fork 67
/
UnicornSimulationTrap.class.st
80 lines (63 loc) · 2 KB
/
UnicornSimulationTrap.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
Class {
#name : #UnicornSimulationTrap,
#superclass : #Object,
#instVars : [
'unicornInvalidAccess',
'simulator'
],
#category : #'VMMakerTests-Unicorn'
}
{ #category : #'instance creation' }
UnicornSimulationTrap class >> simulator: simulator error: anUnicornInvalidMemoryAccess [
^ self new
simulator: simulator;
unicornInvalidAccess: anUnicornInvalidMemoryAccess;
yourself
]
{ #category : #accessing }
UnicornSimulationTrap >> address [
^ unicornInvalidAccess address
]
{ #category : #accessing }
UnicornSimulationTrap >> nextpc [
| instruction |
instruction := self simulator disassembleCurrentInstruction.
^ self simulator instructionPointerRegisterValue + instruction size
]
{ #category : #accessing }
UnicornSimulationTrap >> registerAccessor [
"Assume this is a read of a value into a register"
| failingInstruction registerName |
self assert: self type = #read.
"Get the register were we wanted to read the value into"
failingInstruction := self simulator disassembleCurrentInstruction.
registerName := self simulator extractDestinationRegisterFromAssembly: failingInstruction.
^ (registerName , ':') asSymbol
]
{ #category : #accessing }
UnicornSimulationTrap >> simulator [
^ simulator
]
{ #category : #accessing }
UnicornSimulationTrap >> simulator: anObject [
simulator := anObject
]
{ #category : #accessing }
UnicornSimulationTrap >> type [
unicornInvalidAccess type = UcMemoryAccessType UC_MEM_WRITE_UNMAPPED
ifTrue: [ ^ #write ].
unicornInvalidAccess type = UcMemoryAccessType UC_MEM_READ_UNMAPPED
ifTrue: [ ^ #read ].
unicornInvalidAccess type = UcMemoryAccessType UC_MEM_FETCH_UNMAPPED
ifTrue: [ ^ #jump ].
self halt
]
{ #category : #accessing }
UnicornSimulationTrap >> unicornInvalidAccess: anUnicornInvalidMemoryAccess [
unicornInvalidAccess := anUnicornInvalidMemoryAccess
]
{ #category : #accessing }
UnicornSimulationTrap >> writtenValue [
"This is the value that was tried to be written but failed (if this is a failed write)"
^ unicornInvalidAccess value
]