| |
| 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-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-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 |
| |
| |
| 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 |