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