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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26