123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813 |
- PSIM - model the PowerPC environment
- Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>.
- ----------------------------------------------------------------------
- Building PSIM
- This file describes how to build the program PSIM
- o Walk through a basic build
- o Discussion of PSIM's components and
- how they relate to the build process
- o Detailed description of each of PSIM's
- compile time configuration options
- ----------------------------------------------------------------------
- BUILDING PSIM:
- PSIM 1.0.2 is included in GDB-4.16. To build PSIM you will need the
- following:
- gdb-4.16.tar.gz Available from your favorite GNU
- ftp site
- gcc GCC version two includes suport
- for long long (64bit integer)
- arrithemetic which PSIM uses. Hence
- it is recommended that you build PSIM
- using GCC.
-
- Method:
- 1. Unpack gdb
- $ cd .../scratch
- $ gunzip < gdb-4.16.tar.gz | tar xf -
- 2. Configure gdb
- First consult the gdb documentation
- $ cd .../scratch
- $ cd gdb-4.16
- $ more README
- $ more gdb/README
- then something like (I assume SH):
- $ CC=gcc ./configure \
- --enable-sim-powerpc \
- --target=powerpc-unknown-eabi \
- --prefix=/applications/psim
- 4. Build (again specifying GCC)
- $ make CC=gcc
- alternatively, if you are short on disk space or only
- want to build the simulator:
- $ ( cd libiberty && make CC=gcc )
- $ ( cd bfd && make CC=gcc )
- $ ( cd sim/ppc && make CC=gcc )
- 5. Install
- $ make CC=gcc install
- or just
- $ cp gdb/gdb ~/bin/powerpc-unknown-eabisim-gdb
- $ cp sim/ppc/run ~/bin/powerpc-unknown-eabisim-run
- ----------------------------------------------------------------------
- UPDATING PSIM:
- A PSIM is an ongoing development. Occasional snapshots which both contain new
- features and fix old bugs are made available. See the ftp directory:
- ftp://ftp.ci.com.au/pub/psim/beta
- or ftp://cambridge.cygnus.com/pub/psim/beta
- for the latest version. To build/install one of these snapshots, you
- replace the sim/ppc found in the gdb archive with with one from the
- snapshot. Then just re-configure and rebuild/install.
- Procedure:
- 0. A starting point
- $ cd gdb-4.16
- 1. Remove the old psim directory
- $ mv sim/ppc sim/old.ppc
- 2. Unpack the new one
- $ gunzip < ../psim-NNNNNN.tar.gz | tar tf -
- $ gunzip < ../psim-NNNNNN.tar.gz | tar tf -
- 3. Reconfigure/rebuild (as seen above):
- $ CC=gcc ./configure \
- --enable-sim-powerpc \
- --target=powerpc-unknown-eabi \
- --prefix=/applications/psim
- $ make CC=gcc
- ----------------------------------------------------------------------
- UPDATES TO GDB:
- From time to time, problems involving the integration of PSIM into gdb
- are found. While eventually each of these problems is resolved there
- can be periouds during which a local hack may be needed.
- At the time of writing the following were outstanding:
- ATTACH command:
- ftp://ftp.ci.com.au/pub/psim/gdb-4.15+attach.diff.gz
- or ftp://cambridge.cygnus.com/pub/psim/gdb-4.15+attach.diff.gz
-
- PSIM, unlike the other simulators found in GDB, is able to load
- the description of a target machine (including the initial
- state of all processor registers) from a file.
- Unfortunatly GDB does not yet have a standard command that
- facilitates the use of this feature. Until such a command is
- added, the patch (hack?) gdb-4.15+attach.diff.gz can be used to
- extend GDB's attach command so that it can be used to initialize
- the simulators configuration from a file.
- ----------------------------------------------------------------------
- RUNNING PROGRAMS:
- See the file:
- ftp://ftp.ci.com.au/pub/psim/RUN
- or ftp://cambridge.cygnus.com/pub/psim/RUN
- ----------------------------------------------------------------------
- COMPILE TIME CONFIGURATION OPTIONS:
- PSIM's compile time configuration is controlled by autoconf. PSIM's
- configure script recognises options of the form:
- --enable-sim-<option>[=<val>]
- And can be specified on the configure command line (at the top level
- of the gdb directory tree) vis:
- $ cd gdb-4.15
- $ CC=gcc ./configure \
- --target=powerpc-unknown-eabisim \
- --prefix=/applications/psim \
- --enable-sim-inline
- $ make CC=gcc
- For a brief list of PSIM's configuration options, configure --help
- will list them vis:
- $ cd sim/ppc
- $ ./configure --help
- Each PSIM specific option is discussed in detail below.
- --enable-sim-cflags=<opts>
- Specify additional C compiler flags that are to be used when compiling
- just PSIM.
- PSIM places heavy demands on both the host machine and its C compiler. So that
- the builder has better control over the compiler the above option can be used
- to pass additional options to the compiler while PSIM is being built.
- Ex: No debug information
- PSIM can be built with everything inline. Unfortunately, because of
- all the debugging information generated the C compiler can grow very
- very large as a result. For GCC, the debug information can be
- restricted with the `-g0' option. To specify that this option should
- be include in the CFLAGS when compiling the psim source code use:
- --enable-sim-cflags=-g0
- Ex: Additional optimization flags
- A significant gain in performance can be achieved by tuning the
- optimization flags passed to the C compiler. For instance on an x86
- you may consider:
- --enable-sim-cflags='-g0 -O2 -fno-strength-reduce -f...'
- --enable-sim-warnings=<flags>
- Turn on additional GCC specific checks.
- Some hosts (NetBSD, Linux, Solaris-2.5) have complete header files
- that include correct prototypes for all library functions. On such
- hosts, PSIM can be built with many more than the standard C checks
- enabled. The option --enable-sim-warnings controls this.
- Ex: Default warnings
- With just --enable-sim-warnings, the following -W options are enabled:
- -Werror -Wall -Wpointer-arith -Wmissing-prototypes.
- --enable-sim-opcode=which
- Specify the file containing the rules for generating the instruction
- decode and execute functions from the file ppc-instructions.
- The form of the instruction decode and execute functions is controlled
- by an opcode table. It specifies: the combination of switch
- statements and jump tables to use when decoding an instruction and how
- much of each instruction should be decoded before calling the
- instruction execute function.
- PSIM includes a number of opcode tables:
- psim-opcode-simple
- Generates a small compact two level switch statement
- that will compile quickly and run reasonably fast.
- This may be useful on a small machine.
- psim-opcode-complex
- (the default) A fairly aggressive instruction decode
- table that includes the breaking out of a number
- of special instruction cases (eg RA==0 vs RA!=0).
- psim-opcode-flat
- Identical to complex except a switch statement
- is used. Ideal for when the icache is being
- disabled.
- psim-opcode-stupid
- In addition to the instruction decodes performed
- by psim-opcode-complex, this also full decodes mtspr,
- mfspr, and branch instructions. The table generated
- is very large and, as a consequence, only performs
- well on machines with large caches.
- ppc-opcode-test-1
- ppc-opcode-test-2
- Generate test (but workable) tables. These exercise
- PSIM's ability to generate instruction decode functions
- that are a combination of jump-tables and switch statements.
- The program igen generates the instruction tables from the opcode
- table and the ppc-instruction table.
- --enable-sim-switch
- Enable/disable the use of a switch statement when looking up the
- attributes of a SPR register.
- The PowerPC architecture defines a number of Special Purpose Registers
- (SPR's). Associated with each of these registers are a number of
- attributes (such as validity or size) which the instructions
- mtspr/mfspr query as part of their execution.
- For PSIM, this information is kept in a table (ppc-spr-table). The
- program dgen converts this table into lookup routines (contained in
- the generated files spreg.h spreg.c) that can be used to query an
- SPR's attributes. Those lookup routines are either implemented as
- a table or alternatively as a number of switch statements:
- spr_table spr_info[] = { .... };
- int spr_length(sprs spr) { return spr_info[spr].length; }
- vs
- int spr_length(sprs spr) { switch (spr) { case ..: return ..; } }
- In general the first implementation (a table) is the most efficient.
- It may, however, prove that when performing an aggressive optimization
- where both the SPR is known and the above function is being inlined
- (with the consequence that GCC can eliminate the switch statement)
- that the second choice is improves performance.
- In practice, only a marginal (if any benefit) has ever been seen.
- --enable-sim-duplicate
- Create a duplicate copy of each instruction function hardwiring
- instruction fields that would have otherwise have been variable.
- As discussed above, igen outputs a C function generated from the file
- ppc-instructions (using the opcode rules) for each of the
- instructions. Thus multiple entries in the instruction decode tables
- may be pointing back at the same function. Enabling duplicate, will
- result in psim creating a duplicate of the instruction's function for
- each different entry in the instruction decode tables.
- For instance, given the branch instruction:
- 0.19,6.BO,11.BI,16./,21.528,31.LK
- ...
- if (LK) LR = (spreg)IEA(CIA + 4);
- ...
- igen as part of its instruction lookup table may have generated two
- different entries - one for LK=0 and one for LK=1. With duplicate
- enabled, igen outputs (almost) duplicate copies of branch function,
- one with LK hardwired to 0 and one with LK hardwired to 1.
- By doing this the compiler is provided with additional information that
- will allow it possibly eliminate dead code. (such as the assignment
- to LK if LR==0).
- Ex: default
- Because this feature is such a big win, --enable-sim-duplicate is
- turned on by default.
- Ex: A small machine
- Only rarely (eg on a very small host) would this feature need to be
- disabled (using: --disable-sim-duplicate).
- --enable-sim-filter=rule
- Include/exclude PowerPC instructions that are specific to a particular
- implementation.
- Some of the PowerPC instructions included in the file ppc-instructions
- are limited to certain specific PPC implementations. For instance,
- the instruction:
- 0.58,6.RT,11.RA,16.DS,30.2:DS:64::Load Word Algebraic
- Is only valid for the 64bit architecture. The enable-sim-filter flag
- is passed to igen so that it can `filter out' any invalid
- instructions. The filter rule has the form:
- -f <name>
- thus:
- --enable-sim-filter='-f 64'
- (the default) would filter out all 64bit instructions.
- Ex: Remove floating point instructions
- A given 32bit PowerPC implementation may not include floating point
- hardware. Consequently there is little point in including floating
- point instructions in the instruction table. The option:
- --enable-sim-filter='-f 64 -f f'
- will eliminate all floating point instructions from the instruction
- table.
- --enable-sim-icache=size
- Set the size of the cache used to hold decoded instructions.
- Psim executes instructions in two separate steps:
- o instruction fetch/decode
- o instruction execution
- For a given instruction, the first stage need only be executed once
- (the first time the instruction is encountered) while the second stage
- must be executed every time the program `executes' that instruction.
- Exploiting this, PSIM can maintain a cache of decoded instructions.
- It will then use the decoded instruction from the cache in preference
- to fetching/decoding the real instruction from memory.
- Ex: default
- Because this feature is normally such a big win, it is enabled by
- default (with the cache size set to 1024 entries).
- The 1024 entries equals 4096 bytes (or one page) of instructions.
- Larger caches can be used but with caution - PSIM does not check for
- address aliasing within its instruction cache.
- Ex: disable the cache
- There may be cases (for instance where the cache has a low hit rate)
- where the psim performs better with no instruction cache. For such
- situations, the cache can be disabled vis: --disable-sim-icache.
- --enable-sim-inline[=module]
- Specify the inlining of one or more modules.
- Many architectures (in particular the x86) suffer from a large
- function call overhead. By eliminating function calls (through
- inlining of functions) a large performance gain can be achieved.
- In PSIM, modules are inlined in one of two possible ways. Some
- modules (such as the byte swapping code) can be inlined into any
- module that calls them. Other modules, due to complex
- interdependencies, are only inlined as a group when compiling the
- external interface module psim.c.
- Ex: default
- By default the modules endian (handle be/le), bits (manipulate
- bit-fields within words), cpu (the processor object) and events
- (timers) are inlined in any module that calls them. This gives a
- reasonable performance gain with little additional compilation
- overhead.
- Ex: recommended --enable-sim-inline
- Assuming you machine is reasonably well configured, this option is
- highly recommended. On the x86 several orders of magnitude
- improvement in performance is possible.
- Ex: fine tuning
- The file std-config.h contains a detailed description of how the
- inlining works. Individual modules can be inlined by specifying them.
- For if you have a very large cache the model module could be inlined
- with:
- --enable-sim-inline=MODEL
- --enable-sim-bswap
- (x86 specific) Use the i486/P5/P6 byte swap instruction.
- PSIM contains generic byte swapping code. For the x86 (P[4-6]) PSIM
- can be built so that it uses the bswap instruction instead of relying
- on the compiler to generate byte swap code.
- Ex: default
- By default, when compiling with GCC-2 on an i486/P5/P6 the bswap
- instruction is used.
- --enable-sim-endian=endian
- Specify the byte order of the target.
- By default, PSIM is able to execute both big and little endian
- executables. As a consequence, every byte swap routine includes a
- test to see if the byte swap is really needed. By specifying the byte
- order of the target (and the host below) the need for this test can be
- eliminated.
- Clearly setting the byte order of the target is only useful when known
- before hand.
- --enable-sim-hostendain=end
- As above but for the host.
- Normally this option should not be needed. configure (autoconf) should
- determine the byte order of the host automatically. However if for
- some reason there is a problem, this option can be used to override
- autoconf.
- --enable-sim-smp=n
- Set the maximum number of processors that PSIM can model.
- Psim can model (with small limitation discussed else where) a
- multi-processor PowerPC environment. While the overhead of
- co-ordinating the execution of a number of processors is relatively
- small it is still significant when compared to handling only one
- processor.
- This option only sets the maximum number of processors that can be
- simulated. The number active during a given simulation run us
- determined at run time.
- Ex: default
- By default 5 processors are configured but only one is enabled.
- Additional processors can be enabled with the runtime option:
- -o '/openprom/options/smp 5'
- Ex: recommended
- Unless you intend studying multi-processor systems there is little reason for
- having PSIM configured with SMP support. Specifying:
- --disable-sim-smp
- or --enable-sim-smp=0
- will eliminate any SMP such as:
- for (cpu = 0; cpu < nr_cpus; cpu++)
- ...
- --enable-sim-xor-endian=n
- Set the byte-size of the bus involved in the PowerPC's xor endian byte
- swapping.
- The PowerPC's implementation of BE/LE mode is different to what a
- programmer may first expect. The details of this implementation are
- discussed at length in PowerPC documentation.
- Ex: default
- By default this is configured with a value of 8 (the bus size of most
- 60x processors).
- Ex: recommended
- Unless you are expecting to test/debug PowerPC be/le switching code
- this option is of little use and should be disabled:
- --disable-sim-xor-endian
- --enable-sim-bitsize=n
- Specify the bit size (32/64) of the PowerPC to be modelled.
- Note: By default 32 is specified. The implementation of the 64bit
- architecture is still under development.
- --enable-sim-hostbitsize=32|64
- As above but for the host.
- NOTE: Psim has yet to be built on a 64bit host.
- --enable-sim-env=env
- Hardwire the PowerPC environment being modelled (user, virtual or
- operating).
- The PowerPC architecture defines three different levels of compliance to its
- architectural specification. These environments are discussed in detail in
- PowerPC publications.
- user - normal user programs
- virtual - an extension of the user environment (includes timers)
- operating - kernel code
- Ex: default
- By default all three environments are supported.
- Ex: recommended
- If you only intend running psim with user (or operating) code then
- PSIM should be configured accordingly. For user code, it eliminates:
- support for timers and events and redundant VM calls.
- --enable-sim-timebase
- Enable/disable the time base register.
- The PowerPC architecture (virtual environment) includes a time base
- register. Maintaining that register incurs an overhead in
- performance that can be eliminated by eliminating time-base register
- support.
- Ex: default
- Normally this option is not used. Instead --enable-sim-env (above) us
- used to disable/enable features such as the timebase register.
- --enable-sim-alignment=align
- Control the PowerPC's memory access alignment restrictions.
- The PowerPC in LE mode only allows memory transfers of a correctly
- aligned size/address. The above option controls how misaligned
- accesses are handled.
- strict All accesses must be correctly aligned
- nonstrict Unaligned access allowed (the are split
- into a number of aligned accesses).
- Ex: default
- Unless otherwise specified PSIM will auto configure a BE program to
- allow miss-aligned accesses while a LE program will not.
- Ex: 604e
- The recently announced 604e processor allows miss-aligned accesses in both
- BE and LE modes. If modeling the 604e then you should specify:
- --enable-sim-alignment=nonstrict
- --enable-sim-trace
- Include code to trace PSIM's internal progress (also controlled by the
- -t option).
- Checking to see if a trace message should be output slows down a
- simulation. Disabling this option (--disable-sim-trace) eliminates
- completely that code.
- --enable-sim-assert
- Include the code that checks the correctness of parts of PSIM.
- Eliminating such code (--disable-sim-assert) eliminates internal
- consistency tests and their overhead.
- --enable-sim-reserved-bits
- Include code to check that the reserved fields of the instruction are
- zero.
- The PowerPC architecture defines certain fields of some instructions
- as reserved (`/'). By default, for each instruction, PSIM will check
- the reserved fields causing an invalid instruction exception if a
- field is invalid. Disabling this option eliminates this test. This
- is at the slight risk of PSIM treating an invalid instruction as
- valid.
- --enable-sim-float
- Include support for hardware floating point.
- --enable-sim-monitor=mon
- Include support for basic instruction counting.
- If you are not interested in the performance of either you program or
- the simulator then you can disable this option.
- --enable-sim-model=which
- Hardwire the processor that will be used as a reference when modeling
- execution units.
- --enable-sim-default-model=which
- Specify the processor of choice for the execution unit model.
- --enable-sim-model-issue
- Include support for the modeling of processor execution units.
- ----------------------------------------------------------------------
- TYPICAL CONFIGURATION OPTIONS:
- VEA CODE ONLY:
- Here of note are:
- o ramp up the compiler options (some
- of the below are P5 specific).
- o disable anything not used
- CC=gcc ./configure \
- --prefix=/applications/psim \
- --target=powerpc-unknown-eabi \
- --enable-sim-powerpc \
- --enable-sim-warnings \
- --enable-sim-inline \
- --disable-sim-smp \
- --enable-sim-duplicate \
- --enable-sim-endian=big \
- --disable-sim-xor-endian \
- --enable-sim-env=user \
- --disable-sim-reserved-bits \
- --disable-sim-assert \
- --disable-sim-trace \
- --enable-sim-cflags='-g0,-O2,-fno-strength-reduce,-fomit-frame-pointer'
- OEA CODE ONLY:
- The key configuration changes are:
- o turn off the instruction cache. The overhead
- of flushing and reloading it is greater than
- not having a cache.
- o use a switch statement (ppc-opcode-flat) for
- the instruction decode and then (-O3) fully
- inline all functions.
- o --enable-sim-warnings is not present. GCC (2.7.2)
- gets confused by the instruction decode table
- generated by igen (contains a perfect switch)
- and, as a consequence, generates a bogus warning.
- CC=gcc ./configure \
- --prefix=/applications/psim \
- --target=powerpc-unknown-eabi \
- --enable-sim-powerpc \
- --enable-sim-inline \
- --disable-sim-smp \
- --enable-sim-duplicate \
- --enable-sim-endian=big \
- --disable-sim-xor-endian \
- --enable-sim-env=operating \
- --disable-sim-reserved-bits \
- --disable-sim-assert \
- --disable-sim-trace \
- --enable-sim-opcode=ppc-opcode-flat \
- --disable-sim-icache \
- --enable-sim-cflags='-g0,-O3,-fno-strength-reduce,-fomit-frame-pointer'
|