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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
PSIM
Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
This directory contains the program PSIM that models the PowerPC
architecture. It can either be run stand alone (psim) or linked with
GDB.
CONTENTS:
psim-*.tar:
psim-sim-*.tar.gz simulator source code
psim-test-*.tar.gz test directory for simulator
psim-gdb-*.diff.gz patches to integrated psim
into gdb
gnu-*.tar:
gnu-gdb-*.diff.gz patches to gdb that may have
already been merged into the
GDB source tree.
gnu-*-*.diff.gz Other noise
BUILDING:
o Install flex, bison, gnu-make, native gcc and probably also byacc.
o First you will need a fairly current copy of GDB (try the ftp site
ftp.cygnus.com:pub). I've built it with a beta version of gdb-4.15.
Unpack gdb vis:
$ gunzip < gdb-4.15.tar.gz | tar xf -
o Apply any patches that haven't yet been merged into the GDB source
tree.
$ cd gdb-4.15
$ gunzip < ../psim-gdb-*.diff.gz | patch -p1
$ gunzip < ../gnu-gdb-*.diff.gz | patch -p1
o Unpack the psim source code (and optionally the test directory)
$ cd gdb-4.15
$ gunzip < ../psim-sim-*.tar.gz | tar xvf -
$ gunzip < ../psim-test-*.tar.gz | tar xvf -
o Configure gdb as per normal. I use something along the lines of:
$ cd gdb-4.15
$ CC=gcc ./configure --target=powerpcle-unknown-eabi
o Build your entire gdb tree as per normal. Something along the
lines of:
$ cd gdb-4.15
$ make CC=gcc
.
.
.
o Install it it all as per normal. Something along the lines of:
$ cd gdb-4.15
$ make CC=gcc install
The program sim/ppc/psim is not installed.
RUNNING:
PSIM can either be run as a stand alone program or as part
of gdb. The psim-test archive contains pre-compiled and
linked programs that can be run on PSIM. The notes below
assume that you have unpacked that tar archive.
To rebuild the archive you will need to obtain a working
version of an ELF compiler/linker for the PowerPC.
Example of running PSIM:
Print out the users environment:
$ sim/ppc/psim sim/ppc/test/envp
Print out the arguments:
$ sim/ppc/psim sim/ppc/test/argv a b c
Check the OEA model:
$ sim/ppc/psim sim/ppc/test/interrupt
Check that sbrk works
$ sim/ppc/psim sim/ppc/test/break
Try for speed. The program count contains a loop
of two instructions which is looped <arg> times.
See later for how to make PSIM run 10-100 times
faster.
$ time sim/ppc/sim sim/ppc/test/count 5000000
$ expr 10 \* 1000 \* 1000 / <seconds>
Example of running GDB:
The most important thing to be aware of is the fact
that before the simulator is used, the user must attach
to it (target sim) and than load the executable (load count).
$ cd sim/ppc/test
$ powerpc-unknown-eabi-gdb count
(gdb) target sim
(gdb) load count
(gdb) break main
(gdb) run
.
.
.
CONFIGURATION: Making it go faster
See the file sim/ppc/config.h (a.k.a. sim/ppc/data/ppc-config)
for notes.
KNOWN FEATURES
SMP, dual-endian, VEA and OEA models, hardware devices
(console, icu, reset) ...
KNOWN PROBLEMS:
Configuration could be better.
HTAB (page) code for OEA model untested. Some of the vm code
instructions unimplemented.
Doesn't detect/handle changing endian bits. In fact they are
ignored.
Return from interrupt instruction unimplemented.
Flush instruction cache instructions do nothing. Perhaphs they
should (if there is an instruction cache) flush it.
PowerOpen VEA model (a.k.a XCOFF a.k.a AIX) broken. It was
working but that is before I changed the create stack frame
code into an ELF version.
OpenBoot and PR*P interfaces missing. Open boot could be
implemented by putting special instructions at the address
of the OpenBoot callback functions. Those instructions
could than emulate OpenBoot behavour.
VEA memory read/write performance could be improved by merging
the data sections.
When reading in a VEA executable, the binaries text and data
sections are not made page aligned.
Missing or commented out instructions.
Lack of floating point support.
[workaround: build everything using -msoft-float]
64bit untested.
Event code for pending events from signal handlers not
finished/tested.
Better and more devices.
Only two device trees VEA and OEA (clayton) and those hard coded.
Should be possible to specify a file containing a device tree
description as the program to run. At present it a device tree
file is detected causing psim to abort.
I wonder if I've got my ppc.instructions copyright
notice correct.
THANKS:
Thanks go to the following who each helped in some way.
Allen Briggs, Bett Koch, David Edelsohn,
Michael Meissner, Bob Mercier, Richard Perini,
Richard Stallman, Mitchele Walker
----------------------------------------------------------------
Random notes on performance:
$ cd test
time ../psim count `expr 10000000 / 2`
time ../psim volatile-count `expr 10000000 / 7`
Where 2 and 7 are the number of instructions in the main loop.
611/729 - baseline
Tests:
CFLAGS= -c -O2 -m486 -fomit-frame-pointer
o different first/second level table/switch combinations
0 - use a table
1 - use a simple switch
2 - use an expanded switch
i486DX4/100 - AMD
1/108/140 - switch=0/0/0,expand=2,inline=2,nia=1,cache=1
1/114/140 - switch=0/0/0,expand=2,inline=2,nia=1,cache=1
1/137/149 - switch=0/0,expand=2,inline=1,nia=1,cache=1
1/144/155 - switch=2/1,expand=2,inline=1,nia=1,cache=1
1/153/159 - switch=2/1,expand=0,inline=1,nia=1,cache=1
1/185/189 - switch=0/0,expand=0,inline=1,nia=1
i486DX2/66
1/572/695 - switch=1/1,expand=0,inline=0
1/579/729 - switch=0/0,expand=0,inline=0
1/570/682 - switch=2/2,expand=0,inline=0
1/431/492 - switch=0/0,expand=0,inline=1,nia=0
1/271/292 - switch=2/1,expand=0,inline=1,nia=0
1/270/316 - switch=2/2,expand=0,inline=1,nia=0
1/271/281 - switch=1/1,expand=0,inline=1,nia=1
1/267/274 - switch=2/1,expand=0,inline=1,nia=1
|