Commit | Line | Data |
---|---|---|
c906108c SS |
1 | |
2 | PSIM - model the PowerPC environment | |
3 | ||
4 | Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>. | |
5 | ||
6 | ---------------------------------------------------------------------- | |
7 | ||
8 | Running PSIM | |
9 | ||
10 | This file describes how to run the program PSIM. | |
11 | ||
12 | o Walk through a number of examples from the | |
13 | pre-built tar archive psim-test. | |
14 | ||
15 | o Looks at the device tree used by PSIM. | |
16 | ||
17 | o Notes on building a programmer environment to | |
18 | use with PSIM (BSD/UEA and BUG/OEA) | |
19 | ||
20 | ||
21 | ---------------------------------------------------------------------- | |
22 | ||
23 | ||
24 | RUNNING PSIM: | |
25 | ||
26 | ||
27 | The compressed tar archive psim-test available from: | |
28 | ||
29 | ftp://ftp.ci.com.au/pub/psim/psim-test-1.0.1.tar.gz | |
30 | or ftp://cambridge.cygnus.com/pub/psim/psim-test-1.0.1.tar.gz | |
31 | ||
32 | contains a number of pre-built programs for running under PSIM. Each | |
33 | pre-built binary is built both big and little endian. The suffixes | |
34 | .be/.le (executables) .bo/.lo (object files) and .ba/.la (libraries) | |
35 | are used. | |
36 | ||
37 | ||
38 | To run one of these programs, use: | |
39 | ||
40 | powerpc-unknown-eabi-run <image> | |
41 | ||
42 | for instance: | |
43 | ||
44 | powerpc-unknown-eabi-run psim-test/uea/envp | |
45 | ||
46 | The program envp prints out your shells environment - very useful! | |
47 | More generally psim is run as (this is part of the output from the -h | |
48 | option): | |
49 | ||
50 | psim [ <psim-option> ... ] <image> [ <image-arg> ... ] | |
51 | ||
52 | Where | |
53 | ||
54 | <image> Name of the PowerPC program to run. | |
55 | This can either be a PowerPC binary or | |
56 | a text file containing a device tree | |
57 | specification. | |
58 | PSIM will attempt to determine from the | |
59 | specified <image> the intended emulation | |
60 | environment. | |
61 | If PSIM gets it wrong, the emulation | |
62 | environment can be specified using the | |
63 | `-e' option (described below). | |
64 | ||
65 | <image-arg> Argument to be passed to <image> | |
66 | These arguments will be passed to | |
67 | <image> (as standard C argv, argc) | |
68 | when <image> is started. | |
69 | ||
70 | <psim-option> See below | |
71 | ||
72 | The following are valid <psim-option>s: | |
73 | ||
74 | -m <model> Specify the processor to model (604) | |
75 | Selects the processor to use when | |
76 | modeling execution units. Includes: | |
77 | 604, 603 and 603e | |
78 | ||
79 | -e <os-emul> specify an OS or platform to model | |
80 | Can be any of the following: | |
81 | bug - OEA + MOTO BUG ROM calls | |
82 | netbsd - UEA + NetBSD system calls | |
83 | chirp - OEA + a few OpenBoot calls | |
84 | ||
85 | -i Print instruction counting statistics | |
86 | ||
87 | -I Print execution unit statistics | |
88 | ||
89 | -r <size> Set RAM size in bytes (OEA environments) | |
90 | ||
91 | -t [!]<trace> Enable (disable) <trace> option | |
92 | ||
93 | -o <spec> add device <spec> to the device tree | |
94 | ||
95 | -h -? -H give more detailed usage | |
96 | ||
97 | ||
98 | The `-H' option gives a long usage output. This includes a complete | |
99 | list of all the pre-configured devices. | |
100 | ||
101 | ||
102 | ---------------------------------------------------------------------- | |
103 | ||
104 | ||
105 | RUNNING GDB: | |
106 | ||
107 | ||
108 | If you built PSIM with gdb then the following is a quick start | |
109 | tutorial. | |
110 | ||
111 | At present GDB, if configured big-endian (say) unlike PSIM, does not | |
112 | support the debugging of little endian binaries. If you find that | |
113 | your program won't run at all, make certain that GDB and your | |
114 | program's endianness match. | |
115 | ||
116 | ||
117 | The most important thing is that before you can run the simulator you | |
118 | must enable it. For the simulator, gdb is started like any program: | |
119 | ||
120 | $ powerpc-unknown-eabi-gdb psim-test/uea/envp.be | |
121 | ||
122 | Next the simulator is enabled. The command `target sim' accepts the | |
123 | same options as can be specified on the PSIM command line. | |
124 | ||
125 | (gdb) target sim | |
126 | ||
127 | To trace the communication between psim and gdb specify `target sim -t | |
128 | gdb'. Once enabled, the binary needs to be loaded, any breakpoints of | |
129 | interest set, and the program run: | |
130 | ||
131 | (gdb) load | |
132 | (gdb) break main | |
133 | (gdb) run | |
134 | . | |
135 | . | |
136 | . | |
137 | ||
138 | In addition, if you are wanting to run a program described by a device | |
139 | tree you can `attach' to the simulation using (I assume that you have | |
140 | applied the attach patch): | |
141 | ||
142 | $ cd psim-test/tree | |
143 | $ powerpc-unknown-eabi-gdb | |
144 | (gdb) target sim | |
145 | (gdb) attach device-tree | |
146 | (gdb) run | |
147 | ||
148 | Here GDB takes the programs initial state from the attached | |
149 | device-tree instead of forcing initialisation. | |
150 | ||
151 | ||
152 | ---------------------------------------------------------------------- | |
153 | ||
154 | ||
155 | PROFILING: | |
156 | ||
157 | ||
158 | PSIM includes a number of performance monitoring (profiling) | |
159 | facilities: | |
160 | ||
161 | o instruction frequency counting | |
162 | ||
163 | o execution unit modeling (records | |
164 | effective usage of units). | |
165 | ||
166 | o instruction cache performance | |
167 | ||
168 | As discussed in the file INSTALL, each can be configured to individual | |
169 | requirements. | |
170 | ||
171 | ||
172 | -i Enable instruction counting. | |
173 | ||
174 | The frequency of all instructions is tabulated. In | |
175 | addition (f configured) the hit/miss rate of the | |
176 | instruction cache is output. | |
177 | ||
178 | ||
179 | -I Enable execution unit analysis. | |
180 | ||
181 | In addition to counting basic instructions also model | |
182 | the performance of the processors execution units | |
183 | ||
184 | ||
185 | -m <processor> | |
186 | ||
187 | Select the processor to be modelled. | |
188 | ||
189 | For execution unit analysis specify the processor that | |
190 | is to be analysed. By default the 604 is modelled | |
191 | however, support for other processors such as the | |
192 | 603 and 603e is included. | |
193 | ||
194 | The output from a performance run (on a P90) for the program | |
195 | psim-test/profile/bench is below. In this run psim was fairly | |
196 | agressively configured (see the file INSTALL for compile time | |
197 | configuration). | |
198 | ||
199 | CPU #1 executed 41,994 AND instructions. | |
200 | CPU #1 executed 519,785 AND Immediate instructions. | |
201 | CPU #1 executed 680,058 Add instructions. | |
202 | CPU #1 executed 41,994 Add Extended instructions. | |
203 | CPU #1 executed 921,916 Add Immediate instructions. | |
204 | CPU #1 executed 221,199 Add Immediate Carrying instructions. | |
205 | CPU #1 executed 943,823 Add Immediate Shifted instructions. | |
206 | CPU #1 executed 471,909 Add to Zero Extended instructions. | |
207 | CPU #1 executed 571,915 Branch instructions. | |
208 | CPU #1 executed 1,992,403 Branch Conditional instructions. | |
209 | CPU #1 executed 571,910 Branch Conditional to Link Register instructions. | |
210 | CPU #1 executed 320,431 Compare instructions. | |
211 | CPU #1 executed 471,911 Compare Immediate instructions. | |
212 | CPU #1 executed 145,867 Compare Logical instructions. | |
213 | CPU #1 executed 442,414 Compare Logical Immediate instructions. | |
214 | CPU #1 executed 1 Condition Register XOR instruction. | |
215 | CPU #1 executed 103,873 Divide Word instructions. | |
216 | CPU #1 executed 104,275 Divide Word Unsigned instructions. | |
217 | CPU #1 executed 132,510 Extend Sign Byte instructions. | |
218 | CPU #1 executed 178,895 Extend Sign Half Word instructions. | |
219 | CPU #1 executed 871,920 Load Word and Zero instructions. | |
220 | CPU #1 executed 41,994 Move From Condition Register instructions. | |
221 | CPU #1 executed 100,005 Move from Special Purpose Register instructions. | |
222 | CPU #1 executed 100,002 Move to Special Purpose Register instructions. | |
223 | CPU #1 executed 804,619 Multiply Low Word instructions. | |
224 | CPU #1 executed 421,201 OR instructions. | |
225 | CPU #1 executed 471,910 OR Immediate instructions. | |
226 | CPU #1 executed 1,292,020 Rotate Left Word Immediate then AND with Mask instructions. | |
227 | CPU #1 executed 663,613 Shift Left Word instructions. | |
228 | CPU #1 executed 1,151,564 Shift Right Algebraic Word Immediate instructions. | |
229 | CPU #1 executed 871,922 Store Word instructions. | |
230 | CPU #1 executed 100,004 Store Word with Update instructions. | |
231 | CPU #1 executed 887,804 Subtract From instructions. | |
232 | CPU #1 executed 83,988 Subtract From Immediate Carrying instructions. | |
233 | CPU #1 executed 1 System Call instruction. | |
234 | CPU #1 executed 207,746 XOR instructions. | |
235 | ||
236 | CPU #1 executed 23,740,856 cycles. | |
237 | CPU #1 executed 10,242,780 stalls waiting for data. | |
238 | CPU #1 executed 1 stall waiting for a function unit. | |
239 | CPU #1 executed 1 stall waiting for serialization. | |
240 | CPU #1 executed 1,757,900 times a write-back slot was unavailable. | |
241 | CPU #1 executed 1,088,135 branches. | |
242 | CPU #1 executed 2,048,093 conditional branches fell through. | |
243 | CPU #1 executed 1,088,135 successful branch predictions. | |
244 | CPU #1 executed 904,268 unsuccessful branch predictions. | |
245 | CPU #1 executed 742,557 branch if the condition is FALSE conditional branches. | |
246 | CPU #1 executed 1,249,846 branch if the condition is TRUE conditional branches. | |
247 | CPU #1 executed 571,910 branch always conditional branches. | |
248 | CPU #1 executed 9,493,653 1st single cycle integer functional unit instructions. | |
249 | CPU #1 executed 1,220,900 2nd single cycle integer functional unit instructions. | |
250 | CPU #1 executed 1,254,768 multiple cycle integer functional unit instructions. | |
251 | CPU #1 executed 1,843,846 load/store functional unit instructions. | |
252 | CPU #1 executed 3,136,229 branch functional unit instructions. | |
253 | CPU #1 executed 16,949,396 instructions that were accounted for in timing info. | |
254 | CPU #1 executed 871,920 data reads. | |
255 | CPU #1 executed 971,926 data writes. | |
256 | CPU #1 executed 221 icache misses. | |
257 | CPU #1 executed 16,949,396 instructions in total. | |
258 | ||
259 | Simulator speed was 250,731 instructions/second | |
260 | ||
261 | ||
262 | ---------------------------------------------------------------------- | |
263 | ||
264 | ||
265 | PSIM CONFIGURATION - THE DEVICE TREE | |
266 | ||
267 | ||
268 | Internally PSIM's configuration is controlled by a tree data | |
269 | structure. This structure, created at run-time, intentionally | |
270 | resembles the device tree used by OpenBoot firmware to describe a | |
271 | machines hardware configuration. | |
272 | ||
273 | PSIM can either create its device tree using a builtin emulation or | |
274 | from one read in from a file. | |
275 | ||
276 | During startup, the device tree is created using the following steps: | |
277 | ||
278 | o Initial empty tree is created | |
279 | ||
280 | o Any tree entry options specified on the | |
281 | command line are merged in (the -o <entry> | |
282 | option is used). | |
283 | ||
284 | It should be pointed out that most of the | |
285 | command line options (eg -r, -e, -m, -t | |
286 | are all just short hand for corresponding | |
287 | -o options). | |
288 | ||
289 | o If the specified program is a device tree spec, that | |
290 | is loaded. | |
291 | ||
292 | If the specified program is a text file it is assumed | |
293 | that that file contains a further specification of the | |
294 | simulators device tree. That tree is loaded and | |
295 | merged with the current tree options. | |
296 | ||
297 | o The selected emulation fills out any remaining details. | |
298 | ||
299 | By this stage the emulation environment that the program | |
300 | needs will either be specified in the device tree | |
301 | (through the -e option) or determined from the | |
302 | characteristics of the binary. | |
303 | ||
304 | The selected emulation will then fill out any missing | |
305 | nodes in the device tree. | |
306 | ||
307 | Most importantly earlier additions to the tree are not overridden by | |
308 | later additions. Thus, command line options override information | |
309 | found in the program file and both override any builtin emulation | |
310 | entries. | |
311 | ||
312 | The following is a summary of the most useful runtime configuration | |
313 | options: | |
314 | ||
315 | -e <os-emul> | |
316 | -o '/openprom/options/os-emul <os-emul>' | |
317 | ||
318 | Run program using the <emulation> run-time | |
319 | environment. | |
320 | ||
321 | -r <ram-size> | |
322 | -o '/openprom/options/oea-memory-size <ram-size>' | |
323 | ||
324 | Set the size of the first bank of memory | |
325 | (RAM from address 0 up). | |
326 | ||
327 | -t print-device-tree | |
328 | -o '/openprom/trace/print-device-tree 1' | |
329 | ||
330 | -t dump-device-tree | |
331 | -o '/openprom/trace/dump-device-tree 1' | |
332 | ||
333 | Print out the device tree once it has been fully | |
334 | populated. For dump-device-tree, exit simulator after | |
335 | dumping the tree. | |
336 | ||
337 | PSIM is able to reload the dumped device tree. | |
338 | ||
339 | The format of the dumped tree is under development. | |
340 | ||
341 | -o '/openprom/options/smp <N>' | |
342 | ||
343 | Enable <N> processors for the simulation run. | |
344 | See the directory psim-test/oea for an example. | |
345 | ||
346 | -o '/openprom/options/alignment <N>' | |
347 | ||
348 | Where <N> is 1 - nonstrict or 2 - strict. | |
349 | Specify if the missaligned access are allowed | |
350 | (non-strict) or result in an alignment exception | |
351 | (strict). | |
352 | ||
353 | Devices (if included in the file device_table.c) can also be specified | |
354 | in a similar way. For instance, to add a second serial port, a | |
355 | command like: | |
356 | ||
357 | -o '/iobus@0x400000/console@0x000010' | |
358 | ||
359 | would create a `console' device at offset 0x10 within the `iobus' at | |
360 | memory address 0x400000. | |
361 | ||
362 | For more detailed information on device specifiers see the notes on | |
363 | the function dump_device_tree in the file device.c (found in the | |
364 | source code). | |
365 | ||
366 | ||
367 | ---------------------------------------------------------------------- | |
368 | ||
369 | ||
370 | BUILDING A BUG/OEA DEVELOPMENT ENVIRONMENT | |
371 | ||
372 | ||
373 | Background: | |
374 | ||
375 | ||
376 | Included in many PowerPC systems is Motorola's BUG monitor. This | |
377 | monitor includes, for client programs, a set of services that allow | |
378 | that program to interact with hardware devices such as the console using | |
379 | a simple system call interface. | |
380 | ||
381 | PSIM is able to emulate a number of the services (including the | |
382 | console IO calls). If additional services are needed they can easily | |
383 | be added. | |
384 | ||
385 | Cygnus support's newlib library includes includes an interface to the | |
386 | MOTO BUG services. The notes below discuss how I both built and run | |
387 | programs compiled using this library on PSIM. | |
388 | ||
389 | The only confusing part about building a development environment based | |
390 | around newlib/binutils/gcc is a chicken/egg problem with include | |
391 | files: | |
392 | ||
393 | For GCC to build, a fairly complete set of include | |
394 | files must be installed but newlib won't install its | |
395 | include files until it has been built with gcc ... | |
396 | ||
397 | I get around this by installing the problematic include files by hand. | |
398 | ||
399 | ||
400 | Preparation: | |
401 | ||
402 | ||
403 | The following files are needed: | |
404 | ||
405 | From your favorite FTP site, the sources to gas/ld and gcc - mine | |
406 | happens to be archie.au : | |
407 | ||
408 | ftp://archie.au/gnu/binutils-2.6.tar.gz | |
409 | ftp://archie.au/gnu/gcc-2.7.2.tar.gz | |
410 | ||
411 | From ftp://ftp.cygnus.com/pub/newlib the source code to a library: | |
412 | ||
413 | ftp://ftp.cygnus.com/pub/newlib/newlib-1.7.0.tar.gz | |
414 | ||
415 | From ftp://ftp.ci.com.au/pub/psim some minor patches and updates to | |
416 | the above library: | |
417 | ||
418 | ftp://ftp.ci.com.au/pub/psim/newlib-1.7.0+float+ppc-asm.tar.gz | |
419 | ftp://ftp.ci.com.au/pub/psim/newlib-1.7.0+ppc-fix.diff.gz | |
420 | ftp://ftp.ci.com.au/pub/psim/binutils-2.6+note.diff.gz | |
421 | ||
422 | In addition you'll need to decide where you will be installing the | |
423 | development environment. You will notice that in the below I install | |
424 | things well away /usr/local instead installing everything under its | |
425 | own directory in /applications. | |
426 | ||
427 | ||
428 | Method: | |
429 | ||
430 | ||
431 | These notes are based on an installation performed on a Sun-OS-4/SPARC | |
432 | host. For other hosts and other configurations, the below should be | |
433 | considered as a guideline only. | |
434 | ||
435 | ||
436 | o Sanity check | |
437 | ||
438 | $ cd .../scratch # your scratch directory | |
439 | $ ls -1 | |
440 | binutils-2.6.tar.gz | |
441 | binutils-2.6+note.diff.gz | |
442 | gcc-2.7.2,tar.gz | |
443 | newlib-1.7.0+float+ppc-asm.tar.gz | |
444 | newlib-1.7.0+ppc-fix.diff.gz | |
445 | newlib-1.7.0.tar.gz | |
446 | ||
447 | ||
448 | o Unpack/build/install binutils | |
449 | ||
450 | This is done first so that there is a gas/ld ready | |
451 | for the building of GCC and NEWLIB. | |
452 | ||
453 | $ cd .../scratch | |
454 | $ gunzip < binutils-2.6.tar.gz | tar xf - | |
455 | $ cd binutils-2.6 | |
456 | ||
457 | Optionally apply the note patch | |
458 | ||
459 | $ gunzip ../binutils-2.6+note.diff.gz | patch | |
460 | ||
461 | Then continue with the build | |
462 | ||
463 | $ ./configure --target=powerpc-unknown-eabi \ | |
464 | --prefix=/applications/psim | |
465 | $ make | |
466 | $ make install | |
467 | $ cd .. | |
468 | $ rm -rf binutils-2.6 | |
469 | ||
470 | This also creates much of the installation directory | |
471 | tree. | |
472 | ||
473 | ||
474 | o Unpack newlib, install the include files so that they | |
475 | are ready for GCC's build. | |
476 | ||
477 | $ cd .../scratch | |
478 | $ gunzip < newlib-1.7.0.tar.gz | tar xf - | |
479 | ||
480 | New lib-1.7.0 had a few minor bugs (fixed in current): | |
481 | the header files float.h and ppc-asm.h were missing; | |
482 | the configure and Makefile's for the rs6000 (ppc) directory | |
483 | contained typos: | |
484 | ||
485 | $ cd .../scratch | |
486 | $ cd newlib-1.7.0 | |
487 | $ gunzip < ../newlib-1.7.0+float+ppc-asm.tar.gz | tar xvf - | |
488 | $ gunzip < ../newlib-1.7.0+ppc-fix.diff.gz | patch -p1 | |
489 | ||
490 | Finally copy the include files to where GCC will see them: | |
491 | ||
492 | $ cd .../scratch | |
493 | $ cd newlib-1.7.0/newlib/libc | |
494 | $ tar cf - include | \ | |
495 | ( cd /applications/psim/powerpc-unknown-eabi && tar xf - ) | |
496 | ||
497 | ||
498 | o Unpack/build gcc | |
499 | ||
500 | $ cd .../scratch | |
501 | $ gunzip < gcc-2.7.2,tar.gz | tar xf - | |
502 | $ cd gcc-2.7.2 | |
503 | $ ./configure --target=powerpc-unknown-eabi \ | |
504 | --prefix=/applications/psim | |
505 | $ make | |
506 | $ make install | |
507 | $ cd .. | |
508 | $ rm -rf gcc-2.7.2 | |
509 | ||
510 | Gcc likes to install its own dummy version of float that | |
511 | just returns an error. | |
512 | ||
513 | $ more /applications/psim/lib/gcc-lib/powerpc-unknown-eabi/2.7.2/include/float.h | |
514 | $ rm /applications/psim/lib/gcc-lib/powerpc-unknown-eabi/2.7.2/include/float.h | |
515 | ||
516 | ||
517 | o Finish building/installing newlib | |
518 | ||
519 | $ cd .../scratch | |
520 | $ cd newlib-1.7.0 | |
521 | $ ./configure --target=powerpc-unknown-eabi \ | |
522 | --prefix=/applications/psim | |
523 | ||
524 | Your path will need to include the recently installed | |
525 | gas/gcc when building. Either add it to your path or | |
526 | use: | |
527 | ||
528 | $ PATH=/applications/psim/bin:$PATH make | |
529 | $ PATH=/applications/psim/bin:$PATH make install | |
530 | ||
531 | ||
532 | o Finally, test out the build | |
533 | ||
534 | $ cat hello.c | |
535 | main() | |
536 | { | |
537 | printf("hello world\n"); | |
538 | } | |
539 | ||
540 | The binary is linked with an entry point less than 0x100000 | |
541 | (1mb) so that psim will recognize the binary as needing | |
542 | the BUG/OEA instead of the BSD/UEA runtime environment. | |
543 | ||
544 | $ powerpc-unknown-eabi-gcc -v -o hello \ | |
545 | -Wl,-Ttext,0x4000,-Tdata,0x10000 \ | |
546 | /applications/psim/powerpc-unknown-eabi/lib/mvme-crt0.o \ | |
547 | hello.c \ | |
548 | -lc -lmvme | |
549 | $ powerpc-unknown-eabi-objdump -h hello | |
550 | $ powerpc-unknown-eabi-run hello | |
551 | ||
552 | It is also possible to force psim to use a specific | |
553 | run-time environment using the -e option vis: | |
554 | ||
555 | $ powerpc-unknown-eabi-run -e bug hello | |
556 | ||
557 | ||
558 | ||
559 | ||
560 | ---------------------------------------------------------------------- | |
561 | ||
562 | ||
563 | BUILDING A BSD/UEA DEVELOPMENT ENVIRONMENT | |
564 | ||
565 | ||
566 | Background: | |
567 | ||
568 | ||
569 | For a UEA to be useful it needs a supporting run-time environment. | |
570 | PSIM implements a runtime environment based on the NetBSD system call | |
571 | interface. | |
572 | ||
573 | More than any thing, this user level emulation was the first | |
574 | implemented because I happened to have the NetBSD source code lying | |
575 | around. | |
576 | ||
577 | ||
578 | Preparation: | |
579 | ||
580 | ||
581 | This requires the NetBSD-1.1 source tree online. It can either be | |
582 | obtained vi ftp: | |
583 | ||
584 | try http://www.netbsd.org or ftp://ftp.netbsd.org | |
585 | ||
586 | Alternatively obtain one of the NetBSD cdrom's. Patches to this source | |
587 | tree that fill out much of the PowerPC code are available in: | |
588 | ||
589 | ftp://ftp.ci.com.au/pub/clayton | |
590 | ||
591 | Fetch everything in that directory - diffs, tar archives and scripts. | |
592 | In addition patches to the bintuils and gcc are in: | |
593 | ||
594 | ftp://ftp.ci.com.au/pub/psim/binutils-2.6+note.diff.gz | |
595 | ftp://ftp.ci.com.au/pub/psim/gcc-2.7.2+sys-types.diff.gz | |
596 | ||
597 | while the compiler (gcc) and assember (binutils) can be found at your | |
598 | favorite gnu ftp site. I used versions: | |
599 | ||
600 | gcc-2.7.2.tar.gz | |
601 | binutils-2.6.tar.gz | |
602 | ||
603 | ||
604 | ||
605 | ||
606 | Method: | |
607 | ||
608 | ||
609 | These notes are based on an installation performed on a Solaris2/x86 | |
610 | host. For other hosts and other configurations, the below should be | |
611 | considered as a guideline only. | |
612 | ||
613 | ||
614 | o Sanity check | |
615 | ||
616 | I assume that you have already obtained the NetBSD-1.1 source | |
617 | code and unpacked it into the directory bsd-src. While the | |
618 | full NetBSD source tree may not be needed, things are easier | |
619 | if it is all online. | |
620 | ||
621 | $ cd .../scratch | |
622 | $ ls -1 | |
623 | binutils-2.6.tar.gz | |
624 | binutils-2.6+note.diff.gz | |
625 | clayton-include-960203.diff.gz | |
626 | clayton-lib-960203.diff.gz | |
627 | clayton-lib-960203.tar.gz | |
628 | clayton-sys-960203.diff.gz | |
629 | clayton-sys-960203.tar.gz | |
630 | clayton.chown.sh | |
631 | clayton.install.sh | |
632 | clayton.lorder.sh | |
633 | clayton.make.sh | |
634 | gcc-2.7.2.tar.gz | |
635 | gcc-2.7.2+sys-types.diff.gz | |
636 | make.tar.gz | |
637 | make.diff.gz | |
638 | ||
639 | ||
640 | o Prepare the destination directory ready for installation. | |
641 | ||
642 | Firstly create many of the needed directories (some are | |
643 | created automatically later): | |
644 | ||
645 | $ for d in \ | |
646 | /applications/psim \ | |
647 | /applications/psim/bsd-root \ | |
648 | /applications/psim/bsd-root/usr \ | |
649 | /applications/psim/bsd-root/usr/share \ | |
650 | /applications/psim/bsd-root/usr/share/doc \ | |
651 | /applications/psim/bsd-root/usr/share/doc/psd \ | |
652 | /applications/psim/bsd-root/usr/share/doc/psd/19.curses \ | |
653 | /applications/psim/bsd-root/usr/include \ | |
654 | /applications/psim/bsd-root/usr/lib \ | |
655 | /applications/psim/powerpc-unknown-eabi \ | |
656 | /applications/psim/powerpc-unknown-eabi/bin \ | |
657 | ; \ | |
658 | do test -d $d || mkdir $d ; done | |
659 | ||
660 | Next, link the BSD and GNU include directories together. | |
661 | GCC expects include files to be in one location while the | |
662 | bsd install expects them in a second. The link is in | |
663 | the direction below because bsd's install also insists on | |
664 | a directory (not a link) for its install destination. | |
665 | ||
666 | $ rm -rf /applications/psim/powerpc-unknown-eabi/include | |
667 | $ ln -s /applications/psim/bsd-root/usr/include \ | |
668 | /applications/psim/powerpc-unknown-eabi/include | |
669 | ||
670 | $ ls -l /applications/psim/powerpc-unknown-eabi/include | |
671 | lrwxr-xr-x 1 cagney wheel 39 Mar 21 18:09 | |
672 | /applications/psim/powerpc-unknown-eabi/include | |
673 | -> /applications/psim/bsd-root/usr/include | |
674 | ||
675 | ||
676 | o Build/install Berkeley make | |
677 | ||
678 | The tar archive make.tar.gz contains a recent snapshot | |
679 | of bmake from the NetBSD source tree. The notes below | |
680 | describe how to build/install it. If you have access | |
681 | to an even more recent version of bmake, use that. | |
682 | ||
683 | Unpack the source code: | |
684 | ||
685 | $ cd .../scratch | |
686 | $ gunzip < make.tar.gz | tar xf - | |
687 | $ cd make | |
688 | ||
689 | Apply the patch in make.diff.gz that fixes a minor | |
690 | problem with a build under Solaris (by now it should | |
691 | be fixed in the NetBSD-current source tree). | |
692 | ||
693 | $ gunzip < ../make.diff.gz | more | |
694 | $ gunzip < ../make.diff.gz | patch | |
695 | ||
696 | Build it | |
697 | ||
698 | $ make -f Makefile.boot 'CC=gcc -g -DPOSIX' | |
699 | ||
700 | With bmake built, install it into the target specific bin | |
701 | directory: | |
702 | ||
703 | $ cp bmake /applications/psim/powerpc-unknown-eabi/bin/make | |
704 | $ cd .. | |
705 | $ rm -rf make | |
706 | ||
707 | ||
708 | o Set up a number of wrapper scripts for bmake so that it works. | |
709 | ||
710 | In addition to needing BSD make the build process assumes | |
711 | a number of BSD specific commands. To get around this | |
712 | several wrapper scripts are available. | |
713 | ||
714 | powerpc-unknown-eabi-make (clayton.make.sh) | |
715 | ||
716 | Front end to Berkeley make setting it up for a | |
717 | cross compilation | |
718 | ||
719 | $ cp clayton.make.sh \ | |
720 | /applications/psim/bin/powerpc-unknown-eabi-make | |
721 | $ chmod a+x \ | |
722 | /applications/psim/bin/powerpc-unknown-eabi-make | |
723 | ||
724 | chown (clayton.chown.sh) | |
725 | ||
726 | Wrapper that does not do any thing. | |
727 | Avoids the need to be root when installing. | |
728 | ||
729 | $ cp clayton.chown.sh \ | |
730 | /applications/psim/powerpc-unknown-eabi/bin/chown | |
731 | $ chmod a+x \ | |
732 | /applications/psim/powerpc-unknown-eabi/bin/chown | |
733 | ||
734 | install (clayton.install.sh) | |
735 | ||
736 | Wrapper to strip away a number of bsd specific install | |
737 | arguments. | |
738 | ||
739 | $ cp clayton.install.sh \ | |
740 | /applications/psim/powerpc-unknown-eabi/bin/install | |
741 | $ chmod a+x \ | |
742 | /applications/psim/powerpc-unknown-eabi/bin/install | |
743 | ||
744 | lorder (clayton.lorder.sh) | |
745 | ||
746 | Tweaked lorder script that will use nm etc from | |
747 | binutils. | |
748 | ||
749 | $ cp clayton.lorder.sh \ | |
750 | /applications/psim/powerpc-unknown-eabi/bin/lorder | |
751 | $ chmod a+x \ | |
752 | /applications/psim/powerpc-unknown-eabi/bin/lorder | |
753 | ||
754 | ||
755 | printf (?) | |
756 | ||
757 | Some operating systems don't include the program | |
758 | printf. If you host doesn't have one, then a | |
759 | good source is the gnu sh-utils version. | |
760 | ||
761 | Again, if that program is missing, then I suggest | |
762 | installing it onto the powerpc specific program | |
763 | directory: | |
764 | ||
765 | /applications/psim/powerpc-unknown-eabi/bin | |
766 | ||
767 | ||
768 | o Unpack the bsd source code (if you haven't already) | |
769 | ||
770 | If you're short on disk space (like me) just unpack: | |
771 | ||
772 | sys, lib, share/mk, include, usr.sbin/config, | |
773 | usr.sbin/dbsym, gnu/lib/libg++/g++-include, | |
774 | usr.bin/lex | |
775 | ||
776 | Otherwize, assuming you have a CD-DRIVE: | |
777 | ||
778 | $ cd .../scratch | |
779 | $ mkdir bsd-src | |
780 | $ cd bsd-src | |
781 | $ for d in /cdrom/bsdisc_12_95_disc2/NetBSD-1.1/source/*11 | |
782 | do | |
783 | echo $d | |
784 | cat $d/*.?? | gunzip | tar xf - | |
785 | done | |
786 | ||
787 | Flatten the directory structure a little. | |
788 | ||
789 | $ mv usr/src/* . | |
790 | $ rmdir usr/src usr | |
791 | $ cd .. | |
792 | ||
793 | ||
794 | o Apply the clayton (PowerPC) patches to your constructed | |
795 | tree. | |
796 | ||
797 | $ cd .../scratch | |
798 | $ cd bsd-src | |
799 | ||
800 | Diffs are applied using something like: | |
801 | ||
802 | $ gunzip < ../clayton-include-960312.diff.gz | patch -p1 | |
803 | $ gunzip < ../clayton-lib-960203.diff.gz | patch -p1 | |
804 | $ gunzip < ../clayton-sys-960203.diff.gz | patch -p1 | |
805 | ||
806 | The patch to sys/dev/pci/ncr.c.rej might fail. | |
807 | ||
808 | The tar archives have a different problem, you need | |
809 | to remove the `src' prefix. I used | |
810 | ||
811 | $ ln -s . src | |
812 | $ gunzip < ../clayton-lib-960203.tar.gz | tar xvf - | |
813 | $ gunzip < ../clayton-sys-960203.tar.gz | tar xvf - | |
814 | ||
815 | So that src/xxx unpacked into ./xxx | |
816 | ||
817 | $ cd .. | |
818 | ||
819 | ||
820 | o install Berkeley make's include (mk) files. | |
821 | ||
822 | $ cd .../scrath | |
823 | $ cd bsd-src/share | |
824 | $ tar cf - mk | ( cd /applications/psim/bsd-root/usr/share \ | |
825 | && tar xvf - ) | |
826 | $ cd ../.. | |
827 | ||
828 | ||
829 | o Install the include files | |
830 | ||
831 | $ cd .../scratch | |
832 | $ cd bsd-src/include | |
833 | $ powerpc-unknown-eabi-make install | |
834 | $ cd ../.. | |
835 | ||
836 | ||
837 | o Install a few other include files. | |
838 | ||
839 | As discussed above in the section on building libnew, | |
840 | the build process can have chicken/egg problems. In the | |
841 | case of BSD's libc, it wants to use several include files | |
842 | (from the installed include directory) before they are | |
843 | installed. Just copy them in as seen below: | |
844 | ||
845 | $ cd .../scratch | |
846 | $ cd bsd-src | |
847 | $ cp gnu/lib/libg++/g++-include/values.h \ | |
848 | /applications/psim/powerpc-unknown-eabi/include | |
849 | $ cp lib/libcurses/curses.h \ | |
850 | /applications/psim/powerpc-unknown-eabi/include | |
851 | $ cd .. | |
852 | ||
853 | ||
854 | o Unpack/patch/build/install BINUTILS | |
855 | ||
856 | $ cd .../scratch | |
857 | $ gunzip < binutils-2.6.tar.gz | tar xf - | |
858 | ||
859 | gas (bfd) 2.6 didn't support the reading and writing of | |
860 | note sections. The patch binutils-2.6+note.diff.gz | |
861 | adds support for this. PowerPC/ELF boot files being loaded | |
862 | by OpenBoot ROM's should contain a PowerPC note section. | |
863 | ||
864 | $ cd .../scratch | |
865 | $ cd binutils-2.6/bfd | |
866 | $ gunzip < ../../binutils-2.6+note.diff.gz | more | |
867 | $ gunzip < ../../binutils-2.6+note.diff.gz | patch | |
868 | $ cd ../.. | |
869 | ||
870 | Then continue with the build | |
871 | ||
872 | $ cd .../scratch | |
873 | $ cd binutils-2.6 | |
874 | $ ./configure --target=powerpc-unknown-eabi \ | |
875 | --prefix=/applications/psim | |
876 | $ make | |
877 | $ make install | |
878 | $ cd .. | |
879 | $ rm -rf binutils-2.6 | |
880 | ||
881 | This has the intended side effect of partially populating | |
882 | the psim directory tree which makes follow on steps easier. | |
883 | ||
884 | ||
885 | o Unpack/patch/build/install GCC | |
886 | ||
887 | $ cd .../scratch | |
888 | $ gunzip < gcc-2.7.2.tar.gz | tar xf - | |
889 | $ cd gcc-2.7.2 | |
890 | ||
891 | GCC-2.7.2 and the BSD include files have a conflicting type | |
892 | declaration. The patch below gets around this problem | |
893 | (it may still be applicable to more recent versions of | |
894 | GCC): | |
895 | ||
896 | $ gunzip < ../gcc-2.7.2+sys-types.diff.gz | more | |
897 | $ gunzip < ../gcc-2.7.2+sys-types.diff.gz | patch | |
898 | ||
899 | If your version of GCC includes the file ginclude/ppc-asm.h | |
900 | then you should install that header file into the directory: | |
901 | /applications/psim/powerpc-unknown-eabi/include. More | |
902 | recent versions of GCC expect this file to be installed: | |
903 | ||
904 | $ test -r ginclude/ppc-asm.h \ | |
905 | && cp ginclude/ppc-asm.h \ | |
906 | /applications/psim/powerpc-unknown-eabi/include | |
907 | ||
908 | Other than that, assuming the include files installed | |
909 | okay, the rest should be fine .... | |
910 | ||
911 | $ ./configure --target=powerpc-unknown-eabi \ | |
912 | --prefix=/applications/psim | |
913 | $ make CC=gcc | |
914 | $ make CC=gcc install | |
915 | $ cd .. | |
916 | $ rm -rf gcc-2.7.2 | |
917 | ||
918 | ||
919 | o Build/install the Berkeley library: | |
920 | ||
921 | $ cd .../scratch | |
922 | $ cd bsd-src/lib | |
923 | $ powerpc-unknown-eabi-make | |
924 | $ powerpc-unknown-eabi-make install | |
925 | $ cd ../.. | |
926 | ||
927 | If you encounter problems check the following (each | |
928 | discussed above): | |
929 | ||
930 | o GCC and BSD have a common include | |
931 | directory | |
932 | ||
933 | o all the missing include files installed | |
934 | ||
935 | o all the wrapper programs installed | |
936 | ||
937 | ||
938 | o Build/run a simple BSD program | |
939 | ||
940 | $ cd .../scratch | |
941 | $ cd bsd-src/usr.bin/printenv | |
942 | $ powerpc-unknown-eabi-make | |
943 | $ powerpc-unknown-eabi-run printenv | |
944 | . | |
945 | . | |
946 | . | |
947 | ||
948 | ||
949 | ---------------------------------------------------------------------- |