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