| |
| PSIM - model the PowerPC environment |
| |
| Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>. |
| |
| ---------------------------------------------------------------------- |
| |
| Running PSIM |
| |
| This file describes how to run the program PSIM. |
| |
| o Walk through a number of examples from the |
| pre-built tar archive psim-test. |
| |
| o Looks at the device tree used by PSIM. |
| |
| o Notes on building a programmer environment to |
| use with PSIM (BSD/UEA and BUG/OEA) |
| |
| |
| ---------------------------------------------------------------------- |
| |
| |
| RUNNING PSIM: |
| |
| |
| The compressed tar archive psim-test available from: |
| |
| ftp://ftp.ci.com.au/pub/psim/psim-test-1.0.1.tar.gz |
| or ftp://cambridge.cygnus.com/pub/psim/psim-test-1.0.1.tar.gz |
| |
| contains a number of pre-built programs for running under PSIM. Each |
| pre-built binary is built both big and little endian. The suffixes |
| .be/.le (executables) .bo/.lo (object files) and .ba/.la (libraries) |
| are used. |
| |
| |
| To run one of these programs, use: |
| |
| powerpc-unknown-eabi-run <image> |
| |
| for instance: |
| |
| powerpc-unknown-eabi-run psim-test/uea/envp |
| |
| The program envp prints out your shells environment - very useful! |
| More generally psim is run as (this is part of the output from the -h |
| option): |
| |
| psim [ <psim-option> ... ] <image> [ <image-arg> ... ] |
| |
| Where |
| |
| <image> Name of the PowerPC program to run. |
| This can either be a PowerPC binary or |
| a text file containing a device tree |
| specification. |
| PSIM will attempt to determine from the |
| specified <image> the intended emulation |
| environment. |
| If PSIM gets it wrong, the emulation |
| environment can be specified using the |
| `-e' option (described below). |
| |
| <image-arg> Argument to be passed to <image> |
| These arguments will be passed to |
| <image> (as standard C argv, argc) |
| when <image> is started. |
| |
| <psim-option> See below |
| |
| The following are valid <psim-option>s: |
| |
| -m <model> Specify the processor to model (604) |
| Selects the processor to use when |
| modeling execution units. Includes: |
| 604, 603 and 603e |
| |
| -e <os-emul> specify an OS or platform to model |
| Can be any of the following: |
| bug - OEA + MOTO BUG ROM calls |
| netbsd - UEA + NetBSD system calls |
| chirp - OEA + a few OpenBoot calls |
| |
| -i Print instruction counting statistics |
| |
| -I Print execution unit statistics |
| |
| -r <size> Set RAM size in bytes (OEA environments) |
| |
| -t [!]<trace> Enable (disable) <trace> option |
| |
| -o <spec> add device <spec> to the device tree |
| |
| -h -? -H give more detailed usage |
| |
| |
| The `-H' option gives a long usage output. This includes a complete |
| list of all the pre-configured devices. |
| |
| |
| ---------------------------------------------------------------------- |
| |
| |
| RUNNING GDB: |
| |
| |
| If you built PSIM with gdb then the following is a quick start |
| tutorial. |
| |
| At present GDB, if configured big-endian (say) unlike PSIM, does not |
| support the debugging of little endian binaries. If you find that |
| your program won't run at all, make certain that GDB and your |
| program's endianness match. |
| |
| |
| The most important thing is that before you can run the simulator you |
| must enable it. For the simulator, gdb is started like any program: |
| |
| $ powerpc-unknown-eabi-gdb psim-test/uea/envp.be |
| |
| Next the simulator is enabled. The command `target sim' accepts the |
| same options as can be specified on the PSIM command line. |
| |
| (gdb) target sim |
| |
| To trace the communication between psim and gdb specify `target sim -t |
| gdb'. Once enabled, the binary needs to be loaded, any breakpoints of |
| interest set, and the program run: |
| |
| (gdb) load |
| (gdb) break main |
| (gdb) run |
| . |
| . |
| . |
| |
| In addition, if you are wanting to run a program described by a device |
| tree you can `attach' to the simulation using (I assume that you have |
| applied the attach patch): |
| |
| $ cd psim-test/tree |
| $ powerpc-unknown-eabi-gdb |
| (gdb) target sim |
| (gdb) attach device-tree |
| (gdb) run |
| |
| Here GDB takes the programs initial state from the attached |
| device-tree instead of forcing initialisation. |
| |
| |
| ---------------------------------------------------------------------- |
| |
| |
| PROFILING: |
| |
| |
| PSIM includes a number of performance monitoring (profiling) |
| facilities: |
| |
| o instruction frequency counting |
| |
| o execution unit modeling (records |
| effective usage of units). |
| |
| o instruction cache performance |
| |
| As discussed in the file INSTALL, each can be configured to individual |
| requirements. |
| |
| |
| -i Enable instruction counting. |
| |
| The frequency of all instructions is tabulated. In |
| addition (f configured) the hit/miss rate of the |
| instruction cache is output. |
| |
| |
| -I Enable execution unit analysis. |
| |
| In addition to counting basic instructions also model |
| the performance of the processors execution units |
| |
| |
| -m <processor> |
| |
| Select the processor to be modelled. |
| |
| For execution unit analysis specify the processor that |
| is to be analysed. By default the 604 is modelled |
| however, support for other processors such as the |
| 603 and 603e is included. |
| |
| The output from a performance run (on a P90) for the program |
| psim-test/profile/bench is below. In this run psim was fairly |
| agressively configured (see the file INSTALL for compile time |
| configuration). |
| |
| CPU #1 executed 41,994 AND instructions. |
| CPU #1 executed 519,785 AND Immediate instructions. |
| CPU #1 executed 680,058 Add instructions. |
| CPU #1 executed 41,994 Add Extended instructions. |
| CPU #1 executed 921,916 Add Immediate instructions. |
| CPU #1 executed 221,199 Add Immediate Carrying instructions. |
| CPU #1 executed 943,823 Add Immediate Shifted instructions. |
| CPU #1 executed 471,909 Add to Zero Extended instructions. |
| CPU #1 executed 571,915 Branch instructions. |
| CPU #1 executed 1,992,403 Branch Conditional instructions. |
| CPU #1 executed 571,910 Branch Conditional to Link Register instructions. |
| CPU #1 executed 320,431 Compare instructions. |
| CPU #1 executed 471,911 Compare Immediate instructions. |
| CPU #1 executed 145,867 Compare Logical instructions. |
| CPU #1 executed 442,414 Compare Logical Immediate instructions. |
| CPU #1 executed 1 Condition Register XOR instruction. |
| CPU #1 executed 103,873 Divide Word instructions. |
| CPU #1 executed 104,275 Divide Word Unsigned instructions. |
| CPU #1 executed 132,510 Extend Sign Byte instructions. |
| CPU #1 executed 178,895 Extend Sign Half Word instructions. |
| CPU #1 executed 871,920 Load Word and Zero instructions. |
| CPU #1 executed 41,994 Move From Condition Register instructions. |
| CPU #1 executed 100,005 Move from Special Purpose Register instructions. |
| CPU #1 executed 100,002 Move to Special Purpose Register instructions. |
| CPU #1 executed 804,619 Multiply Low Word instructions. |
| CPU #1 executed 421,201 OR instructions. |
| CPU #1 executed 471,910 OR Immediate instructions. |
| CPU #1 executed 1,292,020 Rotate Left Word Immediate then AND with Mask instructions. |
| CPU #1 executed 663,613 Shift Left Word instructions. |
| CPU #1 executed 1,151,564 Shift Right Algebraic Word Immediate instructions. |
| CPU #1 executed 871,922 Store Word instructions. |
| CPU #1 executed 100,004 Store Word with Update instructions. |
| CPU #1 executed 887,804 Subtract From instructions. |
| CPU #1 executed 83,988 Subtract From Immediate Carrying instructions. |
| CPU #1 executed 1 System Call instruction. |
| CPU #1 executed 207,746 XOR instructions. |
| |
| CPU #1 executed 23,740,856 cycles. |
| CPU #1 executed 10,242,780 stalls waiting for data. |
| CPU #1 executed 1 stall waiting for a function unit. |
| CPU #1 executed 1 stall waiting for serialization. |
| CPU #1 executed 1,757,900 times a write-back slot was unavailable. |
| CPU #1 executed 1,088,135 branches. |
| CPU #1 executed 2,048,093 conditional branches fell through. |
| CPU #1 executed 1,088,135 successful branch predictions. |
| CPU #1 executed 904,268 unsuccessful branch predictions. |
| CPU #1 executed 742,557 branch if the condition is FALSE conditional branches. |
| CPU #1 executed 1,249,846 branch if the condition is TRUE conditional branches. |
| CPU #1 executed 571,910 branch always conditional branches. |
| CPU #1 executed 9,493,653 1st single cycle integer functional unit instructions. |
| CPU #1 executed 1,220,900 2nd single cycle integer functional unit instructions. |
| CPU #1 executed 1,254,768 multiple cycle integer functional unit instructions. |
| CPU #1 executed 1,843,846 load/store functional unit instructions. |
| CPU #1 executed 3,136,229 branch functional unit instructions. |
| CPU #1 executed 16,949,396 instructions that were accounted for in timing info. |
| CPU #1 executed 871,920 data reads. |
| CPU #1 executed 971,926 data writes. |
| CPU #1 executed 221 icache misses. |
| CPU #1 executed 16,949,396 instructions in total. |
| |
| Simulator speed was 250,731 instructions/second |
| |
| |
| ---------------------------------------------------------------------- |
| |
| |
| PSIM CONFIGURATION - THE DEVICE TREE |
| |
| |
| Internally PSIM's configuration is controlled by a tree data |
| structure. This structure, created at run-time, intentionally |
| resembles the device tree used by OpenBoot firmware to describe a |
| machines hardware configuration. |
| |
| PSIM can either create its device tree using a builtin emulation or |
| from one read in from a file. |
| |
| During startup, the device tree is created using the following steps: |
| |
| o Initial empty tree is created |
| |
| o Any tree entry options specified on the |
| command line are merged in (the -o <entry> |
| option is used). |
| |
| It should be pointed out that most of the |
| command line options (eg -r, -e, -m, -t |
| are all just short hand for corresponding |
| -o options). |
| |
| o If the specified program is a device tree spec, that |
| is loaded. |
| |
| If the specified program is a text file it is assumed |
| that that file contains a further specification of the |
| simulators device tree. That tree is loaded and |
| merged with the current tree options. |
| |
| o The selected emulation fills out any remaining details. |
| |
| By this stage the emulation environment that the program |
| needs will either be specified in the device tree |
| (through the -e option) or determined from the |
| characteristics of the binary. |
| |
| The selected emulation will then fill out any missing |
| nodes in the device tree. |
| |
| Most importantly earlier additions to the tree are not overridden by |
| later additions. Thus, command line options override information |
| found in the program file and both override any builtin emulation |
| entries. |
| |
| The following is a summary of the most useful runtime configuration |
| options: |
| |
| -e <os-emul> |
| -o '/openprom/options/os-emul <os-emul>' |
| |
| Run program using the <emulation> run-time |
| environment. |
| |
| -r <ram-size> |
| -o '/openprom/options/oea-memory-size <ram-size>' |
| |
| Set the size of the first bank of memory |
| (RAM from address 0 up). |
| |
| -t print-device-tree |
| -o '/openprom/trace/print-device-tree 1' |
| |
| -t dump-device-tree |
| -o '/openprom/trace/dump-device-tree 1' |
| |
| Print out the device tree once it has been fully |
| populated. For dump-device-tree, exit simulator after |
| dumping the tree. |
| |
| PSIM is able to reload the dumped device tree. |
| |
| The format of the dumped tree is under development. |
| |
| -o '/openprom/options/smp <N>' |
| |
| Enable <N> processors for the simulation run. |
| See the directory psim-test/oea for an example. |
| |
| -o '/openprom/options/alignment <N>' |
| |
| Where <N> is 1 - nonstrict or 2 - strict. |
| Specify if the missaligned access are allowed |
| (non-strict) or result in an alignment exception |
| (strict). |
| |
| Devices (if included in the file device_table.c) can also be specified |
| in a similar way. For instance, to add a second serial port, a |
| command like: |
| |
| -o '/iobus@0x400000/console@0x000010' |
| |
| would create a `console' device at offset 0x10 within the `iobus' at |
| memory address 0x400000. |
| |
| For more detailed information on device specifiers see the notes on |
| the function dump_device_tree in the file device.c (found in the |
| source code). |
| |
| |
| ---------------------------------------------------------------------- |
| |
| |
| BUILDING A BUG/OEA DEVELOPMENT ENVIRONMENT |
| |
| |
| Background: |
| |
| |
| Included in many PowerPC systems is Motorola's BUG monitor. This |
| monitor includes, for client programs, a set of services that allow |
| that program to interact with hardware devices such as the console using |
| a simple system call interface. |
| |
| PSIM is able to emulate a number of the services (including the |
| console IO calls). If additional services are needed they can easily |
| be added. |
| |
| Cygnus support's newlib library includes includes an interface to the |
| MOTO BUG services. The notes below discuss how I both built and run |
| programs compiled using this library on PSIM. |
| |
| The only confusing part about building a development environment based |
| around newlib/binutils/gcc is a chicken/egg problem with include |
| files: |
| |
| For GCC to build, a fairly complete set of include |
| files must be installed but newlib won't install its |
| include files until it has been built with gcc ... |
| |
| I get around this by installing the problematic include files by hand. |
| |
| |
| Preparation: |
| |
| |
| The following files are needed: |
| |
| From your favorite FTP site, the sources to gas/ld and gcc - mine |
| happens to be archie.au : |
| |
| ftp://archie.au/gnu/binutils-2.6.tar.gz |
| ftp://archie.au/gnu/gcc-2.7.2.tar.gz |
| |
| From ftp://ftp.cygnus.com/pub/newlib the source code to a library: |
| |
| ftp://ftp.cygnus.com/pub/newlib/newlib-1.7.0.tar.gz |
| |
| From ftp://ftp.ci.com.au/pub/psim some minor patches and updates to |
| the above library: |
| |
| ftp://ftp.ci.com.au/pub/psim/newlib-1.7.0+float+ppc-asm.tar.gz |
| ftp://ftp.ci.com.au/pub/psim/newlib-1.7.0+ppc-fix.diff.gz |
| ftp://ftp.ci.com.au/pub/psim/binutils-2.6+note.diff.gz |
| |
| In addition you'll need to decide where you will be installing the |
| development environment. You will notice that in the below I install |
| things well away /usr/local instead installing everything under its |
| own directory in /applications. |
| |
| |
| Method: |
| |
| |
| These notes are based on an installation performed on a Sun-OS-4/SPARC |
| host. For other hosts and other configurations, the below should be |
| considered as a guideline only. |
| |
| |
| o Sanity check |
| |
| $ cd .../scratch # your scratch directory |
| $ ls -1 |
| binutils-2.6.tar.gz |
| binutils-2.6+note.diff.gz |
| gcc-2.7.2,tar.gz |
| newlib-1.7.0+float+ppc-asm.tar.gz |
| newlib-1.7.0+ppc-fix.diff.gz |
| newlib-1.7.0.tar.gz |
| |
| |
| o Unpack/build/install binutils |
| |
| This is done first so that there is a gas/ld ready |
| for the building of GCC and NEWLIB. |
| |
| $ cd .../scratch |
| $ gunzip < binutils-2.6.tar.gz | tar xf - |
| $ cd binutils-2.6 |
| |
| Optionally apply the note patch |
| |
| $ gunzip ../binutils-2.6+note.diff.gz | patch |
| |
| Then continue with the build |
| |
| $ ./configure --target=powerpc-unknown-eabi \ |
| --prefix=/applications/psim |
| $ make |
| $ make install |
| $ cd .. |
| $ rm -rf binutils-2.6 |
| |
| This also creates much of the installation directory |
| tree. |
| |
| |
| o Unpack newlib, install the include files so that they |
| are ready for GCC's build. |
| |
| $ cd .../scratch |
| $ gunzip < newlib-1.7.0.tar.gz | tar xf - |
| |
| New lib-1.7.0 had a few minor bugs (fixed in current): |
| the header files float.h and ppc-asm.h were missing; |
| the configure and Makefile's for the rs6000 (ppc) directory |
| contained typos: |
| |
| $ cd .../scratch |
| $ cd newlib-1.7.0 |
| $ gunzip < ../newlib-1.7.0+float+ppc-asm.tar.gz | tar xvf - |
| $ gunzip < ../newlib-1.7.0+ppc-fix.diff.gz | patch -p1 |
| |
| Finally copy the include files to where GCC will see them: |
| |
| $ cd .../scratch |
| $ cd newlib-1.7.0/newlib/libc |
| $ tar cf - include | \ |
| ( cd /applications/psim/powerpc-unknown-eabi && tar xf - ) |
| |
| |
| o Unpack/build gcc |
| |
| $ cd .../scratch |
| $ gunzip < gcc-2.7.2,tar.gz | tar xf - |
| $ cd gcc-2.7.2 |
| $ ./configure --target=powerpc-unknown-eabi \ |
| --prefix=/applications/psim |
| $ make |
| $ make install |
| $ cd .. |
| $ rm -rf gcc-2.7.2 |
| |
| Gcc likes to install its own dummy version of float that |
| just returns an error. |
| |
| $ more /applications/psim/lib/gcc-lib/powerpc-unknown-eabi/2.7.2/include/float.h |
| $ rm /applications/psim/lib/gcc-lib/powerpc-unknown-eabi/2.7.2/include/float.h |
| |
| |
| o Finish building/installing newlib |
| |
| $ cd .../scratch |
| $ cd newlib-1.7.0 |
| $ ./configure --target=powerpc-unknown-eabi \ |
| --prefix=/applications/psim |
| |
| Your path will need to include the recently installed |
| gas/gcc when building. Either add it to your path or |
| use: |
| |
| $ PATH=/applications/psim/bin:$PATH make |
| $ PATH=/applications/psim/bin:$PATH make install |
| |
| |
| o Finally, test out the build |
| |
| $ cat hello.c |
| main() |
| { |
| printf("hello world\n"); |
| } |
| |
| The binary is linked with an entry point less than 0x100000 |
| (1mb) so that psim will recognize the binary as needing |
| the BUG/OEA instead of the BSD/UEA runtime environment. |
| |
| $ powerpc-unknown-eabi-gcc -v -o hello \ |
| -Wl,-Ttext,0x4000,-Tdata,0x10000 \ |
| /applications/psim/powerpc-unknown-eabi/lib/mvme-crt0.o \ |
| hello.c \ |
| -lc -lmvme |
| $ powerpc-unknown-eabi-objdump -h hello |
| $ powerpc-unknown-eabi-run hello |
| |
| It is also possible to force psim to use a specific |
| run-time environment using the -e option vis: |
| |
| $ powerpc-unknown-eabi-run -e bug hello |
| |
| |
| |
| |
| ---------------------------------------------------------------------- |
| |
| |
| BUILDING A BSD/UEA DEVELOPMENT ENVIRONMENT |
| |
| |
| Background: |
| |
| |
| For a UEA to be useful it needs a supporting run-time environment. |
| PSIM implements a runtime environment based on the NetBSD system call |
| interface. |
| |
| More than any thing, this user level emulation was the first |
| implemented because I happened to have the NetBSD source code lying |
| around. |
| |
| |
| Preparation: |
| |
| |
| This requires the NetBSD-1.1 source tree online. It can either be |
| obtained vi ftp: |
| |
| try http://www.netbsd.org or ftp://ftp.netbsd.org |
| |
| Alternatively obtain one of the NetBSD cdrom's. Patches to this source |
| tree that fill out much of the PowerPC code are available in: |
| |
| ftp://ftp.ci.com.au/pub/clayton |
| |
| Fetch everything in that directory - diffs, tar archives and scripts. |
| In addition patches to the bintuils and gcc are in: |
| |
| ftp://ftp.ci.com.au/pub/psim/binutils-2.6+note.diff.gz |
| ftp://ftp.ci.com.au/pub/psim/gcc-2.7.2+sys-types.diff.gz |
| |
| while the compiler (gcc) and assember (binutils) can be found at your |
| favorite gnu ftp site. I used versions: |
| |
| gcc-2.7.2.tar.gz |
| binutils-2.6.tar.gz |
| |
| |
| |
| |
| Method: |
| |
| |
| These notes are based on an installation performed on a Solaris2/x86 |
| host. For other hosts and other configurations, the below should be |
| considered as a guideline only. |
| |
| |
| o Sanity check |
| |
| I assume that you have already obtained the NetBSD-1.1 source |
| code and unpacked it into the directory bsd-src. While the |
| full NetBSD source tree may not be needed, things are easier |
| if it is all online. |
| |
| $ cd .../scratch |
| $ ls -1 |
| binutils-2.6.tar.gz |
| binutils-2.6+note.diff.gz |
| clayton-include-960203.diff.gz |
| clayton-lib-960203.diff.gz |
| clayton-lib-960203.tar.gz |
| clayton-sys-960203.diff.gz |
| clayton-sys-960203.tar.gz |
| clayton.chown.sh |
| clayton.install.sh |
| clayton.lorder.sh |
| clayton.make.sh |
| gcc-2.7.2.tar.gz |
| gcc-2.7.2+sys-types.diff.gz |
| make.tar.gz |
| make.diff.gz |
| |
| |
| o Prepare the destination directory ready for installation. |
| |
| Firstly create many of the needed directories (some are |
| created automatically later): |
| |
| $ for d in \ |
| /applications/psim \ |
| /applications/psim/bsd-root \ |
| /applications/psim/bsd-root/usr \ |
| /applications/psim/bsd-root/usr/share \ |
| /applications/psim/bsd-root/usr/share/doc \ |
| /applications/psim/bsd-root/usr/share/doc/psd \ |
| /applications/psim/bsd-root/usr/share/doc/psd/19.curses \ |
| /applications/psim/bsd-root/usr/include \ |
| /applications/psim/bsd-root/usr/lib \ |
| /applications/psim/powerpc-unknown-eabi \ |
| /applications/psim/powerpc-unknown-eabi/bin \ |
| ; \ |
| do test -d $d || mkdir $d ; done |
| |
| Next, link the BSD and GNU include directories together. |
| GCC expects include files to be in one location while the |
| bsd install expects them in a second. The link is in |
| the direction below because bsd's install also insists on |
| a directory (not a link) for its install destination. |
| |
| $ rm -rf /applications/psim/powerpc-unknown-eabi/include |
| $ ln -s /applications/psim/bsd-root/usr/include \ |
| /applications/psim/powerpc-unknown-eabi/include |
| |
| $ ls -l /applications/psim/powerpc-unknown-eabi/include |
| lrwxr-xr-x 1 cagney wheel 39 Mar 21 18:09 |
| /applications/psim/powerpc-unknown-eabi/include |
| -> /applications/psim/bsd-root/usr/include |
| |
| |
| o Build/install Berkeley make |
| |
| The tar archive make.tar.gz contains a recent snapshot |
| of bmake from the NetBSD source tree. The notes below |
| describe how to build/install it. If you have access |
| to an even more recent version of bmake, use that. |
| |
| Unpack the source code: |
| |
| $ cd .../scratch |
| $ gunzip < make.tar.gz | tar xf - |
| $ cd make |
| |
| Apply the patch in make.diff.gz that fixes a minor |
| problem with a build under Solaris (by now it should |
| be fixed in the NetBSD-current source tree). |
| |
| $ gunzip < ../make.diff.gz | more |
| $ gunzip < ../make.diff.gz | patch |
| |
| Build it |
| |
| $ make -f Makefile.boot 'CC=gcc -g -DPOSIX' |
| |
| With bmake built, install it into the target specific bin |
| directory: |
| |
| $ cp bmake /applications/psim/powerpc-unknown-eabi/bin/make |
| $ cd .. |
| $ rm -rf make |
| |
| |
| o Set up a number of wrapper scripts for bmake so that it works. |
| |
| In addition to needing BSD make the build process assumes |
| a number of BSD specific commands. To get around this |
| several wrapper scripts are available. |
| |
| powerpc-unknown-eabi-make (clayton.make.sh) |
| |
| Front end to Berkeley make setting it up for a |
| cross compilation |
| |
| $ cp clayton.make.sh \ |
| /applications/psim/bin/powerpc-unknown-eabi-make |
| $ chmod a+x \ |
| /applications/psim/bin/powerpc-unknown-eabi-make |
| |
| chown (clayton.chown.sh) |
| |
| Wrapper that does not do any thing. |
| Avoids the need to be root when installing. |
| |
| $ cp clayton.chown.sh \ |
| /applications/psim/powerpc-unknown-eabi/bin/chown |
| $ chmod a+x \ |
| /applications/psim/powerpc-unknown-eabi/bin/chown |
| |
| install (clayton.install.sh) |
| |
| Wrapper to strip away a number of bsd specific install |
| arguments. |
| |
| $ cp clayton.install.sh \ |
| /applications/psim/powerpc-unknown-eabi/bin/install |
| $ chmod a+x \ |
| /applications/psim/powerpc-unknown-eabi/bin/install |
| |
| lorder (clayton.lorder.sh) |
| |
| Tweaked lorder script that will use nm etc from |
| binutils. |
| |
| $ cp clayton.lorder.sh \ |
| /applications/psim/powerpc-unknown-eabi/bin/lorder |
| $ chmod a+x \ |
| /applications/psim/powerpc-unknown-eabi/bin/lorder |
| |
| |
| printf (?) |
| |
| Some operating systems don't include the program |
| printf. If you host doesn't have one, then a |
| good source is the gnu sh-utils version. |
| |
| Again, if that program is missing, then I suggest |
| installing it onto the powerpc specific program |
| directory: |
| |
| /applications/psim/powerpc-unknown-eabi/bin |
| |
| |
| o Unpack the bsd source code (if you haven't already) |
| |
| If you're short on disk space (like me) just unpack: |
| |
| sys, lib, share/mk, include, usr.sbin/config, |
| usr.sbin/dbsym, gnu/lib/libg++/g++-include, |
| usr.bin/lex |
| |
| Otherwize, assuming you have a CD-DRIVE: |
| |
| $ cd .../scratch |
| $ mkdir bsd-src |
| $ cd bsd-src |
| $ for d in /cdrom/bsdisc_12_95_disc2/NetBSD-1.1/source/*11 |
| do |
| echo $d |
| cat $d/*.?? | gunzip | tar xf - |
| done |
| |
| Flatten the directory structure a little. |
| |
| $ mv usr/src/* . |
| $ rmdir usr/src usr |
| $ cd .. |
| |
| |
| o Apply the clayton (PowerPC) patches to your constructed |
| tree. |
| |
| $ cd .../scratch |
| $ cd bsd-src |
| |
| Diffs are applied using something like: |
| |
| $ gunzip < ../clayton-include-960312.diff.gz | patch -p1 |
| $ gunzip < ../clayton-lib-960203.diff.gz | patch -p1 |
| $ gunzip < ../clayton-sys-960203.diff.gz | patch -p1 |
| |
| The patch to sys/dev/pci/ncr.c.rej might fail. |
| |
| The tar archives have a different problem, you need |
| to remove the `src' prefix. I used |
| |
| $ ln -s . src |
| $ gunzip < ../clayton-lib-960203.tar.gz | tar xvf - |
| $ gunzip < ../clayton-sys-960203.tar.gz | tar xvf - |
| |
| So that src/xxx unpacked into ./xxx |
| |
| $ cd .. |
| |
| |
| o install Berkeley make's include (mk) files. |
| |
| $ cd .../scrath |
| $ cd bsd-src/share |
| $ tar cf - mk | ( cd /applications/psim/bsd-root/usr/share \ |
| && tar xvf - ) |
| $ cd ../.. |
| |
| |
| o Install the include files |
| |
| $ cd .../scratch |
| $ cd bsd-src/include |
| $ powerpc-unknown-eabi-make install |
| $ cd ../.. |
| |
| |
| o Install a few other include files. |
| |
| As discussed above in the section on building libnew, |
| the build process can have chicken/egg problems. In the |
| case of BSD's libc, it wants to use several include files |
| (from the installed include directory) before they are |
| installed. Just copy them in as seen below: |
| |
| $ cd .../scratch |
| $ cd bsd-src |
| $ cp gnu/lib/libg++/g++-include/values.h \ |
| /applications/psim/powerpc-unknown-eabi/include |
| $ cp lib/libcurses/curses.h \ |
| /applications/psim/powerpc-unknown-eabi/include |
| $ cd .. |
| |
| |
| o Unpack/patch/build/install BINUTILS |
| |
| $ cd .../scratch |
| $ gunzip < binutils-2.6.tar.gz | tar xf - |
| |
| gas (bfd) 2.6 didn't support the reading and writing of |
| note sections. The patch binutils-2.6+note.diff.gz |
| adds support for this. PowerPC/ELF boot files being loaded |
| by OpenBoot ROM's should contain a PowerPC note section. |
| |
| $ cd .../scratch |
| $ cd binutils-2.6/bfd |
| $ gunzip < ../../binutils-2.6+note.diff.gz | more |
| $ gunzip < ../../binutils-2.6+note.diff.gz | patch |
| $ cd ../.. |
| |
| Then continue with the build |
| |
| $ cd .../scratch |
| $ cd binutils-2.6 |
| $ ./configure --target=powerpc-unknown-eabi \ |
| --prefix=/applications/psim |
| $ make |
| $ make install |
| $ cd .. |
| $ rm -rf binutils-2.6 |
| |
| This has the intended side effect of partially populating |
| the psim directory tree which makes follow on steps easier. |
| |
| |
| o Unpack/patch/build/install GCC |
| |
| $ cd .../scratch |
| $ gunzip < gcc-2.7.2.tar.gz | tar xf - |
| $ cd gcc-2.7.2 |
| |
| GCC-2.7.2 and the BSD include files have a conflicting type |
| declaration. The patch below gets around this problem |
| (it may still be applicable to more recent versions of |
| GCC): |
| |
| $ gunzip < ../gcc-2.7.2+sys-types.diff.gz | more |
| $ gunzip < ../gcc-2.7.2+sys-types.diff.gz | patch |
| |
| If your version of GCC includes the file ginclude/ppc-asm.h |
| then you should install that header file into the directory: |
| /applications/psim/powerpc-unknown-eabi/include. More |
| recent versions of GCC expect this file to be installed: |
| |
| $ test -r ginclude/ppc-asm.h \ |
| && cp ginclude/ppc-asm.h \ |
| /applications/psim/powerpc-unknown-eabi/include |
| |
| Other than that, assuming the include files installed |
| okay, the rest should be fine .... |
| |
| $ ./configure --target=powerpc-unknown-eabi \ |
| --prefix=/applications/psim |
| $ make CC=gcc |
| $ make CC=gcc install |
| $ cd .. |
| $ rm -rf gcc-2.7.2 |
| |
| |
| o Build/install the Berkeley library: |
| |
| $ cd .../scratch |
| $ cd bsd-src/lib |
| $ powerpc-unknown-eabi-make |
| $ powerpc-unknown-eabi-make install |
| $ cd ../.. |
| |
| If you encounter problems check the following (each |
| discussed above): |
| |
| o GCC and BSD have a common include |
| directory |
| |
| o all the missing include files installed |
| |
| o all the wrapper programs installed |
| |
| |
| o Build/run a simple BSD program |
| |
| $ cd .../scratch |
| $ cd bsd-src/usr.bin/printenv |
| $ powerpc-unknown-eabi-make |
| $ powerpc-unknown-eabi-run printenv |
| . |
| . |
| . |
| |
| |
| ---------------------------------------------------------------------- |