/[gxemul]/trunk/src/machine.c
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/src/machine.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (hide annotations)
Mon Oct 8 16:18:11 2007 UTC (16 years, 6 months ago) by dpavlin
File MIME type: text/plain
File size: 152074 byte(s)
++ trunk/HISTORY	(local)
$Id: HISTORY,v 1.772 2005/06/04 12:02:16 debug Exp $
20050428	Disabling the "-fmove-all-movables" option in the configure
		script, because it causes the compile to fail on OpenBSD/sgi.
20050502	Minor updates.
20050503	Removing the WRT54G mode (it was bogus anyway), and adding a
		comment about Windows NT for MIPS in doc/experiments.html.
		Minor updates to the x86 instruction decoding.
20050504	Adding some more x86 instructions.
		Adding support for reading files from ISO9660 CDROMs (including
		gzipped files). It's an ugly hack, but it seems to work.
		Various other minor updates (dev_vga.c, pc_bios.c etc).
20050505	Some more x86-related updates.
		Beginning (what I hope will be) a major code cleanup phase.
		"bootris" (an x86 bootsector) runs :-)
20050506	Adding some more x86 instructions.
20050507	tmpnam => mkstemp.
		Working on a hack to allow VGA charcells to be shown even when
		not running with X11.
		Adding more x86 instructions.
20050508	x86 32-bit SIB addressing fix, and more instructions.
20050509	Adding more x86 instructions.
20050510	Minor documentation updates, and other updates (x86 stuff etc.)
20050511	More x86-related updates.
20050513	Various updates, mostly x86-related. (Trying to fix flag 
		calculation, factoring out the ugly shift/rotate code, and
		some other things.)
20050514	Adding support for loading some old i386 a.out executables.
		Finally beginning the cleanup of machine/PROM/bios dependant
		info.
		Some minor documentation updates.
		Trying to clean up ARCBIOS stuff a little.
20050515	Trying to make it possible to actually use more than one disk
		type per machine (floppy, ide, scsi).
		Trying to clean up the kbd vs PROM console stuff. (For PC and
		ARC emulation modes, mostly.)
		Beginning to add an 8259 interrupt controller, and connecting
		it to the x86 emulation.
20050516	The first x86 interrupts seem to work (keyboard stuff).
		Adding a 8253/8254 programmable interval timer skeleton.
		FreeDOS now reaches a command prompt and can be interacted
		with.
20050517	After some bugfixes, MS-DOS also (sometimes) reaches a
		command prompt now.
		Trying to fix the pckbc to work with MS-DOS' keyb.com, but no
		success yet.
20050518	Adding a simple 32-bit x86 MMU skeleton.
20050519	Some more work on the x86 stuff. (Beginning the work on paging,
		and various other fixes).
20050520	More updates. Working on dev_vga (4-bit graphics modes), adding
		40 columns support to the PC bios emulation.
		Trying to add support for resizing windows when switching
		between graphics modes.
20050521	Many more x86-related updates.
20050522	Correcting the initial stack pointer's sign-extension for
		ARCBIOS emulation (thanks to Alec Voropay for noticing the
		error).
		Continuing on the cleanup (ARCBIOS etc).
		dev_vga updates.
20050523	More x86 updates: trying to add some support for protected mode
		interrupts (via gate descriptors) and many other fixes.
		More ARCBIOS cleanup.
		Adding a device flag which indicates that reads cause no
		side-effects. (Useful for the "dump" command in the debugger,
		and other things.)
		Adding support for directly starting up x86 ELFs, skipping the
		bootloader stage. (Most ELFs, however, are not suitable for
		this.)
20050524	Adding simple 32-bit x86 TSS task switching, but no privilege
		level support yet.
		More work on dev_vga. A small "Copper bars" demo works. :-)
		Adding support for Trap Flag (single-step exceptions), at least
		in real mode, and various other x86-related fixes.
20050525	Adding a new disk image prefix (gH;S;) which can be used to
		override the default nr of heads and sectors per track.
20050527	Various bug fixes, more work on the x86 mode (stack change on
		interrupts between different priv.levels), and some minor
		documentation updates.
20050528	Various fixes (x86 stuff).
20050529	More x86 fixes. An OpenBSD/i386 bootfloppy reaches userland
		and can be interacted with (although there are problems with
		key repetition). NetBSD/i386 triggers a serious CISC-related
		problem: instruction fetches across page boundaries, where
		the later part isn't actually part of the instruction.
20050530	Various minor updates. (Documentation updates, etc.)
20050531	Adding some experimental code (experiments/new_test_*) which
		could be useful for dynamic (but not binary) translation in
		the future.
20050602	Adding a dummy ARM skeleton.
		Fixing the pckbc key repetition problem (by adding release
		scancodes for all keypresses).
20050603	Minor updates for the next release.
20050604	Release testing. Minor updates.

==============  RELEASE 0.3.3  ==============

20050604	There'll probably be a 0.3.3.1 release soon, with some very
		very tiny updates.


1 dpavlin 2 /*
2     * Copyright (C) 2003-2005 Anders Gavare. All rights reserved.
3     *
4     * Redistribution and use in source and binary forms, with or without
5     * modification, are permitted provided that the following conditions are met:
6     *
7     * 1. Redistributions of source code must retain the above copyright
8     * notice, this list of conditions and the following disclaimer.
9     * 2. Redistributions in binary form must reproduce the above copyright
10     * notice, this list of conditions and the following disclaimer in the
11     * documentation and/or other materials provided with the distribution.
12     * 3. The name of the author may not be used to endorse or promote products
13     * derived from this software without specific prior written permission.
14     *
15     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18     * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25     * SUCH DAMAGE.
26     *
27     *
28 dpavlin 6 * $Id: machine.c,v 1.452 2005/06/02 17:11:34 debug Exp $
29 dpavlin 2 *
30     * Emulation of specific machines.
31     *
32     * This module is quite large. Hopefully it is still clear enough to be
33     * easily understood. The main parts are:
34     *
35     * Helper functions.
36     *
37     * Machine specific Interrupt routines.
38     *
39     * Machine specific Initialization routines.
40     */
41    
42     #include <stdio.h>
43     #include <stdlib.h>
44     #include <stdarg.h>
45     #ifdef SOLARIS
46     #include <strings.h>
47     #else
48     #include <string.h>
49     #endif
50     #include <time.h>
51     #include <unistd.h>
52    
53     #include "arcbios.h"
54     #include "bus_pci.h"
55     #include "cpu.h"
56     #include "cpu_mips.h"
57     #include "device.h"
58     #include "devices.h"
59     #include "diskimage.h"
60     #include "emul.h"
61     #include "machine.h"
62     #include "memory.h"
63     #include "misc.h"
64     #include "mp.h"
65     #include "net.h"
66     #include "symbol.h"
67    
68     /* For SGI and ARC emulation: */
69     #include "sgi_arcbios.h"
70     #include "crimereg.h"
71    
72     /* For DECstation emulation: */
73     #include "dec_prom.h"
74     #include "dec_bootinfo.h"
75     #include "dec_5100.h"
76     #include "dec_kn01.h"
77     #include "dec_kn02.h"
78     #include "dec_kn03.h"
79     #include "dec_kmin.h"
80     #include "dec_maxine.h"
81    
82     /* HPC: */
83     #include "hpc_bootinfo.h"
84     #include "vripreg.h"
85    
86    
87     struct machine_entry_subtype {
88     int machine_subtype;/* Old-style subtype */
89     const char *name; /* Official name */
90     int n_aliases;
91     char **aliases; /* Aliases */
92     };
93    
94     struct machine_entry {
95     struct machine_entry *next;
96    
97     /* Machine type: */
98     int arch;
99     int machine_type; /* Old-style type */
100     const char *name; /* Official name */
101     int n_aliases;
102     char **aliases; /* Aliases */
103    
104     /* Machine subtypes: */
105     int n_subtypes;
106     struct machine_entry_subtype **subtype;
107     };
108    
109 dpavlin 6
110     /* See main.c: */
111     extern int quiet_mode;
112    
113    
114 dpavlin 2 /* This is initialized by machine_init(): */
115     static struct machine_entry *first_machine_entry = NULL;
116    
117    
118     /*
119     * machine_new():
120     *
121     * Returns a reasonably initialized struct machine.
122     */
123     struct machine *machine_new(char *name, struct emul *emul)
124     {
125     struct machine *m;
126     m = malloc(sizeof(struct machine));
127     if (m == NULL) {
128     fprintf(stderr, "machine_new(): out of memory\n");
129     exit(1);
130     }
131    
132     memset(m, 0, sizeof(struct machine));
133    
134     /* Back pointer: */
135     m->emul = emul;
136    
137     m->name = strdup(name);
138    
139     /* Sane default values: */
140     m->serial_nr = 0;
141     m->machine_type = MACHINE_NONE;
142     m->machine_subtype = MACHINE_NONE;
143     m->bintrans_enable = 1;
144     m->prom_emulation = 1;
145     m->speed_tricks = 1;
146     m->byte_order_override = NO_BYTE_ORDER_OVERRIDE;
147     m->boot_kernel_filename = "";
148     m->boot_string_argument = NULL;
149     m->automatic_clock_adjustment = 1;
150     m->x11_scaledown = 1;
151     m->n_gfx_cards = 1;
152     m->dbe_on_nonexistant_memaccess = 1;
153     m->show_symbolic_register_names = 1;
154     m->bintrans_size = DEFAULT_BINTRANS_SIZE_IN_MB * 1048576;
155     symbol_init(&m->symbol_context);
156    
157     return m;
158     }
159    
160    
161     /*
162     * machine_name_to_type():
163     *
164     * Take a type and a subtype as strings, and convert them into numeric
165     * values used internally throughout the code.
166     *
167     * Return value is 1 on success, 0 if there was no match.
168     * Also, any errors/warnings are printed using fatal()/debug().
169     */
170     int machine_name_to_type(char *stype, char *ssubtype,
171     int *type, int *subtype, int *arch)
172     {
173     struct machine_entry *me;
174     int i, j, k;
175    
176     *type = MACHINE_NONE;
177     *subtype = 0;
178    
179     me = first_machine_entry;
180     while (me != NULL) {
181     for (i=0; i<me->n_aliases; i++)
182     if (strcasecmp(me->aliases[i], stype) == 0) {
183     /* Found a type: */
184     *type = me->machine_type;
185     *arch = me->arch;
186    
187     if (me->n_subtypes == 0)
188     return 1;
189    
190     /* Check for subtype: */
191     for (j=0; j<me->n_subtypes; j++)
192     for (k=0; k<me->subtype[j]->n_aliases;
193     k++)
194     if (strcasecmp(ssubtype,
195     me->subtype[j]->aliases[k]
196     ) == 0) {
197     *subtype = me->subtype[
198     j]->machine_subtype;
199     return 1;
200     }
201    
202 dpavlin 6 fatal("Unknown subtype '%s' for emulation"
203 dpavlin 2 " '%s'\n", ssubtype, stype);
204 dpavlin 6 if (!ssubtype[0])
205     fatal("(Maybe you forgot the -e"
206     " command line option?)\n");
207 dpavlin 2 exit(1);
208     }
209    
210     me = me->next;
211     }
212    
213 dpavlin 6 fatal("\nSorry, emulation \"%s\"", stype);
214     if (ssubtype != NULL && ssubtype[0] != '\0')
215     fatal(" (subtype \"%s\")", ssubtype);
216     fatal(" is unknown.\n");
217 dpavlin 2 fatal("Use the -H command line option to get a list of available"
218 dpavlin 6 " types and subtypes.\n\n");
219 dpavlin 2 return 0;
220     }
221    
222    
223     /*
224     * machine_add_tickfunction():
225     *
226     * Adds a tick function (a function called every now and then, depending on
227     * clock cycle count) to a machine.
228     */
229     void machine_add_tickfunction(struct machine *machine, void (*func)
230     (struct cpu *, void *), void *extra, int clockshift)
231     {
232     int n = machine->n_tick_entries;
233    
234     if (n >= MAX_TICK_FUNCTIONS) {
235     fprintf(stderr, "machine_add_tickfunction(): too "
236     "many tick functions\n");
237     exit(1);
238     }
239    
240     /* Don't use too low clockshifts, that would be too inefficient
241     with bintrans. */
242     if (clockshift < N_SAFE_BINTRANS_LIMIT_SHIFT)
243     fatal("WARNING! clockshift = %i, less than "
244     "N_SAFE_BINTRANS_LIMIT_SHIFT (%i)\n",
245     clockshift, N_SAFE_BINTRANS_LIMIT_SHIFT);
246    
247     machine->ticks_till_next[n] = 0;
248     machine->ticks_reset_value[n] = 1 << clockshift;
249     machine->tick_func[n] = func;
250     machine->tick_extra[n] = extra;
251    
252     machine->n_tick_entries ++;
253     }
254    
255    
256     /****************************************************************************
257     * *
258     * Helper functions *
259     * *
260     ****************************************************************************/
261    
262    
263     int int_to_bcd(int i)
264     {
265     return (i/10) * 16 + (i % 10);
266     }
267    
268    
269     /*
270     * dump_mem_string():
271     *
272     * Dump the contents of emulated RAM as readable text. Bytes that aren't
273     * readable are dumped in [xx] notation, where xx is in hexadecimal.
274     * Dumping ends after DUMP_MEM_STRING_MAX bytes, or when a terminating
275     * zero byte is found.
276     */
277     #define DUMP_MEM_STRING_MAX 45
278     void dump_mem_string(struct cpu *cpu, uint64_t addr)
279     {
280     int i;
281     for (i=0; i<DUMP_MEM_STRING_MAX; i++) {
282     unsigned char ch = '\0';
283    
284     cpu->memory_rw(cpu, cpu->mem, addr + i, &ch, sizeof(ch),
285     MEM_READ, CACHE_DATA | NO_EXCEPTIONS);
286     if (ch == '\0')
287     return;
288     if (ch >= ' ' && ch < 126)
289     debug("%c", ch);
290     else
291     debug("[%02x]", ch);
292     }
293     }
294    
295    
296     /*
297     * store_byte():
298     *
299     * Stores a byte in emulated ram. (Helper function.)
300     */
301     void store_byte(struct cpu *cpu, uint64_t addr, uint8_t data)
302     {
303     if ((addr >> 32) == 0)
304     addr = (int64_t)(int32_t)addr;
305     cpu->memory_rw(cpu, cpu->mem,
306     addr, &data, sizeof(data), MEM_WRITE, CACHE_DATA);
307     }
308    
309    
310     /*
311     * store_string():
312     *
313     * Stores chars into emulated RAM until a zero byte (string terminating
314     * character) is found. The zero byte is also copied.
315     * (strcpy()-like helper function, host-RAM-to-emulated-RAM.)
316     */
317     void store_string(struct cpu *cpu, uint64_t addr, char *s)
318     {
319     do {
320     store_byte(cpu, addr++, *s);
321     } while (*s++);
322     }
323    
324    
325     /*
326     * add_environment_string():
327     *
328     * Like store_string(), but advances the pointer afterwards. The most
329     * obvious use is to place a number of strings (such as environment variable
330     * strings) after one-another in emulated memory.
331     */
332     void add_environment_string(struct cpu *cpu, char *s, uint64_t *addr)
333     {
334     store_string(cpu, *addr, s);
335     (*addr) += strlen(s) + 1;
336     }
337    
338    
339     /*
340     * store_64bit_word():
341     *
342     * Stores a 64-bit word in emulated RAM. Byte order is taken into account.
343     * Helper function.
344     */
345     int store_64bit_word(struct cpu *cpu, uint64_t addr, uint64_t data64)
346     {
347     unsigned char data[8];
348     if ((addr >> 32) == 0)
349     addr = (int64_t)(int32_t)addr;
350     data[0] = (data64 >> 56) & 255;
351     data[1] = (data64 >> 48) & 255;
352     data[2] = (data64 >> 40) & 255;
353     data[3] = (data64 >> 32) & 255;
354     data[4] = (data64 >> 24) & 255;
355     data[5] = (data64 >> 16) & 255;
356     data[6] = (data64 >> 8) & 255;
357     data[7] = (data64) & 255;
358     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
359     int tmp = data[0]; data[0] = data[7]; data[7] = tmp;
360     tmp = data[1]; data[1] = data[6]; data[6] = tmp;
361     tmp = data[2]; data[2] = data[5]; data[5] = tmp;
362     tmp = data[3]; data[3] = data[4]; data[4] = tmp;
363     }
364     return cpu->memory_rw(cpu, cpu->mem,
365     addr, data, sizeof(data), MEM_WRITE, CACHE_DATA);
366     }
367    
368    
369     /*
370     * store_32bit_word():
371     *
372     * Stores a 32-bit word in emulated RAM. Byte order is taken into account.
373     * (This function takes a 64-bit word as argument, to suppress some
374     * warnings, but only the lowest 32 bits are used.)
375     */
376     int store_32bit_word(struct cpu *cpu, uint64_t addr, uint64_t data32)
377     {
378     unsigned char data[4];
379     if ((addr >> 32) == 0)
380     addr = (int64_t)(int32_t)addr;
381     data[0] = (data32 >> 24) & 255;
382     data[1] = (data32 >> 16) & 255;
383     data[2] = (data32 >> 8) & 255;
384     data[3] = (data32) & 255;
385     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
386     int tmp = data[0]; data[0] = data[3]; data[3] = tmp;
387     tmp = data[1]; data[1] = data[2]; data[2] = tmp;
388     }
389     return cpu->memory_rw(cpu, cpu->mem,
390     addr, data, sizeof(data), MEM_WRITE, CACHE_DATA);
391     }
392    
393    
394     /*
395     * store_16bit_word():
396     *
397     * Stores a 16-bit word in emulated RAM. Byte order is taken into account.
398     * (This function takes a 64-bit word as argument, to suppress some
399     * warnings, but only the lowest 16 bits are used.)
400     */
401     int store_16bit_word(struct cpu *cpu, uint64_t addr, uint64_t data16)
402     {
403     unsigned char data[2];
404     if ((addr >> 32) == 0)
405     addr = (int64_t)(int32_t)addr;
406     data[0] = (data16 >> 8) & 255;
407     data[1] = (data16) & 255;
408     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
409     int tmp = data[0]; data[0] = data[1]; data[1] = tmp;
410     }
411     return cpu->memory_rw(cpu, cpu->mem,
412     addr, data, sizeof(data), MEM_WRITE, CACHE_DATA);
413     }
414    
415    
416     /*
417     * store_buf():
418     *
419     * memcpy()-like helper function, from host RAM to emulated RAM.
420     */
421     void store_buf(struct cpu *cpu, uint64_t addr, char *s, size_t len)
422     {
423 dpavlin 6 int psize = 1024; /* 1024 256 64 16 4 1 */
424    
425 dpavlin 2 if ((addr >> 32) == 0)
426     addr = (int64_t)(int32_t)addr;
427    
428 dpavlin 6 while (len != 0) {
429     if ((addr & (psize-1)) == 0) {
430     while (len >= psize) {
431     cpu->memory_rw(cpu, cpu->mem, addr,
432     (unsigned char *)s, psize, MEM_WRITE,
433     CACHE_DATA);
434     addr += psize;
435     s += psize;
436     len -= psize;
437     }
438 dpavlin 2 }
439 dpavlin 6 psize >>= 2;
440 dpavlin 2 }
441    
442     while (len-- != 0)
443     store_byte(cpu, addr++, *s++);
444     }
445    
446    
447     /*
448     * store_pointer_and_advance():
449     *
450     * Stores a 32-bit or 64-bit pointer in emulated RAM, and advances the
451     * target address. (Used by ARC and SGI initialization.)
452     */
453     void store_pointer_and_advance(struct cpu *cpu, uint64_t *addrp,
454     uint64_t data, int flag64)
455     {
456     uint64_t addr = *addrp;
457     if (flag64) {
458     store_64bit_word(cpu, addr, data);
459     addr += 8;
460     } else {
461     store_32bit_word(cpu, addr, data);
462     addr += 4;
463     }
464     *addrp = addr;
465     }
466    
467    
468     /*
469     * load_32bit_word():
470     *
471     * Helper function. Prints a warning and returns 0, if the read failed.
472     * Emulated byte order is taken into account.
473     */
474     uint32_t load_32bit_word(struct cpu *cpu, uint64_t addr)
475     {
476     unsigned char data[4];
477    
478     if ((addr >> 32) == 0)
479     addr = (int64_t)(int32_t)addr;
480     cpu->memory_rw(cpu, cpu->mem,
481     addr, data, sizeof(data), MEM_READ, CACHE_DATA);
482    
483     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
484     int tmp = data[0]; data[0] = data[3]; data[3] = tmp;
485     tmp = data[1]; data[1] = data[2]; data[2] = tmp;
486     }
487    
488     return (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3];
489     }
490    
491    
492     /*
493 dpavlin 4 * load_16bit_word():
494     *
495     * Helper function. Prints a warning and returns 0, if the read failed.
496     * Emulated byte order is taken into account.
497     */
498     uint16_t load_16bit_word(struct cpu *cpu, uint64_t addr)
499     {
500     unsigned char data[2];
501    
502     if ((addr >> 32) == 0)
503     addr = (int64_t)(int32_t)addr;
504     cpu->memory_rw(cpu, cpu->mem,
505     addr, data, sizeof(data), MEM_READ, CACHE_DATA);
506    
507     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
508     int tmp = data[0]; data[0] = data[1]; data[1] = tmp;
509     }
510    
511     return (data[0] << 8) + data[1];
512     }
513    
514    
515     /*
516 dpavlin 2 * store_64bit_word_in_host():
517     *
518     * Stores a 64-bit word in the _host's_ RAM. Emulated byte order is taken
519     * into account. This is useful when building structs in the host's RAM
520     * which will later be copied into emulated RAM.
521     */
522     void store_64bit_word_in_host(struct cpu *cpu,
523     unsigned char *data, uint64_t data64)
524     {
525     data[0] = (data64 >> 56) & 255;
526     data[1] = (data64 >> 48) & 255;
527     data[2] = (data64 >> 40) & 255;
528     data[3] = (data64 >> 32) & 255;
529     data[4] = (data64 >> 24) & 255;
530     data[5] = (data64 >> 16) & 255;
531     data[6] = (data64 >> 8) & 255;
532     data[7] = (data64) & 255;
533     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
534     int tmp = data[0]; data[0] = data[7]; data[7] = tmp;
535     tmp = data[1]; data[1] = data[6]; data[6] = tmp;
536     tmp = data[2]; data[2] = data[5]; data[5] = tmp;
537     tmp = data[3]; data[3] = data[4]; data[4] = tmp;
538     }
539     }
540    
541    
542     /*
543     * store_32bit_word_in_host():
544     *
545     * See comment for store_64bit_word_in_host().
546     *
547     * (Note: The data32 parameter is a uint64_t. This is done to suppress
548     * some warnings.)
549     */
550     void store_32bit_word_in_host(struct cpu *cpu,
551     unsigned char *data, uint64_t data32)
552     {
553     data[0] = (data32 >> 24) & 255;
554     data[1] = (data32 >> 16) & 255;
555     data[2] = (data32 >> 8) & 255;
556     data[3] = (data32) & 255;
557     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
558     int tmp = data[0]; data[0] = data[3]; data[3] = tmp;
559     tmp = data[1]; data[1] = data[2]; data[2] = tmp;
560     }
561     }
562    
563    
564     /*
565     * store_16bit_word_in_host():
566     *
567     * See comment for store_64bit_word_in_host().
568     */
569     void store_16bit_word_in_host(struct cpu *cpu,
570     unsigned char *data, uint16_t data16)
571     {
572     data[0] = (data16 >> 8) & 255;
573     data[1] = (data16) & 255;
574     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
575     int tmp = data[0]; data[0] = data[1]; data[1] = tmp;
576     }
577     }
578    
579    
580     /****************************************************************************
581     * *
582     * Machine dependant Interrupt routines *
583     * *
584     ****************************************************************************/
585    
586    
587     /*
588     * DECstation KN02 interrupts:
589     */
590     void kn02_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
591     {
592     int current;
593    
594     irq_nr -= 8;
595     irq_nr &= 0xff;
596    
597     if (assrt) {
598     /* OR in the irq_nr into the CSR: */
599 dpavlin 6 m->md_int.kn02_csr->csr[0] |= irq_nr;
600 dpavlin 2 } else {
601     /* AND out the irq_nr from the CSR: */
602 dpavlin 6 m->md_int.kn02_csr->csr[0] &= ~irq_nr;
603 dpavlin 2 }
604    
605 dpavlin 6 current = m->md_int.kn02_csr->csr[0] & m->md_int.kn02_csr->csr[2];
606 dpavlin 2 if (current == 0)
607     cpu_interrupt_ack(cpu, 2);
608     else
609     cpu_interrupt(cpu, 2);
610     }
611    
612    
613     /*
614     * DECstation KMIN interrupts:
615     *
616     * TC slot 3 = system slot.
617     */
618     void kmin_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
619     {
620     irq_nr -= 8;
621     /* debug("kmin_interrupt(): irq_nr=%i assrt=%i\n", irq_nr, assrt); */
622    
623     if (assrt)
624 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] |= irq_nr;
625 dpavlin 2 else
626 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] &= ~irq_nr;
627 dpavlin 2
628 dpavlin 6 if (m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10]
629     & m->md_int.dec_ioasic_data->reg[(IOASIC_IMSK - IOASIC_SLOT_1_START) / 0x10])
630 dpavlin 2 cpu_interrupt(cpu, KMIN_INT_TC3);
631     else
632     cpu_interrupt_ack(cpu, KMIN_INT_TC3);
633     }
634    
635    
636     /*
637     * DECstation KN03 interrupts:
638     */
639     void kn03_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
640     {
641     irq_nr -= 8;
642     /* debug("kn03_interrupt(): irq_nr=0x%x assrt=%i\n", irq_nr, assrt); */
643    
644     if (assrt)
645 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] |= irq_nr;
646 dpavlin 2 else
647 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] &= ~irq_nr;
648 dpavlin 2
649 dpavlin 6 if (m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10]
650     & m->md_int.dec_ioasic_data->reg[(IOASIC_IMSK - IOASIC_SLOT_1_START) / 0x10])
651 dpavlin 2 cpu_interrupt(cpu, KN03_INT_ASIC);
652     else
653     cpu_interrupt_ack(cpu, KN03_INT_ASIC);
654     }
655    
656    
657     /*
658     * DECstation MAXINE interrupts:
659     */
660     void maxine_interrupt(struct machine *m, struct cpu *cpu,
661     int irq_nr, int assrt)
662     {
663     irq_nr -= 8;
664     debug("maxine_interrupt(): irq_nr=0x%x assrt=%i\n", irq_nr, assrt);
665    
666     if (assrt)
667 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START)
668 dpavlin 2 / 0x10] |= irq_nr;
669     else
670 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START)
671 dpavlin 2 / 0x10] &= ~irq_nr;
672    
673 dpavlin 6 if (m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10]
674     & m->md_int.dec_ioasic_data->reg[(IOASIC_IMSK - IOASIC_SLOT_1_START)
675 dpavlin 2 / 0x10])
676     cpu_interrupt(cpu, XINE_INT_TC3);
677     else
678     cpu_interrupt_ack(cpu, XINE_INT_TC3);
679     }
680    
681    
682     /*
683     * DECstation KN230 interrupts:
684     */
685     void kn230_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
686     {
687     int r2 = 0;
688    
689 dpavlin 6 m->md_int.kn230_csr->csr |= irq_nr;
690 dpavlin 2
691     switch (irq_nr) {
692     case KN230_CSR_INTR_SII:
693     case KN230_CSR_INTR_LANCE:
694     r2 = 3;
695     break;
696     case KN230_CSR_INTR_DZ0:
697     case KN230_CSR_INTR_OPT0:
698     case KN230_CSR_INTR_OPT1:
699     r2 = 2;
700     break;
701     default:
702     fatal("kn230_interrupt(): irq_nr = %i ?\n", irq_nr);
703     }
704    
705     if (assrt) {
706     /* OR in the irq_nr mask into the CSR: */
707 dpavlin 6 m->md_int.kn230_csr->csr |= irq_nr;
708 dpavlin 2
709     /* Assert MIPS interrupt 2 or 3: */
710     cpu_interrupt(cpu, r2);
711     } else {
712     /* AND out the irq_nr mask from the CSR: */
713 dpavlin 6 m->md_int.kn230_csr->csr &= ~irq_nr;
714 dpavlin 2
715     /* If the CSR interrupt bits are all zero,
716     clear the bit in the cause register as well. */
717     if (r2 == 2) {
718     /* irq 2: */
719 dpavlin 6 if ((m->md_int.kn230_csr->csr & (KN230_CSR_INTR_DZ0
720 dpavlin 2 | KN230_CSR_INTR_OPT0 | KN230_CSR_INTR_OPT1)) == 0)
721     cpu_interrupt_ack(cpu, r2);
722     } else {
723     /* irq 3: */
724 dpavlin 6 if ((m->md_int.kn230_csr->csr & (KN230_CSR_INTR_SII |
725 dpavlin 2 KN230_CSR_INTR_LANCE)) == 0)
726     cpu_interrupt_ack(cpu, r2);
727     }
728     }
729     }
730    
731    
732     /*
733     * Jazz interrupts (for Acer PICA-61 etc):
734     *
735     * 0..7 MIPS interrupts
736     * 8 + x, where x = 0..15 Jazz interrupts
737     * 8 + x, where x = 16..31 ISA interrupt (irq nr + 16)
738     */
739     void jazz_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
740     {
741     uint32_t irq;
742     int isa = 0;
743    
744     irq_nr -= 8;
745    
746     /* debug("jazz_interrupt() irq_nr = %i, assrt = %i\n",
747     irq_nr, assrt); */
748    
749     if (irq_nr >= 16) {
750     isa = 1;
751     irq_nr -= 16;
752     }
753    
754     irq = 1 << irq_nr;
755    
756     if (isa) {
757     if (assrt)
758 dpavlin 6 m->md_int.jazz_data->isa_int_asserted |= irq;
759 dpavlin 2 else
760 dpavlin 6 m->md_int.jazz_data->isa_int_asserted &= ~irq;
761 dpavlin 2 } else {
762     if (assrt)
763 dpavlin 6 m->md_int.jazz_data->int_asserted |= irq;
764 dpavlin 2 else
765 dpavlin 6 m->md_int.jazz_data->int_asserted &= ~irq;
766 dpavlin 2 }
767    
768 dpavlin 6 /* debug(" %08x %08x\n", m->md_int.jazz_data->int_asserted,
769     m->md_int.jazz_data->int_enable_mask); */
770     /* debug(" %08x %08x\n", m->md_int.jazz_data->isa_int_asserted,
771     m->md_int.jazz_data->isa_int_enable_mask); */
772 dpavlin 2
773 dpavlin 6 if (m->md_int.jazz_data->int_asserted
774     /* & m->md_int.jazz_data->int_enable_mask */ & ~0x8000 )
775 dpavlin 2 cpu_interrupt(cpu, 3);
776     else
777     cpu_interrupt_ack(cpu, 3);
778    
779 dpavlin 6 if (m->md_int.jazz_data->isa_int_asserted &
780     m->md_int.jazz_data->isa_int_enable_mask)
781 dpavlin 2 cpu_interrupt(cpu, 4);
782     else
783     cpu_interrupt_ack(cpu, 4);
784    
785     /* TODO: this "15" (0x8000) is the timer... fix this? */
786 dpavlin 6 if (m->md_int.jazz_data->int_asserted & 0x8000)
787 dpavlin 2 cpu_interrupt(cpu, 6);
788     else
789     cpu_interrupt_ack(cpu, 6);
790     }
791    
792    
793     /*
794     * VR41xx interrupt routine:
795     *
796     * irq_nr = 8 + x
797     * x = 0..15 for level1
798     * x = 16..31 for level2
799     * x = 32+y for GIU interrupt y
800     */
801     void vr41xx_interrupt(struct machine *m, struct cpu *cpu,
802     int irq_nr, int assrt)
803     {
804     int giu_irq = 0;
805    
806     irq_nr -= 8;
807     if (irq_nr >= 32) {
808     giu_irq = irq_nr - 32;
809    
810     if (assrt)
811 dpavlin 6 m->md_int.vr41xx_data->giuint |= (1 << giu_irq);
812 dpavlin 2 else
813 dpavlin 6 m->md_int.vr41xx_data->giuint &= ~(1 << giu_irq);
814 dpavlin 2 }
815    
816     /* TODO: This is wrong. What about GIU bit 8? */
817    
818     if (irq_nr != 8) {
819     /* If any GIU bit is asserted, then assert the main
820     GIU interrupt: */
821 dpavlin 6 if (m->md_int.vr41xx_data->giuint &
822     m->md_int.vr41xx_data->giumask)
823 dpavlin 2 vr41xx_interrupt(m, cpu, 8 + 8, 1);
824     else
825     vr41xx_interrupt(m, cpu, 8 + 8, 0);
826     }
827    
828     /* debug("vr41xx_interrupt(): irq_nr=%i assrt=%i\n",
829     irq_nr, assrt); */
830    
831     if (irq_nr < 16) {
832     if (assrt)
833 dpavlin 6 m->md_int.vr41xx_data->sysint1 |= (1 << irq_nr);
834 dpavlin 2 else
835 dpavlin 6 m->md_int.vr41xx_data->sysint1 &= ~(1 << irq_nr);
836 dpavlin 2 } else if (irq_nr < 32) {
837     irq_nr -= 16;
838     if (assrt)
839 dpavlin 6 m->md_int.vr41xx_data->sysint2 |= (1 << irq_nr);
840 dpavlin 2 else
841 dpavlin 6 m->md_int.vr41xx_data->sysint2 &= ~(1 << irq_nr);
842 dpavlin 2 }
843    
844     /* TODO: Which hardware interrupt pin? */
845    
846     /* debug(" sysint1=%04x mask=%04x, sysint2=%04x mask=%04x\n",
847 dpavlin 6 m->md_int.vr41xx_data->sysint1, m->md_int.vr41xx_data->msysint1,
848     m->md_int.vr41xx_data->sysint2, m->md_int.vr41xx_data->msysint2); */
849 dpavlin 2
850 dpavlin 6 if ((m->md_int.vr41xx_data->sysint1 & m->md_int.vr41xx_data->msysint1) |
851     (m->md_int.vr41xx_data->sysint2 & m->md_int.vr41xx_data->msysint2))
852 dpavlin 2 cpu_interrupt(cpu, 2);
853     else
854     cpu_interrupt_ack(cpu, 2);
855     }
856    
857    
858     /*
859     * Playstation 2 interrupt routine:
860 dpavlin 4 *
861     * irq_nr = 8 + x normal irq x
862     * 8 + 16 + y dma irq y
863     * 8 + 32 + 0 sbus irq 0 (pcmcia)
864     * 8 + 32 + 1 sbus irq 1 (usb)
865 dpavlin 2 */
866     void ps2_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
867     {
868     irq_nr -= 8;
869     debug("ps2_interrupt(): irq_nr=0x%x assrt=%i\n", irq_nr, assrt);
870    
871 dpavlin 4 if (irq_nr >= 32) {
872     int msk = 0;
873     switch (irq_nr - 32) {
874     case 0: /* PCMCIA: */
875     msk = 0x100;
876     break;
877     case 1: /* USB: */
878     msk = 0x400;
879     break;
880     default:
881     fatal("ps2_interrupt(): bad irq_nr %i\n", irq_nr);
882     }
883    
884     if (assrt)
885 dpavlin 6 m->md_int.ps2_data->sbus_smflg |= msk;
886 dpavlin 4 else
887 dpavlin 6 m->md_int.ps2_data->sbus_smflg &= ~msk;
888 dpavlin 4
889 dpavlin 6 if (m->md_int.ps2_data->sbus_smflg != 0)
890 dpavlin 4 cpu_interrupt(cpu, 8 + 1);
891     else
892     cpu_interrupt_ack(cpu, 8 + 1);
893     return;
894     }
895    
896 dpavlin 2 if (assrt) {
897     /* OR into the INTR: */
898 dpavlin 4 if (irq_nr < 16)
899 dpavlin 6 m->md_int.ps2_data->intr |= (1 << irq_nr);
900 dpavlin 2 else
901 dpavlin 6 m->md_int.ps2_data->dmac_reg[0x601] |=
902     (1 << (irq_nr-16));
903 dpavlin 2 } else {
904     /* AND out of the INTR: */
905 dpavlin 4 if (irq_nr < 16)
906 dpavlin 6 m->md_int.ps2_data->intr &= ~(1 << irq_nr);
907 dpavlin 2 else
908 dpavlin 6 m->md_int.ps2_data->dmac_reg[0x601] &=
909     ~(1 << (irq_nr-16));
910 dpavlin 4 }
911 dpavlin 2
912 dpavlin 4 /* TODO: Hm? How about the mask? */
913 dpavlin 6 if (m->md_int.ps2_data->intr /* & m->md_int.ps2_data->imask */ )
914 dpavlin 4 cpu_interrupt(cpu, 2);
915     else
916     cpu_interrupt_ack(cpu, 2);
917    
918     /* TODO: mask? */
919 dpavlin 6 if (m->md_int.ps2_data->dmac_reg[0x601] & 0xffff)
920 dpavlin 4 cpu_interrupt(cpu, 3);
921     else
922     cpu_interrupt_ack(cpu, 3);
923 dpavlin 2 }
924    
925    
926     /*
927     * SGI "IP22" interrupt routine:
928     */
929     void sgi_ip22_interrupt(struct machine *m, struct cpu *cpu,
930     int irq_nr, int assrt)
931     {
932     /*
933     * SGI-IP22 specific interrupt stuff:
934     *
935     * irq_nr should be 8 + x, where x = 0..31 for local0,
936     * and 32..63 for local1 interrupts.
937     * Add 64*y for "mappable" interrupts, where 1<<y is
938     * the mappable interrupt bitmask. TODO: this misses 64*0 !
939     */
940    
941     uint32_t newmask;
942     uint32_t stat, mask;
943    
944     irq_nr -= 8;
945     newmask = 1 << (irq_nr & 31);
946    
947     if (irq_nr >= 64) {
948     int ms = irq_nr / 64;
949     uint32_t new = 1 << ms;
950     if (assrt)
951 dpavlin 6 m->md_int.sgi_ip22_data->reg[4] |= new;
952 dpavlin 2 else
953 dpavlin 6 m->md_int.sgi_ip22_data->reg[4] &= ~new;
954 dpavlin 2 /* TODO: is this enough? */
955     irq_nr &= 63;
956     }
957    
958     if (irq_nr < 32) {
959     if (assrt)
960 dpavlin 6 m->md_int.sgi_ip22_data->reg[0] |= newmask;
961 dpavlin 2 else
962 dpavlin 6 m->md_int.sgi_ip22_data->reg[0] &= ~newmask;
963 dpavlin 2 } else {
964     if (assrt)
965 dpavlin 6 m->md_int.sgi_ip22_data->reg[2] |= newmask;
966 dpavlin 2 else
967 dpavlin 6 m->md_int.sgi_ip22_data->reg[2] &= ~newmask;
968 dpavlin 2 }
969    
970     /* Read stat and mask for local0: */
971 dpavlin 6 stat = m->md_int.sgi_ip22_data->reg[0];
972     mask = m->md_int.sgi_ip22_data->reg[1];
973 dpavlin 2 if ((stat & mask) == 0)
974     cpu_interrupt_ack(cpu, 2);
975     else
976     cpu_interrupt(cpu, 2);
977    
978     /* Read stat and mask for local1: */
979 dpavlin 6 stat = m->md_int.sgi_ip22_data->reg[2];
980     mask = m->md_int.sgi_ip22_data->reg[3];
981 dpavlin 2 if ((stat & mask) == 0)
982     cpu_interrupt_ack(cpu, 3);
983     else
984     cpu_interrupt(cpu, 3);
985     }
986    
987    
988     /*
989     * SGI "IP30" interrupt routine:
990     *
991     * irq_nr = 8 + 1 + nr, where nr is:
992     * 0..49 HEART irqs hardware irq 2,3,4
993     * 50 HEART timer hardware irq 5
994     * 51..63 HEART errors hardware irq 6
995     *
996     * according to Linux/IP30.
997     */
998     void sgi_ip30_interrupt(struct machine *m, struct cpu *cpu,
999     int irq_nr, int assrt)
1000     {
1001     uint64_t newmask;
1002     uint64_t stat, mask;
1003    
1004     irq_nr -= 8;
1005     if (irq_nr == 0)
1006     goto just_assert_and_such;
1007     irq_nr --;
1008    
1009     newmask = (int64_t)1 << irq_nr;
1010    
1011     if (assrt)
1012 dpavlin 6 m->md_int.sgi_ip30_data->isr |= newmask;
1013 dpavlin 2 else
1014 dpavlin 6 m->md_int.sgi_ip30_data->isr &= ~newmask;
1015 dpavlin 2
1016     just_assert_and_such:
1017    
1018     cpu_interrupt_ack(cpu, 2);
1019     cpu_interrupt_ack(cpu, 3);
1020     cpu_interrupt_ack(cpu, 4);
1021     cpu_interrupt_ack(cpu, 5);
1022     cpu_interrupt_ack(cpu, 6);
1023    
1024 dpavlin 6 stat = m->md_int.sgi_ip30_data->isr;
1025     mask = m->md_int.sgi_ip30_data->imask0;
1026 dpavlin 2
1027     if ((stat & mask) & 0x000000000000ffffULL)
1028     cpu_interrupt(cpu, 2);
1029     if ((stat & mask) & 0x00000000ffff0000ULL)
1030     cpu_interrupt(cpu, 3);
1031     if ((stat & mask) & 0x0003ffff00000000ULL)
1032     cpu_interrupt(cpu, 4);
1033     if ((stat & mask) & 0x0004000000000000ULL)
1034     cpu_interrupt(cpu, 5);
1035     if ((stat & mask) & 0xfff8000000000000ULL)
1036     cpu_interrupt(cpu, 6);
1037     }
1038    
1039    
1040     /*
1041     * SGI "IP32" interrupt routine:
1042     */
1043     void sgi_ip32_interrupt(struct machine *m, struct cpu *cpu,
1044     int irq_nr, int assrt)
1045     {
1046     /*
1047     * The 64-bit word at crime offset 0x10 is CRIME_INTSTAT,
1048     * which contains the current interrupt bits. CRIME_INTMASK
1049     * contains a mask of which bits are actually in use.
1050     *
1051     * crime hardcoded at 0x14000000, for SGI-IP32.
1052     * If any of these bits are asserted, then physical MIPS
1053     * interrupt 2 should be asserted.
1054     *
1055     * TODO: how should all this be done nicely?
1056     *
1057     * TODO: mace interrupt mask
1058     */
1059    
1060     uint64_t crime_addr = CRIME_INTSTAT;
1061     uint64_t mace_addr = 0x14;
1062     uint64_t crime_interrupts, crime_interrupts_mask, mace_interrupts;
1063     unsigned int i;
1064     unsigned char x[8];
1065    
1066     /*
1067     * This mapping of both MACE and CRIME interrupts into the same
1068     * 'int' is really ugly.
1069     *
1070     * If MACE_PERIPH_MISC or MACE_PERIPH_SERIAL is set, then mask
1071     * that bit out and treat the rest of the word as the mace interrupt
1072     * bitmask.
1073     *
1074     * TODO: fix.
1075     */
1076     if (irq_nr & MACE_PERIPH_SERIAL) {
1077     /* Read current MACE interrupt bits: */
1078 dpavlin 6 memcpy(x, m->md_int.ip32.mace_data->reg + mace_addr, sizeof(uint32_t));
1079 dpavlin 2 mace_interrupts = 0;
1080     for (i=0; i<sizeof(uint32_t); i++) {
1081     /* SGI is big-endian... */
1082     mace_interrupts <<= 8;
1083     mace_interrupts |= x[i];
1084     }
1085    
1086     if (assrt)
1087     mace_interrupts |= (irq_nr & ~MACE_PERIPH_SERIAL);
1088     else
1089     mace_interrupts &= ~(irq_nr & ~MACE_PERIPH_SERIAL);
1090    
1091     /* Write back MACE interrupt bits: */
1092     for (i=0; i<4; i++)
1093     x[3-i] = mace_interrupts >> (i*8);
1094 dpavlin 6 memcpy(m->md_int.ip32.mace_data->reg + mace_addr, x, sizeof(uint32_t));
1095 dpavlin 2
1096     irq_nr = MACE_PERIPH_SERIAL;
1097     if (mace_interrupts == 0)
1098     assrt = 0;
1099     else
1100     assrt = 1;
1101     }
1102    
1103     /* Hopefully _MISC and _SERIAL will not be both on at the same time. */
1104     if (irq_nr & MACE_PERIPH_MISC) {
1105     /* Read current MACE interrupt bits: */
1106 dpavlin 6 memcpy(x, m->md_int.ip32.mace_data->reg + mace_addr, sizeof(uint32_t));
1107 dpavlin 2 mace_interrupts = 0;
1108     for (i=0; i<sizeof(uint32_t); i++) {
1109     /* SGI is big-endian... */
1110     mace_interrupts <<= 8;
1111     mace_interrupts |= x[i];
1112     }
1113    
1114     if (assrt)
1115     mace_interrupts |= (irq_nr & ~MACE_PERIPH_MISC);
1116     else
1117     mace_interrupts &= ~(irq_nr & ~MACE_PERIPH_MISC);
1118    
1119     /* Write back MACE interrupt bits: */
1120     for (i=0; i<4; i++)
1121     x[3-i] = mace_interrupts >> (i*8);
1122 dpavlin 6 memcpy(m->md_int.ip32.mace_data->reg + mace_addr, x, sizeof(uint32_t));
1123 dpavlin 2
1124     irq_nr = MACE_PERIPH_MISC;
1125     if (mace_interrupts == 0)
1126     assrt = 0;
1127     else
1128     assrt = 1;
1129     }
1130    
1131     /* Read CRIME_INTSTAT: */
1132 dpavlin 6 memcpy(x, m->md_int.ip32.crime_data->reg + crime_addr, sizeof(uint64_t));
1133 dpavlin 2 crime_interrupts = 0;
1134     for (i=0; i<8; i++) {
1135     /* SGI is big-endian... */
1136     crime_interrupts <<= 8;
1137     crime_interrupts |= x[i];
1138     }
1139    
1140     if (assrt)
1141     crime_interrupts |= irq_nr;
1142     else
1143     crime_interrupts &= ~irq_nr;
1144    
1145     /* Write back CRIME_INTSTAT: */
1146     for (i=0; i<8; i++)
1147     x[7-i] = crime_interrupts >> (i*8);
1148 dpavlin 6 memcpy(m->md_int.ip32.crime_data->reg + crime_addr, x, sizeof(uint64_t));
1149 dpavlin 2
1150     /* Read CRIME_INTMASK: */
1151 dpavlin 6 memcpy(x, m->md_int.ip32.crime_data->reg + CRIME_INTMASK, sizeof(uint64_t));
1152 dpavlin 2 crime_interrupts_mask = 0;
1153     for (i=0; i<8; i++) {
1154     crime_interrupts_mask <<= 8;
1155     crime_interrupts_mask |= x[i];
1156     }
1157    
1158     if ((crime_interrupts & crime_interrupts_mask) == 0)
1159     cpu_interrupt_ack(cpu, 2);
1160     else
1161     cpu_interrupt(cpu, 2);
1162    
1163     /* printf("sgi_crime_machine_irq(%i,%i): new interrupts = 0x%08x\n", assrt, irq_nr, crime_interrupts); */
1164     }
1165    
1166    
1167     /*
1168     * Au1x00 interrupt routine:
1169     *
1170     * TODO: This is just bogus so far. For more info, read this:
1171     * http://www.meshcube.org/cgi-bin/viewcvs.cgi/kernel/linux/arch/mips/au1000/common/
1172     *
1173     * CPU int 2 = IC 0, request 0
1174     * CPU int 3 = IC 0, request 1
1175     * CPU int 4 = IC 1, request 0
1176     * CPU int 5 = IC 1, request 1
1177     *
1178     * Interrupts 0..31 are on interrupt controller 0, interrupts 32..63 are
1179     * on controller 1.
1180     *
1181     * Special case: if irq_nr == 64+8, then this just updates the CPU
1182     * interrupt assertions.
1183     */
1184     void au1x00_interrupt(struct machine *m, struct cpu *cpu,
1185     int irq_nr, int assrt)
1186     {
1187     uint32_t ms;
1188    
1189     irq_nr -= 8;
1190     debug("au1x00_interrupt(): irq_nr=%i assrt=%i\n", irq_nr, assrt);
1191    
1192     if (irq_nr < 64) {
1193     ms = 1 << (irq_nr & 31);
1194    
1195     if (assrt)
1196 dpavlin 6 m->md_int.au1x00_ic_data->request0_int |= ms;
1197 dpavlin 2 else
1198 dpavlin 6 m->md_int.au1x00_ic_data->request0_int &= ~ms;
1199 dpavlin 2
1200     /* TODO: Controller 1 */
1201     }
1202    
1203 dpavlin 6 if ((m->md_int.au1x00_ic_data->request0_int &
1204     m->md_int.au1x00_ic_data->mask) != 0)
1205 dpavlin 2 cpu_interrupt(cpu, 2);
1206     else
1207     cpu_interrupt_ack(cpu, 2);
1208    
1209     /* TODO: What _is_ request1? */
1210    
1211     /* TODO: Controller 1 */
1212     }
1213    
1214    
1215 dpavlin 6 /*
1216     * x86 (PC) interrupts:
1217     *
1218     * (irq_nr = 16 can be used to just reassert/deassert interrupts.)
1219     */
1220     void x86_pc_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
1221     {
1222     int mask = 1 << (irq_nr & 7);
1223    
1224     if (irq_nr < 8) {
1225     if (assrt)
1226     m->md.pc.pic1->irr |= mask;
1227     else
1228     m->md.pc.pic1->irr &= ~mask;
1229     } else if (irq_nr < 16) {
1230     if (m->md.pc.pic2 == NULL) {
1231     fatal("x86_pc_interrupt(): pic2 used (irq_nr = %i), "
1232     "but we are emulating an XT?\n", irq_nr);
1233     return;
1234     }
1235     if (assrt)
1236     m->md.pc.pic2->irr |= mask;
1237     else
1238     m->md.pc.pic2->irr &= ~mask;
1239     }
1240    
1241     if (m->md.pc.pic2 != NULL) {
1242     /* Any interrupt assertions on PIC2 go to irq 2 on PIC1 */
1243     /* (TODO: don't hardcode this here) */
1244     if (m->md.pc.pic2->irr & ~m->md.pc.pic2->ier)
1245     m->md.pc.pic1->irr |= 0x04;
1246     else
1247     m->md.pc.pic1->irr &= ~0x04;
1248     }
1249    
1250     /* Now, PIC1: */
1251     if (m->md.pc.pic1->irr & ~m->md.pc.pic1->ier)
1252     cpu->cd.x86.interrupt_asserted = 1;
1253     else
1254     cpu->cd.x86.interrupt_asserted = 0;
1255     }
1256    
1257    
1258 dpavlin 2 /****************************************************************************
1259     * *
1260     * Machine dependant Initialization routines *
1261     * *
1262     ****************************************************************************/
1263    
1264    
1265     /*
1266     * machine_setup():
1267     *
1268     * This (rather large) function initializes memory, registers, and/or devices
1269     * required by specific machine emulations.
1270     */
1271     void machine_setup(struct machine *machine)
1272     {
1273     uint64_t addr, addr2;
1274     int i, j;
1275     struct memory *mem;
1276     char tmpstr[1000];
1277    
1278     /* DECstation: */
1279     char *framebuffer_console_name, *serial_console_name;
1280     int color_fb_flag;
1281     int boot_scsi_boardnumber = 3, boot_net_boardnumber = 3;
1282     char *turbochannel_default_gfx_card = "PMAG-BA";
1283     /* PMAG-AA, -BA, -CA/DA/EA/FA, -JA, -RO, PMAGB-BA */
1284    
1285     /* HPCmips: */
1286     struct xx {
1287     struct btinfo_magic a;
1288     struct btinfo_bootpath b;
1289     struct btinfo_symtab c;
1290     } xx;
1291     struct hpc_bootinfo hpc_bootinfo;
1292     uint64_t hpcmips_fb_addr = 0;
1293     int hpcmips_fb_bits = 0, hpcmips_fb_encoding = 0;
1294     int hpcmips_fb_xsize = 0;
1295     int hpcmips_fb_ysize = 0;
1296     int hpcmips_fb_xsize_mem = 0;
1297     int hpcmips_fb_ysize_mem = 0;
1298    
1299     /* ARCBIOS stuff: */
1300     uint64_t sgi_ram_offset = 0;
1301     int arc_wordlen = sizeof(uint32_t);
1302     char *eaddr_string = "eaddr=10:20:30:40:50:60"; /* nonsense */
1303     unsigned char macaddr[6];
1304    
1305     /* Generic bootstring stuff: */
1306 dpavlin 6 int bootdev_type = 0;
1307     int bootdev_id;
1308 dpavlin 2 char *bootstr = NULL;
1309     char *bootarg = NULL;
1310     char *init_bootpath;
1311    
1312     /* PCI stuff: */
1313     struct pci_data *pci_data;
1314    
1315     /* Framebuffer stuff: */
1316     struct vfb_data *fb;
1317    
1318     /* Abreviation: :-) */
1319     struct cpu *cpu = machine->cpus[machine->bootstrap_cpu];
1320    
1321    
1322 dpavlin 6 bootdev_id = diskimage_bootdev(machine, &bootdev_type);
1323    
1324 dpavlin 2 mem = cpu->mem;
1325     machine->machine_name = NULL;
1326    
1327     /* TODO: Move this somewhere else? */
1328     if (machine->boot_string_argument == NULL) {
1329     switch (machine->machine_type) {
1330     case MACHINE_ARC:
1331     machine->boot_string_argument = "-aN";
1332     break;
1333     case MACHINE_DEC:
1334     machine->boot_string_argument = "-a";
1335     break;
1336     default:
1337     /* Important, because boot_string_argument should
1338     not be set to NULL: */
1339     machine->boot_string_argument = "";
1340     }
1341     }
1342    
1343     switch (machine->machine_type) {
1344    
1345     case MACHINE_NONE:
1346     printf("\nNo emulation type specified.\n");
1347     exit(1);
1348    
1349     case MACHINE_BAREMIPS:
1350     /*
1351     * A "bare" MIPS test machine.
1352     *
1353     * NOTE: NO devices at all.
1354     */
1355     cpu->byte_order = EMUL_BIG_ENDIAN;
1356     machine->machine_name = "\"Bare\" MIPS machine";
1357     break;
1358    
1359     case MACHINE_TESTMIPS:
1360     /*
1361     * A MIPS test machine (which happens to work with my
1362     * thesis work).
1363     */
1364     cpu->byte_order = EMUL_BIG_ENDIAN;
1365     machine->machine_name = "MIPS test machine";
1366    
1367     machine->main_console_handle = dev_cons_init(
1368     machine, mem, DEV_CONS_ADDRESS, "console", 2);
1369    
1370     snprintf(tmpstr, sizeof(tmpstr) - 1, "mp addr=0x%llx",
1371     (long long)DEV_MP_ADDRESS);
1372     device_add(machine, tmpstr);
1373    
1374     fb = dev_fb_init(machine, mem, 0x12000000, VFB_GENERIC,
1375     640,480, 640,480, 24, "generic", 1);
1376     break;
1377    
1378     case MACHINE_DEC:
1379     cpu->byte_order = EMUL_LITTLE_ENDIAN;
1380    
1381     /* An R2020 or R3220 memory thingy: */
1382     cpu->cd.mips.coproc[3] = mips_coproc_new(cpu, 3);
1383    
1384     /* There aren't really any good standard values... */
1385     framebuffer_console_name = "osconsole=0,3";
1386     serial_console_name = "osconsole=1";
1387    
1388     switch (machine->machine_subtype) {
1389     case MACHINE_DEC_PMAX_3100: /* type 1, KN01 */
1390     /* Supposed to have 12MHz or 16.67MHz R2000 CPU, R2010 FPC, R2020 Memory coprocessor */
1391     machine->machine_name = "DEC PMAX 3100 (KN01)";
1392    
1393     /* 12 MHz for 2100, 16.67 MHz for 3100 */
1394     if (machine->emulated_hz == 0)
1395     machine->emulated_hz = 16670000;
1396    
1397     if (machine->physical_ram_in_mb > 24)
1398     fprintf(stderr, "WARNING! Real DECstation 3100 machines cannot have more than 24MB RAM. Continuing anyway.\n");
1399    
1400     if ((machine->physical_ram_in_mb % 4) != 0)
1401     fprintf(stderr, "WARNING! Real DECstation 3100 machines have an integer multiple of 4 MBs of RAM. Continuing anyway.\n");
1402    
1403     color_fb_flag = 1; /* 1 for color, 0 for mono. TODO: command line option? */
1404    
1405     /*
1406     * According to NetBSD/pmax:
1407     *
1408     * pm0 at ibus0 addr 0xfc00000: 1024x864x1 (or x8 for color)
1409     * dc0 at ibus0 addr 0x1c000000
1410     * le0 at ibus0 addr 0x18000000: address 00:00:00:00:00:00
1411     * sii0 at ibus0 addr 0x1a000000
1412     * mcclock0 at ibus0 addr 0x1d000000: mc146818 or compatible
1413     * 0x1e000000 = system status and control register
1414     */
1415     fb = dev_fb_init(machine, mem, KN01_PHYS_FBUF_START,
1416     color_fb_flag? VFB_DEC_VFB02 : VFB_DEC_VFB01,
1417     0,0,0,0,0, color_fb_flag? "VFB02":"VFB01", 1);
1418     dev_colorplanemask_init(mem, KN01_PHYS_COLMASK_START, &fb->color_plane_mask);
1419     dev_vdac_init(mem, KN01_SYS_VDAC, fb->rgb_palette, color_fb_flag);
1420     dev_le_init(machine, mem, KN01_SYS_LANCE, KN01_SYS_LANCE_B_START, KN01_SYS_LANCE_B_END, KN01_INT_LANCE, 4*1048576);
1421     dev_sii_init(machine, mem, KN01_SYS_SII, KN01_SYS_SII_B_START, KN01_SYS_SII_B_END, KN01_INT_SII);
1422     dev_dc7085_init(machine, mem, KN01_SYS_DZ, KN01_INT_DZ, machine->use_x11);
1423     dev_mc146818_init(machine, mem, KN01_SYS_CLOCK, KN01_INT_CLOCK, MC146818_DEC, 1);
1424     dev_kn01_csr_init(mem, KN01_SYS_CSR, color_fb_flag);
1425    
1426     framebuffer_console_name = "osconsole=0,3"; /* fb,keyb */
1427     serial_console_name = "osconsole=3"; /* 3 */
1428     break;
1429    
1430     case MACHINE_DEC_3MAX_5000: /* type 2, KN02 */
1431     /* Supposed to have 25MHz R3000 CPU, R3010 FPC, */
1432     /* and a R3220 Memory coprocessor */
1433     machine->machine_name = "DECstation 5000/200 (3MAX, KN02)";
1434    
1435     if (machine->emulated_hz == 0)
1436     machine->emulated_hz = 25000000;
1437    
1438     if (machine->physical_ram_in_mb < 8)
1439     fprintf(stderr, "WARNING! Real KN02 machines do not have less than 8MB RAM. Continuing anyway.\n");
1440     if (machine->physical_ram_in_mb > 480)
1441     fprintf(stderr, "WARNING! Real KN02 machines cannot have more than 480MB RAM. Continuing anyway.\n");
1442    
1443     /* An R3220 memory thingy: */
1444     cpu->cd.mips.coproc[3] = mips_coproc_new(cpu, 3);
1445    
1446     /*
1447     * According to NetBSD/pmax:
1448     * asc0 at tc0 slot 5 offset 0x0
1449     * le0 at tc0 slot 6 offset 0x0
1450     * ibus0 at tc0 slot 7 offset 0x0
1451     * dc0 at ibus0 addr 0x1fe00000
1452     * mcclock0 at ibus0 addr 0x1fe80000: mc146818
1453     *
1454     * kn02 shared irq numbers (IP) are offset by +8
1455     * in the emulator
1456     */
1457    
1458     /* KN02 interrupts: */
1459     machine->md_interrupt = kn02_interrupt;
1460    
1461     /*
1462     * TURBOchannel slots 0, 1, and 2 are free for
1463     * option cards. Let's put in zero or more graphics
1464     * boards:
1465     *
1466     * TODO: It's also possible to have larger graphics
1467     * cards that occupy several slots. How to solve
1468     * this nicely?
1469     */
1470     dev_turbochannel_init(machine, mem, 0,
1471     KN02_PHYS_TC_0_START, KN02_PHYS_TC_0_END,
1472     machine->n_gfx_cards >= 1?
1473     turbochannel_default_gfx_card : "",
1474     KN02_IP_SLOT0 +8);
1475    
1476     dev_turbochannel_init(machine, mem, 1,
1477     KN02_PHYS_TC_1_START, KN02_PHYS_TC_1_END,
1478     machine->n_gfx_cards >= 2?
1479     turbochannel_default_gfx_card : "",
1480     KN02_IP_SLOT1 +8);
1481    
1482     dev_turbochannel_init(machine, mem, 2,
1483     KN02_PHYS_TC_2_START, KN02_PHYS_TC_2_END,
1484     machine->n_gfx_cards >= 3?
1485     turbochannel_default_gfx_card : "",
1486     KN02_IP_SLOT2 +8);
1487    
1488     /* TURBOchannel slots 3 and 4 are reserved. */
1489    
1490     /* TURBOchannel slot 5 is PMAZ-AA ("asc" SCSI). */
1491     dev_turbochannel_init(machine, mem, 5,
1492     KN02_PHYS_TC_5_START, KN02_PHYS_TC_5_END,
1493     "PMAZ-AA", KN02_IP_SCSI +8);
1494    
1495     /* TURBOchannel slot 6 is PMAD-AA ("le" ethernet). */
1496     dev_turbochannel_init(machine, mem, 6,
1497     KN02_PHYS_TC_6_START, KN02_PHYS_TC_6_END,
1498     "PMAD-AA", KN02_IP_LANCE +8);
1499    
1500     /* TURBOchannel slot 7 is system stuff. */
1501     machine->main_console_handle =
1502     dev_dc7085_init(machine, mem,
1503     KN02_SYS_DZ, KN02_IP_DZ +8, machine->use_x11);
1504     dev_mc146818_init(machine, mem,
1505     KN02_SYS_CLOCK, KN02_INT_CLOCK, MC146818_DEC, 1);
1506    
1507 dpavlin 6 machine->md_int.kn02_csr =
1508 dpavlin 2 dev_kn02_init(cpu, mem, KN02_SYS_CSR);
1509    
1510     framebuffer_console_name = "osconsole=0,7";
1511     /* fb,keyb */
1512     serial_console_name = "osconsole=2";
1513     boot_scsi_boardnumber = 5;
1514     boot_net_boardnumber = 6; /* TODO: 3? */
1515     break;
1516    
1517     case MACHINE_DEC_3MIN_5000: /* type 3, KN02BA */
1518     machine->machine_name = "DECstation 5000/112 or 145 (3MIN, KN02BA)";
1519     if (machine->emulated_hz == 0)
1520     machine->emulated_hz = 33000000;
1521     if (machine->physical_ram_in_mb > 128)
1522     fprintf(stderr, "WARNING! Real 3MIN machines cannot have more than 128MB RAM. Continuing anyway.\n");
1523    
1524     /* KMIN interrupts: */
1525     machine->md_interrupt = kmin_interrupt;
1526    
1527     /*
1528     * tc0 at mainbus0: 12.5 MHz clock (0x10000000, slotsize = 64MB)
1529     * tc slot 1: 0x14000000
1530     * tc slot 2: 0x18000000
1531     * ioasic0 at tc0 slot 3 offset 0x0 (0x1c000000) slot 0
1532     * asic regs (0x1c040000) slot 1
1533     * station's ether address (0x1c080000) slot 2
1534     * le0 at ioasic0 offset 0xc0000: address 00:00:00:00:00:00 (0x1c0c0000) slot 3
1535     * scc0 at ioasic0 offset 0x100000 (0x1c100000) slot 4
1536     * scc1 at ioasic0 offset 0x180000: console (0x1c180000) slot 6
1537     * mcclock0 at ioasic0 offset 0x200000: mc146818 or compatible (0x1c200000) slot 8
1538     * asc0 at ioasic0 offset 0x300000: NCR53C94, 25MHz, SCSI ID 7 (0x1c300000) slot 12
1539     * dma for asc0 (0x1c380000) slot 14
1540     */
1541 dpavlin 6 machine->md_int.dec_ioasic_data = dev_dec_ioasic_init(cpu, mem, 0x1c000000, 0);
1542 dpavlin 2 dev_le_init(machine, mem, 0x1c0c0000, 0, 0, KMIN_INTR_LANCE +8, 4*65536);
1543     dev_scc_init(machine, mem, 0x1c100000, KMIN_INTR_SCC_0 +8, machine->use_x11, 0, 1);
1544     dev_scc_init(machine, mem, 0x1c180000, KMIN_INTR_SCC_1 +8, machine->use_x11, 1, 1);
1545     dev_mc146818_init(machine, mem, 0x1c200000, KMIN_INTR_CLOCK +8, MC146818_DEC, 1);
1546     dev_asc_init(machine, mem, 0x1c300000, KMIN_INTR_SCSI +8,
1547     NULL, DEV_ASC_DEC, NULL, NULL);
1548    
1549     /*
1550     * TURBOchannel slots 0, 1, and 2 are free for
1551     * option cards. These are by default filled with
1552     * zero or more graphics boards.
1553     *
1554     * TODO: irqs
1555     */
1556     dev_turbochannel_init(machine, mem, 0,
1557     0x10000000, 0x103fffff,
1558     machine->n_gfx_cards >= 1?
1559     turbochannel_default_gfx_card : "",
1560     KMIN_INT_TC0);
1561    
1562     dev_turbochannel_init(machine, mem, 1,
1563     0x14000000, 0x143fffff,
1564     machine->n_gfx_cards >= 2?
1565     turbochannel_default_gfx_card : "",
1566     KMIN_INT_TC1);
1567    
1568     dev_turbochannel_init(machine, mem, 2,
1569     0x18000000, 0x183fffff,
1570     machine->n_gfx_cards >= 3?
1571     turbochannel_default_gfx_card : "",
1572     KMIN_INT_TC2);
1573    
1574     /* (kmin shared irq numbers (IP) are offset by +8 in the emulator) */
1575     /* kmin_csr = dev_kmin_init(cpu, mem, KMIN_REG_INTR); */
1576    
1577     framebuffer_console_name = "osconsole=0,3"; /* fb, keyb (?) */
1578     serial_console_name = "osconsole=3"; /* ? */
1579     break;
1580    
1581     case MACHINE_DEC_3MAXPLUS_5000: /* type 4, KN03 */
1582     machine->machine_name = "DECsystem 5900 or 5000 (3MAX+) (KN03)";
1583    
1584     /* 5000/240 (KN03-GA, R3000): 40 MHz */
1585     /* 5000/260 (KN05-NB, R4000): 60 MHz */
1586     /* TODO: are both these type 4? */
1587     if (machine->emulated_hz == 0)
1588     machine->emulated_hz = 40000000;
1589     if (machine->physical_ram_in_mb > 480)
1590     fprintf(stderr, "WARNING! Real KN03 machines cannot have more than 480MB RAM. Continuing anyway.\n");
1591    
1592     /* KN03 interrupts: */
1593     machine->md_interrupt = kn03_interrupt;
1594    
1595     /*
1596     * tc0 at mainbus0: 25 MHz clock (slot 0) (0x1e000000)
1597     * tc0 slot 1 (0x1e800000)
1598     * tc0 slot 2 (0x1f000000)
1599     * ioasic0 at tc0 slot 3 offset 0x0 (0x1f800000)
1600     * something that has to do with interrupts? (?) (0x1f840000 ?)
1601     * le0 at ioasic0 offset 0xc0000 (0x1f8c0000)
1602     * scc0 at ioasic0 offset 0x100000 (0x1f900000)
1603     * scc1 at ioasic0 offset 0x180000: console (0x1f980000)
1604     * mcclock0 at ioasic0 offset 0x200000: mc146818 or compatible (0x1fa00000)
1605     * asc0 at ioasic0 offset 0x300000: NCR53C94, 25MHz, SCSI ID 7 (0x1fb00000)
1606     */
1607 dpavlin 6 machine->md_int.dec_ioasic_data = dev_dec_ioasic_init(cpu, mem, 0x1f800000, 0);
1608 dpavlin 2
1609     dev_le_init(machine, mem, KN03_SYS_LANCE, 0, 0, KN03_INTR_LANCE +8, 4*65536);
1610    
1611 dpavlin 6 machine->md_int.dec_ioasic_data->dma_func[3] = dev_scc_dma_func;
1612     machine->md_int.dec_ioasic_data->dma_func_extra[2] = dev_scc_init(machine, mem, KN03_SYS_SCC_0, KN03_INTR_SCC_0 +8, machine->use_x11, 0, 1);
1613     machine->md_int.dec_ioasic_data->dma_func[2] = dev_scc_dma_func;
1614     machine->md_int.dec_ioasic_data->dma_func_extra[3] = dev_scc_init(machine, mem, KN03_SYS_SCC_1, KN03_INTR_SCC_1 +8, machine->use_x11, 1, 1);
1615 dpavlin 2
1616     dev_mc146818_init(machine, mem, KN03_SYS_CLOCK, KN03_INT_RTC, MC146818_DEC, 1);
1617     dev_asc_init(machine, mem, KN03_SYS_SCSI,
1618     KN03_INTR_SCSI +8, NULL, DEV_ASC_DEC, NULL, NULL);
1619    
1620     /*
1621     * TURBOchannel slots 0, 1, and 2 are free for
1622     * option cards. These are by default filled with
1623     * zero or more graphics boards.
1624     *
1625     * TODO: irqs
1626     */
1627     dev_turbochannel_init(machine, mem, 0,
1628     KN03_PHYS_TC_0_START, KN03_PHYS_TC_0_END,
1629     machine->n_gfx_cards >= 1?
1630     turbochannel_default_gfx_card : "",
1631     KN03_INTR_TC_0 +8);
1632    
1633     dev_turbochannel_init(machine, mem, 1,
1634     KN03_PHYS_TC_1_START, KN03_PHYS_TC_1_END,
1635     machine->n_gfx_cards >= 2?
1636     turbochannel_default_gfx_card : "",
1637     KN03_INTR_TC_1 +8);
1638    
1639     dev_turbochannel_init(machine, mem, 2,
1640     KN03_PHYS_TC_2_START, KN03_PHYS_TC_2_END,
1641     machine->n_gfx_cards >= 3?
1642     turbochannel_default_gfx_card : "",
1643     KN03_INTR_TC_2 +8);
1644    
1645     /* TODO: interrupts */
1646     /* shared (turbochannel) interrupts are +8 */
1647    
1648     framebuffer_console_name = "osconsole=0,3"; /* fb, keyb (?) */
1649     serial_console_name = "osconsole=3"; /* ? */
1650     break;
1651    
1652     case MACHINE_DEC_5800: /* type 5, KN5800 */
1653     machine->machine_name = "DECsystem 5800";
1654    
1655     /* TODO: this is incorrect, banks multiply by 8 etc */
1656     if (machine->physical_ram_in_mb < 48)
1657     fprintf(stderr, "WARNING! 5800 will probably not run with less than 48MB RAM. Continuing anyway.\n");
1658    
1659     /*
1660     * According to http://www2.no.netbsd.org/Ports/pmax/models.html,
1661     * the 5800-series is based on VAX 6000/300.
1662     */
1663    
1664     /*
1665     * Ultrix might support SMP on this machine type.
1666     *
1667     * Something at 0x10000000.
1668     * ssc serial console at 0x10140000, interrupt 2 (shared with XMI?).
1669     * xmi 0 at address 0x11800000 (node x at offset x*0x80000)
1670     * Clock uses interrupt 3 (shared with XMI?).
1671     */
1672    
1673 dpavlin 6 machine->md_int.dec5800_csr = dev_dec5800_init(machine, mem, 0x10000000);
1674 dpavlin 2 dev_decbi_init(mem, 0x10000000);
1675 dpavlin 6 dev_ssc_init(machine, mem, 0x10140000, 2, machine->use_x11, &machine->md_int.dec5800_csr->csr);
1676 dpavlin 2 dev_decxmi_init(mem, 0x11800000);
1677     dev_deccca_init(mem, DEC_DECCCA_BASEADDR);
1678    
1679     break;
1680    
1681     case MACHINE_DEC_5400: /* type 6, KN210 */
1682     machine->machine_name = "DECsystem 5400 (KN210)";
1683     /*
1684     * Misc. info from the KN210 manual:
1685     *
1686     * Interrupt lines:
1687     * irq5 fpu
1688     * irq4 halt
1689     * irq3 pwrfl -> mer1 -> mer0 -> wear
1690     * irq2 100 Hz -> birq7
1691     * irq1 dssi -> ni -> birq6
1692     * irq0 birq5 -> console -> timers -> birq4
1693     *
1694     * Interrupt status register at 0x10048000.
1695     * Main memory error status register at 0x1008140.
1696     * Interval Timer Register (ITR) at 0x10084010.
1697     * Q22 stuff at 0x10088000 - 0x1008ffff.
1698     * TODR at 0x1014006c.
1699     * TCR0 (timer control register 0) 0x10140100.
1700     * TIR0 (timer interval register 0) 0x10140104.
1701     * TCR1 (timer control register 1) 0x10140110.
1702     * TIR1 (timer interval register 1) 0x10140114.
1703     * VRR0 (Vector Read Register 0) at 0x16000050.
1704     * VRR1 (Vector Read Register 1) at 0x16000054.
1705     * VRR2 (Vector Read Register 2) at 0x16000058.
1706     * VRR3 (Vector Read Register 3) at 0x1600005c.
1707     */
1708     /* ln (ethernet) at 0x10084x00 ? and 0x10120000 ? */
1709     /* error registers (?) at 0x17000000 and 0x10080000 */
1710     device_add(machine, "kn210 addr=0x10080000");
1711     dev_ssc_init(machine, mem, 0x10140000, 0, machine->use_x11, NULL); /* TODO: not irq 0 */
1712     break;
1713    
1714     case MACHINE_DEC_MAXINE_5000: /* type 7, KN02CA */
1715     machine->machine_name = "Personal DECstation 5000/xxx (MAXINE) (KN02CA)";
1716     if (machine->emulated_hz == 0)
1717     machine->emulated_hz = 33000000;
1718    
1719     if (machine->physical_ram_in_mb < 8)
1720     fprintf(stderr, "WARNING! Real KN02CA machines do not have less than 8MB RAM. Continuing anyway.\n");
1721     if (machine->physical_ram_in_mb > 40)
1722     fprintf(stderr, "WARNING! Real KN02CA machines cannot have more than 40MB RAM. Continuing anyway.\n");
1723    
1724     /* Maxine interrupts: */
1725     machine->md_interrupt = maxine_interrupt;
1726    
1727     /*
1728     * Something at address 0xca00000. (?)
1729     * Something at address 0xe000000. (?)
1730     * tc0 slot 0 (0x10000000)
1731     * tc0 slot 1 (0x14000000)
1732     * (tc0 slot 2 used by the framebuffer)
1733     * ioasic0 at tc0 slot 3 offset 0x0 (0x1c000000)
1734     * le0 at ioasic0 offset 0xc0000: address 00:00:00:00:00:00 (0x1c0c0000)
1735     * scc0 at ioasic0 offset 0x100000: console <-- serial (0x1c100000)
1736     * mcclock0 at ioasic0 offset 0x200000: mc146818 (0x1c200000)
1737     * isdn at ioasic0 offset 0x240000 not configured (0x1c240000)
1738     * bba0 at ioasic0 offset 0x240000 (audio0 at bba0) <--- which one of isdn and bba0?
1739     * dtop0 at ioasic0 offset 0x280000 (0x1c280000)
1740     * fdc at ioasic0 offset 0x2c0000 not configured <-- floppy (0x1c2c0000)
1741     * asc0 at ioasic0 offset 0x300000: NCR53C94, 25MHz, SCSI ID 7 (0x1c300000)
1742     * xcfb0 at tc0 slot 2 offset 0x0: 1024x768x8 built-in framebuffer (0xa000000)
1743     */
1744 dpavlin 6 machine->md_int.dec_ioasic_data = dev_dec_ioasic_init(cpu, mem, 0x1c000000, 0);
1745 dpavlin 2
1746     /* TURBOchannel slots (0 and 1): */
1747     dev_turbochannel_init(machine, mem, 0,
1748     0x10000000, 0x103fffff,
1749     machine->n_gfx_cards >= 2?
1750     turbochannel_default_gfx_card : "",
1751     XINE_INTR_TC_0 +8);
1752     dev_turbochannel_init(machine, mem, 1,
1753     0x14000000, 0x143fffff,
1754     machine->n_gfx_cards >= 3?
1755     turbochannel_default_gfx_card : "",
1756     XINE_INTR_TC_1 +8);
1757    
1758     /*
1759     * TURBOchannel slot 2 is hardwired to be used by
1760     * the framebuffer: (NOTE: 0x8000000, not 0x18000000)
1761     */
1762     dev_turbochannel_init(machine, mem, 2,
1763     0x8000000, 0xbffffff, "PMAG-DV", 0);
1764    
1765     /*
1766     * TURBOchannel slot 3: fixed, ioasic
1767     * (the system stuff), 0x1c000000
1768     */
1769     dev_le_init(machine, mem, 0x1c0c0000, 0, 0, XINE_INTR_LANCE +8, 4*65536);
1770     dev_scc_init(machine, mem, 0x1c100000,
1771     XINE_INTR_SCC_0 +8, machine->use_x11, 0, 1);
1772     dev_mc146818_init(machine, mem, 0x1c200000,
1773     XINE_INT_TOY, MC146818_DEC, 1);
1774     dev_asc_init(machine, mem, 0x1c300000,
1775     XINE_INTR_SCSI +8, NULL, DEV_ASC_DEC, NULL, NULL);
1776    
1777     framebuffer_console_name = "osconsole=3,2"; /* keyb,fb ?? */
1778     serial_console_name = "osconsole=3";
1779     break;
1780    
1781     case MACHINE_DEC_5500: /* type 11, KN220 */
1782     machine->machine_name = "DECsystem 5500 (KN220)";
1783    
1784     /*
1785     * According to NetBSD's pmax ports page:
1786     * KN220-AA is a "30 MHz R3000 CPU with R3010 FPU"
1787     * with "512 kBytes of Prestoserve battery backed RAM."
1788     */
1789     if (machine->emulated_hz == 0)
1790     machine->emulated_hz = 30000000;
1791    
1792     /*
1793     * See KN220 docs for more info.
1794     *
1795     * something at 0x10000000
1796     * something at 0x10001000
1797     * something at 0x10040000
1798     * scc at 0x10140000
1799     * qbus at (or around) 0x10080000
1800     * dssi (disk controller) buffers at 0x10100000, registers at 0x10160000.
1801     * sgec (ethernet) registers at 0x10008000, station addresss at 0x10120000.
1802     * asc (scsi) at 0x17100000.
1803     */
1804    
1805     dev_ssc_init(machine, mem, 0x10140000, 0, machine->use_x11, NULL); /* TODO: not irq 0 */
1806    
1807     /* something at 0x17000000, ultrix says "cpu 0 panic: DS5500 I/O Board is missing" if this is not here */
1808     dev_dec5500_ioboard_init(cpu, mem, 0x17000000);
1809    
1810     dev_sgec_init(mem, 0x10008000, 0); /* irq? */
1811    
1812     /* The asc controller might be TURBOchannel-ish? */
1813     #if 0
1814     dev_turbochannel_init(machine, mem, 0, 0x17100000, 0x171fffff, "PMAZ-AA", 0); /* irq? */
1815     #else
1816     dev_asc_init(machine, mem, 0x17100000, 0, NULL, DEV_ASC_DEC, NULL, NULL); /* irq? */
1817     #endif
1818    
1819     framebuffer_console_name = "osconsole=0,0"; /* TODO (?) */
1820     serial_console_name = "osconsole=0";
1821     break;
1822    
1823     case MACHINE_DEC_MIPSMATE_5100: /* type 12 */
1824     machine->machine_name = "DEC MIPSMATE 5100 (KN230)";
1825     if (machine->emulated_hz == 0)
1826     machine->emulated_hz = 20000000;
1827     if (machine->physical_ram_in_mb > 128)
1828     fprintf(stderr, "WARNING! Real MIPSMATE 5100 machines cannot have more than 128MB RAM. Continuing anyway.\n");
1829    
1830     if (machine->use_x11)
1831     fprintf(stderr, "WARNING! Real MIPSMATE 5100 machines cannot have a graphical framebuffer. Continuing anyway.\n");
1832    
1833     /* KN230 interrupts: */
1834     machine->md_interrupt = kn230_interrupt;
1835    
1836     /*
1837     * According to NetBSD/pmax:
1838     * dc0 at ibus0 addr 0x1c000000
1839     * le0 at ibus0 addr 0x18000000: address 00:00:00:00:00:00
1840     * sii0 at ibus0 addr 0x1a000000
1841     */
1842     dev_mc146818_init(machine, mem, KN230_SYS_CLOCK, 4, MC146818_DEC, 1);
1843     dev_dc7085_init(machine, mem, KN230_SYS_DZ0, KN230_CSR_INTR_DZ0, machine->use_x11); /* NOTE: CSR_INTR */
1844     /* dev_dc7085_init(machine, mem, KN230_SYS_DZ1, KN230_CSR_INTR_OPT0, machine->use_x11); */ /* NOTE: CSR_INTR */
1845     /* dev_dc7085_init(machine, mem, KN230_SYS_DZ2, KN230_CSR_INTR_OPT1, machine->use_x11); */ /* NOTE: CSR_INTR */
1846     dev_le_init(machine, mem, KN230_SYS_LANCE, KN230_SYS_LANCE_B_START, KN230_SYS_LANCE_B_END, KN230_CSR_INTR_LANCE, 4*1048576);
1847     dev_sii_init(machine, mem, KN230_SYS_SII, KN230_SYS_SII_B_START, KN230_SYS_SII_B_END, KN230_CSR_INTR_SII);
1848    
1849     snprintf(tmpstr, sizeof(tmpstr) - 1,
1850     "kn230 addr=0x%llx", (long long)KN230_SYS_ICSR);
1851 dpavlin 6 machine->md_int.kn230_csr = device_add(machine, tmpstr);
1852 dpavlin 2
1853     serial_console_name = "osconsole=0";
1854     break;
1855    
1856     default:
1857     ;
1858     }
1859    
1860     /*
1861     * Most OSes on DECstation use physical addresses below
1862     * 0x20000000, but OSF/1 seems to use 0xbe...... as if it was
1863     * 0x1e......, so we need this hack:
1864     */
1865     dev_ram_init(mem, 0xa0000000, 0x20000000, DEV_RAM_MIRROR, 0x0);
1866    
1867     /* DECstation PROM stuff: (TODO: endianness) */
1868     for (i=0; i<100; i++)
1869     store_32bit_word(cpu, DEC_PROM_CALLBACK_STRUCT + i*4,
1870     DEC_PROM_EMULATION + i*8);
1871    
1872     /* Fill PROM with dummy return instructions: (TODO: make this nicer) */
1873     for (i=0; i<100; i++) {
1874     store_32bit_word(cpu, DEC_PROM_EMULATION + i*8,
1875     0x03e00008); /* return */
1876     store_32bit_word(cpu, DEC_PROM_EMULATION + i*8 + 4,
1877     0x00000000); /* nop */
1878     }
1879    
1880     /*
1881     * According to dec_prom.h from NetBSD:
1882     *
1883     * "Programs loaded by the new PROMs pass the following arguments:
1884     * a0 argc
1885     * a1 argv
1886     * a2 DEC_PROM_MAGIC
1887     * a3 The callback vector defined below"
1888     *
1889     * So we try to emulate a PROM, even though no such thing has been
1890     * loaded.
1891     */
1892    
1893     cpu->cd.mips.gpr[MIPS_GPR_A0] = 3;
1894     cpu->cd.mips.gpr[MIPS_GPR_A1] = DEC_PROM_INITIAL_ARGV;
1895     cpu->cd.mips.gpr[MIPS_GPR_A2] = DEC_PROM_MAGIC;
1896     cpu->cd.mips.gpr[MIPS_GPR_A3] = DEC_PROM_CALLBACK_STRUCT;
1897    
1898     store_32bit_word(cpu, INITIAL_STACK_POINTER + 0x10,
1899     BOOTINFO_MAGIC);
1900     store_32bit_word(cpu, INITIAL_STACK_POINTER + 0x14,
1901     BOOTINFO_ADDR);
1902    
1903     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV,
1904     (DEC_PROM_INITIAL_ARGV + 0x10));
1905     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV+4,
1906     (DEC_PROM_INITIAL_ARGV + 0x70));
1907     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV+8,
1908     (DEC_PROM_INITIAL_ARGV + 0xe0));
1909     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV+12, 0);
1910    
1911     /*
1912     * NetBSD and Ultrix expect the boot args to be like this:
1913     *
1914     * "boot" "bootdev" [args?]
1915     *
1916     * where bootdev is supposed to be "rz(0,0,0)netbsd" for
1917     * 3100/2100 (although that crashes Ultrix :-/), and
1918     * "5/rz0a/netbsd" for all others. The number '5' is the
1919     * slot number of the boot device.
1920     *
1921     * 'rz' for disks, 'tz' for tapes.
1922     *
1923     * TODO: Make this nicer.
1924     */
1925     {
1926     char bootpath[200];
1927    
1928     #if 0
1929     if (machine->machine_subtype == MACHINE_DEC_PMAX_3100)
1930     strcpy(bootpath, "rz(0,0,0)");
1931     else
1932     #endif
1933     strcpy(bootpath, "5/rz1/");
1934    
1935     if (bootdev_id < 0 || machine->force_netboot) {
1936     /* tftp boot: */
1937     strcpy(bootpath, "5/tftp/");
1938     bootpath[0] = '0' + boot_net_boardnumber;
1939     } else {
1940     /* disk boot: */
1941     bootpath[0] = '0' + boot_scsi_boardnumber;
1942 dpavlin 6 if (diskimage_is_a_tape(machine, bootdev_id,
1943     bootdev_type))
1944 dpavlin 2 bootpath[2] = 't';
1945     bootpath[4] = '0' + bootdev_id;
1946     }
1947    
1948     init_bootpath = bootpath;
1949     }
1950    
1951     bootarg = malloc(strlen(init_bootpath) +
1952     strlen(machine->boot_kernel_filename) + 1 +
1953     strlen(machine->boot_string_argument) + 1);
1954     strcpy(bootarg, init_bootpath);
1955     strcat(bootarg, machine->boot_kernel_filename);
1956    
1957     bootstr = "boot";
1958    
1959     store_string(cpu, DEC_PROM_INITIAL_ARGV+0x10, bootstr);
1960     store_string(cpu, DEC_PROM_INITIAL_ARGV+0x70, bootarg);
1961     store_string(cpu, DEC_PROM_INITIAL_ARGV+0xe0,
1962     machine->boot_string_argument);
1963    
1964     /* Decrease the nr of args, if there are no args :-) */
1965     if (machine->boot_string_argument == NULL ||
1966     machine->boot_string_argument[0] == '\0')
1967     cpu->cd.mips.gpr[MIPS_GPR_A0] --;
1968    
1969     if (machine->boot_string_argument[0] != '\0') {
1970     strcat(bootarg, " ");
1971     strcat(bootarg, machine->boot_string_argument);
1972     }
1973    
1974     xx.a.common.next = (char *)&xx.b - (char *)&xx;
1975     xx.a.common.type = BTINFO_MAGIC;
1976     xx.a.magic = BOOTINFO_MAGIC;
1977    
1978     xx.b.common.next = (char *)&xx.c - (char *)&xx.b;
1979     xx.b.common.type = BTINFO_BOOTPATH;
1980     strcpy(xx.b.bootpath, bootstr);
1981    
1982     xx.c.common.next = 0;
1983     xx.c.common.type = BTINFO_SYMTAB;
1984     xx.c.nsym = 0;
1985     xx.c.ssym = 0;
1986     xx.c.esym = machine->file_loaded_end_addr;
1987    
1988     store_buf(cpu, BOOTINFO_ADDR, (char *)&xx, sizeof(xx));
1989    
1990     /*
1991     * The system's memmap: (memmap is a global variable, in
1992     * dec_prom.h)
1993     */
1994     store_32bit_word_in_host(cpu,
1995     (unsigned char *)&memmap.pagesize, 4096);
1996     {
1997     unsigned int i;
1998     for (i=0; i<sizeof(memmap.bitmap); i++)
1999     memmap.bitmap[i] = ((int)i * 4096*8 <
2000     1048576*machine->physical_ram_in_mb)?
2001     0xff : 0x00;
2002     }
2003     store_buf(cpu, DEC_MEMMAP_ADDR, (char *)&memmap, sizeof(memmap));
2004    
2005     /* Environment variables: */
2006     addr = DEC_PROM_STRINGS;
2007    
2008     if (machine->use_x11 && machine->n_gfx_cards > 0)
2009     /* (0,3) Keyboard and Framebuffer */
2010     add_environment_string(cpu, framebuffer_console_name, &addr);
2011     else
2012     /* Serial console */
2013     add_environment_string(cpu, serial_console_name, &addr);
2014    
2015     /*
2016     * The KN5800 (SMP system) uses a CCA (console communications
2017     * area): (See VAX 6000 documentation for details.)
2018     */
2019     {
2020     char tmps[300];
2021     sprintf(tmps, "cca=%x",
2022     (int)(DEC_DECCCA_BASEADDR + 0xa0000000ULL));
2023     add_environment_string(cpu, tmps, &addr);
2024     }
2025    
2026     /* These are needed for Sprite to boot: */
2027     {
2028     char tmps[300];
2029    
2030     sprintf(tmps, "boot=%s", bootarg);
2031     add_environment_string(cpu, tmps, &addr);
2032    
2033     sprintf(tmps, "bitmap=0x%x", (uint32_t)((
2034     DEC_MEMMAP_ADDR + sizeof(memmap.pagesize))
2035     & 0xffffffffULL));
2036     add_environment_string(cpu, tmps, &addr);
2037    
2038     sprintf(tmps, "bitmaplen=0x%x",
2039     machine->physical_ram_in_mb * 1048576 / 4096 / 8);
2040     add_environment_string(cpu, tmps, &addr);
2041     }
2042    
2043     add_environment_string(cpu, "scsiid0=7", &addr);
2044     add_environment_string(cpu, "bootmode=a", &addr);
2045     add_environment_string(cpu, "testaction=q", &addr);
2046     add_environment_string(cpu, "haltaction=h", &addr);
2047     add_environment_string(cpu, "more=24", &addr);
2048    
2049     /* Used in at least Ultrix on the 5100: */
2050     add_environment_string(cpu, "scsiid=7", &addr);
2051     add_environment_string(cpu, "baud0=9600", &addr);
2052     add_environment_string(cpu, "baud1=9600", &addr);
2053     add_environment_string(cpu, "baud2=9600", &addr);
2054     add_environment_string(cpu, "baud3=9600", &addr);
2055     add_environment_string(cpu, "iooption=0x1", &addr);
2056    
2057     /* The end: */
2058     add_environment_string(cpu, "", &addr);
2059    
2060     break;
2061    
2062     case MACHINE_COBALT:
2063     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2064     machine->machine_name = "Cobalt";
2065    
2066     /*
2067     * Interrupts seem to be the following:
2068     * (according to http://www.funet.fi/pub/Linux/PEOPLE/Linus/v2.4/patch-html/patch-2.4.19/linux-2.4.19_arch_mips_cobalt_irq.c.html)
2069     *
2070     * 2 Galileo chip (timer)
2071     * 3 Tulip 0 + NCR SCSI
2072     * 4 Tulip 1
2073     * 5 16550 UART (serial console)
2074     * 6 VIA southbridge PIC
2075     * 7 PCI
2076     */
2077     /* dev_XXX_init(cpu, mem, 0x10000000, machine->emulated_hz); */
2078     dev_mc146818_init(machine, mem, 0x10000070, 0, MC146818_PC_CMOS, 4);
2079 dpavlin 6
2080 dpavlin 2 machine->main_console_handle = dev_ns16550_init(machine, mem,
2081     0x1c800000, 5, 1, 1, "serial console");
2082    
2083 dpavlin 6 #if 0
2084     dev_ns16550_init(machine, mem, 0x1f000010, 0, 1, 1,
2085     "other serial console");
2086     #endif
2087    
2088 dpavlin 2 /*
2089     * According to NetBSD/cobalt:
2090     *
2091     * pchb0 at pci0 dev 0 function 0: Galileo GT-64111 System Controller, rev 1 (NOTE: added by dev_gt_init())
2092     * tlp0 at pci0 dev 7 function 0: DECchip 21143 Ethernet, pass 4.1
2093     * Symbios Logic 53c860 (SCSI mass storage, revision 0x02) at pci0 dev 8
2094     * pcib0 at pci0 dev 9 function 0, VIA Technologies VT82C586 (Apollo VP) PCI-ISA Bridge, rev 37
2095     * pciide0 at pci0 dev 9 function 1: VIA Technologies VT82C586 (Apollo VP) ATA33 cr
2096     * tlp1 at pci0 dev 12 function 0: DECchip 21143 Ethernet, pass 4.1
2097     */
2098     pci_data = dev_gt_init(machine, mem, 0x14000000, 2, 6); /* 7 for PCI, not 6? */
2099     /* bus_pci_add(machine, pci_data, mem, 0, 7, 0, pci_dec21143_init, pci_dec21143_rr); */
2100     bus_pci_add(machine, pci_data, mem, 0, 8, 0, NULL, NULL); /* PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_860 */
2101     bus_pci_add(machine, pci_data, mem, 0, 9, 0, pci_vt82c586_isa_init, pci_vt82c586_isa_rr);
2102     bus_pci_add(machine, pci_data, mem, 0, 9, 1, pci_vt82c586_ide_init, pci_vt82c586_ide_rr);
2103     /* bus_pci_add(machine, pci_data, mem, 0, 12, 0, pci_dec21143_init, pci_dec21143_rr); */
2104    
2105     /*
2106     * NetBSD/cobalt expects memsize in a0, but it seems that what
2107     * it really wants is the end of memory + 0x80000000.
2108     *
2109     * The bootstring should be stored starting 512 bytes before end
2110     * of physical ram.
2111     */
2112     cpu->cd.mips.gpr[MIPS_GPR_A0] = machine->physical_ram_in_mb * 1048576 + 0x80000000;
2113     bootstr = "root=/dev/hda1 ro";
2114     /* bootstr = "nfsroot=/usr/cobalt/"; */
2115     store_string(cpu, 0xffffffff80000000ULL +
2116     machine->physical_ram_in_mb * 1048576 - 512, bootstr);
2117     break;
2118    
2119     case MACHINE_HPCMIPS:
2120     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2121     memset(&hpc_bootinfo, 0, sizeof(hpc_bootinfo));
2122     /* TODO: set platid from netbsd/usr/src/sys/arch/hpc/include/platid* */
2123     /*
2124     #define PLATID_FLAGS_SHIFT 0
2125     #define PLATID_CPU_SUBMODEL_SHIFT 8
2126     #define PLATID_CPU_MODEL_SHIFT 14
2127     #define PLATID_CPU_SERIES_SHIFT 20
2128     #define PLATID_CPU_ARCH_SHIFT 26
2129    
2130     #define PLATID_SUBMODEL_SHIFT 0
2131     #define PLATID_MODEL_SHIFT 8
2132     #define PLATID_SERIES_SHIFT 16
2133     #define PLATID_VENDOR_SHIFT 22
2134     */
2135    
2136     /*
2137     NOTE: See http://forums.projectmayo.com/viewtopic.php?topic=2743&forum=23
2138     for info on framebuffer addresses.
2139     */
2140    
2141     switch (machine->machine_subtype) {
2142     case MACHINE_HPCMIPS_CASIO_BE300:
2143     /* 166MHz VR4131 */
2144     machine->machine_name = "Casio Cassiopeia BE-300";
2145     hpcmips_fb_addr = 0x0a200000;
2146     hpcmips_fb_xsize = 240;
2147     hpcmips_fb_ysize = 320;
2148     hpcmips_fb_xsize_mem = 256;
2149     hpcmips_fb_ysize_mem = 320;
2150     hpcmips_fb_bits = 15;
2151     hpcmips_fb_encoding = BIFB_D16_0000;
2152    
2153     machine->main_console_handle = dev_ns16550_init(
2154     machine, mem, 0xa008680, 0, 4,
2155     machine->use_x11? 0 : 1, "serial console"); /* TODO: irq? */
2156 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4131);
2157 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2158    
2159     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2160     (1 << 26) /* 1 = MIPS */
2161     + (1 << 20) /* 1 = VR */
2162     + (1 << 14) /* 1 = VR41XX */
2163     + (6 << 8) /* 6 = VR4131 */
2164     );
2165     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2166     (3 << 22) /* 22: vendor 3=casio */
2167     + (1 << 16) /* 16: series 1=CASSIOPEIAE*/
2168     + (2 << 8) /* 8: model 2=EXXX*/
2169     + (3) /* 0: submodel 3=E500 */
2170     );
2171     /* TODO: Don't use model number for E500, it's a BE300! */
2172     break;
2173     case MACHINE_HPCMIPS_CASIO_E105:
2174     /* 131MHz VR4121 */
2175     machine->machine_name = "Casio Cassiopeia E-105";
2176     hpcmips_fb_addr = 0x0a200000; /* TODO? */
2177     hpcmips_fb_xsize = 240;
2178     hpcmips_fb_ysize = 320;
2179     hpcmips_fb_xsize_mem = 256;
2180     hpcmips_fb_ysize_mem = 320;
2181     hpcmips_fb_bits = 16;
2182     hpcmips_fb_encoding = BIFB_D16_0000;
2183    
2184     machine->main_console_handle = dev_ns16550_init(
2185     machine, mem, 0xa008680, 0, 4,
2186     machine->use_x11? 0 : 1, "serial console"); /* TODO: irq? */
2187 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2188 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2189    
2190     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2191     (1 << 26) /* 1 = MIPS */
2192     + (1 << 20) /* 1 = VR */
2193     + (1 << 14) /* 1 = VR41XX */
2194     + (3 << 8) /* 3 = VR4121 */
2195     );
2196     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2197     (3 << 22) /* 22: vendor 3=casio */
2198     + (1 << 16) /* 16: series 1=CASSIOPEIAE*/
2199     + (2 << 8) /* 8: model 2=EXXX*/
2200     + (2) /* 0: submodel 2=E105 */
2201     );
2202     break;
2203     case MACHINE_HPCMIPS_NEC_MOBILEPRO_770:
2204     /* 131 MHz VR4121 */
2205     machine->machine_name = "NEC MobilePro 770";
2206     /* TODO: */
2207     hpcmips_fb_addr = 0xa000000;
2208     hpcmips_fb_xsize = 640;
2209     hpcmips_fb_ysize = 240;
2210     hpcmips_fb_xsize_mem = 800;
2211     hpcmips_fb_ysize_mem = 240;
2212     hpcmips_fb_bits = 16;
2213     hpcmips_fb_encoding = BIFB_D16_0000;
2214    
2215 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2216 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2217    
2218     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2219     (1 << 26) /* 1 = MIPS */
2220     + (1 << 20) /* 1 = VR */
2221     + (1 << 14) /* 1 = VR41XX */
2222     + (3 << 8) /* 3 = VR4121 */
2223     );
2224     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2225     (1 << 22) /* 22: vendor 1=NEC */
2226     + (2 << 16) /* 16: series 2="NEC MCR" */
2227     + (2 << 8) /* 8: model 2="MCR 5XX" */
2228     + (4) /* 0: submodel 4="MCR 520A" */
2229     );
2230     break;
2231     case MACHINE_HPCMIPS_NEC_MOBILEPRO_780:
2232     /* 166 (or 168) MHz VR4121 */
2233     machine->machine_name = "NEC MobilePro 780";
2234     /* TODO: */
2235     hpcmips_fb_addr = 0xa180100;
2236     hpcmips_fb_xsize = 640;
2237     hpcmips_fb_ysize = 240;
2238     hpcmips_fb_xsize_mem = 640;
2239     hpcmips_fb_ysize_mem = 240;
2240     hpcmips_fb_bits = 16;
2241     hpcmips_fb_encoding = BIFB_D16_0000;
2242    
2243 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2244 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2245    
2246     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2247     (1 << 26) /* 1 = MIPS */
2248     + (1 << 20) /* 1 = VR */
2249     + (1 << 14) /* 1 = VR41XX */
2250     + (3 << 8) /* 3 = VR4121 */
2251     );
2252     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2253     (1 << 22) /* 22: vendor 1=NEC */
2254     + (2 << 16) /* 16: series 2="NEC MCR" */
2255     + (2 << 8) /* 8: model 2="MCR 5XX" */
2256     + (8) /* 0: submodel 8="MCR 530A" */
2257     );
2258     break;
2259     case MACHINE_HPCMIPS_NEC_MOBILEPRO_800:
2260     /* 131 MHz VR4121 */
2261     machine->machine_name = "NEC MobilePro 800";
2262     /* TODO: */
2263     hpcmips_fb_addr = 0xa000000;
2264     hpcmips_fb_xsize = 800;
2265     hpcmips_fb_ysize = 600;
2266     hpcmips_fb_xsize_mem = 800;
2267     hpcmips_fb_ysize_mem = 600;
2268     hpcmips_fb_bits = 16;
2269     hpcmips_fb_encoding = BIFB_D16_0000;
2270    
2271 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2272 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2273    
2274     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2275     (1 << 26) /* 1 = MIPS */
2276     + (1 << 20) /* 1 = VR */
2277     + (1 << 14) /* 1 = VR41XX */
2278     + (3 << 8) /* 3 = VR4121 */
2279     );
2280     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2281     (1 << 22) /* 22: vendor 1=NEC */
2282     + (2 << 16) /* 16: series 2="NEC MCR" */
2283     + (3 << 8) /* 8: model 3="MCR 7XX" */
2284     + (2) /* 0: submodel 2="MCR 700A" */
2285     );
2286     break;
2287     case MACHINE_HPCMIPS_NEC_MOBILEPRO_880:
2288     /* 168 MHz VR4121 */
2289     machine->machine_name = "NEC MobilePro 880";
2290     /* TODO: */
2291     hpcmips_fb_addr = 0xa0ea600;
2292     hpcmips_fb_xsize = 800;
2293     hpcmips_fb_ysize = 600;
2294     hpcmips_fb_xsize_mem = 800;
2295     hpcmips_fb_ysize_mem = 600;
2296     hpcmips_fb_bits = 16;
2297     hpcmips_fb_encoding = BIFB_D16_0000;
2298    
2299 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2300 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2301    
2302     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2303     (1 << 26) /* 1 = MIPS */
2304     + (1 << 20) /* 1 = VR */
2305     + (1 << 14) /* 1 = VR41XX */
2306     + (3 << 8) /* 3 = VR4121 */
2307     );
2308     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2309     (1 << 22) /* 22: vendor 1=NEC */
2310     + (2 << 16) /* 16: series 2="NEC MCR" */
2311     + (3 << 8) /* 8: model 3="MCR 7XX" */
2312     + (4) /* 0: submodel 4="MCR 730A" */
2313     );
2314     break;
2315     case MACHINE_HPCMIPS_AGENDA_VR3:
2316     /* 66 MHz VR4181 */
2317     machine->machine_name = "Agenda VR3";
2318     /* TODO: */
2319     hpcmips_fb_addr = 0x1000;
2320     hpcmips_fb_xsize = 160;
2321     hpcmips_fb_ysize = 240;
2322     hpcmips_fb_xsize_mem = 160;
2323     hpcmips_fb_ysize_mem = 240;
2324     hpcmips_fb_bits = 4;
2325     hpcmips_fb_encoding = BIFB_D4_M2L_F;
2326    
2327 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4181);
2328 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2329    
2330     /* TODO: Hm... irq 17 according to linux, but
2331     VRIP_INTR_SIU (=9) here? */
2332     {
2333     int x;
2334     x = dev_ns16550_init(machine, mem, 0x0c000010,
2335     8 + VRIP_INTR_SIU, 1, 1, "serial 0");
2336    
2337     if (!machine->use_x11)
2338     machine->main_console_handle = x;
2339     }
2340    
2341     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2342     (1 << 26) /* 1 = MIPS */
2343     + (1 << 20) /* 1 = VR */
2344     + (1 << 14) /* 1 = VR41XX */
2345     + (4 << 8) /* 4 = VR4181 */
2346     );
2347     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2348     (15 << 22) /* 22: vendor 15=Agenda */
2349     + (1 << 16) /* 16: series 2=VR */
2350     + (1 << 8) /* 8: model 1=VR3 */
2351     + (0) /* 0: submodel 0="VR3" */
2352     );
2353    
2354     dev_ram_init(mem, 0x0f000000, 0x01000000, DEV_RAM_MIRROR, 0x0);
2355     break;
2356     case MACHINE_HPCMIPS_IBM_WORKPAD_Z50:
2357     /* 131 MHz VR4121 */
2358     machine->machine_name = "Agenda VR3";
2359     /* TODO: */
2360     hpcmips_fb_addr = 0xa000000;
2361     hpcmips_fb_xsize = 640;
2362     hpcmips_fb_ysize = 480;
2363     hpcmips_fb_xsize_mem = 640;
2364     hpcmips_fb_ysize_mem = 480;
2365     hpcmips_fb_bits = 16;
2366     hpcmips_fb_encoding = BIFB_D16_0000;
2367    
2368 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2369 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2370    
2371     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2372     (1 << 26) /* 1 = MIPS */
2373     + (1 << 20) /* 1 = VR */
2374     + (1 << 14) /* 1 = VR41XX */
2375     + (3 << 8) /* 3 = VR4121 */
2376     );
2377     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2378     (9 << 22) /* 22: vendor 9=IBM */
2379     + (1 << 16) /* 16: series 1=WorkPad */
2380     + (1 << 8) /* 8: model 1=Z50 */
2381     + (0) /* 0: submodel 0 */
2382     );
2383     break;
2384     default:
2385     printf("Unimplemented hpcmips machine number.\n");
2386     exit(1);
2387     }
2388    
2389     if (machine->use_x11)
2390     machine->main_console_handle =
2391 dpavlin 6 machine->md_int.vr41xx_data->kiu_console_handle;
2392 dpavlin 2
2393     /* NetBSD/hpcmips and possibly others expects the following: */
2394    
2395     cpu->cd.mips.gpr[MIPS_GPR_A0] = 1; /* argc */
2396     cpu->cd.mips.gpr[MIPS_GPR_A1] = machine->physical_ram_in_mb * 1048576
2397     + 0xffffffff80000000ULL - 512; /* argv */
2398     cpu->cd.mips.gpr[MIPS_GPR_A2] = machine->physical_ram_in_mb * 1048576
2399     + 0xffffffff80000000ULL - 256; /* ptr to hpc_bootinfo */
2400    
2401     bootstr = machine->boot_kernel_filename;
2402     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 16);
2403     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 4, 0);
2404     store_string(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 16, bootstr);
2405    
2406     /* Special case for the Agenda VR3: */
2407     if (machine->machine_subtype == MACHINE_HPCMIPS_AGENDA_VR3) {
2408     const int tmplen = 1000;
2409     char *tmp = malloc(tmplen);
2410    
2411     cpu->cd.mips.gpr[MIPS_GPR_A0] = 2; /* argc */
2412    
2413     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 4, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64);
2414     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 8, 0);
2415    
2416     snprintf(tmp, tmplen, "root=/dev/rom video=vr4181fb:xres:160,yres:240,bpp:4,"
2417     "gray,hpck:3084,inv ether=0,0x03fe0300,eth0");
2418     tmp[tmplen-1] = '\0';
2419    
2420     if (!machine->use_x11)
2421     snprintf(tmp+strlen(tmp), tmplen-strlen(tmp), " console=ttyS0,115200");
2422     tmp[tmplen-1] = '\0';
2423    
2424     if (machine->boot_string_argument[0])
2425     snprintf(tmp+strlen(tmp), tmplen-strlen(tmp), " %s", machine->boot_string_argument);
2426     tmp[tmplen-1] = '\0';
2427    
2428     store_string(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64, tmp);
2429    
2430     bootarg = tmp;
2431     } else if (machine->boot_string_argument[0]) {
2432     cpu->cd.mips.gpr[MIPS_GPR_A0] ++; /* argc */
2433    
2434     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 4, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64);
2435     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 8, 0);
2436    
2437     store_string(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64,
2438     machine->boot_string_argument);
2439    
2440     bootarg = machine->boot_string_argument;
2441     }
2442    
2443     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.length, sizeof(hpc_bootinfo));
2444     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.magic, HPC_BOOTINFO_MAGIC);
2445     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_addr, 0x80000000 + hpcmips_fb_addr);
2446     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_line_bytes, hpcmips_fb_xsize_mem * (((hpcmips_fb_bits-1)|7)+1) / 8);
2447     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_width, hpcmips_fb_xsize);
2448     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_height, hpcmips_fb_ysize);
2449     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_type, hpcmips_fb_encoding);
2450     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.bi_cnuse, BI_CNUSE_BUILTIN); /* _BUILTIN or _SERIAL */
2451    
2452     /* printf("hpc_bootinfo.platid_cpu = 0x%08x\n", hpc_bootinfo.platid_cpu);
2453     printf("hpc_bootinfo.platid_machine = 0x%08x\n", hpc_bootinfo.platid_machine); */
2454     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.timezone, 0);
2455     store_buf(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 256, (char *)&hpc_bootinfo, sizeof(hpc_bootinfo));
2456    
2457     if (hpcmips_fb_addr != 0) {
2458     dev_fb_init(machine, mem, hpcmips_fb_addr, VFB_HPCMIPS,
2459     hpcmips_fb_xsize, hpcmips_fb_ysize,
2460     hpcmips_fb_xsize_mem, hpcmips_fb_ysize_mem,
2461     hpcmips_fb_bits, "HPCmips", 0);
2462    
2463     /* NetBSD/hpcmips uses framebuffer at physical
2464     address 0x8.......: */
2465     dev_ram_init(mem, 0x80000000, 0x20000000,
2466     DEV_RAM_MIRROR, 0x0);
2467     }
2468    
2469     break;
2470    
2471     case MACHINE_PS2:
2472     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2473     machine->machine_name = "Playstation 2";
2474    
2475     if (machine->physical_ram_in_mb != 32)
2476     fprintf(stderr, "WARNING! Playstation 2 machines are supposed to have exactly 32 MB RAM. Continuing anyway.\n");
2477     if (!machine->use_x11)
2478     fprintf(stderr, "WARNING! Playstation 2 without -X is pretty meaningless. Continuing anyway.\n");
2479    
2480     /*
2481     * According to NetBSD:
2482     * Hardware irq 0 is timer/interrupt controller
2483     * Hardware irq 1 is dma controller
2484     *
2485     * Some things are not yet emulated (at all), and hence are detected incorrectly:
2486     * sbus0 at mainbus0: controller type 2
2487     * ohci0 at sbus0 (at 0x1f801600, according to linux)
2488     * ohci0: OHCI version 1.0
2489     */
2490    
2491 dpavlin 6 machine->md_int.ps2_data = dev_ps2_stuff_init(machine, mem, 0x10000000);
2492 dpavlin 2 device_add(machine, "ps2_gs addr=0x12000000");
2493 dpavlin 4 device_add(machine, "ps2_ether addr=0x14001000");
2494 dpavlin 2 dev_ram_init(mem, 0x1c000000, 4 * 1048576, DEV_RAM_RAM, 0); /* TODO: how much? */
2495 dpavlin 4 /* irq = 8 + 32 + 1 (SBUS/USB) */
2496     device_add(machine, "ohci addr=0x1f801600 irq=41");
2497 dpavlin 2
2498     machine->md_interrupt = ps2_interrupt;
2499    
2500     add_symbol_name(&machine->symbol_context,
2501     PLAYSTATION2_SIFBIOS, 0x10000, "[SIFBIOS entry]", 0);
2502     store_32bit_word(cpu, PLAYSTATION2_BDA + 0, PLAYSTATION2_SIFBIOS);
2503     store_buf(cpu, PLAYSTATION2_BDA + 4, "PS2b", 4);
2504    
2505 dpavlin 4 /* Set the Harddisk controller present flag, if either
2506     disk 0 or 1 is present: */
2507 dpavlin 6 if (diskimage_exist(machine, 0, DISKIMAGE_IDE) ||
2508     diskimage_exist(machine, 1, DISKIMAGE_IDE)) {
2509 dpavlin 4 store_32bit_word(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x0, 0x100);
2510     dev_ps2_spd_init(machine, mem, 0x14000000);
2511     }
2512 dpavlin 2
2513     store_32bit_word(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x4, PLAYSTATION2_OPTARGS);
2514 dpavlin 4 {
2515     int tmplen = 1000;
2516     char *tmp = malloc(tmplen);
2517     if (tmp == NULL) {
2518     fprintf(stderr, "out of memory\n");
2519     exit(1);
2520     }
2521 dpavlin 2
2522 dpavlin 4 strcpy(tmp, "root=/dev/hda1 crtmode=vesa0,60");
2523    
2524     if (machine->boot_string_argument[0])
2525     snprintf(tmp+strlen(tmp), tmplen-strlen(tmp),
2526     " %s", machine->boot_string_argument);
2527     tmp[tmplen-1] = '\0';
2528    
2529     bootstr = tmp;
2530     store_string(cpu, PLAYSTATION2_OPTARGS, bootstr);
2531     }
2532    
2533 dpavlin 2 /* TODO: netbsd's bootinfo.h, for symbolic names */
2534     {
2535     time_t timet;
2536     struct tm *tmp;
2537    
2538     /* RTC data given by the BIOS: */
2539     timet = time(NULL) + 9*3600; /* PS2 uses Japanese time */
2540     tmp = gmtime(&timet);
2541     /* TODO: are these 0- or 1-based? */
2542     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 1, int_to_bcd(tmp->tm_sec));
2543     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 2, int_to_bcd(tmp->tm_min));
2544     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 3, int_to_bcd(tmp->tm_hour));
2545     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 5, int_to_bcd(tmp->tm_mday));
2546     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 6, int_to_bcd(tmp->tm_mon + 1));
2547     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 7, int_to_bcd(tmp->tm_year - 100));
2548     }
2549    
2550     /* "BOOTINFO_PCMCIA_TYPE" in NetBSD's bootinfo.h. This contains the sbus controller type. */
2551 dpavlin 4 store_32bit_word(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x1c, 2);
2552 dpavlin 2
2553     break;
2554    
2555     case MACHINE_SGI:
2556     case MACHINE_ARC:
2557     /*
2558     * SGI and ARC emulation share a lot of code. (SGI is a special case of
2559     * "almost ARC".)
2560     *
2561     * http://obsolete.majix.org/computers/sgi/iptable.shtml contains a pretty
2562     * detailed list of IP ("Inhouse Processor") model numbers.
2563     * (Or http://hardware.majix.org/computers/sgi/iptable.shtml)
2564     */
2565     machine->machine_name = malloc(500);
2566     if (machine->machine_name == NULL) {
2567     fprintf(stderr, "out of memory\n");
2568     exit(1);
2569     }
2570    
2571     if (machine->machine_type == MACHINE_SGI) {
2572     cpu->byte_order = EMUL_BIG_ENDIAN;
2573     sprintf(machine->machine_name, "SGI-IP%i", machine->machine_subtype);
2574    
2575     sgi_ram_offset = 1048576 * machine->memory_offset_in_mb;
2576    
2577     /* Special cases for IP20,22,24,26 memory offset: */
2578     if (machine->machine_subtype == 20 || machine->machine_subtype == 22 ||
2579     machine->machine_subtype == 24 || machine->machine_subtype == 26) {
2580     dev_ram_init(mem, 0x00000000, 0x10000, DEV_RAM_MIRROR, sgi_ram_offset);
2581     dev_ram_init(mem, 0x00050000, sgi_ram_offset-0x50000, DEV_RAM_MIRROR, sgi_ram_offset + 0x50000);
2582     }
2583    
2584     /* Special cases for IP28,30 memory offset: */
2585     if (machine->machine_subtype == 28 || machine->machine_subtype == 30) {
2586     /* TODO: length below should maybe not be 128MB? */
2587     dev_ram_init(mem, 0x00000000, 128*1048576, DEV_RAM_MIRROR, sgi_ram_offset);
2588     }
2589     } else {
2590     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2591     sprintf(machine->machine_name, "ARC");
2592     }
2593    
2594     if (machine->machine_type == MACHINE_SGI) {
2595     /* TODO: Other SGI machine types? */
2596     switch (machine->machine_subtype) {
2597     case 12:
2598     strcat(machine->machine_name, " (Iris Indigo IP12)");
2599    
2600     /* TODO */
2601     /* 33 MHz R3000, according to http://www.irisindigo.com/ */
2602     /* "capable of addressing up to 96MB of memory." */
2603    
2604     break;
2605     case 19:
2606     strcat(machine->machine_name, " (Everest IP19)");
2607     machine->main_console_handle =
2608     dev_zs_init(machine, mem, 0x1fbd9830, 0, 1, "serial zs"); /* serial? netbsd? */
2609     dev_scc_init(machine, mem, 0x10086000, 0, machine->use_x11, 0, 8); /* serial? irix? */
2610    
2611     device_add(machine, "sgi_ip19 addr=0x18000000");
2612    
2613     /* Irix' <everest_du_init+0x130> reads this device: */
2614     device_add(machine, "random addr=0x10006000 len=16");
2615    
2616     /* Irix' get_mpconf() looks for this: (TODO) */
2617     store_32bit_word(cpu, 0xa0000000 + 0x3000,
2618     0xbaddeed2);
2619    
2620     /* Memory size, not 4096 byte pages, but 256 bytes? (16 is size of kernel... approx) */
2621     store_32bit_word(cpu, 0xa0000000 + 0x26d0,
2622     30000); /* (machine->physical_ram_in_mb - 16) * (1048576 / 256)); */
2623    
2624     break;
2625     case 20:
2626     strcat(machine->machine_name, " (Indigo)");
2627    
2628     /*
2629     * Guesses based on NetBSD 2.0 beta, 20040606.
2630     *
2631     * int0 at mainbus0 addr 0x1fb801c0: bus 1MHz, CPU 2MHz
2632     * imc0 at mainbus0 addr 0x1fa00000: revision 0
2633     * gio0 at imc0
2634     * unknown GIO card (product 0x00 revision 0x00) at gio0 slot 0 addr 0x1f400000 not configured
2635     * unknown GIO card (product 0x00 revision 0x00) at gio0 slot 1 addr 0x1f600000 not configured
2636     * unknown GIO card (product 0x00 revision 0x00) at gio0 slot 2 addr 0x1f000000 not configured
2637     * hpc0 at gio0 addr 0x1fb80000: SGI HPC1
2638     * zsc0 at hpc0 offset 0xd10 (channels 0 and 1, channel 1 for console)
2639     * zsc1 at hpc0 offset 0xd00 (2 channels)
2640     * sq0 at hpc0 offset 0x100: SGI Seeq 80c03
2641     * wdsc0 at hpc0 offset 0x11f
2642     * dpclock0 at hpc0 offset 0xe00
2643     */
2644    
2645     /* int0 at mainbus0 addr 0x1fb801c0 */
2646 dpavlin 6 machine->md_int.sgi_ip20_data = dev_sgi_ip20_init(cpu, mem, DEV_SGI_IP20_BASE);
2647 dpavlin 2
2648     /* imc0 at mainbus0 addr 0x1fa00000: revision 0: TODO (or in dev_sgi_ip20?) */
2649    
2650     dev_zs_init(machine, mem, 0x1fbd9830, 0, 1, "zs console");
2651    
2652     /* This is the zsc0 reported by NetBSD: TODO: irqs */
2653     machine->main_console_handle = dev_zs_init(machine, mem, 0x1fb80d10, 0, 1, "zsc0"); /* zsc0 */
2654     dev_zs_init(machine, mem, 0x1fb80d00, 0, 1, "zsc1"); /* zsc1 */
2655    
2656     /* WDSC SCSI controller: */
2657     dev_wdsc_init(machine, mem, 0x1fb8011f, 0, 0);
2658    
2659     /* Return memory read errors so that hpc1
2660     and hpc2 are not detected: */
2661     device_add(machine, "unreadable addr=0x1fb00000 len=0x10000");
2662     device_add(machine, "unreadable addr=0x1f980000 len=0x10000");
2663    
2664     /* Return nothing for gio slots 0, 1, and 2: */
2665     device_add(machine, "unreadable addr=0x1f400000 len=0x1000"); /* gio0 slot 0 */
2666     device_add(machine, "unreadable addr=0x1f600000 len=0x1000"); /* gio0 slot 1 */
2667     device_add(machine, "unreadable addr=0x1f000000 len=0x1000"); /* gio0 slot 2 */
2668    
2669     break;
2670     case 21:
2671     strcat(machine->machine_name, " (uknown SGI-IP21 ?)"); /* TODO */
2672     /* NOTE: Special case for arc_wordlen: */
2673     arc_wordlen = sizeof(uint64_t);
2674    
2675     device_add(machine, "random addr=0x418000200, len=0x20000");
2676    
2677     break;
2678     case 22:
2679     case 24:
2680     if (machine->machine_subtype == 22) {
2681     strcat(machine->machine_name, " (Indy, Indigo2, Challenge S; Full-house)");
2682 dpavlin 6 machine->md_int.sgi_ip22_data = dev_sgi_ip22_init(machine, mem, 0x1fbd9000, 0);
2683 dpavlin 2 } else {
2684     strcat(machine->machine_name, " (Indy, Indigo2, Challenge S; Guiness)");
2685 dpavlin 6 machine->md_int.sgi_ip22_data = dev_sgi_ip22_init(machine, mem, 0x1fbd9880, 1);
2686 dpavlin 2 }
2687    
2688     /*
2689     Why is this here? TODO
2690     dev_ram_init(mem, 0x88000000ULL,
2691     128 * 1048576, DEV_RAM_MIRROR, 0x08000000);
2692     */
2693     machine->md_interrupt = sgi_ip22_interrupt;
2694    
2695     /*
2696     * According to NetBSD 1.6.2:
2697     *
2698     * imc0 at mainbus0 addr 0x1fa00000, Revision 0
2699     * gio0 at imc0
2700     * hpc0 at gio0 addr 0x1fb80000: SGI HPC3
2701     * zsc0 at hpc0 offset 0x59830
2702     * zstty0 at zsc0 channel 1 (console i/o)
2703     * zstty1 at zsc0 channel 0
2704     * sq0 at hpc0 offset 0x54000: SGI Seeq 80c03 (Ethernet)
2705     * wdsc0 at hpc0 offset 0x44000: WD33C93 SCSI, rev=0, target 7
2706     * scsibus2 at wdsc0: 8 targets, 8 luns per target
2707     * dsclock0 at hpc0 offset 0x60000
2708     *
2709     * According to Linux/IP22:
2710     * tty00 at 0xbfbd9830 (irq = 45) is a Zilog8530
2711     * tty01 at 0xbfbd9838 (irq = 45) is a Zilog8530
2712     *
2713     * and according to NetBSD 2.0_BETA (20040606):
2714     *
2715     * haltwo0 at hpc0 offset 0x58000: HAL2 revision 0.0.0
2716     * audio0 at haltwo0: half duplex
2717     *
2718     * IRQ numbers are of the form 8 + x, where x = 0..31 for local0
2719     * interrupts, and 32..63 for local1. + y*65 for "mappable".
2720     */
2721    
2722     /* zsc0 serial console. */
2723     i = dev_zs_init(machine, mem, 0x1fbd9830,
2724     8 + 32 + 3 + 64*5, 1, "zsc0");
2725    
2726     /* Not supported by NetBSD 1.6.2, but by 2.0_BETA: */
2727     j = dev_pckbc_init(machine, mem, 0x1fbd9840, PCKBC_8242,
2728 dpavlin 6 0, 0, machine->use_x11, 0); /* TODO: irq numbers */
2729 dpavlin 2
2730     if (machine->use_x11)
2731     machine->main_console_handle = j;
2732    
2733     /* sq0: Ethernet. TODO: This should have irq_nr = 8 + 3 */
2734     /* dev_sq_init... */
2735    
2736     /* wdsc0: SCSI */
2737     dev_wdsc_init(machine, mem, 0x1fbc4000, 0, 8 + 1);
2738    
2739     /* wdsc1: SCSI TODO: irq nr */
2740     dev_wdsc_init(machine, mem, 0x1fbcc000, 1, 8 + 1);
2741    
2742     /* dsclock0: TODO: possibly irq 8 + 33 */
2743    
2744     /* Return memory read errors so that hpc1 and hpc2 are not detected: */
2745     device_add(machine, "unreadable addr=0x1fb00000, len=0x10000");
2746     device_add(machine, "unreadable addr=0x1f980000, len=0x10000");
2747    
2748     /* Similarly for gio slots 0, 1, and 2: */
2749     device_add(machine, "unreadable addr=0x1f400000, len=0x1000"); /* gio0 slot 0 */
2750     device_add(machine, "unreadable addr=0x1f600000, len=0x1000"); /* gio0 slot 1 */
2751     device_add(machine, "unreadable addr=0x1f000000, len=0x1000"); /* gio0 slot 2 */
2752    
2753     break;
2754     case 25:
2755     /* NOTE: Special case for arc_wordlen: */
2756     arc_wordlen = sizeof(uint64_t);
2757     strcat(machine->machine_name, " (Everest IP25)");
2758    
2759     /* serial? irix? */
2760     dev_scc_init(machine, mem,
2761     0x400086000ULL, 0, machine->use_x11, 0, 8);
2762    
2763     /* NOTE: ip19! (perhaps not really the same */
2764     device_add(machine, "sgi_ip19 addr=0x18000000");
2765    
2766     /*
2767     * Memory size, not 4096 byte pages, but 256
2768     * bytes? (16 is size of kernel... approx)
2769     */
2770     store_32bit_word(cpu, 0xa0000000ULL + 0x26d0,
2771     30000); /* (machine->physical_ram_in_mb - 16)
2772     * (1048576 / 256)); */
2773    
2774     break;
2775     case 26:
2776     /* NOTE: Special case for arc_wordlen: */
2777     arc_wordlen = sizeof(uint64_t);
2778     strcat(machine->machine_name,
2779     " (uknown SGI-IP26 ?)"); /* TODO */
2780     machine->main_console_handle =
2781     dev_zs_init(machine, mem, 0x1fbd9830,
2782     0, 1, "zs console");
2783     break;
2784     case 27:
2785     strcat(machine->machine_name,
2786     " (Origin 200/2000, Onyx2)");
2787     arc_wordlen = sizeof(uint64_t);
2788     /* 2 cpus per node */
2789    
2790     machine->main_console_handle =
2791     dev_zs_init(machine, mem, 0x1fbd9830,
2792     0, 1, "zs console");
2793     break;
2794     case 28:
2795     /* NOTE: Special case for arc_wordlen: */
2796     arc_wordlen = sizeof(uint64_t);
2797     strcat(machine->machine_name, " (Impact Indigo2 ?)");
2798    
2799     device_add(machine, "random addr=0x1fbe0000, len=1");
2800    
2801     /* Something at paddr 0x1880fb0000. */
2802    
2803     break;
2804     case 30:
2805     /* NOTE: Special case for arc_wordlen: */
2806     arc_wordlen = sizeof(uint64_t);
2807     strcat(machine->machine_name, " (Octane)");
2808    
2809 dpavlin 6 machine->md_int.sgi_ip30_data = dev_sgi_ip30_init(machine, mem, 0x0ff00000);
2810 dpavlin 2 machine->md_interrupt = sgi_ip30_interrupt;
2811    
2812     dev_ram_init(mem, 0xa0000000ULL,
2813     128 * 1048576, DEV_RAM_MIRROR, 0x00000000);
2814    
2815     dev_ram_init(mem, 0x80000000ULL,
2816     32 * 1048576, DEV_RAM_RAM, 0x00000000);
2817    
2818     /*
2819     * Something at paddr=1f022004: TODO
2820     * Something at paddr=813f0510 - paddr=813f0570 ?
2821     * Something at paddr=813f04b8
2822     * Something at paddr=f8000003c used by Linux/Octane
2823     *
2824     * 16550 serial port at paddr=1f620178, addr mul 1
2825     * (Error messages are printed to this serial port by the PROM.)
2826     *
2827     * There seems to also be a serial port at 1f620170. The "symmon"
2828     * program dumps something there, but it doesn't look like
2829     * readable text. (TODO)
2830     */
2831     machine->main_console_handle = dev_ns16550_init(machine, mem, 0x1f620170, 0, 1,
2832     machine->use_x11? 0 : 1, "serial 0"); /* TODO: irq? */
2833     dev_ns16550_init(machine, mem, 0x1f620178, 0, 1,
2834     0, "serial 1"); /* TODO: irq? */
2835    
2836     /* MardiGras graphics: */
2837     device_add(machine, "sgi_mardigras addr=0x1c000000");
2838    
2839     break;
2840     case 32:
2841     strcat(machine->machine_name, " (O2)");
2842    
2843     /* TODO: Find out where the physical ram is actually located. */
2844     dev_ram_init(mem, 0x07ffff00ULL, 256, DEV_RAM_MIRROR, 0x03ffff00);
2845     dev_ram_init(mem, 0x10000000ULL, 256, DEV_RAM_MIRROR, 0x00000000);
2846     dev_ram_init(mem, 0x11ffff00ULL, 256, DEV_RAM_MIRROR, 0x01ffff00);
2847     dev_ram_init(mem, 0x12000000ULL, 256, DEV_RAM_MIRROR, 0x02000000);
2848     dev_ram_init(mem, 0x17ffff00ULL, 256, DEV_RAM_MIRROR, 0x03ffff00);
2849     dev_ram_init(mem, 0x20000000ULL, 128 * 1048576, DEV_RAM_MIRROR, 0x00000000);
2850     dev_ram_init(mem, 0x40000000ULL, 128 * 1048576, DEV_RAM_MIRROR, 0x10000000);
2851    
2852 dpavlin 6 machine->md_int.ip32.crime_data = dev_crime_init(machine, mem, 0x14000000, 2, machine->use_x11); /* crime0 */
2853 dpavlin 2 dev_sgi_mte_init(mem, 0x15000000); /* mte ??? memory thing */
2854     dev_sgi_gbe_init(machine, mem, 0x16000000); /* gbe? framebuffer? */
2855    
2856     /*
2857     * A combination of NetBSD and Linux info:
2858     *
2859     * 17000000 vice (Video Image Compression Engine)
2860     * 1f000000 mace
2861     * 1f080000 macepci
2862     * 1f100000 vin1
2863     * 1f180000 vin2
2864     * 1f200000 vout
2865     * 1f280000 enet (mec0, MAC-110 Ethernet)
2866     * 1f300000 perif:
2867     * 1f300000 audio
2868     * 1f310000 isa
2869     * 1f318000 (accessed by Irix' pciio_pio_write64)
2870     * 1f320000 kbdms
2871     * 1f330000 i2c
2872     * 1f340000 ust
2873     * 1f380000 isa ext
2874     * 1f390000 com0 (serial)
2875     * 1f398000 com1 (serial)
2876     * 1f3a0000 mcclock0
2877     */
2878    
2879 dpavlin 6 machine->md_int.ip32.mace_data = dev_mace_init(mem, 0x1f310000, 2);
2880 dpavlin 2 machine->md_interrupt = sgi_ip32_interrupt;
2881    
2882     /*
2883     * IRQ mapping is really ugly. TODO: fix
2884     *
2885     * com0 at mace0 offset 0x390000 intr 4 intrmask 0x3f00000: ns16550a, working fifo
2886     * com1 at mace0 offset 0x398000 intr 4 intrmask 0xfc000000: ns16550a, working fifo
2887     * pckbc0 at mace0 offset 0x320000 intr 5 intrmask 0x0
2888     * mcclock0 at mace0 offset 0x3a0000 intrmask 0x0
2889     * macepci0 at mace0 offset 0x80000 intr 7 intrmask 0x0: rev 1
2890     *
2891     * intr 4 = MACE_PERIPH_SERIAL
2892     * intr 5 = MACE_PERIPH_MISC
2893     * intr 7 = MACE_PCI_BRIDGE
2894     */
2895    
2896     i = dev_pckbc_init(machine, mem, 0x1f320000,
2897     PCKBC_8242, 0x200 + MACE_PERIPH_MISC,
2898 dpavlin 6 0x800 + MACE_PERIPH_MISC, machine->use_x11, 0);
2899 dpavlin 2 /* keyb+mouse (mace irq numbers) */
2900    
2901     net_generate_unique_mac(machine, macaddr);
2902     eaddr_string = malloc(30);
2903     if (eaddr_string == NULL) {
2904     fprintf(stderr, "out of memory\n");
2905     exit(1);
2906     }
2907     sprintf(eaddr_string, "eaddr=%02x:%02x:"
2908     "%02x:%02x:%02x:%02x",
2909     macaddr[0], macaddr[1], macaddr[2],
2910     macaddr[3], macaddr[4], macaddr[5]);
2911     dev_sgi_mec_init(machine, mem, 0x1f280000, MACE_ETHERNET, macaddr);
2912    
2913     dev_sgi_ust_init(mem, 0x1f340000); /* ust? */
2914    
2915     j = dev_ns16550_init(machine, mem, 0x1f390000,
2916     (1<<20) + MACE_PERIPH_SERIAL, 0x100,
2917     machine->use_x11? 0 : 1, "serial 0"); /* com0 */
2918     dev_ns16550_init(machine, mem, 0x1f398000,
2919     (1<<26) + MACE_PERIPH_SERIAL, 0x100,
2920     0, "serial 1"); /* com1 */
2921    
2922     if (machine->use_x11)
2923     machine->main_console_handle = i;
2924     else
2925     machine->main_console_handle = j;
2926    
2927     dev_mc146818_init(machine, mem, 0x1f3a0000, (1<<8) + MACE_PERIPH_MISC, MC146818_SGI, 0x40); /* mcclock0 */
2928     dev_zs_init(machine, mem, 0x1fbd9830, 0, 1, "zs console");
2929    
2930     /*
2931     * PCI devices: (according to NetBSD's GENERIC config file for sgimips)
2932     *
2933     * ne* at pci? dev ? function ?
2934     * ahc0 at pci0 dev 1 function ?
2935     * ahc1 at pci0 dev 2 function ?
2936     */
2937    
2938     pci_data = dev_macepci_init(mem, 0x1f080000, MACE_PCI_BRIDGE); /* macepci0 */
2939     /* bus_pci_add(machine, pci_data, mem, 0, 0, 0, pci_ne2000_init, pci_ne2000_rr); TODO */
2940 dpavlin 6
2941     /* TODO: make this nicer */
2942     if (diskimage_exist(machine, 0, DISKIMAGE_SCSI) ||
2943     diskimage_exist(machine, 1, DISKIMAGE_SCSI) ||
2944     diskimage_exist(machine, 2, DISKIMAGE_SCSI) ||
2945     diskimage_exist(machine, 3, DISKIMAGE_SCSI) ||
2946     diskimage_exist(machine, 4, DISKIMAGE_SCSI) ||
2947     diskimage_exist(machine, 5, DISKIMAGE_SCSI) ||
2948     diskimage_exist(machine, 6, DISKIMAGE_SCSI) ||
2949     diskimage_exist(machine, 7, DISKIMAGE_SCSI))
2950     bus_pci_add(machine, pci_data, mem, 0, 1, 0, pci_ahc_init, pci_ahc_rr);
2951    
2952     /* TODO: second ahc */
2953 dpavlin 2 /* bus_pci_add(machine, pci_data, mem, 0, 2, 0, pci_ahc_init, pci_ahc_rr); */
2954    
2955     break;
2956     case 35:
2957     strcat(machine->machine_name, " (Origin 3000)");
2958     /* 4 cpus per node */
2959    
2960     machine->main_console_handle =
2961     dev_zs_init(machine, mem, 0x1fbd9830,
2962     0, 1, "zs console");
2963     break;
2964     case 53:
2965     strcat(machine->machine_name, " (Origin 350)");
2966     /*
2967     * According to http://kumba.drachentekh.net/xml/myguide.html
2968     * Origin 350, Tezro IP53 R16000
2969     */
2970     break;
2971     default:
2972     fatal("unimplemented SGI machine type IP%i\n",
2973     machine->machine_subtype);
2974     exit(1);
2975     }
2976     } else {
2977     switch (machine->machine_subtype) {
2978    
2979     case MACHINE_ARC_NEC_RD94:
2980     case MACHINE_ARC_NEC_R94:
2981     case MACHINE_ARC_NEC_R96:
2982     /*
2983     * "NEC-RD94" (NEC RISCstation 2250)
2984     * "NEC-R94" (NEC RISCstation 2200)
2985     * "NEC-R96" (NEC Express RISCserver)
2986     *
2987     * http://mirror.aarnet.edu.au/pub/NetBSD/misc/chs/arcdiag.out (NEC-R96)
2988     */
2989    
2990     switch (machine->machine_subtype) {
2991     case MACHINE_ARC_NEC_RD94:
2992     strcat(machine->machine_name, " (NEC-RD94, NEC RISCstation 2250)");
2993     break;
2994     case MACHINE_ARC_NEC_R94:
2995     strcat(machine->machine_name, " (NEC-R94; NEC RISCstation 2200)");
2996     break;
2997     case MACHINE_ARC_NEC_R96:
2998     strcat(machine->machine_name, " (NEC-R96; NEC Express RISCserver)");
2999     break;
3000     }
3001    
3002     /* TODO: interrupt controller! */
3003    
3004     pci_data = device_add(machine,
3005     "rd94 addr=0x80000000, irq=0");
3006    
3007     device_add(machine, "sn addr=0x80001000 irq=0");
3008     dev_mc146818_init(machine, mem, 0x80004000ULL, 0, MC146818_ARC_NEC, 1);
3009 dpavlin 6 i = dev_pckbc_init(machine, mem, 0x80005000ULL, PCKBC_8042, 0, 0, machine->use_x11, 0);
3010 dpavlin 2 j = dev_ns16550_init(machine, mem, 0x80006000ULL,
3011     3, 1, machine->use_x11? 0 : 1, "serial 0"); /* com0 */
3012     dev_ns16550_init(machine, mem, 0x80007000ULL,
3013     0, 1, 0, "serial 1"); /* com1 */
3014    
3015     if (machine->use_x11)
3016     machine->main_console_handle = i;
3017     else
3018     machine->main_console_handle = j;
3019    
3020     /* lpt at 0x80008000 */
3021    
3022     device_add(machine, "fdc addr=0x8000c000, irq=0");
3023    
3024     switch (machine->machine_subtype) {
3025     case MACHINE_ARC_NEC_RD94:
3026     case MACHINE_ARC_NEC_R94:
3027     /* PCI devices: (NOTE: bus must be 0, device must be 3, 4, or 5, for NetBSD to accept interrupts) */
3028     bus_pci_add(machine, pci_data, mem, 0, 3, 0, pci_dec21030_init, pci_dec21030_rr); /* tga graphics */
3029     break;
3030     case MACHINE_ARC_NEC_R96:
3031     dev_fb_init(machine, mem, 0x100e00000ULL,
3032     VFB_GENERIC, 640,480, 1024,480,
3033     8, "necvdfrb", 1);
3034     break;
3035     }
3036     break;
3037    
3038     case MACHINE_ARC_NEC_R98:
3039     /*
3040     * "NEC-R98" (NEC RISCserver 4200)
3041     *
3042     * According to http://mail-index.netbsd.org/port-arc/2004/02/01/0001.html:
3043     *
3044     * Network adapter at "start: 0x 0 18600000, length: 0x1000, level: 4, vector: 9"
3045     * Disk at "start: 0x 0 18c103f0, length: 0x1000, level: 5, vector: 6"
3046     * Keyboard at "start: 0x 0 18c20060, length: 0x1000, level: 5, vector: 3"
3047     * Serial at "start: 0x 0 18c103f8, length: 0x1000, level: 5, vector: 4"
3048     * Serial at "start: 0x 0 18c102f8, length: 0x1000, level: 5, vector: 4"
3049     * Parallel at "start: 0x 0 18c10278, length: 0x1000, level: 5, vector: 5"
3050     */
3051    
3052     strcat(machine->machine_name, " (NEC-R98; NEC RISCserver 4200)");
3053    
3054     /*
3055     * Windows NT access stuff at these addresses:
3056     *
3057     * 19980308, 18000210, 18c0a008,
3058     * 19022018, 19026010, andso on.
3059     */
3060     break;
3061    
3062     case MACHINE_ARC_JAZZ_PICA:
3063     case MACHINE_ARC_JAZZ_MAGNUM:
3064     /*
3065     * "PICA-61"
3066     *
3067     * According to NetBSD 1.6.2:
3068     *
3069     * jazzio0 at mainbus0
3070     * timer0 at jazzio0 addr 0xe0000228
3071     * mcclock0 at jazzio0 addr 0xe0004000: mc146818 or compatible
3072     * lpt at jazzio0 addr 0xe0008000 intr 0 not configured
3073     * fdc at jazzio0 addr 0xe0003000 intr 1 not configured
3074     * MAGNUM at jazzio0 addr 0xe000c000 intr 2 not configured
3075     * ALI_S3 at jazzio0 addr 0xe0800000 intr 3 not configured
3076     * sn0 at jazzio0 addr 0xe0001000 intr 4: SONIC Ethernet
3077     * sn0: Ethernet address 69:6a:6b:6c:00:00
3078     * asc0 at jazzio0 addr 0xe0002000 intr 5: NCR53C94, target 0
3079     * pckbd at jazzio0 addr 0xe0005000 intr 6 not configured
3080     * pms at jazzio0 addr 0xe0005000 intr 7 not configured
3081     * com0 at jazzio0 addr 0xe0006000 intr 8: ns16550a, working fifo
3082     * com at jazzio0 addr 0xe0007000 intr 9 not configured
3083     * jazzisabr0 at mainbus0
3084     * isa0 at jazzisabr0 isa_io_base 0xe2000000 isa_mem_base 0xe3000000
3085     *
3086     * "Microsoft-Jazz", "MIPS Magnum"
3087     *
3088     * timer0 at jazzio0 addr 0xe0000228
3089     * mcclock0 at jazzio0 addr 0xe0004000: mc146818 or compatible
3090     * lpt at jazzio0 addr 0xe0008000 intr 0 not configured
3091     * fdc at jazzio0 addr 0xe0003000 intr 1 not configured
3092     * MAGNUM at jazzio0 addr 0xe000c000 intr 2 not configured
3093     * VXL at jazzio0 addr 0xe0800000 intr 3 not configured
3094     * sn0 at jazzio0 addr 0xe0001000 intr 4: SONIC Ethernet
3095     * sn0: Ethernet address 69:6a:6b:6c:00:00
3096     * asc0 at jazzio0 addr 0xe0002000 intr 5: NCR53C94, target 0
3097     * scsibus0 at asc0: 8 targets, 8 luns per target
3098     * pckbd at jazzio0 addr 0xe0005000 intr 6 not configured
3099     * pms at jazzio0 addr 0xe0005000 intr 7 not configured
3100     * com0 at jazzio0 addr 0xe0006000 intr 8: ns16550a, working fifo
3101     * com at jazzio0 addr 0xe0007000 intr 9 not configured
3102     * jazzisabr0 at mainbus0
3103     * isa0 at jazzisabr0 isa_io_base 0xe2000000 isa_mem_base 0xe3000000
3104     */
3105    
3106     switch (machine->machine_subtype) {
3107     case MACHINE_ARC_JAZZ_PICA:
3108     strcat(machine->machine_name, " (Microsoft Jazz, Acer PICA-61)");
3109     break;
3110     case MACHINE_ARC_JAZZ_MAGNUM:
3111     strcat(machine->machine_name, " (Microsoft Jazz, MIPS Magnum)");
3112     break;
3113     default:
3114     fatal("error in machine.c. jazz\n");
3115     exit(1);
3116     }
3117    
3118 dpavlin 6 machine->md_int.jazz_data = device_add(machine,
3119 dpavlin 2 "jazz addr=0x80000000");
3120     machine->md_interrupt = jazz_interrupt;
3121    
3122 dpavlin 6 i = dev_pckbc_init(machine, mem, 0x80005000ULL,
3123     PCKBC_JAZZ, 8 + 6, 8 + 7, machine->use_x11, 0);
3124    
3125     j = dev_ns16550_init(machine, mem,
3126     0x80006000ULL, 8 + 8, 1,
3127     machine->use_x11? 0 : 1, "serial 0");
3128     dev_ns16550_init(machine, mem,
3129     0x80007000ULL, 8 + 9, 1, 0, "serial 1");
3130    
3131     if (machine->use_x11)
3132     machine->main_console_handle = i;
3133     else
3134     machine->main_console_handle = j;
3135    
3136 dpavlin 2 switch (machine->machine_subtype) {
3137     case MACHINE_ARC_JAZZ_PICA:
3138 dpavlin 6 if (machine->use_x11) {
3139     dev_vga_init(machine, mem,
3140     0x400a0000ULL, 0x600003c0ULL,
3141     machine->machine_name);
3142     arcbios_console_init(machine,
3143     0x400b8000ULL, 0x600003c0ULL);
3144     }
3145 dpavlin 2 break;
3146     case MACHINE_ARC_JAZZ_MAGNUM:
3147     /* PROM mirror? */
3148     dev_ram_init(mem, 0xfff00000, 0x100000,
3149     DEV_RAM_MIRROR, 0x1fc00000);
3150    
3151     /* VXL. TODO */
3152     /* control at 0x60100000? */
3153     dev_fb_init(machine, mem, 0x60200000ULL,
3154     VFB_GENERIC, 1024,768, 1024,768,
3155     8, "VXL", 1);
3156     break;
3157     }
3158    
3159     /* irq 8 + 4 */
3160     device_add(machine, "sn addr=0x80001000 irq=12");
3161    
3162     dev_asc_init(machine, mem,
3163     0x80002000ULL, 8 + 5, NULL, DEV_ASC_PICA,
3164 dpavlin 6 dev_jazz_dma_controller,
3165     machine->md_int.jazz_data);
3166 dpavlin 2
3167     device_add(machine, "fdc addr=0x80003000, irq=0");
3168    
3169     dev_mc146818_init(machine, mem,
3170     0x80004000ULL, 2, MC146818_ARC_JAZZ, 1);
3171    
3172     #if 0
3173     Not yet.
3174     dev_wdc_init(machine, mem, 0x900001f0ULL, 8+16 + 14, 0);
3175     #endif
3176    
3177     break;
3178    
3179     case MACHINE_ARC_JAZZ_M700:
3180     /*
3181     * "Microsoft-Jazz", "Olivetti M700"
3182     *
3183     * Different enough from Pica and Magnum to be
3184     * separate here.
3185     *
3186     * See http://mail-index.netbsd.org/port-arc/2000/10/18/0001.html.
3187     */
3188    
3189     strcat(machine->machine_name, " (Microsoft Jazz, Olivetti M700)");
3190    
3191 dpavlin 6 machine->md_int.jazz_data = device_add(machine,
3192 dpavlin 2 "jazz addr=0x80000000");
3193     machine->md_interrupt = jazz_interrupt;
3194    
3195     dev_mc146818_init(machine, mem,
3196     0x80004000ULL, 2, MC146818_ARC_JAZZ, 1);
3197    
3198     i = 0; /* TODO: Yuck! */
3199     #if 0
3200     i = dev_pckbc_init(machine, mem, 0x80005000ULL,
3201 dpavlin 6 PCKBC_JAZZ, 8 + 6, 8 + 7, machine->use_x11, 0);
3202 dpavlin 2 #endif
3203     j = dev_ns16550_init(machine, mem,
3204     0x80006000ULL, 8 + 8, 1,
3205     machine->use_x11? 0 : 1, "serial 0");
3206     dev_ns16550_init(machine, mem,
3207     0x80007000ULL, 8 + 9, 1, 0, "serial 1");
3208    
3209     if (machine->use_x11)
3210     machine->main_console_handle = i;
3211     else
3212     machine->main_console_handle = j;
3213    
3214     dev_m700_fb_init(machine, mem,
3215     0x180080000ULL, 0x100000000ULL);
3216    
3217     break;
3218    
3219     case MACHINE_ARC_DESKTECH_TYNE:
3220     /*
3221     * "Deskstation Tyne" (?)
3222     *
3223     * TODO
3224     * http://mail-index.netbsd.org/port-arc/2000/10/14/0000.html
3225     */
3226    
3227     strcat(machine->machine_name, " (Deskstation Tyne)");
3228    
3229     i = dev_ns16550_init(machine, mem, 0x9000003f8ULL, 0, 1, machine->use_x11? 0 : 1, "serial 0");
3230     dev_ns16550_init(machine, mem, 0x9000002f8ULL, 0, 1, 0, "serial 1");
3231     dev_ns16550_init(machine, mem, 0x9000003e8ULL, 0, 1, 0, "serial 2");
3232     dev_ns16550_init(machine, mem, 0x9000002e8ULL, 0, 1, 0, "serial 3");
3233    
3234     dev_mc146818_init(machine, mem,
3235     0x900000070ULL, 2, MC146818_PC_CMOS, 1);
3236    
3237     #if 0
3238     dev_wdc_init(machine, mem, 0x9000001f0ULL, 0, 0);
3239     dev_wdc_init(machine, mem, 0x900000170ULL, 0, 2);
3240     #endif
3241     /* PC kbd */
3242     j = dev_pckbc_init(machine, mem, 0x900000060ULL,
3243 dpavlin 6 PCKBC_8042, 0, 0, machine->use_x11, 0);
3244 dpavlin 2
3245     if (machine->use_x11)
3246     machine->main_console_handle = j;
3247     else
3248     machine->main_console_handle = i;
3249    
3250 dpavlin 6 if (machine->use_x11) {
3251     dev_vga_init(machine, mem, 0x1000a0000ULL,
3252     0x9000003c0ULL, machine->machine_name);
3253    
3254     arcbios_console_init(machine,
3255     0x1000b8000ULL, 0x9000003c0ULL);
3256     }
3257 dpavlin 2 break;
3258    
3259     default:
3260     fatal("Unimplemented ARC machine type %i\n",
3261     machine->machine_subtype);
3262     exit(1);
3263     }
3264     }
3265    
3266     /*
3267     * This is important: :-)
3268     *
3269 dpavlin 6 * TODO: There should not be any use of ARCBIOS before this
3270     * point.
3271 dpavlin 2 */
3272    
3273 dpavlin 6 if (machine->prom_emulation)
3274     arcbios_init(machine, arc_wordlen == sizeof(uint64_t),
3275     sgi_ram_offset);
3276     else
3277     goto no_arc_prom_emulation; /* TODO: ugly */
3278 dpavlin 2
3279     /*
3280     * TODO: How to build the component tree intermixed with
3281     * the rest of device initialization?
3282     */
3283    
3284     /*
3285     * Boot string in ARC format:
3286     *
3287     * TODO: How about floppies? multi()disk()fdisk()
3288     * Is tftp() good for netbooting?
3289     */
3290     init_bootpath = malloc(500);
3291     if (init_bootpath == NULL) {
3292     fprintf(stderr, "out of mem, bootpath\n");
3293     exit(1);
3294     }
3295     init_bootpath[0] = '\0';
3296    
3297     if (bootdev_id < 0 || machine->force_netboot) {
3298     snprintf(init_bootpath, 400, "tftp()");
3299     } else {
3300     /* TODO: Make this nicer. */
3301     if (machine->machine_type == MACHINE_SGI) {
3302     if (machine->machine_subtype == 30)
3303     strcat(init_bootpath, "xio(0)pci(15)");
3304     if (machine->machine_subtype == 32)
3305     strcat(init_bootpath, "pci(0)");
3306     }
3307    
3308 dpavlin 6 if (diskimage_is_a_cdrom(machine, bootdev_id,
3309     bootdev_type))
3310     snprintf(init_bootpath + strlen(init_bootpath),
3311     400,"scsi(0)cdrom(%i)fdisk(0)", bootdev_id);
3312 dpavlin 2 else
3313 dpavlin 6 snprintf(init_bootpath + strlen(init_bootpath),
3314     400,"scsi(0)disk(%i)rdisk(0)partition(1)",
3315     bootdev_id);
3316 dpavlin 2 }
3317    
3318     if (machine->machine_type == MACHINE_ARC)
3319     strcat(init_bootpath, "\\");
3320    
3321     bootstr = malloc(strlen(init_bootpath) +
3322     strlen(machine->boot_kernel_filename) + 1);
3323     strcpy(bootstr, init_bootpath);
3324     strcat(bootstr, machine->boot_kernel_filename);
3325    
3326     /* Boot args., eg "-a" */
3327     bootarg = machine->boot_string_argument;
3328    
3329     /* argc, argv, envp in a0, a1, a2: */
3330     cpu->cd.mips.gpr[MIPS_GPR_A0] = 0; /* note: argc is increased later */
3331    
3332     /* TODO: not needed? */
3333 dpavlin 6 cpu->cd.mips.gpr[MIPS_GPR_SP] = (int64_t)(int32_t)
3334     (machine->physical_ram_in_mb * 1048576 + 0x80000000 - 0x2080);
3335 dpavlin 2
3336     /* Set up argc/argv: */
3337     addr = ARC_ENV_STRINGS;
3338     addr2 = ARC_ARGV_START;
3339     cpu->cd.mips.gpr[MIPS_GPR_A1] = addr2;
3340    
3341     /* bootstr: */
3342     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3343     add_environment_string(cpu, bootstr, &addr);
3344     cpu->cd.mips.gpr[MIPS_GPR_A0] ++;
3345    
3346     /* bootarg: */
3347     if (bootarg[0] != '\0') {
3348     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3349     add_environment_string(cpu, bootarg, &addr);
3350     cpu->cd.mips.gpr[MIPS_GPR_A0] ++;
3351     }
3352    
3353     cpu->cd.mips.gpr[MIPS_GPR_A2] = addr2;
3354    
3355     /*
3356     * Add environment variables. For each variable, add it
3357     * as a string using add_environment_string(), and add a
3358     * pointer to it to the ARC_ENV_POINTERS array.
3359     */
3360     if (machine->use_x11) {
3361     if (machine->machine_type == MACHINE_ARC) {
3362     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3363     add_environment_string(cpu, "CONSOLEIN=multi()key()keyboard()console()", &addr);
3364     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3365     add_environment_string(cpu, "CONSOLEOUT=multi()video()monitor()console()", &addr);
3366     } else {
3367     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3368     add_environment_string(cpu, "ConsoleIn=keyboard()", &addr);
3369     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3370     add_environment_string(cpu, "ConsoleOut=video()", &addr);
3371    
3372     /* g for graphical mode. G for graphical mode
3373     with SGI logo visible on Irix? */
3374     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3375     add_environment_string(cpu, "console=g", &addr);
3376     }
3377     } else {
3378     if (machine->machine_type == MACHINE_ARC) {
3379     /* TODO: serial console for ARC? */
3380     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3381     add_environment_string(cpu, "CONSOLEIN=multi()serial(0)", &addr);
3382     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3383     add_environment_string(cpu, "CONSOLEOUT=multi()serial(0)", &addr);
3384     } else {
3385     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3386     add_environment_string(cpu, "ConsoleIn=serial(0)", &addr);
3387     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3388     add_environment_string(cpu, "ConsoleOut=serial(0)", &addr);
3389    
3390     /* 'd' or 'd2' in Irix, 'ttyS0' in Linux? */
3391     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3392     add_environment_string(cpu, "console=d", &addr); /* d2 = serial? */
3393     }
3394     }
3395    
3396     if (machine->machine_type == MACHINE_SGI) {
3397     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3398     add_environment_string(cpu, "AutoLoad=No", &addr);
3399     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3400     add_environment_string(cpu, "diskless=0", &addr);
3401     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3402     add_environment_string(cpu, "volume=80", &addr);
3403     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3404     add_environment_string(cpu, "sgilogo=y", &addr);
3405    
3406     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3407     add_environment_string(cpu, "monitor=h", &addr);
3408     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3409     add_environment_string(cpu, "TimeZone=GMT", &addr);
3410     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3411     add_environment_string(cpu, "nogfxkbd=1", &addr);
3412    
3413     /* TODO: 'xio(0)pci(15)scsi(0)disk(1)rdisk(0)partition(0)' on IP30 at least */
3414    
3415     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3416     add_environment_string(cpu, "SystemPartition=pci(0)scsi(0)disk(2)rdisk(0)partition(8)", &addr);
3417     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3418     add_environment_string(cpu, "OSLoadPartition=pci(0)scsi(0)disk(2)rdisk(0)partition(0)", &addr);
3419     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3420     add_environment_string(cpu, "OSLoadFilename=/unix", &addr);
3421     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3422     add_environment_string(cpu, "OSLoader=sash", &addr);
3423    
3424     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3425     add_environment_string(cpu, "rbaud=9600", &addr);
3426     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3427     add_environment_string(cpu, "rebound=y", &addr);
3428     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3429     add_environment_string(cpu, "crt_option=1", &addr);
3430     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3431     add_environment_string(cpu, "netaddr=10.0.0.1", &addr);
3432    
3433     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3434     add_environment_string(cpu, "keybd=US", &addr);
3435    
3436     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3437     add_environment_string(cpu, "cpufreq=3", &addr);
3438     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3439     add_environment_string(cpu, "dbaud=9600", &addr);
3440     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3441     add_environment_string(cpu, eaddr_string, &addr);
3442     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3443     add_environment_string(cpu, "verbose=istrue", &addr);
3444     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3445     add_environment_string(cpu, "showconfig=istrue", &addr);
3446     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3447     add_environment_string(cpu, "diagmode=v", &addr);
3448     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3449     add_environment_string(cpu, "kernname=unix", &addr);
3450     } else {
3451     char *tmp;
3452     tmp = malloc(strlen(bootarg) + strlen("OSLOADOPTIONS=") + 2);
3453     sprintf(tmp, "OSLOADOPTIONS=%s", bootarg);
3454     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3455     add_environment_string(cpu, tmp, &addr);
3456    
3457     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3458     add_environment_string(cpu, "OSLOADPARTITION=scsi(0)cdrom(6)fdisk(0);scsi(0)disk(0)rdisk(0)partition(1)", &addr);
3459    
3460     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3461     add_environment_string(cpu, "SYSTEMPARTITION=scsi(0)cdrom(6)fdisk(0);scsi(0)disk(0)rdisk(0)partition(1)", &addr);
3462     }
3463    
3464     /* End the environment strings with an empty zero-terminated
3465     string, and the envp array with a NULL pointer. */
3466     add_environment_string(cpu, "", &addr); /* the end */
3467     store_pointer_and_advance(cpu, &addr2,
3468     0, arc_wordlen==sizeof(uint64_t));
3469    
3470     no_arc_prom_emulation: /* TODO: ugly, get rid of the goto */
3471    
3472     /* Return address: (0x20 = ReturnFromMain()) */
3473     cpu->cd.mips.gpr[MIPS_GPR_RA] = ARC_FIRMWARE_ENTRIES + 0x20;
3474    
3475     break;
3476    
3477     case MACHINE_MESHCUBE:
3478     machine->machine_name = "MeshCube";
3479    
3480     if (machine->physical_ram_in_mb != 64)
3481     fprintf(stderr, "WARNING! MeshCubes are supposed to have exactly 64 MB RAM. Continuing anyway.\n");
3482     if (machine->use_x11)
3483     fprintf(stderr, "WARNING! MeshCube with -X is meaningless. Continuing anyway.\n");
3484    
3485     /* First of all, the MeshCube has an Au1500 in it: */
3486     machine->md_interrupt = au1x00_interrupt;
3487 dpavlin 6 machine->md_int.au1x00_ic_data = dev_au1x00_init(machine, mem);
3488 dpavlin 2
3489     /*
3490     * TODO: Which non-Au1500 devices, and at what addresses?
3491     *
3492     * "4G Systems MTX-1 Board" at ?
3493     * 1017fffc, 14005004, 11700000, 11700008, 11900014,
3494     * 1190002c, 11900100, 11900108, 1190010c,
3495     * 10400040 - 10400074,
3496     * 14001000 (possibly LCD?)
3497     * 11100028 (possibly ttySx?)
3498     *
3499     * "usb_ohci=base:0x10100000,len:0x100000,irq:26"
3500     */
3501    
3502     device_add(machine, "random addr=0x1017fffc len=4");
3503    
3504     /*
3505     * TODO: A Linux kernel wants "memsize" from somewhere... I
3506     * haven't found any docs on how it is used though.
3507     */
3508    
3509     cpu->cd.mips.gpr[MIPS_GPR_A0] = 1;
3510     cpu->cd.mips.gpr[MIPS_GPR_A1] = 0xa0001000ULL;
3511     store_32bit_word(cpu, cpu->cd.mips.gpr[MIPS_GPR_A1],
3512     0xa0002000ULL);
3513     store_string(cpu, 0xa0002000ULL, "something=somethingelse");
3514    
3515     cpu->cd.mips.gpr[MIPS_GPR_A2] = 0xa0003000ULL;
3516     store_string(cpu, 0xa0002000ULL, "hello=world\n");
3517    
3518     break;
3519    
3520     case MACHINE_NETGEAR:
3521     machine->machine_name = "NetGear WG602";
3522    
3523     if (machine->use_x11)
3524     fprintf(stderr, "WARNING! NetGear with -X is meaningless. Continuing anyway.\n");
3525     if (machine->physical_ram_in_mb != 16)
3526     fprintf(stderr, "WARNING! Real NetGear WG602 boxes have exactly 16 MB RAM. Continuing anyway.\n");
3527    
3528     /*
3529     * Lots of info about the IDT 79RC 32334
3530     * http://www.idt.com/products/pages/Integrated_Processors-79RC32334.html
3531     */
3532     device_add(machine, "8250 addr=0x18000800 addr_mult=4 irq=0");
3533     break;
3534    
3535     case MACHINE_SONYNEWS:
3536     /*
3537     * There are several models, according to
3538     * http://www.netbsd.org/Ports/newsmips/:
3539     *
3540     * "R3000 and hyper-bus based models"
3541     * NWS-3470D, -3410, -3460, -3710, -3720
3542     *
3543     * "R4000/4400 and apbus based models"
3544     * NWS-5000
3545     *
3546     * For example: (found using google)
3547     *
3548     * cpu_model = news3700
3549     * SONY NET WORK STATION, Model NWS-3710, Machine ID #30145
3550     * cpu0: MIPS R3000 (0x220) Rev. 2.0 with MIPS R3010 Rev.2.0
3551     * 64KB/4B direct-mapped I, 64KB/4B direct-mapped w-thr. D
3552     *
3553     * See http://katsu.watanabe.name/doc/sonynews/model.html
3554     * for more details.
3555     */
3556     cpu->byte_order = EMUL_BIG_ENDIAN;
3557     machine->machine_name = "Sony NeWS (NET WORK STATION)";
3558    
3559     /* This is just a test. TODO */
3560     {
3561     int i;
3562     for (i=0; i<32; i++)
3563     cpu->cd.mips.gpr[i] =
3564     0x01230000 + (i << 8) + 0x55;
3565     }
3566    
3567     machine->main_console_handle =
3568     dev_zs_init(machine, mem, 0x1e950000, 0, 1, "zs console");
3569    
3570     break;
3571    
3572     case MACHINE_BAREPPC:
3573     /*
3574     * A "bare" PPC machine.
3575     *
3576     * NOTE: NO devices at all.
3577     */
3578     machine->machine_name = "\"Bare\" PPC machine";
3579     break;
3580    
3581     case MACHINE_TESTPPC:
3582     /*
3583     * A PPC test machine, similar to the test machine for MIPS.
3584     */
3585     machine->machine_name = "PPC test machine";
3586    
3587     /* TODO: interrupt for PPC? */
3588     machine->main_console_handle = dev_cons_init(
3589     machine, mem, DEV_CONS_ADDRESS, "console", 0);
3590    
3591     snprintf(tmpstr, sizeof(tmpstr) - 1, "mp addr=0x%llx",
3592     (long long)DEV_MP_ADDRESS);
3593     device_add(machine, tmpstr);
3594    
3595     fb = dev_fb_init(machine, mem, 0x12000000, VFB_GENERIC,
3596     640,480, 640,480, 24, "generic", 1);
3597     break;
3598    
3599     case MACHINE_WALNUT:
3600     /*
3601     * NetBSD/evbppc (http://www.netbsd.org/Ports/evbppc/)
3602     */
3603     machine->machine_name = "Walnut evaluation board";
3604    
3605     break;
3606    
3607     case MACHINE_PMPPC:
3608     /*
3609     * NetBSD/pmppc (http://www.netbsd.org/Ports/pmppc/)
3610     */
3611     machine->machine_name = "Artesyn's PM/PPC board";
3612    
3613     dev_pmppc_init(mem);
3614    
3615     /* com0 = 0xff600300, com1 = 0xff600400 */
3616     machine->main_console_handle = dev_ns16550_init(machine, mem,
3617     0xff600300, 0, 1, 1, "serial 0");
3618     dev_ns16550_init(machine, mem,
3619     0xff600400, 0, 1, 0, "serial 1");
3620    
3621     break;
3622    
3623     case MACHINE_SANDPOINT:
3624     /*
3625     * NetBSD/sandpoint (http://www.netbsd.org/Ports/sandpoint/)
3626     */
3627     machine->machine_name = "Motorola Sandpoint";
3628    
3629     {
3630     int i;
3631     for (i=0; i<32; i++)
3632     cpu->cd.ppc.gpr[i] =
3633     0x12340000 + (i << 8) + 0x55;
3634     }
3635    
3636     break;
3637    
3638     case MACHINE_BEBOX:
3639     /*
3640     * NetBSD/bebox (http://www.netbsd.org/Ports/bebox/)
3641     */
3642     machine->machine_name = "BeBox";
3643    
3644     device_add(machine, "bebox");
3645    
3646     /* Serial, used by NetBSD: */
3647     machine->main_console_handle = dev_ns16550_init(machine, mem,
3648     0x800003f8, 0, 1, 1, "serial 0");
3649    
3650     /* Serial, used by Linux: */
3651     dev_ns16550_init(machine, mem, 0x800002f8, 0, 1, 0, "serial 1");
3652    
3653     /* This is used by Linux too: */
3654 dpavlin 6 dev_vga_init(machine, mem, 0xc00a0000ULL, 0x800003c0ULL,
3655 dpavlin 2 machine->machine_name);
3656    
3657     store_32bit_word(cpu, 0x3010,
3658     machine->physical_ram_in_mb * 1048576);
3659    
3660     /* TODO: List of stuff, see http://www.beatjapan.org/
3661     mirror/www.be.com/aboutbe/benewsletter/
3662     Issue27.html#Cookbook for the details. */
3663     store_32bit_word(cpu, 0x301c, 0);
3664    
3665     /* NetBSD/bebox: r3 = startkernel, r4 = endkernel,
3666     r5 = args, r6 = ptr to bootinfo? */
3667     cpu->cd.ppc.gpr[3] = 0x3100;
3668     cpu->cd.ppc.gpr[4] = 0x200000;
3669     cpu->cd.ppc.gpr[5] = 0x2000;
3670     store_string(cpu, cpu->cd.ppc.gpr[5], "-a");
3671     cpu->cd.ppc.gpr[6] = machine->physical_ram_in_mb * 1048576
3672     - 0x100;
3673    
3674     /* See NetBSD's bebox/include/bootinfo.h for details */
3675     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 0, 12); /* next */
3676     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 4, 0); /* mem */
3677     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 8,
3678     machine->physical_ram_in_mb * 1048576);
3679    
3680     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 12, 20); /* next */
3681     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 16, 1); /* console */
3682     store_buf(cpu, cpu->cd.ppc.gpr[6] + 20, "com", 4);
3683     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 24, 0x3f8);/* addr */
3684     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 28, 9600);/* speed */
3685    
3686     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 32, 0); /* next */
3687     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 36, 2); /* clock */
3688     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 40, 100);
3689    
3690     break;
3691    
3692     case MACHINE_PREP:
3693     /*
3694     * NetBSD/prep (http://www.netbsd.org/Ports/prep/)
3695     */
3696     machine->machine_name = "PowerPC Reference Platform";
3697    
3698     {
3699     int i;
3700     for (i=0; i<32; i++)
3701     cpu->cd.ppc.gpr[i] =
3702     0x12340000 + (i << 8) + 0x55;
3703     }
3704    
3705     /* Linux on PReP has 0xdeadc0de at address 0? (See
3706     http://joshua.raleigh.nc.us/docs/linux-2.4.10_html/113568.html) */
3707     store_32bit_word(cpu, 0, 0xdeadc0de);
3708    
3709     /* r6 should point to "residual data"? */
3710     cpu->cd.ppc.gpr[6] = machine->physical_ram_in_mb * 1048576
3711     - 0x1000;
3712    
3713     break;
3714    
3715     case MACHINE_MACPPC:
3716     /*
3717     * NetBSD/macppc (http://www.netbsd.org/Ports/macppc/)
3718     * OpenBSD/macppc (http://www.openbsd.org/macppc.html)
3719     */
3720     machine->machine_name = "Macintosh (PPC)";
3721    
3722     /* r5 = OpenFirmware entry point */
3723     cpu->cd.ppc.gpr[5] = cpu->cd.ppc.of_emul_addr;
3724    
3725     break;
3726    
3727     case MACHINE_DB64360:
3728     /* For playing with PMON2000 for PPC: */
3729     machine->machine_name = "DB64360";
3730    
3731     machine->main_console_handle = dev_ns16550_init(machine, mem,
3732     0x1d000020, 0, 4, 1, "serial console");
3733    
3734     {
3735     int i;
3736     for (i=0; i<32; i++)
3737     cpu->cd.ppc.gpr[i] =
3738     0x12340000 + (i << 8) + 0x55;
3739     }
3740    
3741     break;
3742    
3743     case MACHINE_BARESPARC:
3744     /* A bare SPARC machine, with no devices. */
3745     machine->machine_name = "\"Bare\" SPARC machine";
3746     break;
3747    
3748     case MACHINE_ULTRA1:
3749     /*
3750     * NetBSD/sparc64 (http://www.netbsd.org/Ports/sparc64/)
3751     * OpenBSD/sparc64 (http://www.openbsd.org/sparc64.html)
3752     */
3753     machine->machine_name = "Sun Ultra1";
3754     break;
3755    
3756     case MACHINE_BAREURISC:
3757     machine->machine_name = "\"Bare\" URISC machine";
3758     break;
3759    
3760     case MACHINE_TESTURISC:
3761     machine->machine_name = "URISC test machine";
3762    
3763     /* TODO */
3764     /* A special "device" for accessing normal devices
3765     using urisc accesses? */
3766    
3767     device_add(machine, "urisc addr=0x12341234");
3768    
3769     break;
3770    
3771     case MACHINE_BAREHPPA:
3772     machine->machine_name = "\"Bare\" HPPA machine";
3773     break;
3774    
3775     case MACHINE_TESTHPPA:
3776     machine->machine_name = "HPPA test machine";
3777    
3778     /* TODO */
3779     break;
3780    
3781     case MACHINE_BAREALPHA:
3782     machine->machine_name = "\"Bare\" Alpha machine";
3783     break;
3784    
3785     case MACHINE_TESTALPHA:
3786     machine->machine_name = "Alpha test machine";
3787    
3788     /* TODO */
3789     break;
3790    
3791 dpavlin 6 case MACHINE_BAREARM:
3792     machine->machine_name = "\"Bare\" ARM machine";
3793     break;
3794    
3795     case MACHINE_TESTARM:
3796     machine->machine_name = "ARM test machine";
3797    
3798     /* TODO */
3799     break;
3800    
3801 dpavlin 4 case MACHINE_BAREX86:
3802     machine->machine_name = "\"Bare\" x86 machine";
3803     break;
3804    
3805     case MACHINE_X86:
3806 dpavlin 6 if (machine->machine_subtype == MACHINE_X86_XT)
3807     machine->machine_name = "PC XT";
3808     else
3809     machine->machine_name = "Generic x86 PC";
3810 dpavlin 4
3811 dpavlin 6 /* Interrupt controllers: */
3812     snprintf(tmpstr, sizeof(tmpstr) - 1, "8259 addr=0x%llx",
3813     (long long)(X86_IO_BASE + 0x20));
3814     machine->md.pc.pic1 = device_add(machine, tmpstr);
3815     if (machine->machine_subtype != MACHINE_X86_XT) {
3816     snprintf(tmpstr, sizeof(tmpstr) - 1, "8259 addr=0x%llx irq=2",
3817     (long long)(X86_IO_BASE + 0xa0));
3818     machine->md.pc.pic2 = device_add(machine, tmpstr);
3819 dpavlin 4 }
3820    
3821 dpavlin 6 machine->md_interrupt = x86_pc_interrupt;
3822    
3823     /* Timer: */
3824     snprintf(tmpstr, sizeof(tmpstr) - 1, "8253 addr=0x%llx irq=0",
3825     (long long)(X86_IO_BASE + 0x40));
3826     device_add(machine, tmpstr);
3827    
3828     snprintf(tmpstr, sizeof(tmpstr) - 1, "pccmos addr=0x%llx",
3829     (long long)(X86_IO_BASE + 0x70));
3830     device_add(machine, tmpstr);
3831    
3832     /* TODO: IRQ when emulating a PC XT? */
3833    
3834     /* IDE controllers: */
3835     if (diskimage_exist(machine, 0, DISKIMAGE_IDE) ||
3836     diskimage_exist(machine, 1, DISKIMAGE_IDE))
3837     dev_wdc_init(machine, mem, X86_IO_BASE + 0x1f0, 14, 0);
3838     if (diskimage_exist(machine, 2, DISKIMAGE_IDE) ||
3839     diskimage_exist(machine, 3, DISKIMAGE_IDE))
3840     dev_wdc_init(machine, mem, X86_IO_BASE + 0x170, 15, 2);
3841    
3842     /* Floppy controller at irq 6 */
3843     snprintf(tmpstr, sizeof(tmpstr) - 1, "fdc addr=0x%llx irq=6",
3844     (long long)(X86_IO_BASE + 0x3f0));
3845     device_add(machine, tmpstr);
3846    
3847     /* TODO: sound blaster (eventually) at irq 7? */
3848    
3849     /* TODO: parallel port */
3850    
3851     /* Serial ports: (TODO: 8250 for PC XT?) */
3852     dev_ns16550_init(machine, mem, X86_IO_BASE + 0x3f8, 4, 1, 0, "com1");
3853     dev_ns16550_init(machine, mem, X86_IO_BASE + 0x378, 3, 1, 0, "com2");
3854    
3855     /* VGA + keyboard: */
3856     dev_vga_init(machine, mem, 0xa0000ULL, X86_IO_BASE + 0x3c0,
3857 dpavlin 4 "Generic x86 PC");
3858 dpavlin 6 machine->main_console_handle = dev_pckbc_init(machine,
3859     mem, X86_IO_BASE + 0x60, PCKBC_8042, 1, 12, 1, 1);
3860 dpavlin 4
3861 dpavlin 6 if (machine->prom_emulation)
3862     pc_bios_init(cpu);
3863 dpavlin 4
3864 dpavlin 6 if (!machine->use_x11 && !quiet_mode)
3865     fprintf(stderr, "-------------------------------------"
3866     "------------------------------------------\n"
3867     "\n WARNING! You are emulating a PC without -X. "
3868     "You will miss graphical output!\n\n"
3869     "-------------------------------------"
3870     "------------------------------------------\n");
3871 dpavlin 4 break;
3872    
3873 dpavlin 2 default:
3874     fatal("Unknown emulation type %i\n", machine->machine_type);
3875     exit(1);
3876     }
3877    
3878     if (machine->machine_name != NULL)
3879     debug("machine: %s", machine->machine_name);
3880    
3881     if (machine->emulated_hz > 0)
3882     debug(" (%.2f MHz)", (float)machine->emulated_hz / 1000000);
3883     debug("\n");
3884    
3885     if (machine->emulated_hz < 1)
3886     machine->emulated_hz = 1000000;
3887    
3888     if (bootstr != NULL) {
3889     debug("bootstring%s: %s", (bootarg!=NULL &&
3890     strlen(bootarg) >= 1)? "(+bootarg)" : "", bootstr);
3891     if (bootarg != NULL && strlen(bootarg) >= 1)
3892     debug(" %s", bootarg);
3893     debug("\n");
3894     }
3895     }
3896    
3897    
3898     /*
3899     * machine_memsize_fix():
3900     *
3901     * Sets physical_ram_in_mb (if not already set), and memory_offset_in_mb,
3902     * depending on machine type.
3903     */
3904     void machine_memsize_fix(struct machine *m)
3905     {
3906     if (m == NULL) {
3907     fatal("machine_defaultmemsize(): m == NULL?\n");
3908     exit(1);
3909     }
3910    
3911     if (m->physical_ram_in_mb == 0) {
3912     switch (m->machine_type) {
3913     case MACHINE_PS2:
3914     m->physical_ram_in_mb = 32;
3915     break;
3916     case MACHINE_SGI:
3917     m->physical_ram_in_mb = 64;
3918     break;
3919     case MACHINE_HPCMIPS:
3920     /* Most have 32 MB by default. */
3921     m->physical_ram_in_mb = 32;
3922     switch (m->machine_subtype) {
3923     case MACHINE_HPCMIPS_CASIO_BE300:
3924     m->physical_ram_in_mb = 16;
3925     break;
3926     case MACHINE_HPCMIPS_CASIO_E105:
3927     m->physical_ram_in_mb = 32;
3928     break;
3929     case MACHINE_HPCMIPS_AGENDA_VR3:
3930     m->physical_ram_in_mb = 16;
3931     break;
3932     }
3933     break;
3934     case MACHINE_MESHCUBE:
3935     m->physical_ram_in_mb = 64;
3936     break;
3937     case MACHINE_NETGEAR:
3938     m->physical_ram_in_mb = 16;
3939     break;
3940     case MACHINE_ARC:
3941     switch (m->machine_subtype) {
3942     case MACHINE_ARC_JAZZ_PICA:
3943     m->physical_ram_in_mb = 64;
3944     break;
3945     case MACHINE_ARC_JAZZ_M700:
3946     m->physical_ram_in_mb = 64;
3947     break;
3948     default:
3949     m->physical_ram_in_mb = 32;
3950     }
3951     break;
3952     case MACHINE_DEC:
3953     switch (m->machine_subtype) {
3954     case MACHINE_DEC_PMAX_3100:
3955     m->physical_ram_in_mb = 24;
3956     break;
3957     default:
3958     m->physical_ram_in_mb = 32;
3959     }
3960     break;
3961     case MACHINE_BEBOX:
3962     m->physical_ram_in_mb = 64;
3963     break;
3964     case MACHINE_BAREURISC:
3965     case MACHINE_TESTURISC:
3966     m->physical_ram_in_mb = 2;
3967     break;
3968 dpavlin 6 case MACHINE_X86:
3969     if (m->machine_subtype == MACHINE_X86_XT)
3970     m->physical_ram_in_mb = 1;
3971     break;
3972 dpavlin 2 }
3973     }
3974    
3975 dpavlin 6 /* Special hack for hpcmips machines: */
3976     if (m->machine_type == MACHINE_HPCMIPS) {
3977 dpavlin 2 m->dbe_on_nonexistant_memaccess = 0;
3978     }
3979    
3980     /* Special SGI memory offsets: */
3981     if (m->machine_type == MACHINE_SGI) {
3982     switch (m->machine_subtype) {
3983     case 20:
3984     case 22:
3985     case 24:
3986     case 26:
3987     m->memory_offset_in_mb = 128;
3988     break;
3989     case 28:
3990     case 30:
3991     m->memory_offset_in_mb = 512;
3992     break;
3993     }
3994     }
3995    
3996     if (m->physical_ram_in_mb == 0)
3997     m->physical_ram_in_mb = DEFAULT_RAM_IN_MB;
3998     }
3999    
4000    
4001     /*
4002     * machine_default_cputype():
4003     *
4004     * Sets m->cpu_name, if it isn't already set, depending on the machine
4005     * type.
4006     */
4007     void machine_default_cputype(struct machine *m)
4008     {
4009     if (m == NULL) {
4010     fatal("machine_default_cputype(): m == NULL?\n");
4011     exit(1);
4012     }
4013    
4014     if (m->cpu_name != NULL)
4015     return;
4016    
4017     switch (m->machine_type) {
4018     case MACHINE_BAREMIPS:
4019     case MACHINE_TESTMIPS:
4020     m->cpu_name = strdup("R4000");
4021     break;
4022     case MACHINE_PS2:
4023     m->cpu_name = strdup("R5900");
4024     break;
4025     case MACHINE_DEC:
4026     if (m->machine_subtype > 2)
4027     m->cpu_name = strdup("R3000A");
4028     if (m->machine_subtype > 1 && m->cpu_name == NULL)
4029     m->cpu_name = strdup("R3000");
4030     if (m->cpu_name == NULL)
4031     m->cpu_name = strdup("R2000");
4032     break;
4033     case MACHINE_SONYNEWS:
4034     m->cpu_name = strdup("R3000");
4035     break;
4036     case MACHINE_HPCMIPS:
4037     switch (m->machine_subtype) {
4038     case MACHINE_HPCMIPS_CASIO_BE300:
4039     m->cpu_name = strdup("VR4131");
4040     break;
4041     case MACHINE_HPCMIPS_CASIO_E105:
4042     m->cpu_name = strdup("VR4121");
4043     break;
4044     case MACHINE_HPCMIPS_NEC_MOBILEPRO_770:
4045     case MACHINE_HPCMIPS_NEC_MOBILEPRO_780:
4046     case MACHINE_HPCMIPS_NEC_MOBILEPRO_800:
4047     case MACHINE_HPCMIPS_NEC_MOBILEPRO_880:
4048     m->cpu_name = strdup("VR4121");
4049     break;
4050     case MACHINE_HPCMIPS_AGENDA_VR3:
4051     m->cpu_name = strdup("VR4181");
4052     break;
4053     case MACHINE_HPCMIPS_IBM_WORKPAD_Z50:
4054     m->cpu_name = strdup("VR4121");
4055     break;
4056     default:
4057     printf("Unimplemented HPCMIPS model?\n");
4058     exit(1);
4059     }
4060     break;
4061     case MACHINE_COBALT:
4062     m->cpu_name = strdup("RM5200");
4063     break;
4064     case MACHINE_MESHCUBE:
4065     m->cpu_name = strdup("R4400");
4066     /* TODO: Should be AU1500, but Linux doesn't like
4067     the absence of caches in the emulator */
4068     break;
4069     case MACHINE_NETGEAR:
4070     m->cpu_name = strdup("RC32334");
4071     break;
4072     case MACHINE_ARC:
4073     switch (m->machine_subtype) {
4074     case MACHINE_ARC_JAZZ_PICA:
4075     m->cpu_name = strdup("R4000");
4076     break;
4077     default:
4078     m->cpu_name = strdup("R4400");
4079     }
4080     break;
4081     case MACHINE_SGI:
4082     if (m->machine_subtype <= 12)
4083     m->cpu_name = strdup("R3000");
4084     if (m->cpu_name == NULL && m->machine_subtype == 35)
4085     m->cpu_name = strdup("R12000");
4086     if (m->cpu_name == NULL && (m->machine_subtype == 25 ||
4087     m->machine_subtype == 27 ||
4088     m->machine_subtype == 28 ||
4089     m->machine_subtype == 30 ||
4090     m->machine_subtype == 32))
4091     m->cpu_name = strdup("R10000");
4092     if (m->cpu_name == NULL && (m->machine_subtype == 21 ||
4093     m->machine_subtype == 26))
4094     m->cpu_name = strdup("R8000");
4095     if (m->cpu_name == NULL && m->machine_subtype == 24)
4096     m->cpu_name = strdup("R5000");
4097    
4098     /* Other SGIs should probably work with
4099     R4000, R4400 or R5000 or similar: */
4100     if (m->cpu_name == NULL)
4101     m->cpu_name = strdup("R4400");
4102     break;
4103    
4104     /* PowerPC: */
4105     case MACHINE_BAREPPC:
4106     case MACHINE_TESTPPC:
4107     m->cpu_name = strdup("PPC970");
4108     break;
4109     case MACHINE_WALNUT:
4110     /* For NetBSD/evbppc. */
4111     m->cpu_name = strdup("PPC405GP");
4112     break;
4113     case MACHINE_PMPPC:
4114     /* For NetBSD/pmppc. */
4115     m->cpu_name = strdup("PPC750");
4116     break;
4117     case MACHINE_SANDPOINT:
4118     /*
4119     * For NetBSD/sandpoint. According to NetBSD's page:
4120     *
4121     * "Unity" module has an MPC8240.
4122     * "Altimus" module has an MPC7400 (G4) or an MPC107.
4123     */
4124     m->cpu_name = strdup("MPC7400");
4125     break;
4126     case MACHINE_BEBOX:
4127     /* For NetBSD/bebox. Dual 133 MHz 603e CPUs, for example. */
4128     m->cpu_name = strdup("PPC603e");
4129     break;
4130     case MACHINE_PREP:
4131     /* For NetBSD/prep. TODO */
4132     m->cpu_name = strdup("PPC603e");
4133     break;
4134     case MACHINE_MACPPC:
4135     switch (m->machine_subtype) {
4136     case MACHINE_MACPPC_G4:
4137     m->cpu_name = strdup("G4e");
4138     break;
4139     case MACHINE_MACPPC_G5:
4140     m->cpu_name = strdup("PPC970");
4141     break;
4142     }
4143     break;
4144     case MACHINE_DB64360:
4145     m->cpu_name = strdup("PPC750");
4146     break;
4147    
4148     /* SPARC: */
4149     case MACHINE_BARESPARC:
4150     m->cpu_name = strdup("SPARCV9");
4151     break;
4152     case MACHINE_ULTRA1:
4153     m->cpu_name = strdup("SPARCV9");
4154     break;
4155    
4156     /* URISC: */
4157     case MACHINE_BAREURISC:
4158     case MACHINE_TESTURISC:
4159     m->cpu_name = strdup("URISC");
4160     break;
4161    
4162     /* HPPA: */
4163     case MACHINE_BAREHPPA:
4164     case MACHINE_TESTHPPA:
4165     m->cpu_name = strdup("HPPA2.0");
4166     break;
4167    
4168     /* Alpha: */
4169     case MACHINE_BAREALPHA:
4170     case MACHINE_TESTALPHA:
4171     m->cpu_name = strdup("EV4");
4172     break;
4173 dpavlin 4
4174 dpavlin 6 /* ARM: */
4175     case MACHINE_BAREARM:
4176     case MACHINE_TESTARM:
4177     m->cpu_name = strdup("ARM");
4178     break;
4179    
4180 dpavlin 4 /* x86: */
4181     case MACHINE_BAREX86:
4182     case MACHINE_X86:
4183 dpavlin 6 if (m->machine_subtype == MACHINE_X86_XT)
4184     m->cpu_name = strdup("8086");
4185     else
4186     m->cpu_name = strdup("AMD64");
4187 dpavlin 4 break;
4188 dpavlin 2 }
4189    
4190     if (m->cpu_name == NULL) {
4191     fprintf(stderr, "machine_default_cputype(): no default"
4192     " cpu for machine type %i subtype %i\n",
4193     m->machine_type, m->machine_subtype);
4194     exit(1);
4195     }
4196     }
4197    
4198    
4199     /*
4200     * machine_dumpinfo():
4201     *
4202     * Dumps info about a machine in some kind of readable format. (Used by
4203     * the 'machine' debugger command.)
4204     */
4205     void machine_dumpinfo(struct machine *m)
4206     {
4207     int i;
4208    
4209     debug("serial nr: %i", m->serial_nr);
4210     if (m->nr_of_nics > 0)
4211     debug(" (nr of nics: %i)", m->nr_of_nics);
4212     debug("\n");
4213    
4214     debug("memory: %i MB", m->physical_ram_in_mb);
4215     if (m->memory_offset_in_mb != 0)
4216     debug(" (offset by %i MB)", m->memory_offset_in_mb);
4217     if (m->random_mem_contents)
4218     debug(", randomized contents");
4219     if (m->dbe_on_nonexistant_memaccess)
4220     debug(", dbe_on_nonexistant_memaccess");
4221     debug("\n");
4222    
4223     if (m->single_step_on_bad_addr)
4224     debug("single-step on bad addresses\n");
4225    
4226     if (m->bintrans_enable)
4227     debug("bintrans enabled (%i MB cache)\n",
4228     (int) (m->bintrans_size / 1048576));
4229     else
4230     debug("bintrans disabled, other speedtricks %s\n",
4231     m->speed_tricks? "enabled" : "disabled");
4232    
4233     debug("clock: ");
4234     if (m->automatic_clock_adjustment)
4235     debug("adjusted automatically");
4236     else
4237     debug("fixed at %i Hz", m->emulated_hz);
4238     debug("\n");
4239    
4240     if (!m->prom_emulation)
4241     debug("PROM emulation disabled\n");
4242    
4243     for (i=0; i<m->ncpus; i++)
4244     cpu_dumpinfo(m, m->cpus[i]);
4245    
4246     if (m->ncpus > 1)
4247     debug("Bootstrap cpu is nr %i\n", m->bootstrap_cpu);
4248    
4249     if (m->slow_serial_interrupts_hack_for_linux)
4250     debug("Using slow_serial_interrupts_hack_for_linux\n");
4251    
4252     if (m->use_x11) {
4253     debug("Using X11");
4254     if (m->x11_scaledown > 1)
4255     debug(", scaledown %i", m->x11_scaledown);
4256     if (m->x11_n_display_names > 0) {
4257     for (i=0; i<m->x11_n_display_names; i++) {
4258     debug(i? ", " : " (");
4259     debug("\"%s\"", m->x11_display_names[i]);
4260     }
4261     debug(")");
4262     }
4263     debug("\n");
4264     }
4265    
4266     diskimage_dump_info(m);
4267    
4268     if (m->force_netboot)
4269     debug("Forced netboot\n");
4270     }
4271    
4272    
4273     /*
4274     * machine_entry_new():
4275     *
4276     * This function creates a new machine_entry struct, and fills it with some
4277     * valid data; it is up to the caller to add additional data that weren't
4278     * passed as arguments to this function.
4279     *
4280     * For internal use.
4281     */
4282     static struct machine_entry *machine_entry_new(const char *name,
4283     int arch, int oldstyle_type, int n_aliases, int n_subtypes)
4284     {
4285     struct machine_entry *me;
4286    
4287     me = malloc(sizeof(struct machine_entry));
4288     if (me == NULL) {
4289     fprintf(stderr, "machine_entry_new(): out of memory (1)\n");
4290     exit(1);
4291     }
4292    
4293     memset(me, 0, sizeof(struct machine_entry));
4294    
4295     me->name = name;
4296     me->arch = arch;
4297     me->machine_type = oldstyle_type;
4298     me->n_aliases = n_aliases;
4299     me->aliases = malloc(sizeof(char *) * n_aliases);
4300     if (me->aliases == NULL) {
4301     fprintf(stderr, "machine_entry_new(): out of memory (2)\n");
4302     exit(1);
4303     }
4304     me->n_subtypes = n_subtypes;
4305    
4306     if (n_subtypes > 0) {
4307     me->subtype = malloc(sizeof(struct machine_entry_subtype *) *
4308     n_subtypes);
4309     if (me->subtype == NULL) {
4310     fprintf(stderr, "machine_entry_new(): out of "
4311     "memory (3)\n");
4312     exit(1);
4313     }
4314     }
4315    
4316     return me;
4317     }
4318    
4319    
4320     /*
4321     * machine_entry_subtype_new():
4322     *
4323     * This function creates a new machine_entry_subtype struct, and fills it with
4324     * some valid data; it is up to the caller to add additional data that weren't
4325     * passed as arguments to this function.
4326     *
4327     * For internal use.
4328     */
4329     static struct machine_entry_subtype *machine_entry_subtype_new(
4330     const char *name, int oldstyle_type, int n_aliases)
4331     {
4332     struct machine_entry_subtype *mes;
4333    
4334     mes = malloc(sizeof(struct machine_entry_subtype));
4335     if (mes == NULL) {
4336     fprintf(stderr, "machine_entry_subtype_new(): out "
4337     "of memory (1)\n");
4338     exit(1);
4339     }
4340    
4341     memset(mes, 0, sizeof(struct machine_entry_subtype));
4342     mes->name = name;
4343     mes->machine_subtype = oldstyle_type;
4344     mes->n_aliases = n_aliases;
4345     mes->aliases = malloc(sizeof(char *) * n_aliases);
4346     if (mes->aliases == NULL) {
4347     fprintf(stderr, "machine_entry_subtype_new(): "
4348     "out of memory (2)\n");
4349     exit(1);
4350     }
4351    
4352     return mes;
4353     }
4354    
4355    
4356     /*
4357     * machine_list_available_types_and_cpus():
4358     *
4359     * List all available machine types (for example when running the emulator
4360     * with just -H as command line argument).
4361     */
4362     void machine_list_available_types_and_cpus(void)
4363     {
4364     struct machine_entry *me;
4365     int iadd = 8;
4366    
4367     debug("Available CPU types:\n\n");
4368    
4369     debug_indentation(iadd);
4370     cpu_list_available_types();
4371     debug_indentation(-iadd);
4372    
4373     debug("\nMost of the CPU types are bogus, and not really implemented."
4374     " The main effect of\nselecting a specific CPU type is to choose "
4375     "what kind of 'id' it will have.\n\nAvailable machine types (with "
4376     "aliases) and their subtypes:\n\n");
4377    
4378     debug_indentation(iadd);
4379     me = first_machine_entry;
4380    
4381     if (me == NULL)
4382     fatal("No machines defined!\n");
4383    
4384     while (me != NULL) {
4385     int i, j, iadd = 4;
4386    
4387     debug("%s", me->name);
4388     debug(" (");
4389     for (i=0; i<me->n_aliases; i++)
4390     debug("%s\"%s\"", i? ", " : "", me->aliases[i]);
4391     debug(")\n");
4392    
4393     debug_indentation(iadd);
4394     for (i=0; i<me->n_subtypes; i++) {
4395     struct machine_entry_subtype *mes;
4396     mes = me->subtype[i];
4397     debug("- %s", mes->name);
4398     debug(" (");
4399     for (j=0; j<mes->n_aliases; j++)
4400     debug("%s\"%s\"", j? ", " : "",
4401     mes->aliases[j]);
4402     debug(")\n");
4403     }
4404     debug_indentation(-iadd);
4405    
4406     me = me->next;
4407     }
4408     debug_indentation(-iadd);
4409    
4410     debug("\nMost of the machine types are bogus too. Please read the "
4411     "GXemul\ndocumentation for information about which machine"
4412     " types that actually\nwork. Use the alias when selecting a "
4413     "machine type or subtype, not the\nreal name.\n");
4414    
4415     debug("\n");
4416    
4417     useremul_list_emuls();
4418     }
4419    
4420    
4421     /*
4422     * machine_init():
4423     *
4424     * This function should be called before any other machine_*() function
4425     * is used.
4426     */
4427     void machine_init(void)
4428     {
4429     struct machine_entry *me;
4430    
4431     /*
4432     * NOTE: This list is in reverse order, so that the
4433     * entries will appear in normal order when listed. :-)
4434     */
4435    
4436 dpavlin 4 /* X86 machine: */
4437 dpavlin 6 me = machine_entry_new("x86-based PC", ARCH_X86,
4438     MACHINE_X86, 2, 2);
4439 dpavlin 4 me->aliases[0] = "pc";
4440     me->aliases[1] = "x86";
4441 dpavlin 6 me->subtype[0] = machine_entry_subtype_new("Generic PC",
4442     MACHINE_X86_GENERIC, 1);
4443     me->subtype[0]->aliases[0] = "generic";
4444     me->subtype[1] = machine_entry_subtype_new("PC XT", MACHINE_X86_XT, 1);
4445     me->subtype[1]->aliases[0] = "xt";
4446 dpavlin 4 if (cpu_family_ptr_by_number(ARCH_X86) != NULL) {
4447     me->next = first_machine_entry; first_machine_entry = me;
4448     }
4449    
4450 dpavlin 2 /* Walnut: (NetBSD/evbppc) */
4451     me = machine_entry_new("Walnut evaluation board", ARCH_PPC,
4452     MACHINE_WALNUT, 2, 0);
4453     me->aliases[0] = "walnut";
4454     me->aliases[1] = "evbppc";
4455     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4456     me->next = first_machine_entry; first_machine_entry = me;
4457     }
4458    
4459     /* Test-machine for URISC: */
4460     me = machine_entry_new("Test-machine for URISC", ARCH_URISC,
4461     MACHINE_TESTURISC, 1, 0);
4462     me->aliases[0] = "testurisc";
4463     if (cpu_family_ptr_by_number(ARCH_URISC) != NULL) {
4464     me->next = first_machine_entry; first_machine_entry = me;
4465     }
4466    
4467     /* Test-machine for PPC: */
4468     me = machine_entry_new("Test-machine for PPC", ARCH_PPC,
4469     MACHINE_TESTPPC, 1, 0);
4470     me->aliases[0] = "testppc";
4471     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4472     me->next = first_machine_entry; first_machine_entry = me;
4473     }
4474    
4475     /* Test-machine for MIPS: */
4476     me = machine_entry_new("Test-machine for MIPS", ARCH_MIPS,
4477     MACHINE_TESTMIPS, 1, 0);
4478     me->aliases[0] = "testmips";
4479     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4480     me->next = first_machine_entry; first_machine_entry = me;
4481     }
4482    
4483     /* Test-machine for HPPA: */
4484     me = machine_entry_new("Test-machine for HPPA", ARCH_HPPA,
4485     MACHINE_TESTHPPA, 1, 0);
4486     me->aliases[0] = "testhppa";
4487     if (cpu_family_ptr_by_number(ARCH_HPPA) != NULL) {
4488     me->next = first_machine_entry; first_machine_entry = me;
4489     }
4490    
4491 dpavlin 6 /* Test-machine for ARM: */
4492     me = machine_entry_new("Test-machine for ARM", ARCH_ARM,
4493     MACHINE_TESTARM, 1, 0);
4494     me->aliases[0] = "testarm";
4495     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
4496     me->next = first_machine_entry; first_machine_entry = me;
4497     }
4498    
4499 dpavlin 2 /* Test-machine for Alpha: */
4500     me = machine_entry_new("Test-machine for Alpha", ARCH_ALPHA,
4501     MACHINE_TESTALPHA, 1, 0);
4502     me->aliases[0] = "testalpha";
4503     if (cpu_family_ptr_by_number(ARCH_ALPHA) != NULL) {
4504     me->next = first_machine_entry; first_machine_entry = me;
4505     }
4506    
4507     /* Sun Ultra1: */
4508     me = machine_entry_new("Sun Ultra1", ARCH_SPARC, MACHINE_ULTRA1, 1, 0);
4509     me->aliases[0] = "ultra1";
4510     if (cpu_family_ptr_by_number(ARCH_SPARC) != NULL) {
4511     me->next = first_machine_entry; first_machine_entry = me;
4512     }
4513    
4514     /* Sony Playstation 2: */
4515     me = machine_entry_new("Sony Playstation 2", ARCH_MIPS,
4516     MACHINE_PS2, 2, 0);
4517     me->aliases[0] = "playstation2";
4518     me->aliases[1] = "ps2";
4519     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4520     me->next = first_machine_entry; first_machine_entry = me;
4521     }
4522    
4523     /* Sony NeWS: */
4524     me = machine_entry_new("Sony NeWS", ARCH_MIPS,
4525     MACHINE_SONYNEWS, 2, 0);
4526     me->aliases[0] = "sonynews";
4527     me->aliases[1] = "news";
4528     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4529     me->next = first_machine_entry; first_machine_entry = me;
4530     }
4531    
4532     /* SGI: */
4533     me = machine_entry_new("SGI", ARCH_MIPS, MACHINE_SGI, 2, 9);
4534     me->aliases[0] = "silicon graphics";
4535     me->aliases[1] = "sgi";
4536     me->subtype[0] = machine_entry_subtype_new("IP19", 19, 1);
4537     me->subtype[0]->aliases[0] = "ip19";
4538     me->subtype[1] = machine_entry_subtype_new("IP20", 20, 1);
4539     me->subtype[1]->aliases[0] = "ip20";
4540     me->subtype[2] = machine_entry_subtype_new("IP22", 22, 2);
4541     me->subtype[2]->aliases[0] = "ip22";
4542     me->subtype[2]->aliases[1] = "indy";
4543     me->subtype[3] = machine_entry_subtype_new("IP24", 24, 1);
4544     me->subtype[3]->aliases[0] = "ip24";
4545     me->subtype[4] = machine_entry_subtype_new("IP27", 27, 3);
4546     me->subtype[4]->aliases[0] = "ip27";
4547     me->subtype[4]->aliases[1] = "origin 200";
4548     me->subtype[4]->aliases[2] = "origin 2000";
4549     me->subtype[5] = machine_entry_subtype_new("IP28", 28, 1);
4550     me->subtype[5]->aliases[0] = "ip28";
4551     me->subtype[6] = machine_entry_subtype_new("IP30", 30, 2);
4552     me->subtype[6]->aliases[0] = "ip30";
4553     me->subtype[6]->aliases[1] = "octane";
4554     me->subtype[7] = machine_entry_subtype_new("IP32", 32, 2);
4555     me->subtype[7]->aliases[0] = "ip32";
4556     me->subtype[7]->aliases[1] = "o2";
4557     me->subtype[8] = machine_entry_subtype_new("IP35", 35, 1);
4558     me->subtype[8]->aliases[0] = "ip35";
4559     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4560     me->next = first_machine_entry; first_machine_entry = me;
4561     }
4562    
4563     /* PReP: (NetBSD/prep etc.) */
4564     me = machine_entry_new("PowerPC Reference Platform", ARCH_PPC,
4565     MACHINE_PREP, 1, 0);
4566     me->aliases[0] = "prep";
4567     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4568     me->next = first_machine_entry; first_machine_entry = me;
4569     }
4570    
4571     /* NetGear: */
4572     me = machine_entry_new("NetGear WG602", ARCH_MIPS,
4573     MACHINE_NETGEAR, 2, 0);
4574     me->aliases[0] = "netgear";
4575     me->aliases[1] = "wg602";
4576     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4577     me->next = first_machine_entry; first_machine_entry = me;
4578     }
4579    
4580     /* Motorola Sandpoint: (NetBSD/sandpoint) */
4581     me = machine_entry_new("Motorola Sandpoint",
4582     ARCH_PPC, MACHINE_SANDPOINT, 1, 0);
4583     me->aliases[0] = "sandpoint";
4584     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4585     me->next = first_machine_entry; first_machine_entry = me;
4586     }
4587    
4588     /* Meshcube: */
4589     me = machine_entry_new("Meshcube", ARCH_MIPS, MACHINE_MESHCUBE, 1, 0);
4590     me->aliases[0] = "meshcube";
4591     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4592     me->next = first_machine_entry; first_machine_entry = me;
4593     }
4594    
4595     /* Macintosh (PPC): */
4596     me = machine_entry_new("Macintosh (PPC)", ARCH_PPC,
4597     MACHINE_MACPPC, 1, 2);
4598     me->aliases[0] = "macppc";
4599     me->subtype[0] = machine_entry_subtype_new("MacPPC G4",
4600     MACHINE_MACPPC_G4, 1);
4601     me->subtype[0]->aliases[0] = "g4";
4602     me->subtype[1] = machine_entry_subtype_new("MacPPC G5",
4603     MACHINE_MACPPC_G5, 1);
4604     me->subtype[1]->aliases[0] = "g5";
4605     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4606     me->next = first_machine_entry; first_machine_entry = me;
4607     }
4608    
4609     /* HPCmips: */
4610     me = machine_entry_new("Handheld MIPS (HPC)",
4611     ARCH_MIPS, MACHINE_HPCMIPS, 2, 8);
4612     me->aliases[0] = "hpcmips";
4613     me->aliases[1] = "hpc";
4614     me->subtype[0] = machine_entry_subtype_new(
4615     "Casio Cassiopeia BE-300", MACHINE_HPCMIPS_CASIO_BE300, 2);
4616     me->subtype[0]->aliases[0] = "be-300";
4617     me->subtype[0]->aliases[1] = "be300";
4618     me->subtype[1] = machine_entry_subtype_new(
4619     "Casio Cassiopeia E-105", MACHINE_HPCMIPS_CASIO_E105, 2);
4620     me->subtype[1]->aliases[0] = "e-105";
4621     me->subtype[1]->aliases[1] = "e105";
4622     me->subtype[2] = machine_entry_subtype_new(
4623     "Agenda VR3", MACHINE_HPCMIPS_AGENDA_VR3, 2);
4624     me->subtype[2]->aliases[0] = "agenda";
4625     me->subtype[2]->aliases[1] = "vr3";
4626     me->subtype[3] = machine_entry_subtype_new(
4627     "IBM WorkPad Z50", MACHINE_HPCMIPS_IBM_WORKPAD_Z50, 2);
4628     me->subtype[3]->aliases[0] = "workpad";
4629     me->subtype[3]->aliases[1] = "z50";
4630     me->subtype[4] = machine_entry_subtype_new(
4631     "NEC MobilePro 770", MACHINE_HPCMIPS_NEC_MOBILEPRO_770, 1);
4632     me->subtype[4]->aliases[0] = "mobilepro770";
4633     me->subtype[5] = machine_entry_subtype_new(
4634     "NEC MobilePro 780", MACHINE_HPCMIPS_NEC_MOBILEPRO_780, 1);
4635     me->subtype[5]->aliases[0] = "mobilepro780";
4636     me->subtype[6] = machine_entry_subtype_new(
4637     "NEC MobilePro 800", MACHINE_HPCMIPS_NEC_MOBILEPRO_800, 1);
4638     me->subtype[6]->aliases[0] = "mobilepro800";
4639     me->subtype[7] = machine_entry_subtype_new(
4640     "NEC MobilePro 880", MACHINE_HPCMIPS_NEC_MOBILEPRO_880, 1);
4641     me->subtype[7]->aliases[0] = "mobilepro880";
4642     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4643     me->next = first_machine_entry; first_machine_entry = me;
4644     }
4645    
4646 dpavlin 4 /* Generic "bare" X86 machine: */
4647     me = machine_entry_new("Generic \"bare\" X86 machine", ARCH_X86,
4648     MACHINE_BAREX86, 1, 0);
4649     me->aliases[0] = "barex86";
4650     if (cpu_family_ptr_by_number(ARCH_X86) != NULL) {
4651     me->next = first_machine_entry; first_machine_entry = me;
4652     }
4653    
4654 dpavlin 2 /* Generic "bare" URISC machine: */
4655     me = machine_entry_new("Generic \"bare\" URISC machine", ARCH_URISC,
4656     MACHINE_BAREURISC, 1, 0);
4657     me->aliases[0] = "bareurisc";
4658     if (cpu_family_ptr_by_number(ARCH_URISC) != NULL) {
4659     me->next = first_machine_entry; first_machine_entry = me;
4660     }
4661    
4662     /* Generic "bare" SPARC machine: */
4663     me = machine_entry_new("Generic \"bare\" SPARC machine", ARCH_SPARC,
4664     MACHINE_BARESPARC, 1, 0);
4665     me->aliases[0] = "baresparc";
4666     if (cpu_family_ptr_by_number(ARCH_SPARC) != NULL) {
4667     me->next = first_machine_entry; first_machine_entry = me;
4668     }
4669    
4670     /* Generic "bare" PPC machine: */
4671     me = machine_entry_new("Generic \"bare\" PPC machine", ARCH_PPC,
4672     MACHINE_BAREPPC, 1, 0);
4673     me->aliases[0] = "bareppc";
4674     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4675     me->next = first_machine_entry; first_machine_entry = me;
4676     }
4677    
4678     /* Generic "bare" MIPS machine: */
4679     me = machine_entry_new("Generic \"bare\" MIPS machine", ARCH_MIPS,
4680     MACHINE_BAREMIPS, 1, 0);
4681     me->aliases[0] = "baremips";
4682     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4683     me->next = first_machine_entry; first_machine_entry = me;
4684     }
4685    
4686     /* Generic "bare" HPPA machine: */
4687     me = machine_entry_new("Generic \"bare\" HPPA machine", ARCH_HPPA,
4688     MACHINE_BAREHPPA, 1, 0);
4689     me->aliases[0] = "barehppa";
4690     if (cpu_family_ptr_by_number(ARCH_HPPA) != NULL) {
4691     me->next = first_machine_entry; first_machine_entry = me;
4692     }
4693    
4694 dpavlin 6 /* Generic "bare" ARM machine: */
4695     me = machine_entry_new("Generic \"bare\" ARM machine", ARCH_ARM,
4696     MACHINE_BAREARM, 1, 0);
4697     me->aliases[0] = "barearm";
4698     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
4699     me->next = first_machine_entry; first_machine_entry = me;
4700     }
4701    
4702 dpavlin 2 /* Generic "bare" Alpha machine: */
4703     me = machine_entry_new("Generic \"bare\" Alpha machine", ARCH_ALPHA,
4704     MACHINE_BAREALPHA, 1, 0);
4705     me->aliases[0] = "barealpha";
4706     if (cpu_family_ptr_by_number(ARCH_ALPHA) != NULL) {
4707     me->next = first_machine_entry; first_machine_entry = me;
4708     }
4709    
4710     /* DECstation: */
4711     me = machine_entry_new("DECstation/DECsystem",
4712     ARCH_MIPS, MACHINE_DEC, 3, 9);
4713     me->aliases[0] = "decstation";
4714     me->aliases[1] = "decsystem";
4715     me->aliases[2] = "dec";
4716     me->subtype[0] = machine_entry_subtype_new(
4717     "DECstation 3100 (PMAX)", MACHINE_DEC_PMAX_3100, 3);
4718     me->subtype[0]->aliases[0] = "pmax";
4719     me->subtype[0]->aliases[1] = "3100";
4720     me->subtype[0]->aliases[2] = "2100";
4721    
4722     me->subtype[1] = machine_entry_subtype_new(
4723     "DECstation 5000/200 (3MAX)", MACHINE_DEC_3MAX_5000, 2);
4724     me->subtype[1]->aliases[0] = "3max";
4725     me->subtype[1]->aliases[1] = "5000/200";
4726    
4727     me->subtype[2] = machine_entry_subtype_new(
4728     "DECstation 5000/1xx (3MIN)", MACHINE_DEC_3MIN_5000, 2);
4729     me->subtype[2]->aliases[0] = "3min";
4730     me->subtype[2]->aliases[1] = "5000/1xx";
4731    
4732     me->subtype[3] = machine_entry_subtype_new(
4733     "DECstation 5000 (3MAXPLUS)", MACHINE_DEC_3MAXPLUS_5000, 2);
4734     me->subtype[3]->aliases[0] = "3maxplus";
4735     me->subtype[3]->aliases[1] = "3max+";
4736    
4737     me->subtype[4] = machine_entry_subtype_new(
4738     "DECsystem 58x0", MACHINE_DEC_5800, 2);
4739     me->subtype[4]->aliases[0] = "5800";
4740     me->subtype[4]->aliases[1] = "58x0";
4741    
4742     me->subtype[5] = machine_entry_subtype_new(
4743     "DECsystem 5400", MACHINE_DEC_5400, 1);
4744     me->subtype[5]->aliases[0] = "5400";
4745    
4746     me->subtype[6] = machine_entry_subtype_new(
4747     "DECstation Maxine (5000)", MACHINE_DEC_MAXINE_5000, 1);
4748     me->subtype[6]->aliases[0] = "maxine";
4749    
4750     me->subtype[7] = machine_entry_subtype_new(
4751     "DECsystem 5500", MACHINE_DEC_5500, 1);
4752     me->subtype[7]->aliases[0] = "5500";
4753    
4754     me->subtype[8] = machine_entry_subtype_new(
4755     "DECstation MipsMate (5100)", MACHINE_DEC_MIPSMATE_5100, 2);
4756     me->subtype[8]->aliases[0] = "5100";
4757     me->subtype[8]->aliases[1] = "mipsmate";
4758    
4759     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4760     me->next = first_machine_entry; first_machine_entry = me;
4761     }
4762    
4763     /* DB64360: (for playing with PMON for PPC) */
4764     me = machine_entry_new("DB64360", ARCH_PPC, MACHINE_DB64360, 1, 0);
4765     me->aliases[0] = "db64360";
4766     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4767     me->next = first_machine_entry; first_machine_entry = me;
4768     }
4769    
4770     /* Cobalt: */
4771     me = machine_entry_new("Cobalt", ARCH_MIPS, MACHINE_COBALT, 1, 0);
4772     me->aliases[0] = "cobalt";
4773     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4774     me->next = first_machine_entry; first_machine_entry = me;
4775     }
4776    
4777     /* BeBox: (NetBSD/bebox) */
4778     me = machine_entry_new("BeBox", ARCH_PPC, MACHINE_BEBOX, 1, 0);
4779     me->aliases[0] = "bebox";
4780     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4781     me->next = first_machine_entry; first_machine_entry = me;
4782     }
4783    
4784     /* Artesyn's PM/PPC board: (NetBSD/pmppc) */
4785     me = machine_entry_new("Artesyn's PM/PPC board", ARCH_PPC,
4786     MACHINE_PMPPC, 1, 0);
4787     me->aliases[0] = "pmppc";
4788     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
4789     me->next = first_machine_entry; first_machine_entry = me;
4790     }
4791    
4792     /* ARC: */
4793     me = machine_entry_new("ARC", ARCH_MIPS, MACHINE_ARC, 1, 8);
4794     me->aliases[0] = "arc";
4795    
4796     me->subtype[0] = machine_entry_subtype_new(
4797     "Acer PICA-61", MACHINE_ARC_JAZZ_PICA, 3);
4798     me->subtype[0]->aliases[0] = "pica-61";
4799     me->subtype[0]->aliases[1] = "acer pica";
4800     me->subtype[0]->aliases[2] = "pica";
4801    
4802     me->subtype[1] = machine_entry_subtype_new(
4803     "Deskstation Tyne", MACHINE_ARC_DESKTECH_TYNE, 3);
4804     me->subtype[1]->aliases[0] = "deskstation tyne";
4805     me->subtype[1]->aliases[1] = "desktech";
4806     me->subtype[1]->aliases[2] = "tyne";
4807    
4808     me->subtype[2] = machine_entry_subtype_new(
4809     "Jazz Magnum", MACHINE_ARC_JAZZ_MAGNUM, 2);
4810     me->subtype[2]->aliases[0] = "magnum";
4811     me->subtype[2]->aliases[1] = "jazz magnum";
4812    
4813     me->subtype[3] = machine_entry_subtype_new(
4814     "NEC-R94", MACHINE_ARC_NEC_R94, 2);
4815     me->subtype[3]->aliases[0] = "nec-r94";
4816     me->subtype[3]->aliases[1] = "r94";
4817    
4818     me->subtype[4] = machine_entry_subtype_new(
4819     "NEC-RD94", MACHINE_ARC_NEC_RD94, 2);
4820     me->subtype[4]->aliases[0] = "nec-rd94";
4821     me->subtype[4]->aliases[1] = "rd94";
4822    
4823     me->subtype[5] = machine_entry_subtype_new(
4824     "NEC-R96", MACHINE_ARC_NEC_R96, 2);
4825     me->subtype[5]->aliases[0] = "nec-r96";
4826     me->subtype[5]->aliases[1] = "r96";
4827    
4828     me->subtype[6] = machine_entry_subtype_new(
4829     "NEC-R98", MACHINE_ARC_NEC_R98, 2);
4830     me->subtype[6]->aliases[0] = "nec-r98";
4831     me->subtype[6]->aliases[1] = "r98";
4832    
4833     me->subtype[7] = machine_entry_subtype_new(
4834     "Olivetti M700", MACHINE_ARC_JAZZ_M700, 2);
4835     me->subtype[7]->aliases[0] = "olivetti";
4836     me->subtype[7]->aliases[1] = "m700";
4837    
4838     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
4839     me->next = first_machine_entry; first_machine_entry = me;
4840     }
4841     }
4842    

  ViewVC Help
Powered by ViewVC 1.1.26