/[gxemul]/trunk/doc/misc.html
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/doc/misc.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 44 - (hide annotations)
Mon Oct 8 16:22:56 2007 UTC (16 years, 6 months ago) by dpavlin
File MIME type: text/html
File size: 23851 byte(s)
++ trunk/HISTORY	(local)
$Id: HISTORY,v 1.1632 2007/09/11 21:46:35 debug Exp $
20070616	Implementing the MIPS32/64 revision 2 "ror" instruction.
20070617	Adding a struct for each physpage which keeps track of which
		ranges within that page (base offset, length) that are
		continuously translatable. When running with native code
		generation enabled (-b), a range is added after each read-
		ahead loop.
		Experimenting with using the physical program counter sample
		data (implemented 20070608) together with the "translatable
		range" information, to figure out which physical address ranges
		would be worth translating to native code (if the number of
		samples falling within a range is above a certain threshold).
20070618	Adding automagic building of .index comment files for
		src/file/, src/promemul/, src src/useremul/ as well.
		Adding a "has been translated" bit to the ranges, so that only
		not-yet-translated ranges will be sampled.
20070619	Moving src/cpu.c and src/memory_rw.c into src/cpus/,
		src/device.c into src/devices/, and src/machine.c into
		src/machines/.
		Creating a skeleton cc/ld native backend module; beginning on
		the function which will detect cc command line, etc.
20070620	Continuing on the native code generation infrastructure.
20070621	Moving src/x11.c and src/console.c into a new src/console/
		subdir (for everything that is console or framebuffer related).
		Moving src/symbol*.c into a new src/symbol/, which should
		contain anything that is symbol handling related.
20070624	Making the program counter sampling threshold a "settings
		variable" (sampling_threshold), i.e. it can now be changed
		during runtime.
		Switching the RELEASE notes format from plain text to HTML.
		If the TMPDIR environment variable is set, it is used instead
		of "/tmp" for temporary files.
		Continuing on the cc/ld backend: simple .c code is generated,
		the compiler and linker are called, etc.
		Adding detection of host architecture to the configure script
		(again), and adding icache invalidation support (only
		implemented for Alpha hosts so far).
20070625	Simplifying the program counter sampling mechanism.
20070626	Removing the cc/ld native code generation stuff, program
		counter sampling, etc; it would not have worked well in the
		general case.
20070627	Removing everything related to native code generation.
20070629	Removing the (practically unusable) support for multiple
		emulations. (The single emulation allowed now still supports
		multiple simultaneous machines, as before.)
		Beginning on PCCTWO and M88K interrupts.
20070723	Adding a dummy skeleton for emulation of M32R processors.
20070901	Fixing a warning found by "gcc version 4.3.0 20070817
		(experimental)" on amd64.
20070905	Removing some more traces of the old "multiple emulations"
		code.
		Also looking in /usr/local/include and /usr/local/lib for
		X11 libs, when running configure.
20070909	Minor updates to the guest OS install instructions, in
		preparation for the NetBSD 4.0 release.
20070918	More testing of NetBSD 4.0 RC1.

1 dpavlin 12 <html><head><title>Gavare's eXperimental Emulator:&nbsp;&nbsp;&nbsp;Miscellaneous</title>
2 dpavlin 8 <meta name="robots" content="noarchive,nofollow,noindex"></head>
3 dpavlin 4 <body bgcolor="#f8f8f8" text="#000000" link="#4040f0" vlink="#404040" alink="#ff0000">
4     <table border=0 width=100% bgcolor="#d0d0d0"><tr>
5     <td width=100% align=center valign=center><table border=0 width=100%><tr>
6     <td align="left" valign=center bgcolor="#d0efff"><font color="#6060e0" size="6">
7 dpavlin 44 <b>GXemul:</b></font>&nbsp;&nbsp;
8 dpavlin 12 <font color="#000000" size="6"><b>Miscellaneous</b>
9 dpavlin 4 </font></td></tr></table></td></tr></table><p>
10 dpavlin 2
11     <!--
12    
13 dpavlin 44 $Id: misc.html,v 1.73 2007/06/23 16:59:35 debug Exp $
14 dpavlin 2
15 dpavlin 34 Copyright (C) 2003-2007 Anders Gavare. All rights reserved.
16 dpavlin 2
17     Redistribution and use in source and binary forms, with or without
18     modification, are permitted provided that the following conditions are met:
19    
20     1. Redistributions of source code must retain the above copyright
21     notice, this list of conditions and the following disclaimer.
22     2. Redistributions in binary form must reproduce the above copyright
23     notice, this list of conditions and the following disclaimer in the
24     documentation and/or other materials provided with the distribution.
25     3. The name of the author may not be used to endorse or promote products
26     derived from this software without specific prior written permission.
27    
28     THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
29     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31     ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
32     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38     SUCH DAMAGE.
39    
40     -->
41    
42 dpavlin 12
43 dpavlin 2 <a href="./">Back to the index</a>
44    
45     <p><br>
46 dpavlin 12 <h2>Miscellaneous</h2>
47 dpavlin 2
48     <p>
49     <ul>
50 dpavlin 12 <li><a href="#devel">Writing operating system code, or
51     developing firmware, using GXemul</a>
52 dpavlin 2 <li><a href="#compilercontruct">Using GXemul in compiler contruction courses</a>
53     <li><a href="#disk">How to start the emulator with a disk image</a>
54 dpavlin 38 <li><a href="#tape_images">How to start the emulator with tape images</a>
55     <li><a href="#disk_overlays">How to use disk image overlays</a>
56 dpavlin 20 <li><a href="#filexfer">Transfering files to/from the guest OS</a>
57 dpavlin 2 <li><a href="#largeimages">How to extract large gzipped disk images</a>
58     <li><a href="#userland">Running userland binaries</a>
59     <li><a href="#promdump">Using a PROM dump from a real machine</a>
60     </ul>
61    
62    
63    
64    
65    
66    
67    
68    
69    
70     <p><br>
71 dpavlin 12 <a name="devel"></a>
72     <h3>Writing operating system code, or developing firmware, using GXemul:</h3>
73 dpavlin 2
74 dpavlin 12 Is this a good idea? The answer is yes and no, depending on the level of
75     detail you need in your simulations. If you are developing an operating
76 dpavlin 20 system or operating system kernel of your own, then the emulator can be a
77     complement to testing on real hardware.
78 dpavlin 2
79 dpavlin 20 <p>Important things to keep in mind:
80 dpavlin 2
81 dpavlin 12 <ul>
82     <li>Porting code to a specific machine mode, e.g. a Silicon Graphics
83 dpavlin 20 machine, using GXemul, will not "magically" cause the code to
84 dpavlin 12 work on a real machine. Sometimes code works in GXemul which doesn't
85     work on real hardware, sometimes it's the other way around.
86 dpavlin 2
87 dpavlin 12 <p>
88     <li>GXemul contains bugs, and many things are not yet implemented.
89 dpavlin 2
90 dpavlin 12 <p>
91 dpavlin 20 <li><b>Very important!</b> I have only implemented devices in GXemul
92     to the degree that NetBSD, OpenBSD, Linux, etc don't complain too much.
93 dpavlin 12 <p>
94 dpavlin 20 If you are developing a driver for a device which is emulated by
95     GXemul, and your driver does not seem to be working, then the
96     probability of a bug in GXemul's implementation of the device is
97     very much higher than that of a bug in your driver.
98     <p>
99     The device implementations in GXemul are based on the assumption
100     that the emulated OS is already developed and bug-free. They are
101     not primarily intended to be used for development of new device
102     driver code in operating systems, so if you do that, then be
103     prepared for bugs and inconsitencies.
104     <p>
105 dpavlin 12 <li>CPU details in GXemul are usually wrong. If your code depends
106     on, say, R10000 or MIPS64 specifics, chances are that GXemul will
107 dpavlin 20 not be sufficient. One example is different revisions of ISAs;
108 dpavlin 32 some instructions which should trigger an exception on a
109     real MIPS processor usually execute anyway in GXemul. Another
110 dpavlin 20 example is if userland code tries to access kernel memory; in some
111     cases there is protection against this, but not in all cases (to get
112     higher performance).
113 dpavlin 12 <p>
114     <li>Caches. There is no cache emulation in GXemul right now. Caches
115     for R2000/R3000 are faked well enough to run NetBSD, Ultrix, etc
116 dpavlin 44 in the <a href="http://en.wikipedia.org/wiki/DECstation">DECstation</a>
117     emulation mode, but other than that, cache operations are treated as nops.
118 dpavlin 12 </ul>
119 dpavlin 2
120 dpavlin 12 <p>The bottom line is that GXemul can be useful as yet another way to test
121     your code during development, but it should not be fully relied on.
122 dpavlin 2
123    
124 dpavlin 12
125    
126    
127    
128 dpavlin 2 <p><br>
129     <a name="compilercontruct"></a>
130     <h3>Using GXemul in compiler contruction courses:</h3>
131    
132     If you are learning how to write a compiler, and wish to target a
133 dpavlin 20 realistic target platform, then MIPS or ARM (as emulated by GXemul)
134     might be suitable choices.
135 dpavlin 2
136     <ul>
137     <li><b>(+)</b>&nbsp;&nbsp;Your compiler needs to output real assembly
138 dpavlin 24 language code, which the assembler (e.g. gas, the GNU assembler) can
139 dpavlin 2 then compile into object format, and then you need to link this
140     into an executable image. This is much closer to how things work
141     in real life than running assembly language listings in a simulator
142 dpavlin 44 (e.g. <a href="http://pages.cs.wisc.edu/~larus/spim.html">SPIM</a>).
143 dpavlin 2 <p>
144 dpavlin 44 <li><b>(-)</b>&nbsp;&nbsp;GXemul does not simulate <a href="http://en.wikipedia.org/wiki/Out-of-order_execution">out-of-order
145     execution</a>, penalties related to instruction scheduling, or
146 dpavlin 2 load-delays, so it cannot be used to create optimizing compilers
147     that take advantage of such processor features. GXemul keeps
148 dpavlin 44 track of the number of instructions executed, and that's it.
149 dpavlin 2 </ul>
150    
151    
152    
153    
154    
155    
156     <p><br>
157     <a name="disk"></a>
158     <h3>How to start the emulator with a disk image:</h3>
159    
160     Add <i>-d [prefixes:]diskimagefilename</i> to the command line, where prefixes
161     are one or more single-character options. Run <b>gxemul -h</b>
162     to get a list of possible options.
163    
164     <p>
165 dpavlin 44 Here are some examples. If you want to run a <a href="http://www.netbsd.org/ports/pmax/">NetBSD/pmax</a>
166     kernel on an emulated <a href="http://en.wikipedia.org/wiki/DECstation">DECstation</a>
167     machine, you would use a command line such as this:
168 dpavlin 2 <pre>
169 dpavlin 12 $ <b>gxemul -e 3max -d pmax_diskimage.fs netbsd-pmax-INSTALL</b>
170 dpavlin 2 </pre>
171 dpavlin 20
172     <p>NOTE: For some emulation modes, such as the DECstation mode, you do
173     <i>not</i> actually have to specify the name of the kernel, if the disk
174     image is bootable!
175    
176     <p>It is possible to have more than one disk. For each -d argument, a disk
177 dpavlin 2 image is added; the first will be SCSI target 0, the second will be target 1, and so on,
178     unless you specify explicitly which ID number the devices should have.
179     <pre>
180 dpavlin 12 $ <b>gxemul -e 3max -d disk0.raw -d disk1.raw -d 5:disk2.raw netbsd-pmax-INSTALL</b>
181 dpavlin 2 </pre>
182     Note: In the example above, disk2.raw will get scsi id 5.
183 dpavlin 20
184     <p>If a filename has a 'c' prefix, or ends with ".iso", then it is assumed to be
185 dpavlin 2 a CDROM device (this can be overridden with a 'd' prefix, to force a read/write disk).
186     For example, the following command would start the emulator with two
187     CDROM images, and one harddisk image:
188     <pre>
189 dpavlin 12 $ <b>gxemul -e 3max -d image.iso -d disk0.img -d c:second_cdrom.img netbsd-pmax-INSTALL</b>
190 dpavlin 2 </pre>
191     Usually, the device with the lowest id becomes the boot device. To override
192     this, add a 'b' prefix to one of the devices:
193     <pre>
194 dpavlin 12 $ <b>gxemul -e 3max -d rootdisk.img -d bc:install-cd.iso name_of_kernel</b>
195 dpavlin 2 </pre>
196     If you have a physical CD-ROM drive on the host machine, say /dev/cd0c, you can
197     use it as a CD-ROM directly accessible from within the emulator:
198     <pre>
199 dpavlin 12 $ <b>gxemul -e 3max -d rootdisk.img -d bc:/dev/cd0c name_of_kernel</b>
200 dpavlin 2 </pre>
201     It is probably possible to use harddisks as well this way, but I would not
202     recommend it.
203 dpavlin 38
204    
205    
206    
207    
208    
209     <p><br>
210     <a name="tape_images"></a>
211     <h3>How to start the emulator with tape images:</h3>
212    
213 dpavlin 2 Using emulated tape drives is a bit more complicated than disks, because a
214     tape can be made up of several "files" with space in between. The solution
215     I have choosen is to have one file in the host's file system space for each
216     tape file. The prefix for using tapes is 't', and the filename given is
217     for the <i>first</i> file on that tape (number zero, implicitly). For
218     files following file nr 0, a dot and the filenumber is appended to the
219     filename.
220     <p>
221     As an example, starting the emulator with
222     <pre>
223     <b>-d t4:mytape.img</b>
224     </pre>
225     will cause SCSI id 4 to be a tape device, using the following file number
226     to name translation scheme:
227     <p>
228     <center>
229     <table border="0">
230     <tr>
231     <td><b>File number:</b></td>
232     <td><b>File name in the host's filesystem:</b></td>
233     </tr>
234     <tr>
235     <td align="center">0</td>
236     <td align="left">mytape.img</td>
237     </tr>
238     <tr>
239     <td align="center">1</td>
240     <td align="left">mytape.img.1</td>
241     </tr>
242     <tr>
243     <td align="center">2</td>
244     <td align="left">mytape.img.2</td>
245     </tr>
246     <tr>
247     <td align="center">..</td>
248     <td align="left">..</td>
249     </tr>
250     </table>
251     </center>
252     <p>
253     If you already have a number of tape files, which should be placed on the
254     same emulated tape, then you might not want to rename all those files.
255     Use symbolic links instead (ln -s).
256     <p>
257     There is another advantage to using symbolic links for tape filenames:
258     every time a tape is rewound, it is reopened using the filename given
259     on the command line. By changing what the symbolic name points to,
260     you can "switch tapes" without quiting and restarting the emulator.
261    
262 dpavlin 38 <p>
263     <font color="#ff0000">Note: Tape support is most likely very buggy,
264     because it has not been tested much, and has probably also suffered
265     from bit-rot by now.</font>
266 dpavlin 2
267    
268 dpavlin 20
269    
270    
271 dpavlin 38
272 dpavlin 2 <p><br>
273 dpavlin 38 <a name="disk_overlays"></a>
274     <h3>How to use disk image overlays:</h3>
275    
276     This is most likely best understood by an example:
277    
278     <p><ul>
279     <li>Install e.g. <a href="guestoses.html#netbsdcatsinstall">NetBSD/cats</a>.
280     You will end up with a disk image called
281     <tt>nbsd_cats.img</tt>.
282     <p>
283     <li>Running the following command will boot straight from the disk
284     image, with no overlay images:<pre>
285     <b>gxemul -XEcats -d nbsd_cats.img netbsd.aout-GENERIC.gz</b>
286    
287     </pre>
288     <li>You may now create an overlay file, a corresponding map file,
289     and start the emulator with the overlay image connected to
290     the same (explicit) ID as the base disk image:<pre>
291     <b>touch overlay.img overlay.img.map
292     gxemul -XEcats -d 0:nbsd_cats.img -d V0:overlay.img netbsd.aout-GENERIC.gz</b>
293    
294     </pre>
295     <li>Any changes to the filesystem you perform when using the overlay
296     will only be written to that overlay. For example, to perform
297     a "roll back", you can do the following:<pre>
298     <b>rm -f overlay.img overlay.img.map
299     touch overlay.img overlay.img.map</b>
300    
301     </pre>
302     and then simply start the emulator again, with the newly created
303     overlay image.
304     </ul>
305    
306     <p>It is also possible to add multiple overlays. In that case, writes
307     always go the the <i>last</i> added overlay.
308    
309     <p>GXemul uses Unix' way of supporting files with "holes",
310     so even if <tt>ls -l overlay.img</tt> says that the overlay is several
311     gigabytes large, <tt>du overlay.img</tt> should reveal that only the
312     blocks that have actually been written to have been stored in the
313     overlay, e.g.:<pre>
314     <b>$ ls -l
315     ..
316     -rw-r--r-- 1 debug wheel 3072319488 Mar 24 11:59 nbsd_cats.img
317     -rw-r--r-- 1 debug wheel 2465354 Mar 24 11:44 netbsd.aout-GENERIC.gz
318     -rw-r--r-- 1 debug wheel 2930841600 Mar 24 14:02 overlay.img
319     -rw-r--r-- 1 debug wheel 715538 Mar 24 14:02 overlay.img.map
320     $ du overlay.img
321     864 overlay.img
322     </b>
323     </pre>
324    
325     <p>The .map file is simply a raw bitmap telling which blocks of the
326     overlay file that are in use.
327    
328    
329    
330    
331    
332     <p><br>
333 dpavlin 20 <a name="filexfer"></a>
334     <h3>Transfering files to/from the guest OS:</h3>
335    
336 dpavlin 32 If the emulated machine supports networking (see <a
337 dpavlin 40 href="networking.html#intro">this section</a> for more info), then the easiest
338     way to transfer files is probably to use FTP or similar methods.
339 dpavlin 20
340     <p>There is another way of transfering files which works for any kind of
341     emulated machine which supports disks (either SCSI or IDE). Any file can
342     be supplied as a disk image. For example, consider the following:<pre>
343     $ <b>gxemul -XEcats -d nbsd_cats.img -d archive.tar.gz netbsd-GENERIC</b>
344     </pre>
345     This will start NetBSD/cats with <tt>nbsd_cats.img</tt> as IDE master on
346     controller 0 (wd0), and <tt>archive.tar.gz</tt> as IDE slave on controller
347     0 (wd1). From inside NetBSD, it is now possible to extract the files using
348     the following command:<pre>
349     (inside emulated NetBSD/cats)
350     # <b>tar zxvf /dev/wd1c</b>
351     </pre>
352     Don't worry if NetBSD complains about lack of disklabel; it doesn't
353     matter. On some machines, NetBSD uses <tt>wd1d</tt> instead of
354     <tt>wd1c</tt> for the entire disk.
355     There is also a minor problem: reading the end of the disk image. If you
356     experience problems untaring archives like this, then pad out the archive
357     first with some zeroes.
358    
359     <p>Transfering files <i>out</i> from the emulated operating system to the
360     host can be done the same way. First, prepare an empty archive file:<pre>
361     $ <b>dd if=/dev/zero of=newarchive.tar bs=1024 count=1 seek=10000</b>
362     </pre>This example created a 10 MB empty file. Then, start the emulator
363     like this:<pre>
364     $ <b>gxemul -XEcats -d nbsd_cats.img -d archive.tar netbsd-GENERIC</b>
365     </pre>
366     and transfer files by creating an archive directly onto the disk image:<pre>
367     (inside emulated NetBSD/cats)
368     # <b>tar cvf /dev/wd1c filenames</b>
369     </pre>
370     where filenames are the files or directories to transfer.
371    
372    
373    
374    
375    
376     <p><br>
377 dpavlin 2 <a name="largeimages"></a>
378     <h3>How to extract large gzipped disk images:</h3>
379    
380     Unix filesystems usually support large files with "holes". Holes are
381     zero-filled blocks that don't actually exist on disk. This is very
382     practical for emulated disk images, as it is possible to create a very
383     large disk image without using up much space at all.
384    
385     <p>
386     Using gzip and gunzip on disk images can be <i>very</i> slow, as these
387     files can be multiple gigabytes large, but this is usually necessary for
388     transfering disk images over the internet. If you receive a gzipped disk
389     image, say disk.img.gz, and run a naive
390     <p>
391     <pre>
392     $ <b>gunzip disk.img.gz</b>
393     </pre>
394     <p>
395     on it, you will not end up with an optimized file unless
396     gunzip supports that. (In my experiments, it doesn't.) In plain English,
397     if you type <b>ls -l</b> and the filesize is 9 GB, it will actually occupy
398     9 GB of disk space! This is often unacceptable.
399     <p>
400     Using a simple tool which only writes blocks that are non-zero, a lot of
401     space can be saved. Compile the program cp_removeblocks in the
402     experiments/ directory, and type:
403     <p>
404     <pre>
405     $ <b>gunzip -c disk.img.gz | cp_removeblocks /dev/stdin disk.img</b>
406     </pre>
407    
408     <p>
409     This will give you a disk.img which looks like it is 9 GB, and works like
410     the real file, but the holes are not written out to the disk. (You can see
411     this by running for example <b>du disk.img</b> to see the physical block
412     count.)
413    
414    
415    
416     <p><br>
417     <a name="userland"></a>
418     <h3>Running userland binaries:</h3>
419    
420 dpavlin 42 <font color="#ff0000"><b>NOTE 2007-06-15:</b> I just removed most of the
421     userland (syscall) emulation support, and started a rewrite from scratch.
422     The rest of this section in the documentation is not currently valid.</font>
423 dpavlin 2
424 dpavlin 12 <p>There is some skeleton code for running userland programs as well. This
425     will not emulate any particular machine, but instead try to translate
426     syscalls from e.g. NetBSD/pmax into the host's OS' syscalls. Right now,
427     this is just a proof-of-concept, to show that it could work; there's lots
428     of work left to do to make it actually run useful programs.
429    
430 dpavlin 2 <p>
431    
432     <ul>
433     <li><b>NetBSD/pmax:</b>
434     <br>
435     Running /bin/hostname or /bin/date and similarly trivial
436     programs from the NetBSD/pmax distribution works:<pre>
437     $ <b>gxemul -q -u netbsd/pmax pmax_bin_hostname</b>
438     tab.csbnet.se
439     $ <b>gxemul -q -u netbsd/pmax pmax_bin_date</b>
440     Sun Jan 25 02:26:14 GMT 2004
441     $ <b>gxemul -q -u netbsd/pmax pmax_bin_sleep</b>
442     usage: pmax_bin_sleep seconds
443     $ <b>gxemul -q -u netbsd/pmax pmax_bin_sleep 5</b>
444     $ <b>gxemul -q -u netbsd/pmax pmax_bin_sync</b>
445     </pre>
446    
447     <p>
448     <li><b>Ultrix:</b>
449     <br>
450     At least /bin/date and /bin/hostname work:<pre>
451     $ <b>gxemul -q -u ultrix ultrix4_bin_date</b>
452     UNIMPLEMENTED ultrix syscall 54
453     UNIMPLEMENTED ultrix syscall 62
454     Mon Feb 9 12:50:59 WET 2004
455     $ <b>gxemul -q -u ultrix ultrix4_bin_hostname</b>
456     tab.csbnet.se
457     </pre>
458    
459 dpavlin 12 <!--
460 dpavlin 2 <p>
461     <li><b>NetBSD/powerpc:</b>
462     <br>
463     /bin/sync from NetBSD/macppc works, but probably not much else.<pre>
464     $ <b>gxemul -v -u netbsd/powerpc netbsd-1.6.2-macppc-bin-sync</b>
465     ...
466     [ sync() ]
467     [ exit(0) ]
468     cpu_run_deinit(): All CPUs halted.
469    
470     </pre>
471    
472     <p>
473     <li><b>Linux/PPC64:</b>
474     <br>
475     The <a href="http://www-106.ibm.com/developerworks/library/l-ppc/#h13">64-bit Hello World assembly language example</a>
476     on IBM's developerWorks pages runs:<pre>
477     $ <b>ppc64-unknown-linux-as hello-ppc64.s -o hello-ppc64.o</b>
478     $ <b>ppc64-unknown-linux-ld hello-ppc64.o -o hello-ppc64</b>
479     $ <b>gxemul -q -u linux/ppc64 hello-ppc64</b>
480     Hello, world!
481    
482     </pre>
483 dpavlin 12 -->
484 dpavlin 2
485     </ul>
486    
487    
488    
489    
490    
491     <p><br>
492     <a name="promdump"></a>
493     <h3>Using a PROM dump from a real machine:</h3>
494    
495     Raw PROM images from real machines can, in a few cases, be used in
496     the emulator. ROM code is usually much more sensitive to correctness
497     of the emulator than operating system kernels or userland programs
498     are, so don't expect any PROM image to just magically work.
499    
500    
501     <p>
502     <h4>Dumping the PROM on a DECstation 5000/125:</h4>
503 dpavlin 44
504 dpavlin 2 The image first needs to be extracted from the machine. There are
505     several ways to do this.
506 dpavlin 44
507 dpavlin 2 <ul>
508     <li>Use hardware to read the PROM chip(s) directly. Not easy if you
509     don't have such a hardware reader.
510     <li>Copy the PROM memory range into a file, from a running
511     operating system. You need a running OS, and it must
512     have access to the PROM memory range. NetBSD, for example,
513     doesn't allow that from userland.
514     <li>Hook up a serial console and dump using the PROM's own dump
515     command.
516     </ul>
517 dpavlin 44
518     <p>The easiest way is to hook up a serial console. The terminal must be
519 dpavlin 2 able to capture output to a file.
520 dpavlin 44
521     <p>These are approximately the commands that I used:
522 dpavlin 2 <pre>
523     >><b>cnfg</b> <i>Show machine configuration</i>
524    
525     >><b>printenv</b> <i>Show environment variables</i>
526    
527     >><b>setenv more 0</b> <i>This turns off the More messages</i>
528    
529     >><b>e -x 0xbfc00000:0xbfffffff</b> <i>Dump the PROM data</i>
530     </pre>
531 dpavlin 44
532     <p>Remember that DECstations are little endian, so if the dump data
533 dpavlin 2 looks like this:
534     <pre>
535     bfc00000: 0x0bf0007e
536     </pre>
537     then the bytes in memory are actually 0x7e, 0x00, 0xf0, and 0x0b.
538 dpavlin 44
539     <p>At 9600 bps, about 10KB can be dumped per minute, so it takes a while.
540 dpavlin 2 Once enough of the PROM has been dumped, you can press CTRL-C to break out.
541     Then, restore the more environment variable:
542     <pre>
543     >><b>setenv more 24</b>
544     </pre>
545 dpavlin 44
546     <p>Now, convert the data you just saved (little-endian words -> bytes),
547 dpavlin 2 and store in a file. Let's call this file DECstation5000_125_promdump.bin.
548     <pre>
549     $ <b>decprom_dump_txt_to_bin DECstation5000_125_promdump.txt DECstation5000_125_promdump.bin</b>
550     </pre>
551 dpavlin 44
552 dpavlin 2 This binary image can now be used in the emulator:
553     <pre>
554 dpavlin 12 $ <b>gxemul -e 3min -Q -M128 -q 0xbfc00000:DECstation5000_125_promdump.bin</b>
555 dpavlin 2
556     KN02-BA V5.7e
557     ?TFL: 3/scc/access (1:Ln1 reg-12: actual=0x00 xpctd=0x01) [KN02-BA]
558     ?TFL: 3/scc/io (1:Ln0 tx bfr not empty. status=0X 0) [KN02-BA]
559     ...
560     --More--?TFL: 3/scsi/cntl (CUX, cause= 1000002C)
561     >><b>?</b>
562     ? [cmd]
563     boot [[-z #] [-n] #/path [ARG...]]
564     cat SCRPT
565     cnfg [#]
566     d [-bhw] [-S #] RNG VAL
567     e [-bhwcdoux] [-S #] RNG
568     erl [-c]
569     go [ADR]
570     init [#] [-m] [ARG...]
571     ls [#]
572     passwd [-c] [-s]
573     printenv [EVN]
574     restart
575     script SCRPT
576     setenv EVN STR
577     sh [-belvS] [SCRPT] [ARG..]
578     t [-l] #/STR [ARG..]
579     unsetenv EVN
580     >><b>cnfg</b>
581     3: KN02-BA DEC V5.7e TCF0 (128 MB)
582     (enet: 00-00-00-00-00-00)
583     (SCSI = 7)
584     0: PMAG-BA DEC V5.3a TCF0
585     >><b>printenv</b>
586     boot=
587     testaction=q
588     haltaction=h
589     more=24
590     #=3
591     console=*
592     osconsole=3
593     >>
594     </pre>
595 dpavlin 14
596     <p><font color="#ff0000">(Note: at the moment, this doesn't work.
597     I must have broken something when fixing something else, but this
598     is what it looked like at the time.)</font>
599    
600     <p>During bootup, the PROM complains <i>a lot</i> about hardware failures.
601 dpavlin 2 That's because the emulator doesn't emulate the hardware well enough yet.
602 dpavlin 14
603     <p>The command line options used are: <tt>-e 3min</tt> for
604     "DECstation 3min" (5000/1xx), <tt>-Q</tt> to supress the emulator's own PROM
605     call emulation, <tt>-M128</tt> for 128MB RAM (because GXemul doesn't correctly
606 dpavlin 2 emulate memory detection well enough for the PROM to accept, so it will
607 dpavlin 14 always believe there is 128MB ram anyway), and <tt>-q</tt> to supress debug messages.
608     The <tt>0xbfc00000</tt> in front of the filename tells GXemul that it is a raw
609 dpavlin 2 binary file which should be loaded at a specific virtual address.
610    
611    
612     <p><br>
613 dpavlin 42 <a name="promdump_o2"><h4>Dumping the PROM on a SGI O2:</h4></a>
614 dpavlin 2
615     The general ideas in this section applies to using ROM images from other
616 dpavlin 14 machines as well. I have also tried this on an SGI IP32 ("O2"), in addition
617     to the DECstation.
618    
619     <p>For the O2, a suitable command to dump the prom memory range is
620 dpavlin 2 <pre>
621     &gt;&gt; <b>dump -b 0xBFC00000:0xBFC80000</b>
622     </pre>
623     Make sure you capture all the output (via serial console) into a file,
624 dpavlin 14 and then run <tt>experiments/sgiprom_to_bin</tt> on the captured file.
625    
626 dpavlin 2 <p>
627 dpavlin 14 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
628     <a href="sgi-o2-real.jpg"><img src="sgi-o2-real_small.jpg"></a>
629     &nbsp;&nbsp;&nbsp;
630     <a href="20050817-sgi-o2-success-7.png"><img src="20050817-sgi-o2-success-7_small.png"></a>
631     &nbsp;&nbsp;&nbsp;
632     <a href="20050817-sgi-o2-success-8.png"><img src="20050817-sgi-o2-success-8_small.png"></a>
633 dpavlin 2
634 dpavlin 14 <p>The photo on the left is from the real machine. The other two are
635     screenshots of the PROM running experimentally in GXemul, using <tt>-Y2</tt>
636     framebuffer scaledown.
637 dpavlin 2
638 dpavlin 14 <p>Normally during bootup, the IP32 PROM does a Power-On test which makes
639     sure that the caches and other things are working properly. GXemul doesn't
640     emulate all those things well enough for the tests to pass. The
641     experimental screenshots above were taken with cache detection skipped
642     manually.
643 dpavlin 2
644 dpavlin 14 <p><font color="#ff0000">
645     In other words: don't expect this to work out-of-the-box with GXemul right
646     now. It might work once I've added correct cache emulation.</font>
647 dpavlin 2
648 dpavlin 14 <p>The command line used to start the emulator, once correct cache
649     emulation has been implemented, would be something like <tt>gxemul -XQeo2
650     0xbfc00000:prom.bin</tt>.
651 dpavlin 2
652 dpavlin 14 <p>The same caution applies when dealing with SGI PROMs as with
653     DECstation PROMs: GXemul doesn't really emulate the hardware, it only
654     "fakes" devices well enough to fool some things, primarily NetBSD, that
655     it is emulating a real machine. ROM code is usually a <i>lot</i> more
656     picky about the details.
657    
658     <p>The graphics used in the O2 is (as far as I know) undocumented. Combining
659     some traces of info from how Linux/O2 draws to the screen with some
660 dpavlin 18 reverse-engineering of my own, I've implemented enough of the controller to
661 dpavlin 14 let the PROM draw rectangles and bitmaps, but not much more. The SCSI
662     controller is not implemented yet either.
663    
664    
665    
666    
667 dpavlin 2 </p>
668    
669     </body>
670     </html>

  ViewVC Help
Powered by ViewVC 1.1.26