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

Contents of /trunk/doc/misc.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 44 - (show 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 <html><head><title>Gavare's eXperimental Emulator:&nbsp;&nbsp;&nbsp;Miscellaneous</title>
2 <meta name="robots" content="noarchive,nofollow,noindex"></head>
3 <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 <b>GXemul:</b></font>&nbsp;&nbsp;
8 <font color="#000000" size="6"><b>Miscellaneous</b>
9 </font></td></tr></table></td></tr></table><p>
10
11 <!--
12
13 $Id: misc.html,v 1.73 2007/06/23 16:59:35 debug Exp $
14
15 Copyright (C) 2003-2007 Anders Gavare. All rights reserved.
16
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
43 <a href="./">Back to the index</a>
44
45 <p><br>
46 <h2>Miscellaneous</h2>
47
48 <p>
49 <ul>
50 <li><a href="#devel">Writing operating system code, or
51 developing firmware, using GXemul</a>
52 <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 <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 <li><a href="#filexfer">Transfering files to/from the guest OS</a>
57 <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 <a name="devel"></a>
72 <h3>Writing operating system code, or developing firmware, using GXemul:</h3>
73
74 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 system or operating system kernel of your own, then the emulator can be a
77 complement to testing on real hardware.
78
79 <p>Important things to keep in mind:
80
81 <ul>
82 <li>Porting code to a specific machine mode, e.g. a Silicon Graphics
83 machine, using GXemul, will not "magically" cause the code to
84 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
87 <p>
88 <li>GXemul contains bugs, and many things are not yet implemented.
89
90 <p>
91 <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 <p>
94 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 <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 not be sufficient. One example is different revisions of ISAs;
108 some instructions which should trigger an exception on a
109 real MIPS processor usually execute anyway in GXemul. Another
110 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 <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 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 </ul>
119
120 <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
123
124
125
126
127
128 <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 realistic target platform, then MIPS or ARM (as emulated by GXemul)
134 might be suitable choices.
135
136 <ul>
137 <li><b>(+)</b>&nbsp;&nbsp;Your compiler needs to output real assembly
138 language code, which the assembler (e.g. gas, the GNU assembler) can
139 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 (e.g. <a href="http://pages.cs.wisc.edu/~larus/spim.html">SPIM</a>).
143 <p>
144 <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 load-delays, so it cannot be used to create optimizing compilers
147 that take advantage of such processor features. GXemul keeps
148 track of the number of instructions executed, and that's it.
149 </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 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 <pre>
169 $ <b>gxemul -e 3max -d pmax_diskimage.fs netbsd-pmax-INSTALL</b>
170 </pre>
171
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 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 $ <b>gxemul -e 3max -d disk0.raw -d disk1.raw -d 5:disk2.raw netbsd-pmax-INSTALL</b>
181 </pre>
182 Note: In the example above, disk2.raw will get scsi id 5.
183
184 <p>If a filename has a 'c' prefix, or ends with ".iso", then it is assumed to be
185 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 $ <b>gxemul -e 3max -d image.iso -d disk0.img -d c:second_cdrom.img netbsd-pmax-INSTALL</b>
190 </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 $ <b>gxemul -e 3max -d rootdisk.img -d bc:install-cd.iso name_of_kernel</b>
195 </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 $ <b>gxemul -e 3max -d rootdisk.img -d bc:/dev/cd0c name_of_kernel</b>
200 </pre>
201 It is probably possible to use harddisks as well this way, but I would not
202 recommend it.
203
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 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 <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
267
268
269
270
271
272 <p><br>
273 <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 <a name="filexfer"></a>
334 <h3>Transfering files to/from the guest OS:</h3>
335
336 If the emulated machine supports networking (see <a
337 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
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 <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 <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
424 <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 <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 <!--
460 <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 -->
484
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
504 The image first needs to be extracted from the machine. There are
505 several ways to do this.
506
507 <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
518 <p>The easiest way is to hook up a serial console. The terminal must be
519 able to capture output to a file.
520
521 <p>These are approximately the commands that I used:
522 <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
532 <p>Remember that DECstations are little endian, so if the dump data
533 looks like this:
534 <pre>
535 bfc00000: 0x0bf0007e
536 </pre>
537 then the bytes in memory are actually 0x7e, 0x00, 0xf0, and 0x0b.
538
539 <p>At 9600 bps, about 10KB can be dumped per minute, so it takes a while.
540 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
546 <p>Now, convert the data you just saved (little-endian words -> bytes),
547 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
552 This binary image can now be used in the emulator:
553 <pre>
554 $ <b>gxemul -e 3min -Q -M128 -q 0xbfc00000:DECstation5000_125_promdump.bin</b>
555
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
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 That's because the emulator doesn't emulate the hardware well enough yet.
602
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 emulate memory detection well enough for the PROM to accept, so it will
607 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 binary file which should be loaded at a specific virtual address.
610
611
612 <p><br>
613 <a name="promdump_o2"><h4>Dumping the PROM on a SGI O2:</h4></a>
614
615 The general ideas in this section applies to using ROM images from other
616 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 <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 and then run <tt>experiments/sgiprom_to_bin</tt> on the captured file.
625
626 <p>
627 &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
634 <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
638 <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
644 <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
648 <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
652 <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 reverse-engineering of my own, I've implemented enough of the controller to
661 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 </p>
668
669 </body>
670 </html>

  ViewVC Help
Powered by ViewVC 1.1.26