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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (hide annotations)
Mon Oct 8 16:19:28 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 202175 byte(s)
0.3.7
1 dpavlin 2 /*
2     * Copyright (C) 2003-2005 Anders Gavare. All rights reserved.
3     *
4     * Redistribution and use in source and binary forms, with or without
5     * modification, are permitted provided that the following conditions are met:
6     *
7     * 1. Redistributions of source code must retain the above copyright
8     * notice, this list of conditions and the following disclaimer.
9     * 2. Redistributions in binary form must reproduce the above copyright
10     * notice, this list of conditions and the following disclaimer in the
11     * documentation and/or other materials provided with the distribution.
12     * 3. The name of the author may not be used to endorse or promote products
13     * derived from this software without specific prior written permission.
14     *
15     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18     * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25     * SUCH DAMAGE.
26     *
27     *
28 dpavlin 20 * $Id: machine.c,v 1.611 2005/11/23 23:31:34 debug Exp $
29 dpavlin 2 *
30     * Emulation of specific machines.
31     *
32     * This module is quite large. Hopefully it is still clear enough to be
33     * easily understood. The main parts are:
34     *
35     * Helper functions.
36     *
37     * Machine specific Interrupt routines.
38     *
39     * Machine specific Initialization routines.
40     */
41    
42     #include <stdio.h>
43     #include <stdlib.h>
44     #include <stdarg.h>
45     #ifdef SOLARIS
46     #include <strings.h>
47     #else
48     #include <string.h>
49     #endif
50     #include <time.h>
51     #include <unistd.h>
52    
53     #include "arcbios.h"
54 dpavlin 20 #include "bus_isa.h"
55 dpavlin 2 #include "bus_pci.h"
56     #include "cpu.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 dpavlin 12 /* For Alpha emulation: */
69     #include "alpha_rpb.h"
70    
71 dpavlin 14 /* For CATS emulation: */
72     #include "cyclone_boot.h"
73    
74 dpavlin 2 /* For SGI and ARC emulation: */
75     #include "sgi_arcbios.h"
76     #include "crimereg.h"
77    
78 dpavlin 12 /* For evbmips emulation: */
79     #include "maltareg.h"
80    
81 dpavlin 2 /* For DECstation emulation: */
82     #include "dec_prom.h"
83     #include "dec_bootinfo.h"
84     #include "dec_5100.h"
85     #include "dec_kn01.h"
86     #include "dec_kn02.h"
87     #include "dec_kn03.h"
88     #include "dec_kmin.h"
89     #include "dec_maxine.h"
90    
91     /* HPC: */
92     #include "hpc_bootinfo.h"
93     #include "vripreg.h"
94    
95 dpavlin 10 #define BOOTSTR_BUFLEN 1000
96     #define BOOTARG_BUFLEN 2000
97     #define ETHERNET_STRING_MAXLEN 40
98 dpavlin 2
99     struct machine_entry_subtype {
100     int machine_subtype;/* Old-style subtype */
101     const char *name; /* Official name */
102     int n_aliases;
103     char **aliases; /* Aliases */
104     };
105    
106     struct machine_entry {
107     struct machine_entry *next;
108    
109     /* Machine type: */
110     int arch;
111     int machine_type; /* Old-style type */
112     const char *name; /* Official name */
113     int n_aliases;
114     char **aliases; /* Aliases */
115    
116     /* Machine subtypes: */
117     int n_subtypes;
118     struct machine_entry_subtype **subtype;
119     };
120    
121 dpavlin 6
122     /* See main.c: */
123     extern int quiet_mode;
124    
125    
126 dpavlin 2 /* This is initialized by machine_init(): */
127     static struct machine_entry *first_machine_entry = NULL;
128    
129    
130     /*
131     * machine_new():
132     *
133     * Returns a reasonably initialized struct machine.
134     */
135     struct machine *machine_new(char *name, struct emul *emul)
136     {
137     struct machine *m;
138     m = malloc(sizeof(struct machine));
139     if (m == NULL) {
140     fprintf(stderr, "machine_new(): out of memory\n");
141     exit(1);
142     }
143    
144     memset(m, 0, sizeof(struct machine));
145    
146     /* Back pointer: */
147     m->emul = emul;
148    
149     m->name = strdup(name);
150    
151     /* Sane default values: */
152 dpavlin 10 m->serial_nr = 1;
153 dpavlin 2 m->machine_type = MACHINE_NONE;
154     m->machine_subtype = MACHINE_NONE;
155 dpavlin 10 #ifdef BINTRANS
156 dpavlin 2 m->bintrans_enable = 1;
157 dpavlin 10 m->old_bintrans_enable = 1;
158     #endif
159 dpavlin 12 m->arch_pagesize = 4096; /* Should be overriden in
160     emul.c for other pagesizes. */
161     m->dyntrans_alignment_check = 1;
162 dpavlin 2 m->prom_emulation = 1;
163     m->speed_tricks = 1;
164     m->byte_order_override = NO_BYTE_ORDER_OVERRIDE;
165     m->boot_kernel_filename = "";
166     m->boot_string_argument = NULL;
167     m->automatic_clock_adjustment = 1;
168     m->x11_scaledown = 1;
169 dpavlin 20 m->x11_scaleup = 1;
170 dpavlin 2 m->n_gfx_cards = 1;
171     m->dbe_on_nonexistant_memaccess = 1;
172     m->show_symbolic_register_names = 1;
173     m->bintrans_size = DEFAULT_BINTRANS_SIZE_IN_MB * 1048576;
174     symbol_init(&m->symbol_context);
175    
176     return m;
177     }
178    
179    
180     /*
181     * machine_name_to_type():
182     *
183     * Take a type and a subtype as strings, and convert them into numeric
184     * values used internally throughout the code.
185     *
186     * Return value is 1 on success, 0 if there was no match.
187     * Also, any errors/warnings are printed using fatal()/debug().
188     */
189     int machine_name_to_type(char *stype, char *ssubtype,
190     int *type, int *subtype, int *arch)
191     {
192     struct machine_entry *me;
193 dpavlin 12 int i, j, k, nmatches = 0;
194 dpavlin 2
195     *type = MACHINE_NONE;
196     *subtype = 0;
197    
198 dpavlin 12 /* Check stype, and optionally ssubtype: */
199 dpavlin 2 me = first_machine_entry;
200     while (me != NULL) {
201     for (i=0; i<me->n_aliases; i++)
202     if (strcasecmp(me->aliases[i], stype) == 0) {
203     /* Found a type: */
204     *type = me->machine_type;
205     *arch = me->arch;
206    
207     if (me->n_subtypes == 0)
208     return 1;
209    
210     /* Check for subtype: */
211     for (j=0; j<me->n_subtypes; j++)
212     for (k=0; k<me->subtype[j]->n_aliases;
213     k++)
214     if (strcasecmp(ssubtype,
215     me->subtype[j]->aliases[k]
216     ) == 0) {
217     *subtype = me->subtype[
218     j]->machine_subtype;
219     return 1;
220     }
221    
222 dpavlin 6 fatal("Unknown subtype '%s' for emulation"
223 dpavlin 2 " '%s'\n", ssubtype, stype);
224 dpavlin 6 if (!ssubtype[0])
225     fatal("(Maybe you forgot the -e"
226     " command line option?)\n");
227 dpavlin 2 exit(1);
228     }
229    
230     me = me->next;
231     }
232    
233 dpavlin 12 /* Not found? Then just check ssubtype: */
234     me = first_machine_entry;
235     while (me != NULL) {
236     if (me->n_subtypes == 0) {
237     me = me->next;
238     continue;
239     }
240    
241     /* Check for subtype: */
242     for (j=0; j<me->n_subtypes; j++)
243     for (k=0; k<me->subtype[j]->n_aliases; k++)
244     if (strcasecmp(ssubtype, me->subtype[j]->
245     aliases[k]) == 0) {
246     *type = me->machine_type;
247     *arch = me->arch;
248     *subtype = me->subtype[j]->
249     machine_subtype;
250     nmatches ++;
251     }
252    
253     me = me->next;
254     }
255    
256     switch (nmatches) {
257     case 0: fatal("\nSorry, emulation \"%s\"", stype);
258     if (ssubtype != NULL && ssubtype[0] != '\0')
259     fatal(" (subtype \"%s\")", ssubtype);
260     fatal(" is unknown.\n");
261     break;
262     case 1: return 1;
263     default:fatal("\nSorry, multiple matches for \"%s\"", stype);
264     if (ssubtype != NULL && ssubtype[0] != '\0')
265     fatal(" (subtype \"%s\")", ssubtype);
266     fatal(".\n");
267     }
268    
269     *type = MACHINE_NONE;
270     *subtype = 0;
271    
272     fatal("Use the -H command line option to get a list of "
273     "available types and subtypes.\n\n");
274    
275 dpavlin 2 return 0;
276     }
277    
278    
279     /*
280     * machine_add_tickfunction():
281     *
282     * Adds a tick function (a function called every now and then, depending on
283     * clock cycle count) to a machine.
284     */
285     void machine_add_tickfunction(struct machine *machine, void (*func)
286     (struct cpu *, void *), void *extra, int clockshift)
287     {
288     int n = machine->n_tick_entries;
289    
290     if (n >= MAX_TICK_FUNCTIONS) {
291     fprintf(stderr, "machine_add_tickfunction(): too "
292     "many tick functions\n");
293     exit(1);
294     }
295    
296     /* Don't use too low clockshifts, that would be too inefficient
297     with bintrans. */
298     if (clockshift < N_SAFE_BINTRANS_LIMIT_SHIFT)
299     fatal("WARNING! clockshift = %i, less than "
300     "N_SAFE_BINTRANS_LIMIT_SHIFT (%i)\n",
301     clockshift, N_SAFE_BINTRANS_LIMIT_SHIFT);
302    
303     machine->ticks_till_next[n] = 0;
304     machine->ticks_reset_value[n] = 1 << clockshift;
305     machine->tick_func[n] = func;
306     machine->tick_extra[n] = extra;
307    
308     machine->n_tick_entries ++;
309     }
310    
311    
312     /****************************************************************************
313     * *
314     * Helper functions *
315     * *
316     ****************************************************************************/
317    
318    
319     int int_to_bcd(int i)
320     {
321     return (i/10) * 16 + (i % 10);
322     }
323    
324    
325     /*
326     * dump_mem_string():
327     *
328     * Dump the contents of emulated RAM as readable text. Bytes that aren't
329     * readable are dumped in [xx] notation, where xx is in hexadecimal.
330     * Dumping ends after DUMP_MEM_STRING_MAX bytes, or when a terminating
331     * zero byte is found.
332     */
333     #define DUMP_MEM_STRING_MAX 45
334     void dump_mem_string(struct cpu *cpu, uint64_t addr)
335     {
336     int i;
337     for (i=0; i<DUMP_MEM_STRING_MAX; i++) {
338     unsigned char ch = '\0';
339    
340     cpu->memory_rw(cpu, cpu->mem, addr + i, &ch, sizeof(ch),
341     MEM_READ, CACHE_DATA | NO_EXCEPTIONS);
342     if (ch == '\0')
343     return;
344     if (ch >= ' ' && ch < 126)
345     debug("%c", ch);
346     else
347     debug("[%02x]", ch);
348     }
349     }
350    
351    
352     /*
353     * store_byte():
354     *
355     * Stores a byte in emulated ram. (Helper function.)
356     */
357     void store_byte(struct cpu *cpu, uint64_t addr, uint8_t data)
358     {
359     if ((addr >> 32) == 0)
360     addr = (int64_t)(int32_t)addr;
361     cpu->memory_rw(cpu, cpu->mem,
362     addr, &data, sizeof(data), MEM_WRITE, CACHE_DATA);
363     }
364    
365    
366     /*
367     * store_string():
368     *
369     * Stores chars into emulated RAM until a zero byte (string terminating
370     * character) is found. The zero byte is also copied.
371     * (strcpy()-like helper function, host-RAM-to-emulated-RAM.)
372     */
373     void store_string(struct cpu *cpu, uint64_t addr, char *s)
374     {
375     do {
376     store_byte(cpu, addr++, *s);
377     } while (*s++);
378     }
379    
380    
381     /*
382     * add_environment_string():
383     *
384     * Like store_string(), but advances the pointer afterwards. The most
385     * obvious use is to place a number of strings (such as environment variable
386     * strings) after one-another in emulated memory.
387     */
388     void add_environment_string(struct cpu *cpu, char *s, uint64_t *addr)
389     {
390     store_string(cpu, *addr, s);
391     (*addr) += strlen(s) + 1;
392     }
393    
394    
395     /*
396 dpavlin 12 * add_environment_string_dual():
397     *
398     * Add "dual" environment strings, one for the variable name and one for the
399     * value, and update pointers afterwards.
400     */
401     void add_environment_string_dual(struct cpu *cpu,
402     uint64_t *ptrp, uint64_t *addrp, char *s1, char *s2)
403     {
404     uint64_t ptr = *ptrp, addr = *addrp;
405    
406     store_32bit_word(cpu, ptr, addr);
407     ptr += sizeof(uint32_t);
408     if (addr != 0) {
409     store_string(cpu, addr, s1);
410     addr += strlen(s1) + 1;
411     }
412     store_32bit_word(cpu, ptr, addr);
413     ptr += sizeof(uint32_t);
414     if (addr != 0) {
415     store_string(cpu, addr, s2);
416     addr += strlen(s2) + 1;
417     }
418    
419     *ptrp = ptr;
420     *addrp = addr;
421     }
422    
423    
424     /*
425 dpavlin 2 * store_64bit_word():
426     *
427     * Stores a 64-bit word in emulated RAM. Byte order is taken into account.
428     * Helper function.
429     */
430     int store_64bit_word(struct cpu *cpu, uint64_t addr, uint64_t data64)
431     {
432     unsigned char data[8];
433     if ((addr >> 32) == 0)
434     addr = (int64_t)(int32_t)addr;
435     data[0] = (data64 >> 56) & 255;
436     data[1] = (data64 >> 48) & 255;
437     data[2] = (data64 >> 40) & 255;
438     data[3] = (data64 >> 32) & 255;
439     data[4] = (data64 >> 24) & 255;
440     data[5] = (data64 >> 16) & 255;
441     data[6] = (data64 >> 8) & 255;
442     data[7] = (data64) & 255;
443     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
444     int tmp = data[0]; data[0] = data[7]; data[7] = tmp;
445     tmp = data[1]; data[1] = data[6]; data[6] = tmp;
446     tmp = data[2]; data[2] = data[5]; data[5] = tmp;
447     tmp = data[3]; data[3] = data[4]; data[4] = tmp;
448     }
449     return cpu->memory_rw(cpu, cpu->mem,
450     addr, data, sizeof(data), MEM_WRITE, CACHE_DATA);
451     }
452    
453    
454     /*
455     * store_32bit_word():
456     *
457     * Stores a 32-bit word in emulated RAM. Byte order is taken into account.
458     * (This function takes a 64-bit word as argument, to suppress some
459     * warnings, but only the lowest 32 bits are used.)
460     */
461     int store_32bit_word(struct cpu *cpu, uint64_t addr, uint64_t data32)
462     {
463     unsigned char data[4];
464 dpavlin 14 if (cpu->machine->arch == ARCH_MIPS && (addr >> 32) == 0)
465 dpavlin 2 addr = (int64_t)(int32_t)addr;
466     data[0] = (data32 >> 24) & 255;
467     data[1] = (data32 >> 16) & 255;
468     data[2] = (data32 >> 8) & 255;
469     data[3] = (data32) & 255;
470     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
471     int tmp = data[0]; data[0] = data[3]; data[3] = tmp;
472     tmp = data[1]; data[1] = data[2]; data[2] = tmp;
473     }
474     return cpu->memory_rw(cpu, cpu->mem,
475     addr, data, sizeof(data), MEM_WRITE, CACHE_DATA);
476     }
477    
478    
479     /*
480     * store_16bit_word():
481     *
482     * Stores a 16-bit word in emulated RAM. Byte order is taken into account.
483     * (This function takes a 64-bit word as argument, to suppress some
484     * warnings, but only the lowest 16 bits are used.)
485     */
486     int store_16bit_word(struct cpu *cpu, uint64_t addr, uint64_t data16)
487     {
488     unsigned char data[2];
489 dpavlin 14 if (cpu->machine->arch == ARCH_MIPS && (addr >> 32) == 0)
490 dpavlin 2 addr = (int64_t)(int32_t)addr;
491     data[0] = (data16 >> 8) & 255;
492     data[1] = (data16) & 255;
493     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
494     int tmp = data[0]; data[0] = data[1]; data[1] = tmp;
495     }
496     return cpu->memory_rw(cpu, cpu->mem,
497     addr, data, sizeof(data), MEM_WRITE, CACHE_DATA);
498     }
499    
500    
501     /*
502     * store_buf():
503     *
504     * memcpy()-like helper function, from host RAM to emulated RAM.
505     */
506     void store_buf(struct cpu *cpu, uint64_t addr, char *s, size_t len)
507     {
508 dpavlin 6 int psize = 1024; /* 1024 256 64 16 4 1 */
509    
510 dpavlin 14 if (cpu->machine->arch == ARCH_MIPS && (addr >> 32) == 0)
511 dpavlin 2 addr = (int64_t)(int32_t)addr;
512    
513 dpavlin 6 while (len != 0) {
514     if ((addr & (psize-1)) == 0) {
515     while (len >= psize) {
516     cpu->memory_rw(cpu, cpu->mem, addr,
517     (unsigned char *)s, psize, MEM_WRITE,
518     CACHE_DATA);
519     addr += psize;
520     s += psize;
521     len -= psize;
522     }
523 dpavlin 2 }
524 dpavlin 6 psize >>= 2;
525 dpavlin 2 }
526    
527     while (len-- != 0)
528     store_byte(cpu, addr++, *s++);
529     }
530    
531    
532     /*
533     * store_pointer_and_advance():
534     *
535     * Stores a 32-bit or 64-bit pointer in emulated RAM, and advances the
536     * target address. (Used by ARC and SGI initialization.)
537     */
538     void store_pointer_and_advance(struct cpu *cpu, uint64_t *addrp,
539     uint64_t data, int flag64)
540     {
541     uint64_t addr = *addrp;
542     if (flag64) {
543     store_64bit_word(cpu, addr, data);
544     addr += 8;
545     } else {
546     store_32bit_word(cpu, addr, data);
547     addr += 4;
548     }
549     *addrp = addr;
550     }
551    
552    
553     /*
554     * load_32bit_word():
555     *
556     * Helper function. Prints a warning and returns 0, if the read failed.
557     * Emulated byte order is taken into account.
558     */
559     uint32_t load_32bit_word(struct cpu *cpu, uint64_t addr)
560     {
561     unsigned char data[4];
562    
563 dpavlin 14 if (cpu->machine->arch == ARCH_MIPS && (addr >> 32) == 0)
564 dpavlin 2 addr = (int64_t)(int32_t)addr;
565     cpu->memory_rw(cpu, cpu->mem,
566     addr, data, sizeof(data), MEM_READ, CACHE_DATA);
567    
568     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
569     int tmp = data[0]; data[0] = data[3]; data[3] = tmp;
570     tmp = data[1]; data[1] = data[2]; data[2] = tmp;
571     }
572    
573     return (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3];
574     }
575    
576    
577     /*
578 dpavlin 4 * load_16bit_word():
579     *
580     * Helper function. Prints a warning and returns 0, if the read failed.
581     * Emulated byte order is taken into account.
582     */
583     uint16_t load_16bit_word(struct cpu *cpu, uint64_t addr)
584     {
585     unsigned char data[2];
586    
587 dpavlin 14 if (cpu->machine->arch == ARCH_MIPS && (addr >> 32) == 0)
588 dpavlin 4 addr = (int64_t)(int32_t)addr;
589     cpu->memory_rw(cpu, cpu->mem,
590     addr, data, sizeof(data), MEM_READ, CACHE_DATA);
591    
592     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
593     int tmp = data[0]; data[0] = data[1]; data[1] = tmp;
594     }
595    
596     return (data[0] << 8) + data[1];
597     }
598    
599    
600     /*
601 dpavlin 2 * store_64bit_word_in_host():
602     *
603     * Stores a 64-bit word in the _host's_ RAM. Emulated byte order is taken
604     * into account. This is useful when building structs in the host's RAM
605     * which will later be copied into emulated RAM.
606     */
607     void store_64bit_word_in_host(struct cpu *cpu,
608     unsigned char *data, uint64_t data64)
609     {
610     data[0] = (data64 >> 56) & 255;
611     data[1] = (data64 >> 48) & 255;
612     data[2] = (data64 >> 40) & 255;
613     data[3] = (data64 >> 32) & 255;
614     data[4] = (data64 >> 24) & 255;
615     data[5] = (data64 >> 16) & 255;
616     data[6] = (data64 >> 8) & 255;
617     data[7] = (data64) & 255;
618     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
619     int tmp = data[0]; data[0] = data[7]; data[7] = tmp;
620     tmp = data[1]; data[1] = data[6]; data[6] = tmp;
621     tmp = data[2]; data[2] = data[5]; data[5] = tmp;
622     tmp = data[3]; data[3] = data[4]; data[4] = tmp;
623     }
624     }
625    
626    
627     /*
628     * store_32bit_word_in_host():
629     *
630     * See comment for store_64bit_word_in_host().
631     *
632     * (Note: The data32 parameter is a uint64_t. This is done to suppress
633     * some warnings.)
634     */
635     void store_32bit_word_in_host(struct cpu *cpu,
636     unsigned char *data, uint64_t data32)
637     {
638     data[0] = (data32 >> 24) & 255;
639     data[1] = (data32 >> 16) & 255;
640     data[2] = (data32 >> 8) & 255;
641     data[3] = (data32) & 255;
642     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
643     int tmp = data[0]; data[0] = data[3]; data[3] = tmp;
644     tmp = data[1]; data[1] = data[2]; data[2] = tmp;
645     }
646     }
647    
648    
649     /*
650     * store_16bit_word_in_host():
651     *
652     * See comment for store_64bit_word_in_host().
653     */
654     void store_16bit_word_in_host(struct cpu *cpu,
655     unsigned char *data, uint16_t data16)
656     {
657     data[0] = (data16 >> 8) & 255;
658     data[1] = (data16) & 255;
659     if (cpu->byte_order == EMUL_LITTLE_ENDIAN) {
660     int tmp = data[0]; data[0] = data[1]; data[1] = tmp;
661     }
662     }
663    
664    
665     /****************************************************************************
666     * *
667     * Machine dependant Interrupt routines *
668     * *
669     ****************************************************************************/
670    
671    
672     /*
673     * DECstation KN02 interrupts:
674     */
675     void kn02_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
676     {
677     int current;
678    
679     irq_nr -= 8;
680     irq_nr &= 0xff;
681    
682     if (assrt) {
683     /* OR in the irq_nr into the CSR: */
684 dpavlin 6 m->md_int.kn02_csr->csr[0] |= irq_nr;
685 dpavlin 2 } else {
686     /* AND out the irq_nr from the CSR: */
687 dpavlin 6 m->md_int.kn02_csr->csr[0] &= ~irq_nr;
688 dpavlin 2 }
689    
690 dpavlin 6 current = m->md_int.kn02_csr->csr[0] & m->md_int.kn02_csr->csr[2];
691 dpavlin 2 if (current == 0)
692     cpu_interrupt_ack(cpu, 2);
693     else
694     cpu_interrupt(cpu, 2);
695     }
696    
697    
698     /*
699     * DECstation KMIN interrupts:
700     *
701     * TC slot 3 = system slot.
702     */
703     void kmin_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
704     {
705     irq_nr -= 8;
706     /* debug("kmin_interrupt(): irq_nr=%i assrt=%i\n", irq_nr, assrt); */
707    
708     if (assrt)
709 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] |= irq_nr;
710 dpavlin 2 else
711 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] &= ~irq_nr;
712 dpavlin 2
713 dpavlin 6 if (m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10]
714     & m->md_int.dec_ioasic_data->reg[(IOASIC_IMSK - IOASIC_SLOT_1_START) / 0x10])
715 dpavlin 2 cpu_interrupt(cpu, KMIN_INT_TC3);
716     else
717     cpu_interrupt_ack(cpu, KMIN_INT_TC3);
718     }
719    
720    
721     /*
722     * DECstation KN03 interrupts:
723     */
724     void kn03_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
725     {
726     irq_nr -= 8;
727     /* debug("kn03_interrupt(): irq_nr=0x%x assrt=%i\n", irq_nr, assrt); */
728    
729     if (assrt)
730 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] |= irq_nr;
731 dpavlin 2 else
732 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10] &= ~irq_nr;
733 dpavlin 2
734 dpavlin 6 if (m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10]
735     & m->md_int.dec_ioasic_data->reg[(IOASIC_IMSK - IOASIC_SLOT_1_START) / 0x10])
736 dpavlin 2 cpu_interrupt(cpu, KN03_INT_ASIC);
737     else
738     cpu_interrupt_ack(cpu, KN03_INT_ASIC);
739     }
740    
741    
742     /*
743     * DECstation MAXINE interrupts:
744     */
745     void maxine_interrupt(struct machine *m, struct cpu *cpu,
746     int irq_nr, int assrt)
747     {
748     irq_nr -= 8;
749     debug("maxine_interrupt(): irq_nr=0x%x assrt=%i\n", irq_nr, assrt);
750    
751     if (assrt)
752 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START)
753 dpavlin 2 / 0x10] |= irq_nr;
754     else
755 dpavlin 6 m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START)
756 dpavlin 2 / 0x10] &= ~irq_nr;
757    
758 dpavlin 6 if (m->md_int.dec_ioasic_data->reg[(IOASIC_INTR - IOASIC_SLOT_1_START) / 0x10]
759     & m->md_int.dec_ioasic_data->reg[(IOASIC_IMSK - IOASIC_SLOT_1_START)
760 dpavlin 2 / 0x10])
761     cpu_interrupt(cpu, XINE_INT_TC3);
762     else
763     cpu_interrupt_ack(cpu, XINE_INT_TC3);
764     }
765    
766    
767     /*
768     * DECstation KN230 interrupts:
769     */
770     void kn230_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
771     {
772     int r2 = 0;
773    
774 dpavlin 6 m->md_int.kn230_csr->csr |= irq_nr;
775 dpavlin 2
776     switch (irq_nr) {
777     case KN230_CSR_INTR_SII:
778     case KN230_CSR_INTR_LANCE:
779     r2 = 3;
780     break;
781     case KN230_CSR_INTR_DZ0:
782     case KN230_CSR_INTR_OPT0:
783     case KN230_CSR_INTR_OPT1:
784     r2 = 2;
785     break;
786     default:
787     fatal("kn230_interrupt(): irq_nr = %i ?\n", irq_nr);
788     }
789    
790     if (assrt) {
791     /* OR in the irq_nr mask into the CSR: */
792 dpavlin 6 m->md_int.kn230_csr->csr |= irq_nr;
793 dpavlin 2
794     /* Assert MIPS interrupt 2 or 3: */
795     cpu_interrupt(cpu, r2);
796     } else {
797     /* AND out the irq_nr mask from the CSR: */
798 dpavlin 6 m->md_int.kn230_csr->csr &= ~irq_nr;
799 dpavlin 2
800     /* If the CSR interrupt bits are all zero,
801     clear the bit in the cause register as well. */
802     if (r2 == 2) {
803     /* irq 2: */
804 dpavlin 6 if ((m->md_int.kn230_csr->csr & (KN230_CSR_INTR_DZ0
805 dpavlin 2 | KN230_CSR_INTR_OPT0 | KN230_CSR_INTR_OPT1)) == 0)
806     cpu_interrupt_ack(cpu, r2);
807     } else {
808     /* irq 3: */
809 dpavlin 6 if ((m->md_int.kn230_csr->csr & (KN230_CSR_INTR_SII |
810 dpavlin 2 KN230_CSR_INTR_LANCE)) == 0)
811     cpu_interrupt_ack(cpu, r2);
812     }
813     }
814     }
815    
816    
817     /*
818     * Jazz interrupts (for Acer PICA-61 etc):
819     *
820     * 0..7 MIPS interrupts
821     * 8 + x, where x = 0..15 Jazz interrupts
822     * 8 + x, where x = 16..31 ISA interrupt (irq nr + 16)
823     */
824     void jazz_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
825     {
826     uint32_t irq;
827     int isa = 0;
828    
829     irq_nr -= 8;
830    
831     /* debug("jazz_interrupt() irq_nr = %i, assrt = %i\n",
832     irq_nr, assrt); */
833    
834     if (irq_nr >= 16) {
835     isa = 1;
836     irq_nr -= 16;
837     }
838    
839     irq = 1 << irq_nr;
840    
841     if (isa) {
842     if (assrt)
843 dpavlin 6 m->md_int.jazz_data->isa_int_asserted |= irq;
844 dpavlin 2 else
845 dpavlin 6 m->md_int.jazz_data->isa_int_asserted &= ~irq;
846 dpavlin 2 } else {
847     if (assrt)
848 dpavlin 6 m->md_int.jazz_data->int_asserted |= irq;
849 dpavlin 2 else
850 dpavlin 6 m->md_int.jazz_data->int_asserted &= ~irq;
851 dpavlin 2 }
852    
853 dpavlin 6 /* debug(" %08x %08x\n", m->md_int.jazz_data->int_asserted,
854     m->md_int.jazz_data->int_enable_mask); */
855     /* debug(" %08x %08x\n", m->md_int.jazz_data->isa_int_asserted,
856     m->md_int.jazz_data->isa_int_enable_mask); */
857 dpavlin 2
858 dpavlin 6 if (m->md_int.jazz_data->int_asserted
859     /* & m->md_int.jazz_data->int_enable_mask */ & ~0x8000 )
860 dpavlin 2 cpu_interrupt(cpu, 3);
861     else
862     cpu_interrupt_ack(cpu, 3);
863    
864 dpavlin 6 if (m->md_int.jazz_data->isa_int_asserted &
865     m->md_int.jazz_data->isa_int_enable_mask)
866 dpavlin 2 cpu_interrupt(cpu, 4);
867     else
868     cpu_interrupt_ack(cpu, 4);
869    
870     /* TODO: this "15" (0x8000) is the timer... fix this? */
871 dpavlin 6 if (m->md_int.jazz_data->int_asserted & 0x8000)
872 dpavlin 2 cpu_interrupt(cpu, 6);
873     else
874     cpu_interrupt_ack(cpu, 6);
875     }
876    
877    
878     /*
879     * VR41xx interrupt routine:
880     *
881     * irq_nr = 8 + x
882     * x = 0..15 for level1
883     * x = 16..31 for level2
884     * x = 32+y for GIU interrupt y
885     */
886     void vr41xx_interrupt(struct machine *m, struct cpu *cpu,
887     int irq_nr, int assrt)
888     {
889     int giu_irq = 0;
890    
891     irq_nr -= 8;
892     if (irq_nr >= 32) {
893     giu_irq = irq_nr - 32;
894    
895     if (assrt)
896 dpavlin 6 m->md_int.vr41xx_data->giuint |= (1 << giu_irq);
897 dpavlin 2 else
898 dpavlin 6 m->md_int.vr41xx_data->giuint &= ~(1 << giu_irq);
899 dpavlin 2 }
900    
901     /* TODO: This is wrong. What about GIU bit 8? */
902    
903     if (irq_nr != 8) {
904     /* If any GIU bit is asserted, then assert the main
905     GIU interrupt: */
906 dpavlin 6 if (m->md_int.vr41xx_data->giuint &
907     m->md_int.vr41xx_data->giumask)
908 dpavlin 2 vr41xx_interrupt(m, cpu, 8 + 8, 1);
909     else
910     vr41xx_interrupt(m, cpu, 8 + 8, 0);
911     }
912    
913     /* debug("vr41xx_interrupt(): irq_nr=%i assrt=%i\n",
914     irq_nr, assrt); */
915    
916     if (irq_nr < 16) {
917     if (assrt)
918 dpavlin 6 m->md_int.vr41xx_data->sysint1 |= (1 << irq_nr);
919 dpavlin 2 else
920 dpavlin 6 m->md_int.vr41xx_data->sysint1 &= ~(1 << irq_nr);
921 dpavlin 2 } else if (irq_nr < 32) {
922     irq_nr -= 16;
923     if (assrt)
924 dpavlin 6 m->md_int.vr41xx_data->sysint2 |= (1 << irq_nr);
925 dpavlin 2 else
926 dpavlin 6 m->md_int.vr41xx_data->sysint2 &= ~(1 << irq_nr);
927 dpavlin 2 }
928    
929     /* TODO: Which hardware interrupt pin? */
930    
931     /* debug(" sysint1=%04x mask=%04x, sysint2=%04x mask=%04x\n",
932 dpavlin 6 m->md_int.vr41xx_data->sysint1, m->md_int.vr41xx_data->msysint1,
933     m->md_int.vr41xx_data->sysint2, m->md_int.vr41xx_data->msysint2); */
934 dpavlin 2
935 dpavlin 6 if ((m->md_int.vr41xx_data->sysint1 & m->md_int.vr41xx_data->msysint1) |
936     (m->md_int.vr41xx_data->sysint2 & m->md_int.vr41xx_data->msysint2))
937 dpavlin 2 cpu_interrupt(cpu, 2);
938     else
939     cpu_interrupt_ack(cpu, 2);
940     }
941    
942    
943     /*
944     * Playstation 2 interrupt routine:
945 dpavlin 4 *
946     * irq_nr = 8 + x normal irq x
947     * 8 + 16 + y dma irq y
948     * 8 + 32 + 0 sbus irq 0 (pcmcia)
949     * 8 + 32 + 1 sbus irq 1 (usb)
950 dpavlin 2 */
951     void ps2_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
952     {
953     irq_nr -= 8;
954     debug("ps2_interrupt(): irq_nr=0x%x assrt=%i\n", irq_nr, assrt);
955    
956 dpavlin 4 if (irq_nr >= 32) {
957     int msk = 0;
958     switch (irq_nr - 32) {
959     case 0: /* PCMCIA: */
960     msk = 0x100;
961     break;
962     case 1: /* USB: */
963     msk = 0x400;
964     break;
965     default:
966     fatal("ps2_interrupt(): bad irq_nr %i\n", irq_nr);
967     }
968    
969     if (assrt)
970 dpavlin 6 m->md_int.ps2_data->sbus_smflg |= msk;
971 dpavlin 4 else
972 dpavlin 6 m->md_int.ps2_data->sbus_smflg &= ~msk;
973 dpavlin 4
974 dpavlin 6 if (m->md_int.ps2_data->sbus_smflg != 0)
975 dpavlin 4 cpu_interrupt(cpu, 8 + 1);
976     else
977     cpu_interrupt_ack(cpu, 8 + 1);
978     return;
979     }
980    
981 dpavlin 2 if (assrt) {
982     /* OR into the INTR: */
983 dpavlin 4 if (irq_nr < 16)
984 dpavlin 6 m->md_int.ps2_data->intr |= (1 << irq_nr);
985 dpavlin 2 else
986 dpavlin 6 m->md_int.ps2_data->dmac_reg[0x601] |=
987     (1 << (irq_nr-16));
988 dpavlin 2 } else {
989     /* AND out of the INTR: */
990 dpavlin 4 if (irq_nr < 16)
991 dpavlin 6 m->md_int.ps2_data->intr &= ~(1 << irq_nr);
992 dpavlin 2 else
993 dpavlin 6 m->md_int.ps2_data->dmac_reg[0x601] &=
994     ~(1 << (irq_nr-16));
995 dpavlin 4 }
996 dpavlin 2
997 dpavlin 4 /* TODO: Hm? How about the mask? */
998 dpavlin 6 if (m->md_int.ps2_data->intr /* & m->md_int.ps2_data->imask */ )
999 dpavlin 4 cpu_interrupt(cpu, 2);
1000     else
1001     cpu_interrupt_ack(cpu, 2);
1002    
1003     /* TODO: mask? */
1004 dpavlin 6 if (m->md_int.ps2_data->dmac_reg[0x601] & 0xffff)
1005 dpavlin 4 cpu_interrupt(cpu, 3);
1006     else
1007     cpu_interrupt_ack(cpu, 3);
1008 dpavlin 2 }
1009    
1010    
1011     /*
1012     * SGI "IP22" interrupt routine:
1013     */
1014     void sgi_ip22_interrupt(struct machine *m, struct cpu *cpu,
1015     int irq_nr, int assrt)
1016     {
1017     /*
1018     * SGI-IP22 specific interrupt stuff:
1019     *
1020     * irq_nr should be 8 + x, where x = 0..31 for local0,
1021     * and 32..63 for local1 interrupts.
1022     * Add 64*y for "mappable" interrupts, where 1<<y is
1023     * the mappable interrupt bitmask. TODO: this misses 64*0 !
1024     */
1025    
1026     uint32_t newmask;
1027     uint32_t stat, mask;
1028    
1029     irq_nr -= 8;
1030     newmask = 1 << (irq_nr & 31);
1031    
1032     if (irq_nr >= 64) {
1033     int ms = irq_nr / 64;
1034     uint32_t new = 1 << ms;
1035     if (assrt)
1036 dpavlin 6 m->md_int.sgi_ip22_data->reg[4] |= new;
1037 dpavlin 2 else
1038 dpavlin 6 m->md_int.sgi_ip22_data->reg[4] &= ~new;
1039 dpavlin 2 /* TODO: is this enough? */
1040     irq_nr &= 63;
1041     }
1042    
1043     if (irq_nr < 32) {
1044     if (assrt)
1045 dpavlin 6 m->md_int.sgi_ip22_data->reg[0] |= newmask;
1046 dpavlin 2 else
1047 dpavlin 6 m->md_int.sgi_ip22_data->reg[0] &= ~newmask;
1048 dpavlin 2 } else {
1049     if (assrt)
1050 dpavlin 6 m->md_int.sgi_ip22_data->reg[2] |= newmask;
1051 dpavlin 2 else
1052 dpavlin 6 m->md_int.sgi_ip22_data->reg[2] &= ~newmask;
1053 dpavlin 2 }
1054    
1055     /* Read stat and mask for local0: */
1056 dpavlin 6 stat = m->md_int.sgi_ip22_data->reg[0];
1057     mask = m->md_int.sgi_ip22_data->reg[1];
1058 dpavlin 2 if ((stat & mask) == 0)
1059     cpu_interrupt_ack(cpu, 2);
1060     else
1061     cpu_interrupt(cpu, 2);
1062    
1063     /* Read stat and mask for local1: */
1064 dpavlin 6 stat = m->md_int.sgi_ip22_data->reg[2];
1065     mask = m->md_int.sgi_ip22_data->reg[3];
1066 dpavlin 2 if ((stat & mask) == 0)
1067     cpu_interrupt_ack(cpu, 3);
1068     else
1069     cpu_interrupt(cpu, 3);
1070     }
1071    
1072    
1073     /*
1074     * SGI "IP30" interrupt routine:
1075     *
1076     * irq_nr = 8 + 1 + nr, where nr is:
1077     * 0..49 HEART irqs hardware irq 2,3,4
1078     * 50 HEART timer hardware irq 5
1079     * 51..63 HEART errors hardware irq 6
1080     *
1081     * according to Linux/IP30.
1082     */
1083     void sgi_ip30_interrupt(struct machine *m, struct cpu *cpu,
1084     int irq_nr, int assrt)
1085     {
1086     uint64_t newmask;
1087     uint64_t stat, mask;
1088    
1089     irq_nr -= 8;
1090     if (irq_nr == 0)
1091     goto just_assert_and_such;
1092     irq_nr --;
1093    
1094     newmask = (int64_t)1 << irq_nr;
1095    
1096     if (assrt)
1097 dpavlin 6 m->md_int.sgi_ip30_data->isr |= newmask;
1098 dpavlin 2 else
1099 dpavlin 6 m->md_int.sgi_ip30_data->isr &= ~newmask;
1100 dpavlin 2
1101     just_assert_and_such:
1102    
1103     cpu_interrupt_ack(cpu, 2);
1104     cpu_interrupt_ack(cpu, 3);
1105     cpu_interrupt_ack(cpu, 4);
1106     cpu_interrupt_ack(cpu, 5);
1107     cpu_interrupt_ack(cpu, 6);
1108    
1109 dpavlin 6 stat = m->md_int.sgi_ip30_data->isr;
1110     mask = m->md_int.sgi_ip30_data->imask0;
1111 dpavlin 2
1112     if ((stat & mask) & 0x000000000000ffffULL)
1113     cpu_interrupt(cpu, 2);
1114     if ((stat & mask) & 0x00000000ffff0000ULL)
1115     cpu_interrupt(cpu, 3);
1116     if ((stat & mask) & 0x0003ffff00000000ULL)
1117     cpu_interrupt(cpu, 4);
1118     if ((stat & mask) & 0x0004000000000000ULL)
1119     cpu_interrupt(cpu, 5);
1120     if ((stat & mask) & 0xfff8000000000000ULL)
1121     cpu_interrupt(cpu, 6);
1122     }
1123    
1124    
1125     /*
1126     * SGI "IP32" interrupt routine:
1127     */
1128     void sgi_ip32_interrupt(struct machine *m, struct cpu *cpu,
1129     int irq_nr, int assrt)
1130     {
1131     /*
1132     * The 64-bit word at crime offset 0x10 is CRIME_INTSTAT,
1133     * which contains the current interrupt bits. CRIME_INTMASK
1134     * contains a mask of which bits are actually in use.
1135     *
1136     * crime hardcoded at 0x14000000, for SGI-IP32.
1137     * If any of these bits are asserted, then physical MIPS
1138     * interrupt 2 should be asserted.
1139     *
1140     * TODO: how should all this be done nicely?
1141     */
1142    
1143     uint64_t crime_addr = CRIME_INTSTAT;
1144 dpavlin 10 uint64_t mace_addr = 0x10;
1145     uint64_t crime_interrupts, crime_interrupts_mask;
1146     uint64_t mace_interrupts, mace_interrupt_mask;
1147 dpavlin 2 unsigned int i;
1148     unsigned char x[8];
1149    
1150 dpavlin 10 /* Read current MACE interrupt assertions: */
1151     memcpy(x, m->md_int.ip32.mace_data->reg + mace_addr,
1152     sizeof(uint64_t));
1153     mace_interrupts = 0;
1154     for (i=0; i<sizeof(uint64_t); i++) {
1155     mace_interrupts <<= 8;
1156     mace_interrupts |= x[i];
1157     }
1158    
1159     /* Read current MACE interrupt mask: */
1160     memcpy(x, m->md_int.ip32.mace_data->reg + mace_addr + 8,
1161     sizeof(uint64_t));
1162     mace_interrupt_mask = 0;
1163     for (i=0; i<sizeof(uint64_t); i++) {
1164     mace_interrupt_mask <<= 8;
1165     mace_interrupt_mask |= x[i];
1166     }
1167    
1168 dpavlin 2 /*
1169     * This mapping of both MACE and CRIME interrupts into the same
1170     * 'int' is really ugly.
1171     *
1172     * If MACE_PERIPH_MISC or MACE_PERIPH_SERIAL is set, then mask
1173     * that bit out and treat the rest of the word as the mace interrupt
1174     * bitmask.
1175     *
1176     * TODO: fix.
1177     */
1178     if (irq_nr & MACE_PERIPH_SERIAL) {
1179     if (assrt)
1180     mace_interrupts |= (irq_nr & ~MACE_PERIPH_SERIAL);
1181     else
1182     mace_interrupts &= ~(irq_nr & ~MACE_PERIPH_SERIAL);
1183    
1184     irq_nr = MACE_PERIPH_SERIAL;
1185 dpavlin 10 if ((mace_interrupts & mace_interrupt_mask) == 0)
1186 dpavlin 2 assrt = 0;
1187     else
1188     assrt = 1;
1189     }
1190    
1191     /* Hopefully _MISC and _SERIAL will not be both on at the same time. */
1192     if (irq_nr & MACE_PERIPH_MISC) {
1193     if (assrt)
1194     mace_interrupts |= (irq_nr & ~MACE_PERIPH_MISC);
1195     else
1196     mace_interrupts &= ~(irq_nr & ~MACE_PERIPH_MISC);
1197    
1198     irq_nr = MACE_PERIPH_MISC;
1199 dpavlin 10 if ((mace_interrupts & mace_interrupt_mask) == 0)
1200 dpavlin 2 assrt = 0;
1201     else
1202     assrt = 1;
1203     }
1204    
1205 dpavlin 10 /* Write back MACE interrupt assertions: */
1206     for (i=0; i<sizeof(uint64_t); i++)
1207     x[7-i] = mace_interrupts >> (i*8);
1208     memcpy(m->md_int.ip32.mace_data->reg + mace_addr, x, sizeof(uint64_t));
1209    
1210 dpavlin 2 /* Read CRIME_INTSTAT: */
1211 dpavlin 10 memcpy(x, m->md_int.ip32.crime_data->reg + crime_addr,
1212     sizeof(uint64_t));
1213 dpavlin 2 crime_interrupts = 0;
1214 dpavlin 10 for (i=0; i<sizeof(uint64_t); i++) {
1215 dpavlin 2 crime_interrupts <<= 8;
1216     crime_interrupts |= x[i];
1217     }
1218    
1219     if (assrt)
1220     crime_interrupts |= irq_nr;
1221     else
1222     crime_interrupts &= ~irq_nr;
1223    
1224     /* Write back CRIME_INTSTAT: */
1225 dpavlin 10 for (i=0; i<sizeof(uint64_t); i++)
1226 dpavlin 2 x[7-i] = crime_interrupts >> (i*8);
1227 dpavlin 10 memcpy(m->md_int.ip32.crime_data->reg + crime_addr, x,
1228     sizeof(uint64_t));
1229 dpavlin 2
1230     /* Read CRIME_INTMASK: */
1231 dpavlin 10 memcpy(x, m->md_int.ip32.crime_data->reg + CRIME_INTMASK,
1232     sizeof(uint64_t));
1233 dpavlin 2 crime_interrupts_mask = 0;
1234 dpavlin 10 for (i=0; i<sizeof(uint64_t); i++) {
1235 dpavlin 2 crime_interrupts_mask <<= 8;
1236     crime_interrupts_mask |= x[i];
1237     }
1238    
1239     if ((crime_interrupts & crime_interrupts_mask) == 0)
1240     cpu_interrupt_ack(cpu, 2);
1241     else
1242     cpu_interrupt(cpu, 2);
1243    
1244 dpavlin 10 /* printf("sgi_crime_machine_irq(%i,%i): new interrupts = 0x%08x\n",
1245     assrt, irq_nr, crime_interrupts); */
1246 dpavlin 2 }
1247    
1248    
1249     /*
1250     * Au1x00 interrupt routine:
1251     *
1252     * TODO: This is just bogus so far. For more info, read this:
1253     * http://www.meshcube.org/cgi-bin/viewcvs.cgi/kernel/linux/arch/mips/au1000/common/
1254     *
1255     * CPU int 2 = IC 0, request 0
1256     * CPU int 3 = IC 0, request 1
1257     * CPU int 4 = IC 1, request 0
1258     * CPU int 5 = IC 1, request 1
1259     *
1260     * Interrupts 0..31 are on interrupt controller 0, interrupts 32..63 are
1261     * on controller 1.
1262     *
1263     * Special case: if irq_nr == 64+8, then this just updates the CPU
1264     * interrupt assertions.
1265     */
1266     void au1x00_interrupt(struct machine *m, struct cpu *cpu,
1267     int irq_nr, int assrt)
1268     {
1269     uint32_t ms;
1270    
1271     irq_nr -= 8;
1272     debug("au1x00_interrupt(): irq_nr=%i assrt=%i\n", irq_nr, assrt);
1273    
1274     if (irq_nr < 64) {
1275     ms = 1 << (irq_nr & 31);
1276    
1277     if (assrt)
1278 dpavlin 6 m->md_int.au1x00_ic_data->request0_int |= ms;
1279 dpavlin 2 else
1280 dpavlin 6 m->md_int.au1x00_ic_data->request0_int &= ~ms;
1281 dpavlin 2
1282     /* TODO: Controller 1 */
1283     }
1284    
1285 dpavlin 6 if ((m->md_int.au1x00_ic_data->request0_int &
1286     m->md_int.au1x00_ic_data->mask) != 0)
1287 dpavlin 2 cpu_interrupt(cpu, 2);
1288     else
1289     cpu_interrupt_ack(cpu, 2);
1290    
1291     /* TODO: What _is_ request1? */
1292    
1293     /* TODO: Controller 1 */
1294     }
1295    
1296    
1297 dpavlin 6 /*
1298 dpavlin 20 * CPC700 interrupt routine:
1299 dpavlin 10 *
1300 dpavlin 20 * irq_nr should be 0..31. (32 means reassertion.)
1301 dpavlin 10 */
1302 dpavlin 20 void cpc700_interrupt(struct machine *m, struct cpu *cpu,
1303     int irq_nr, int assrt)
1304 dpavlin 10 {
1305 dpavlin 20 if (irq_nr < 32) {
1306     uint32_t mask = 1 << (irq_nr & 31);
1307 dpavlin 10 if (assrt)
1308 dpavlin 20 m->md_int.cpc700_data->sr |= mask;
1309 dpavlin 10 else
1310 dpavlin 20 m->md_int.cpc700_data->sr &= ~mask;
1311 dpavlin 10 }
1312    
1313 dpavlin 20 if ((m->md_int.cpc700_data->sr & m->md_int.cpc700_data->er) != 0)
1314     cpu_interrupt(cpu, 65);
1315 dpavlin 10 else
1316 dpavlin 20 cpu_interrupt_ack(cpu, 65);
1317 dpavlin 10 }
1318    
1319    
1320     /*
1321 dpavlin 20 * Interrupt function for Cobalt, evbmips (Malta), and Algor.
1322 dpavlin 12 *
1323     * (irq_nr = 8 + 16 can be used to just reassert/deassert interrupts.)
1324     */
1325 dpavlin 20 void isa8_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
1326 dpavlin 12 {
1327 dpavlin 20 int mask, x;
1328     int old_isa_assert, new_isa_assert;
1329 dpavlin 12
1330 dpavlin 20 old_isa_assert = m->isa_pic_data.pic1->irr & ~m->isa_pic_data.pic1->ier;
1331    
1332 dpavlin 12 irq_nr -= 8;
1333     mask = 1 << (irq_nr & 7);
1334    
1335     if (irq_nr < 8) {
1336     if (assrt)
1337 dpavlin 14 m->isa_pic_data.pic1->irr |= mask;
1338 dpavlin 12 else
1339 dpavlin 14 m->isa_pic_data.pic1->irr &= ~mask;
1340 dpavlin 12 } else if (irq_nr < 16) {
1341     if (assrt)
1342 dpavlin 14 m->isa_pic_data.pic2->irr |= mask;
1343 dpavlin 12 else
1344 dpavlin 14 m->isa_pic_data.pic2->irr &= ~mask;
1345 dpavlin 12 }
1346    
1347     /* Any interrupt assertions on PIC2 go to irq 2 on PIC1 */
1348     /* (TODO: don't hardcode this here) */
1349 dpavlin 20 if (m->isa_pic_data.pic2->irr & ~m->isa_pic_data.pic2->ier)
1350 dpavlin 14 m->isa_pic_data.pic1->irr |= 0x04;
1351 dpavlin 12 else
1352 dpavlin 14 m->isa_pic_data.pic1->irr &= ~0x04;
1353 dpavlin 12
1354     /* Now, PIC1: */
1355 dpavlin 20 new_isa_assert = m->isa_pic_data.pic1->irr & ~m->isa_pic_data.pic1->ier;
1356     if (old_isa_assert != new_isa_assert) {
1357     for (x=0; x<16; x++) {
1358     if (x == 2)
1359     continue;
1360     if (x < 8 && (m->isa_pic_data.pic1->irr &
1361     ~m->isa_pic_data.pic1->ier & (1 << x)))
1362     break;
1363     if (x >= 8 && (m->isa_pic_data.pic2->irr &
1364     ~m->isa_pic_data.pic2->ier & (1 << (x&7))))
1365     break;
1366     }
1367     m->isa_pic_data.last_int = x;
1368     }
1369    
1370     if (m->isa_pic_data.pic1->irr & ~m->isa_pic_data.pic1->ier)
1371     cpu_interrupt(cpu, m->isa_pic_data.native_irq);
1372 dpavlin 12 else
1373 dpavlin 20 cpu_interrupt_ack(cpu, m->isa_pic_data.native_irq);
1374 dpavlin 12 }
1375    
1376    
1377     /*
1378 dpavlin 6 * x86 (PC) interrupts:
1379     *
1380     * (irq_nr = 16 can be used to just reassert/deassert interrupts.)
1381     */
1382     void x86_pc_interrupt(struct machine *m, struct cpu *cpu, int irq_nr, int assrt)
1383     {
1384     int mask = 1 << (irq_nr & 7);
1385    
1386     if (irq_nr < 8) {
1387     if (assrt)
1388 dpavlin 14 m->isa_pic_data.pic1->irr |= mask;
1389 dpavlin 6 else
1390 dpavlin 14 m->isa_pic_data.pic1->irr &= ~mask;
1391 dpavlin 6 } else if (irq_nr < 16) {
1392 dpavlin 14 if (m->isa_pic_data.pic2 == NULL) {
1393 dpavlin 6 fatal("x86_pc_interrupt(): pic2 used (irq_nr = %i), "
1394     "but we are emulating an XT?\n", irq_nr);
1395     return;
1396     }
1397     if (assrt)
1398 dpavlin 14 m->isa_pic_data.pic2->irr |= mask;
1399 dpavlin 6 else
1400 dpavlin 14 m->isa_pic_data.pic2->irr &= ~mask;
1401 dpavlin 6 }
1402    
1403 dpavlin 14 if (m->isa_pic_data.pic2 != NULL) {
1404 dpavlin 6 /* Any interrupt assertions on PIC2 go to irq 2 on PIC1 */
1405     /* (TODO: don't hardcode this here) */
1406 dpavlin 14 if (m->isa_pic_data.pic2->irr & ~m->isa_pic_data.pic2->ier)
1407     m->isa_pic_data.pic1->irr |= 0x04;
1408 dpavlin 6 else
1409 dpavlin 14 m->isa_pic_data.pic1->irr &= ~0x04;
1410 dpavlin 6 }
1411    
1412     /* Now, PIC1: */
1413 dpavlin 14 if (m->isa_pic_data.pic1->irr & ~m->isa_pic_data.pic1->ier)
1414 dpavlin 6 cpu->cd.x86.interrupt_asserted = 1;
1415     else
1416     cpu->cd.x86.interrupt_asserted = 0;
1417     }
1418    
1419    
1420 dpavlin 14 /*
1421 dpavlin 20 * "Generic" ISA interrupt management, 32 native interrupts, 16 ISA
1422     * interrupts. So far: Footbridge (CATS, NetWinder), BeBox, and PReP.
1423 dpavlin 14 *
1424     * 0..31 = footbridge interrupt
1425 dpavlin 20 * 32..47 = ISA interrupts
1426     * 48 = ISA reassert
1427     * 64 = reassert (non-ISA)
1428 dpavlin 14 */
1429 dpavlin 20 void isa32_interrupt(struct machine *m, struct cpu *cpu, int irq_nr,
1430 dpavlin 14 int assrt)
1431     {
1432     uint32_t mask = 1 << (irq_nr & 31);
1433     int old_isa_assert, new_isa_assert;
1434    
1435     old_isa_assert = m->isa_pic_data.pic1->irr & ~m->isa_pic_data.pic1->ier;
1436    
1437     if (irq_nr >= 32 && irq_nr < 32 + 8) {
1438     int mm = 1 << (irq_nr & 7);
1439     if (assrt)
1440     m->isa_pic_data.pic1->irr |= mm;
1441     else
1442     m->isa_pic_data.pic1->irr &= ~mm;
1443     } else if (irq_nr >= 32+8 && irq_nr < 32+16) {
1444     int mm = 1 << (irq_nr & 7);
1445     if (assrt)
1446     m->isa_pic_data.pic2->irr |= mm;
1447     else
1448     m->isa_pic_data.pic2->irr &= ~mm;
1449     }
1450    
1451     /* Any interrupt assertions on PIC2 go to irq 2 on PIC1 */
1452     /* (TODO: don't hardcode this here) */
1453     if (m->isa_pic_data.pic2->irr & ~m->isa_pic_data.pic2->ier)
1454     m->isa_pic_data.pic1->irr |= 0x04;
1455     else
1456     m->isa_pic_data.pic1->irr &= ~0x04;
1457    
1458     /* Now, PIC1: */
1459     new_isa_assert = m->isa_pic_data.pic1->irr & ~m->isa_pic_data.pic1->ier;
1460 dpavlin 20 if (old_isa_assert != new_isa_assert || irq_nr == 48) {
1461     if (new_isa_assert) {
1462     int x;
1463     for (x=0; x<16; x++) {
1464     if (x == 2)
1465     continue;
1466     if (x < 8 && (m->isa_pic_data.pic1->irr &
1467     ~m->isa_pic_data.pic1->ier & (1 << x)))
1468     break;
1469     if (x >= 8 && (m->isa_pic_data.pic2->irr &
1470     ~m->isa_pic_data.pic2->ier & (1 << (x&7))))
1471     break;
1472     }
1473     m->isa_pic_data.last_int = x;
1474     cpu_interrupt(cpu, m->isa_pic_data.native_irq);
1475     } else
1476     cpu_interrupt_ack(cpu, m->isa_pic_data.native_irq);
1477 dpavlin 14 return;
1478     }
1479    
1480 dpavlin 20 switch (m->machine_type) {
1481     case MACHINE_CATS:
1482     case MACHINE_NETWINDER:
1483     if (irq_nr < 32) {
1484     if (assrt)
1485     m->md_int.footbridge_data->irq_status |= mask;
1486     else
1487     m->md_int.footbridge_data->irq_status &= ~mask;
1488     }
1489     if (m->md_int.footbridge_data->irq_status &
1490     m->md_int.footbridge_data->irq_enable)
1491     cpu_interrupt(cpu, 65);
1492 dpavlin 14 else
1493 dpavlin 20 cpu_interrupt_ack(cpu, 65);
1494     break;
1495     case MACHINE_BEBOX:
1496     if (irq_nr < 32) {
1497     if (assrt)
1498     m->md_int.bebox_data->int_status |= mask;
1499     else
1500     m->md_int.bebox_data->int_status &= ~mask;
1501     }
1502     if (m->md_int.bebox_data->int_status &
1503     m->md_int.bebox_data->cpu0_int_mask)
1504     cpu_interrupt(m->cpus[0], 65);
1505     else
1506     cpu_interrupt_ack(m->cpus[0], 65);
1507     if (m->ncpus > 1 &&
1508     m->md_int.bebox_data->int_status &
1509     m->md_int.bebox_data->cpu1_int_mask)
1510     cpu_interrupt(m->cpus[1], 65);
1511     else
1512     cpu_interrupt_ack(m->cpus[1], 65);
1513     break;
1514     case MACHINE_PREP:
1515     if (irq_nr < 32) {
1516     if (assrt)
1517     m->md_int.prep_data->int_status |= mask;
1518     else
1519     m->md_int.prep_data->int_status &= ~mask;
1520     }
1521     if (m->md_int.prep_data->int_status & 2)
1522     cpu_interrupt(cpu, 65);
1523     else
1524     cpu_interrupt_ack(cpu, 65);
1525     break;
1526 dpavlin 14 }
1527     }
1528    
1529    
1530 dpavlin 2 /****************************************************************************
1531     * *
1532     * Machine dependant Initialization routines *
1533     * *
1534     ****************************************************************************/
1535    
1536    
1537     /*
1538     * machine_setup():
1539     *
1540     * This (rather large) function initializes memory, registers, and/or devices
1541     * required by specific machine emulations.
1542     */
1543     void machine_setup(struct machine *machine)
1544     {
1545     uint64_t addr, addr2;
1546     int i, j;
1547     struct memory *mem;
1548     char tmpstr[1000];
1549 dpavlin 12 struct cons_data *cons_data;
1550 dpavlin 2
1551     /* DECstation: */
1552     char *framebuffer_console_name, *serial_console_name;
1553     int color_fb_flag;
1554     int boot_scsi_boardnumber = 3, boot_net_boardnumber = 3;
1555     char *turbochannel_default_gfx_card = "PMAG-BA";
1556     /* PMAG-AA, -BA, -CA/DA/EA/FA, -JA, -RO, PMAGB-BA */
1557    
1558     /* HPCmips: */
1559     struct xx {
1560     struct btinfo_magic a;
1561     struct btinfo_bootpath b;
1562     struct btinfo_symtab c;
1563     } xx;
1564     struct hpc_bootinfo hpc_bootinfo;
1565 dpavlin 18 int hpc_platid_flags = 0, hpc_platid_cpu_submodel = 0,
1566     hpc_platid_cpu_model = 0, hpc_platid_cpu_series = 0,
1567     hpc_platid_cpu_arch = 0,
1568     hpc_platid_submodel = 0, hpc_platid_model = 0,
1569     hpc_platid_series = 0, hpc_platid_vendor = 0;
1570     uint64_t hpc_fb_addr = 0;
1571     int hpc_fb_bits = 0, hpc_fb_encoding = 0;
1572     int hpc_fb_xsize = 0;
1573     int hpc_fb_ysize = 0;
1574     int hpc_fb_xsize_mem = 0;
1575     int hpc_fb_ysize_mem = 0;
1576 dpavlin 2
1577     /* ARCBIOS stuff: */
1578     uint64_t sgi_ram_offset = 0;
1579     int arc_wordlen = sizeof(uint32_t);
1580     char *eaddr_string = "eaddr=10:20:30:40:50:60"; /* nonsense */
1581     unsigned char macaddr[6];
1582    
1583     /* Generic bootstring stuff: */
1584 dpavlin 6 int bootdev_type = 0;
1585     int bootdev_id;
1586 dpavlin 2 char *bootstr = NULL;
1587     char *bootarg = NULL;
1588     char *init_bootpath;
1589    
1590     /* PCI stuff: */
1591 dpavlin 14 struct pci_data *pci_data = NULL;
1592 dpavlin 2
1593     /* Framebuffer stuff: */
1594 dpavlin 14 struct vfb_data *fb = NULL;
1595 dpavlin 2
1596     /* Abreviation: :-) */
1597     struct cpu *cpu = machine->cpus[machine->bootstrap_cpu];
1598    
1599    
1600 dpavlin 6 bootdev_id = diskimage_bootdev(machine, &bootdev_type);
1601    
1602 dpavlin 2 mem = cpu->mem;
1603     machine->machine_name = NULL;
1604    
1605     /* TODO: Move this somewhere else? */
1606     if (machine->boot_string_argument == NULL) {
1607     switch (machine->machine_type) {
1608     case MACHINE_ARC:
1609     machine->boot_string_argument = "-aN";
1610     break;
1611 dpavlin 16 case MACHINE_CATS:
1612     machine->boot_string_argument = "-A";
1613     break;
1614 dpavlin 2 case MACHINE_DEC:
1615     machine->boot_string_argument = "-a";
1616     break;
1617     default:
1618     /* Important, because boot_string_argument should
1619     not be set to NULL: */
1620     machine->boot_string_argument = "";
1621     }
1622     }
1623    
1624     switch (machine->machine_type) {
1625    
1626     case MACHINE_NONE:
1627     printf("\nNo emulation type specified.\n");
1628     exit(1);
1629    
1630 dpavlin 12 #ifdef ENABLE_MIPS
1631 dpavlin 2 case MACHINE_BAREMIPS:
1632     /*
1633     * A "bare" MIPS test machine.
1634     *
1635     * NOTE: NO devices at all.
1636     */
1637     cpu->byte_order = EMUL_BIG_ENDIAN;
1638     machine->machine_name = "\"Bare\" MIPS machine";
1639     break;
1640    
1641     case MACHINE_TESTMIPS:
1642     /*
1643 dpavlin 10 * A MIPS test machine (which happens to work with the
1644     * code in my master's thesis). :-)
1645 dpavlin 12 *
1646     * IRQ map:
1647     * 7 CPU counter
1648     * 6 SMP IPIs
1649     * 5 not used yet
1650     * 4 not used yet
1651     * 3 ethernet
1652     * 2 serial console
1653 dpavlin 2 */
1654     cpu->byte_order = EMUL_BIG_ENDIAN;
1655     machine->machine_name = "MIPS test machine";
1656    
1657 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=2",
1658     (long long)DEV_CONS_ADDRESS);
1659     cons_data = device_add(machine, tmpstr);
1660     machine->main_console_handle = cons_data->console_handle;
1661 dpavlin 2
1662 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
1663 dpavlin 2 (long long)DEV_MP_ADDRESS);
1664     device_add(machine, tmpstr);
1665    
1666 dpavlin 12 fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
1667     640,480, 640,480, 24, "testmips generic");
1668    
1669     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
1670     (long long)DEV_DISK_ADDRESS);
1671     device_add(machine, tmpstr);
1672    
1673     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=3",
1674     (long long)DEV_ETHER_ADDRESS);
1675     device_add(machine, tmpstr);
1676    
1677 dpavlin 2 break;
1678    
1679     case MACHINE_DEC:
1680     cpu->byte_order = EMUL_LITTLE_ENDIAN;
1681    
1682     /* An R2020 or R3220 memory thingy: */
1683     cpu->cd.mips.coproc[3] = mips_coproc_new(cpu, 3);
1684    
1685     /* There aren't really any good standard values... */
1686     framebuffer_console_name = "osconsole=0,3";
1687     serial_console_name = "osconsole=1";
1688    
1689     switch (machine->machine_subtype) {
1690     case MACHINE_DEC_PMAX_3100: /* type 1, KN01 */
1691     /* Supposed to have 12MHz or 16.67MHz R2000 CPU, R2010 FPC, R2020 Memory coprocessor */
1692     machine->machine_name = "DEC PMAX 3100 (KN01)";
1693    
1694     /* 12 MHz for 2100, 16.67 MHz for 3100 */
1695     if (machine->emulated_hz == 0)
1696     machine->emulated_hz = 16670000;
1697    
1698     if (machine->physical_ram_in_mb > 24)
1699     fprintf(stderr, "WARNING! Real DECstation 3100 machines cannot have more than 24MB RAM. Continuing anyway.\n");
1700    
1701     if ((machine->physical_ram_in_mb % 4) != 0)
1702     fprintf(stderr, "WARNING! Real DECstation 3100 machines have an integer multiple of 4 MBs of RAM. Continuing anyway.\n");
1703    
1704     color_fb_flag = 1; /* 1 for color, 0 for mono. TODO: command line option? */
1705    
1706     /*
1707     * According to NetBSD/pmax:
1708     *
1709     * pm0 at ibus0 addr 0xfc00000: 1024x864x1 (or x8 for color)
1710     * dc0 at ibus0 addr 0x1c000000
1711     * le0 at ibus0 addr 0x18000000: address 00:00:00:00:00:00
1712     * sii0 at ibus0 addr 0x1a000000
1713     * mcclock0 at ibus0 addr 0x1d000000: mc146818 or compatible
1714     * 0x1e000000 = system status and control register
1715     */
1716     fb = dev_fb_init(machine, mem, KN01_PHYS_FBUF_START,
1717     color_fb_flag? VFB_DEC_VFB02 : VFB_DEC_VFB01,
1718 dpavlin 12 0,0,0,0,0, color_fb_flag? "VFB02":"VFB01");
1719 dpavlin 2 dev_colorplanemask_init(mem, KN01_PHYS_COLMASK_START, &fb->color_plane_mask);
1720     dev_vdac_init(mem, KN01_SYS_VDAC, fb->rgb_palette, color_fb_flag);
1721     dev_le_init(machine, mem, KN01_SYS_LANCE, KN01_SYS_LANCE_B_START, KN01_SYS_LANCE_B_END, KN01_INT_LANCE, 4*1048576);
1722     dev_sii_init(machine, mem, KN01_SYS_SII, KN01_SYS_SII_B_START, KN01_SYS_SII_B_END, KN01_INT_SII);
1723     dev_dc7085_init(machine, mem, KN01_SYS_DZ, KN01_INT_DZ, machine->use_x11);
1724     dev_mc146818_init(machine, mem, KN01_SYS_CLOCK, KN01_INT_CLOCK, MC146818_DEC, 1);
1725     dev_kn01_csr_init(mem, KN01_SYS_CSR, color_fb_flag);
1726    
1727     framebuffer_console_name = "osconsole=0,3"; /* fb,keyb */
1728     serial_console_name = "osconsole=3"; /* 3 */
1729     break;
1730    
1731     case MACHINE_DEC_3MAX_5000: /* type 2, KN02 */
1732     /* Supposed to have 25MHz R3000 CPU, R3010 FPC, */
1733     /* and a R3220 Memory coprocessor */
1734     machine->machine_name = "DECstation 5000/200 (3MAX, KN02)";
1735    
1736     if (machine->emulated_hz == 0)
1737     machine->emulated_hz = 25000000;
1738    
1739     if (machine->physical_ram_in_mb < 8)
1740     fprintf(stderr, "WARNING! Real KN02 machines do not have less than 8MB RAM. Continuing anyway.\n");
1741     if (machine->physical_ram_in_mb > 480)
1742     fprintf(stderr, "WARNING! Real KN02 machines cannot have more than 480MB RAM. Continuing anyway.\n");
1743    
1744     /* An R3220 memory thingy: */
1745     cpu->cd.mips.coproc[3] = mips_coproc_new(cpu, 3);
1746    
1747     /*
1748     * According to NetBSD/pmax:
1749     * asc0 at tc0 slot 5 offset 0x0
1750     * le0 at tc0 slot 6 offset 0x0
1751     * ibus0 at tc0 slot 7 offset 0x0
1752     * dc0 at ibus0 addr 0x1fe00000
1753     * mcclock0 at ibus0 addr 0x1fe80000: mc146818
1754     *
1755     * kn02 shared irq numbers (IP) are offset by +8
1756     * in the emulator
1757     */
1758    
1759     /* KN02 interrupts: */
1760     machine->md_interrupt = kn02_interrupt;
1761    
1762     /*
1763     * TURBOchannel slots 0, 1, and 2 are free for
1764     * option cards. Let's put in zero or more graphics
1765     * boards:
1766     *
1767     * TODO: It's also possible to have larger graphics
1768     * cards that occupy several slots. How to solve
1769     * this nicely?
1770     */
1771     dev_turbochannel_init(machine, mem, 0,
1772     KN02_PHYS_TC_0_START, KN02_PHYS_TC_0_END,
1773     machine->n_gfx_cards >= 1?
1774     turbochannel_default_gfx_card : "",
1775     KN02_IP_SLOT0 +8);
1776    
1777     dev_turbochannel_init(machine, mem, 1,
1778     KN02_PHYS_TC_1_START, KN02_PHYS_TC_1_END,
1779     machine->n_gfx_cards >= 2?
1780     turbochannel_default_gfx_card : "",
1781     KN02_IP_SLOT1 +8);
1782    
1783     dev_turbochannel_init(machine, mem, 2,
1784     KN02_PHYS_TC_2_START, KN02_PHYS_TC_2_END,
1785     machine->n_gfx_cards >= 3?
1786     turbochannel_default_gfx_card : "",
1787     KN02_IP_SLOT2 +8);
1788    
1789     /* TURBOchannel slots 3 and 4 are reserved. */
1790    
1791     /* TURBOchannel slot 5 is PMAZ-AA ("asc" SCSI). */
1792     dev_turbochannel_init(machine, mem, 5,
1793     KN02_PHYS_TC_5_START, KN02_PHYS_TC_5_END,
1794     "PMAZ-AA", KN02_IP_SCSI +8);
1795    
1796     /* TURBOchannel slot 6 is PMAD-AA ("le" ethernet). */
1797     dev_turbochannel_init(machine, mem, 6,
1798     KN02_PHYS_TC_6_START, KN02_PHYS_TC_6_END,
1799     "PMAD-AA", KN02_IP_LANCE +8);
1800    
1801     /* TURBOchannel slot 7 is system stuff. */
1802     machine->main_console_handle =
1803     dev_dc7085_init(machine, mem,
1804     KN02_SYS_DZ, KN02_IP_DZ +8, machine->use_x11);
1805     dev_mc146818_init(machine, mem,
1806     KN02_SYS_CLOCK, KN02_INT_CLOCK, MC146818_DEC, 1);
1807    
1808 dpavlin 6 machine->md_int.kn02_csr =
1809 dpavlin 2 dev_kn02_init(cpu, mem, KN02_SYS_CSR);
1810    
1811     framebuffer_console_name = "osconsole=0,7";
1812     /* fb,keyb */
1813     serial_console_name = "osconsole=2";
1814     boot_scsi_boardnumber = 5;
1815     boot_net_boardnumber = 6; /* TODO: 3? */
1816     break;
1817    
1818     case MACHINE_DEC_3MIN_5000: /* type 3, KN02BA */
1819     machine->machine_name = "DECstation 5000/112 or 145 (3MIN, KN02BA)";
1820     if (machine->emulated_hz == 0)
1821     machine->emulated_hz = 33000000;
1822     if (machine->physical_ram_in_mb > 128)
1823     fprintf(stderr, "WARNING! Real 3MIN machines cannot have more than 128MB RAM. Continuing anyway.\n");
1824    
1825     /* KMIN interrupts: */
1826     machine->md_interrupt = kmin_interrupt;
1827    
1828     /*
1829     * tc0 at mainbus0: 12.5 MHz clock (0x10000000, slotsize = 64MB)
1830     * tc slot 1: 0x14000000
1831     * tc slot 2: 0x18000000
1832     * ioasic0 at tc0 slot 3 offset 0x0 (0x1c000000) slot 0
1833     * asic regs (0x1c040000) slot 1
1834     * station's ether address (0x1c080000) slot 2
1835     * le0 at ioasic0 offset 0xc0000: address 00:00:00:00:00:00 (0x1c0c0000) slot 3
1836     * scc0 at ioasic0 offset 0x100000 (0x1c100000) slot 4
1837     * scc1 at ioasic0 offset 0x180000: console (0x1c180000) slot 6
1838     * mcclock0 at ioasic0 offset 0x200000: mc146818 or compatible (0x1c200000) slot 8
1839     * asc0 at ioasic0 offset 0x300000: NCR53C94, 25MHz, SCSI ID 7 (0x1c300000) slot 12
1840     * dma for asc0 (0x1c380000) slot 14
1841     */
1842 dpavlin 6 machine->md_int.dec_ioasic_data = dev_dec_ioasic_init(cpu, mem, 0x1c000000, 0);
1843 dpavlin 2 dev_le_init(machine, mem, 0x1c0c0000, 0, 0, KMIN_INTR_LANCE +8, 4*65536);
1844     dev_scc_init(machine, mem, 0x1c100000, KMIN_INTR_SCC_0 +8, machine->use_x11, 0, 1);
1845     dev_scc_init(machine, mem, 0x1c180000, KMIN_INTR_SCC_1 +8, machine->use_x11, 1, 1);
1846     dev_mc146818_init(machine, mem, 0x1c200000, KMIN_INTR_CLOCK +8, MC146818_DEC, 1);
1847     dev_asc_init(machine, mem, 0x1c300000, KMIN_INTR_SCSI +8,
1848     NULL, DEV_ASC_DEC, NULL, NULL);
1849    
1850     /*
1851     * TURBOchannel slots 0, 1, and 2 are free for
1852     * option cards. These are by default filled with
1853     * zero or more graphics boards.
1854     *
1855     * TODO: irqs
1856     */
1857     dev_turbochannel_init(machine, mem, 0,
1858     0x10000000, 0x103fffff,
1859     machine->n_gfx_cards >= 1?
1860     turbochannel_default_gfx_card : "",
1861     KMIN_INT_TC0);
1862    
1863     dev_turbochannel_init(machine, mem, 1,
1864     0x14000000, 0x143fffff,
1865     machine->n_gfx_cards >= 2?
1866     turbochannel_default_gfx_card : "",
1867     KMIN_INT_TC1);
1868    
1869     dev_turbochannel_init(machine, mem, 2,
1870     0x18000000, 0x183fffff,
1871     machine->n_gfx_cards >= 3?
1872     turbochannel_default_gfx_card : "",
1873     KMIN_INT_TC2);
1874    
1875     /* (kmin shared irq numbers (IP) are offset by +8 in the emulator) */
1876     /* kmin_csr = dev_kmin_init(cpu, mem, KMIN_REG_INTR); */
1877    
1878     framebuffer_console_name = "osconsole=0,3"; /* fb, keyb (?) */
1879     serial_console_name = "osconsole=3"; /* ? */
1880     break;
1881    
1882     case MACHINE_DEC_3MAXPLUS_5000: /* type 4, KN03 */
1883     machine->machine_name = "DECsystem 5900 or 5000 (3MAX+) (KN03)";
1884    
1885     /* 5000/240 (KN03-GA, R3000): 40 MHz */
1886     /* 5000/260 (KN05-NB, R4000): 60 MHz */
1887     /* TODO: are both these type 4? */
1888     if (machine->emulated_hz == 0)
1889     machine->emulated_hz = 40000000;
1890     if (machine->physical_ram_in_mb > 480)
1891     fprintf(stderr, "WARNING! Real KN03 machines cannot have more than 480MB RAM. Continuing anyway.\n");
1892    
1893     /* KN03 interrupts: */
1894     machine->md_interrupt = kn03_interrupt;
1895    
1896     /*
1897     * tc0 at mainbus0: 25 MHz clock (slot 0) (0x1e000000)
1898     * tc0 slot 1 (0x1e800000)
1899     * tc0 slot 2 (0x1f000000)
1900     * ioasic0 at tc0 slot 3 offset 0x0 (0x1f800000)
1901     * something that has to do with interrupts? (?) (0x1f840000 ?)
1902     * le0 at ioasic0 offset 0xc0000 (0x1f8c0000)
1903     * scc0 at ioasic0 offset 0x100000 (0x1f900000)
1904     * scc1 at ioasic0 offset 0x180000: console (0x1f980000)
1905     * mcclock0 at ioasic0 offset 0x200000: mc146818 or compatible (0x1fa00000)
1906     * asc0 at ioasic0 offset 0x300000: NCR53C94, 25MHz, SCSI ID 7 (0x1fb00000)
1907     */
1908 dpavlin 6 machine->md_int.dec_ioasic_data = dev_dec_ioasic_init(cpu, mem, 0x1f800000, 0);
1909 dpavlin 2
1910     dev_le_init(machine, mem, KN03_SYS_LANCE, 0, 0, KN03_INTR_LANCE +8, 4*65536);
1911    
1912 dpavlin 6 machine->md_int.dec_ioasic_data->dma_func[3] = dev_scc_dma_func;
1913     machine->md_int.dec_ioasic_data->dma_func_extra[2] = dev_scc_init(machine, mem, KN03_SYS_SCC_0, KN03_INTR_SCC_0 +8, machine->use_x11, 0, 1);
1914     machine->md_int.dec_ioasic_data->dma_func[2] = dev_scc_dma_func;
1915     machine->md_int.dec_ioasic_data->dma_func_extra[3] = dev_scc_init(machine, mem, KN03_SYS_SCC_1, KN03_INTR_SCC_1 +8, machine->use_x11, 1, 1);
1916 dpavlin 2
1917     dev_mc146818_init(machine, mem, KN03_SYS_CLOCK, KN03_INT_RTC, MC146818_DEC, 1);
1918     dev_asc_init(machine, mem, KN03_SYS_SCSI,
1919     KN03_INTR_SCSI +8, NULL, DEV_ASC_DEC, NULL, NULL);
1920    
1921     /*
1922     * TURBOchannel slots 0, 1, and 2 are free for
1923     * option cards. These are by default filled with
1924     * zero or more graphics boards.
1925     *
1926     * TODO: irqs
1927     */
1928     dev_turbochannel_init(machine, mem, 0,
1929     KN03_PHYS_TC_0_START, KN03_PHYS_TC_0_END,
1930     machine->n_gfx_cards >= 1?
1931     turbochannel_default_gfx_card : "",
1932     KN03_INTR_TC_0 +8);
1933    
1934     dev_turbochannel_init(machine, mem, 1,
1935     KN03_PHYS_TC_1_START, KN03_PHYS_TC_1_END,
1936     machine->n_gfx_cards >= 2?
1937     turbochannel_default_gfx_card : "",
1938     KN03_INTR_TC_1 +8);
1939    
1940     dev_turbochannel_init(machine, mem, 2,
1941     KN03_PHYS_TC_2_START, KN03_PHYS_TC_2_END,
1942     machine->n_gfx_cards >= 3?
1943     turbochannel_default_gfx_card : "",
1944     KN03_INTR_TC_2 +8);
1945    
1946     /* TODO: interrupts */
1947     /* shared (turbochannel) interrupts are +8 */
1948    
1949     framebuffer_console_name = "osconsole=0,3"; /* fb, keyb (?) */
1950     serial_console_name = "osconsole=3"; /* ? */
1951     break;
1952    
1953     case MACHINE_DEC_5800: /* type 5, KN5800 */
1954     machine->machine_name = "DECsystem 5800";
1955    
1956     /* TODO: this is incorrect, banks multiply by 8 etc */
1957     if (machine->physical_ram_in_mb < 48)
1958     fprintf(stderr, "WARNING! 5800 will probably not run with less than 48MB RAM. Continuing anyway.\n");
1959    
1960     /*
1961     * According to http://www2.no.netbsd.org/Ports/pmax/models.html,
1962     * the 5800-series is based on VAX 6000/300.
1963     */
1964    
1965     /*
1966     * Ultrix might support SMP on this machine type.
1967     *
1968     * Something at 0x10000000.
1969     * ssc serial console at 0x10140000, interrupt 2 (shared with XMI?).
1970     * xmi 0 at address 0x11800000 (node x at offset x*0x80000)
1971     * Clock uses interrupt 3 (shared with XMI?).
1972     */
1973    
1974 dpavlin 6 machine->md_int.dec5800_csr = dev_dec5800_init(machine, mem, 0x10000000);
1975 dpavlin 2 dev_decbi_init(mem, 0x10000000);
1976 dpavlin 6 dev_ssc_init(machine, mem, 0x10140000, 2, machine->use_x11, &machine->md_int.dec5800_csr->csr);
1977 dpavlin 2 dev_decxmi_init(mem, 0x11800000);
1978     dev_deccca_init(mem, DEC_DECCCA_BASEADDR);
1979    
1980     break;
1981    
1982     case MACHINE_DEC_5400: /* type 6, KN210 */
1983     machine->machine_name = "DECsystem 5400 (KN210)";
1984     /*
1985     * Misc. info from the KN210 manual:
1986     *
1987     * Interrupt lines:
1988     * irq5 fpu
1989     * irq4 halt
1990     * irq3 pwrfl -> mer1 -> mer0 -> wear
1991     * irq2 100 Hz -> birq7
1992     * irq1 dssi -> ni -> birq6
1993     * irq0 birq5 -> console -> timers -> birq4
1994     *
1995     * Interrupt status register at 0x10048000.
1996     * Main memory error status register at 0x1008140.
1997     * Interval Timer Register (ITR) at 0x10084010.
1998     * Q22 stuff at 0x10088000 - 0x1008ffff.
1999     * TODR at 0x1014006c.
2000     * TCR0 (timer control register 0) 0x10140100.
2001     * TIR0 (timer interval register 0) 0x10140104.
2002     * TCR1 (timer control register 1) 0x10140110.
2003     * TIR1 (timer interval register 1) 0x10140114.
2004     * VRR0 (Vector Read Register 0) at 0x16000050.
2005     * VRR1 (Vector Read Register 1) at 0x16000054.
2006     * VRR2 (Vector Read Register 2) at 0x16000058.
2007     * VRR3 (Vector Read Register 3) at 0x1600005c.
2008     */
2009     /* ln (ethernet) at 0x10084x00 ? and 0x10120000 ? */
2010     /* error registers (?) at 0x17000000 and 0x10080000 */
2011     device_add(machine, "kn210 addr=0x10080000");
2012     dev_ssc_init(machine, mem, 0x10140000, 0, machine->use_x11, NULL); /* TODO: not irq 0 */
2013     break;
2014    
2015     case MACHINE_DEC_MAXINE_5000: /* type 7, KN02CA */
2016     machine->machine_name = "Personal DECstation 5000/xxx (MAXINE) (KN02CA)";
2017     if (machine->emulated_hz == 0)
2018     machine->emulated_hz = 33000000;
2019    
2020     if (machine->physical_ram_in_mb < 8)
2021     fprintf(stderr, "WARNING! Real KN02CA machines do not have less than 8MB RAM. Continuing anyway.\n");
2022     if (machine->physical_ram_in_mb > 40)
2023     fprintf(stderr, "WARNING! Real KN02CA machines cannot have more than 40MB RAM. Continuing anyway.\n");
2024    
2025     /* Maxine interrupts: */
2026     machine->md_interrupt = maxine_interrupt;
2027    
2028     /*
2029     * Something at address 0xca00000. (?)
2030     * Something at address 0xe000000. (?)
2031     * tc0 slot 0 (0x10000000)
2032     * tc0 slot 1 (0x14000000)
2033     * (tc0 slot 2 used by the framebuffer)
2034     * ioasic0 at tc0 slot 3 offset 0x0 (0x1c000000)
2035     * le0 at ioasic0 offset 0xc0000: address 00:00:00:00:00:00 (0x1c0c0000)
2036     * scc0 at ioasic0 offset 0x100000: console <-- serial (0x1c100000)
2037     * mcclock0 at ioasic0 offset 0x200000: mc146818 (0x1c200000)
2038     * isdn at ioasic0 offset 0x240000 not configured (0x1c240000)
2039     * bba0 at ioasic0 offset 0x240000 (audio0 at bba0) <--- which one of isdn and bba0?
2040     * dtop0 at ioasic0 offset 0x280000 (0x1c280000)
2041     * fdc at ioasic0 offset 0x2c0000 not configured <-- floppy (0x1c2c0000)
2042     * asc0 at ioasic0 offset 0x300000: NCR53C94, 25MHz, SCSI ID 7 (0x1c300000)
2043     * xcfb0 at tc0 slot 2 offset 0x0: 1024x768x8 built-in framebuffer (0xa000000)
2044     */
2045 dpavlin 6 machine->md_int.dec_ioasic_data = dev_dec_ioasic_init(cpu, mem, 0x1c000000, 0);
2046 dpavlin 2
2047     /* TURBOchannel slots (0 and 1): */
2048     dev_turbochannel_init(machine, mem, 0,
2049     0x10000000, 0x103fffff,
2050     machine->n_gfx_cards >= 2?
2051     turbochannel_default_gfx_card : "",
2052     XINE_INTR_TC_0 +8);
2053     dev_turbochannel_init(machine, mem, 1,
2054     0x14000000, 0x143fffff,
2055     machine->n_gfx_cards >= 3?
2056     turbochannel_default_gfx_card : "",
2057     XINE_INTR_TC_1 +8);
2058    
2059     /*
2060     * TURBOchannel slot 2 is hardwired to be used by
2061     * the framebuffer: (NOTE: 0x8000000, not 0x18000000)
2062     */
2063     dev_turbochannel_init(machine, mem, 2,
2064     0x8000000, 0xbffffff, "PMAG-DV", 0);
2065    
2066     /*
2067     * TURBOchannel slot 3: fixed, ioasic
2068     * (the system stuff), 0x1c000000
2069     */
2070     dev_le_init(machine, mem, 0x1c0c0000, 0, 0, XINE_INTR_LANCE +8, 4*65536);
2071     dev_scc_init(machine, mem, 0x1c100000,
2072     XINE_INTR_SCC_0 +8, machine->use_x11, 0, 1);
2073     dev_mc146818_init(machine, mem, 0x1c200000,
2074     XINE_INT_TOY, MC146818_DEC, 1);
2075     dev_asc_init(machine, mem, 0x1c300000,
2076     XINE_INTR_SCSI +8, NULL, DEV_ASC_DEC, NULL, NULL);
2077    
2078     framebuffer_console_name = "osconsole=3,2"; /* keyb,fb ?? */
2079     serial_console_name = "osconsole=3";
2080     break;
2081    
2082     case MACHINE_DEC_5500: /* type 11, KN220 */
2083     machine->machine_name = "DECsystem 5500 (KN220)";
2084    
2085     /*
2086     * According to NetBSD's pmax ports page:
2087     * KN220-AA is a "30 MHz R3000 CPU with R3010 FPU"
2088     * with "512 kBytes of Prestoserve battery backed RAM."
2089     */
2090     if (machine->emulated_hz == 0)
2091     machine->emulated_hz = 30000000;
2092    
2093     /*
2094     * See KN220 docs for more info.
2095     *
2096     * something at 0x10000000
2097     * something at 0x10001000
2098     * something at 0x10040000
2099     * scc at 0x10140000
2100     * qbus at (or around) 0x10080000
2101     * dssi (disk controller) buffers at 0x10100000, registers at 0x10160000.
2102     * sgec (ethernet) registers at 0x10008000, station addresss at 0x10120000.
2103     * asc (scsi) at 0x17100000.
2104     */
2105    
2106     dev_ssc_init(machine, mem, 0x10140000, 0, machine->use_x11, NULL); /* TODO: not irq 0 */
2107    
2108     /* something at 0x17000000, ultrix says "cpu 0 panic: DS5500 I/O Board is missing" if this is not here */
2109     dev_dec5500_ioboard_init(cpu, mem, 0x17000000);
2110    
2111     dev_sgec_init(mem, 0x10008000, 0); /* irq? */
2112    
2113     /* The asc controller might be TURBOchannel-ish? */
2114     #if 0
2115     dev_turbochannel_init(machine, mem, 0, 0x17100000, 0x171fffff, "PMAZ-AA", 0); /* irq? */
2116     #else
2117     dev_asc_init(machine, mem, 0x17100000, 0, NULL, DEV_ASC_DEC, NULL, NULL); /* irq? */
2118     #endif
2119    
2120     framebuffer_console_name = "osconsole=0,0"; /* TODO (?) */
2121     serial_console_name = "osconsole=0";
2122     break;
2123    
2124     case MACHINE_DEC_MIPSMATE_5100: /* type 12 */
2125     machine->machine_name = "DEC MIPSMATE 5100 (KN230)";
2126     if (machine->emulated_hz == 0)
2127     machine->emulated_hz = 20000000;
2128     if (machine->physical_ram_in_mb > 128)
2129     fprintf(stderr, "WARNING! Real MIPSMATE 5100 machines cannot have more than 128MB RAM. Continuing anyway.\n");
2130    
2131     if (machine->use_x11)
2132     fprintf(stderr, "WARNING! Real MIPSMATE 5100 machines cannot have a graphical framebuffer. Continuing anyway.\n");
2133    
2134     /* KN230 interrupts: */
2135     machine->md_interrupt = kn230_interrupt;
2136    
2137     /*
2138     * According to NetBSD/pmax:
2139     * dc0 at ibus0 addr 0x1c000000
2140     * le0 at ibus0 addr 0x18000000: address 00:00:00:00:00:00
2141     * sii0 at ibus0 addr 0x1a000000
2142     */
2143     dev_mc146818_init(machine, mem, KN230_SYS_CLOCK, 4, MC146818_DEC, 1);
2144     dev_dc7085_init(machine, mem, KN230_SYS_DZ0, KN230_CSR_INTR_DZ0, machine->use_x11); /* NOTE: CSR_INTR */
2145     /* dev_dc7085_init(machine, mem, KN230_SYS_DZ1, KN230_CSR_INTR_OPT0, machine->use_x11); */ /* NOTE: CSR_INTR */
2146     /* dev_dc7085_init(machine, mem, KN230_SYS_DZ2, KN230_CSR_INTR_OPT1, machine->use_x11); */ /* NOTE: CSR_INTR */
2147     dev_le_init(machine, mem, KN230_SYS_LANCE, KN230_SYS_LANCE_B_START, KN230_SYS_LANCE_B_END, KN230_CSR_INTR_LANCE, 4*1048576);
2148     dev_sii_init(machine, mem, KN230_SYS_SII, KN230_SYS_SII_B_START, KN230_SYS_SII_B_END, KN230_CSR_INTR_SII);
2149    
2150 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr),
2151 dpavlin 2 "kn230 addr=0x%llx", (long long)KN230_SYS_ICSR);
2152 dpavlin 6 machine->md_int.kn230_csr = device_add(machine, tmpstr);
2153 dpavlin 2
2154     serial_console_name = "osconsole=0";
2155     break;
2156    
2157     default:
2158     ;
2159     }
2160    
2161     /*
2162     * Most OSes on DECstation use physical addresses below
2163 dpavlin 18 * 0x20000000, but both OSF/1 and Sprite use 0xbe...... as if
2164     * it was 0x1e......, so we need this hack:
2165 dpavlin 2 */
2166 dpavlin 18 dev_ram_init(machine, 0xa0000000, 0x20000000,
2167     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, 0x0);
2168 dpavlin 2
2169 dpavlin 14 if (machine->prom_emulation) {
2170     /* DECstation PROM stuff: (TODO: endianness) */
2171     for (i=0; i<100; i++)
2172     store_32bit_word(cpu, DEC_PROM_CALLBACK_STRUCT + i*4,
2173     DEC_PROM_EMULATION + i*8);
2174 dpavlin 2
2175 dpavlin 14 /* Fill PROM with dummy return instructions: (TODO: make this nicer) */
2176     for (i=0; i<100; i++) {
2177     store_32bit_word(cpu, DEC_PROM_EMULATION + i*8,
2178     0x03e00008); /* return */
2179     store_32bit_word(cpu, DEC_PROM_EMULATION + i*8 + 4,
2180     0x00000000); /* nop */
2181     }
2182 dpavlin 2
2183 dpavlin 14 /*
2184     * According to dec_prom.h from NetBSD:
2185     *
2186     * "Programs loaded by the new PROMs pass the following arguments:
2187     * a0 argc
2188     * a1 argv
2189     * a2 DEC_PROM_MAGIC
2190     * a3 The callback vector defined below"
2191     *
2192     * So we try to emulate a PROM, even though no such thing has been
2193     * loaded.
2194     */
2195 dpavlin 2
2196 dpavlin 14 cpu->cd.mips.gpr[MIPS_GPR_A0] = 3;
2197     cpu->cd.mips.gpr[MIPS_GPR_A1] = DEC_PROM_INITIAL_ARGV;
2198     cpu->cd.mips.gpr[MIPS_GPR_A2] = DEC_PROM_MAGIC;
2199     cpu->cd.mips.gpr[MIPS_GPR_A3] = DEC_PROM_CALLBACK_STRUCT;
2200 dpavlin 2
2201 dpavlin 14 store_32bit_word(cpu, INITIAL_STACK_POINTER + 0x10,
2202     BOOTINFO_MAGIC);
2203     store_32bit_word(cpu, INITIAL_STACK_POINTER + 0x14,
2204     BOOTINFO_ADDR);
2205 dpavlin 2
2206 dpavlin 14 store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV,
2207     (DEC_PROM_INITIAL_ARGV + 0x10));
2208     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV+4,
2209     (DEC_PROM_INITIAL_ARGV + 0x70));
2210     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV+8,
2211     (DEC_PROM_INITIAL_ARGV + 0xe0));
2212     store_32bit_word(cpu, DEC_PROM_INITIAL_ARGV+12, 0);
2213 dpavlin 2
2214 dpavlin 14 /*
2215     * NetBSD and Ultrix expect the boot args to be like this:
2216     *
2217     * "boot" "bootdev" [args?]
2218     *
2219     * where bootdev is supposed to be "rz(0,0,0)netbsd" for
2220     * 3100/2100 (although that crashes Ultrix :-/), and
2221     * "5/rz0a/netbsd" for all others. The number '5' is the
2222     * slot number of the boot device.
2223     *
2224     * 'rz' for disks, 'tz' for tapes.
2225     *
2226     * TODO: Make this nicer.
2227     */
2228     {
2229 dpavlin 2 char bootpath[200];
2230     #if 0
2231     if (machine->machine_subtype == MACHINE_DEC_PMAX_3100)
2232 dpavlin 10 strlcpy(bootpath, "rz(0,0,0)", sizeof(bootpath));
2233 dpavlin 2 else
2234     #endif
2235 dpavlin 10 strlcpy(bootpath, "5/rz1/", sizeof(bootpath));
2236 dpavlin 2
2237     if (bootdev_id < 0 || machine->force_netboot) {
2238     /* tftp boot: */
2239 dpavlin 10 strlcpy(bootpath, "5/tftp/", sizeof(bootpath));
2240 dpavlin 2 bootpath[0] = '0' + boot_net_boardnumber;
2241     } else {
2242     /* disk boot: */
2243     bootpath[0] = '0' + boot_scsi_boardnumber;
2244 dpavlin 6 if (diskimage_is_a_tape(machine, bootdev_id,
2245     bootdev_type))
2246 dpavlin 2 bootpath[2] = 't';
2247     bootpath[4] = '0' + bootdev_id;
2248     }
2249    
2250     init_bootpath = bootpath;
2251 dpavlin 14 }
2252 dpavlin 2
2253 dpavlin 14 bootarg = malloc(BOOTARG_BUFLEN);
2254     if (bootarg == NULL) {
2255     fprintf(stderr, "out of memory\n");
2256     exit(1);
2257     }
2258     strlcpy(bootarg, init_bootpath, BOOTARG_BUFLEN);
2259     if (strlcat(bootarg, machine->boot_kernel_filename,
2260     BOOTARG_BUFLEN) > BOOTARG_BUFLEN) {
2261     fprintf(stderr, "bootarg truncated?\n");
2262     exit(1);
2263     }
2264 dpavlin 2
2265 dpavlin 14 bootstr = "boot";
2266 dpavlin 2
2267 dpavlin 14 store_string(cpu, DEC_PROM_INITIAL_ARGV+0x10, bootstr);
2268     store_string(cpu, DEC_PROM_INITIAL_ARGV+0x70, bootarg);
2269     store_string(cpu, DEC_PROM_INITIAL_ARGV+0xe0,
2270     machine->boot_string_argument);
2271 dpavlin 2
2272 dpavlin 14 /* Decrease the nr of args, if there are no args :-) */
2273     if (machine->boot_string_argument == NULL ||
2274     machine->boot_string_argument[0] == '\0')
2275     cpu->cd.mips.gpr[MIPS_GPR_A0] --;
2276 dpavlin 2
2277 dpavlin 14 if (machine->boot_string_argument[0] != '\0') {
2278     strlcat(bootarg, " ", BOOTARG_BUFLEN);
2279     if (strlcat(bootarg, machine->boot_string_argument,
2280     BOOTARG_BUFLEN) >= BOOTARG_BUFLEN) {
2281     fprintf(stderr, "bootstr truncated?\n");
2282     exit(1);
2283     }
2284 dpavlin 10 }
2285 dpavlin 2
2286 dpavlin 14 xx.a.common.next = (char *)&xx.b - (char *)&xx;
2287     xx.a.common.type = BTINFO_MAGIC;
2288     xx.a.magic = BOOTINFO_MAGIC;
2289 dpavlin 2
2290 dpavlin 14 xx.b.common.next = (char *)&xx.c - (char *)&xx.b;
2291     xx.b.common.type = BTINFO_BOOTPATH;
2292     strlcpy(xx.b.bootpath, bootstr, sizeof(xx.b.bootpath));
2293 dpavlin 2
2294 dpavlin 14 xx.c.common.next = 0;
2295     xx.c.common.type = BTINFO_SYMTAB;
2296     xx.c.nsym = 0;
2297     xx.c.ssym = 0;
2298     xx.c.esym = machine->file_loaded_end_addr;
2299 dpavlin 2
2300 dpavlin 14 store_buf(cpu, BOOTINFO_ADDR, (char *)&xx, sizeof(xx));
2301 dpavlin 2
2302 dpavlin 14 /*
2303     * The system's memmap: (memmap is a global variable, in
2304     * dec_prom.h)
2305     */
2306     store_32bit_word_in_host(cpu,
2307     (unsigned char *)&memmap.pagesize, 4096);
2308     {
2309     unsigned int i;
2310     for (i=0; i<sizeof(memmap.bitmap); i++)
2311     memmap.bitmap[i] = ((int)i * 4096*8 <
2312     1048576*machine->physical_ram_in_mb)?
2313     0xff : 0x00;
2314     }
2315     store_buf(cpu, DEC_MEMMAP_ADDR, (char *)&memmap, sizeof(memmap));
2316 dpavlin 2
2317 dpavlin 14 /* Environment variables: */
2318     addr = DEC_PROM_STRINGS;
2319 dpavlin 2
2320 dpavlin 14 if (machine->use_x11 && machine->n_gfx_cards > 0)
2321     /* (0,3) Keyboard and Framebuffer */
2322     add_environment_string(cpu, framebuffer_console_name, &addr);
2323     else
2324     /* Serial console */
2325     add_environment_string(cpu, serial_console_name, &addr);
2326 dpavlin 2
2327 dpavlin 14 /*
2328     * The KN5800 (SMP system) uses a CCA (console communications
2329     * area): (See VAX 6000 documentation for details.)
2330     */
2331     {
2332     char tmps[300];
2333     snprintf(tmps, sizeof(tmps), "cca=%x",
2334     (int)(DEC_DECCCA_BASEADDR + 0xa0000000ULL));
2335     add_environment_string(cpu, tmps, &addr);
2336     }
2337 dpavlin 2
2338 dpavlin 14 /* These are needed for Sprite to boot: */
2339     {
2340     char tmps[500];
2341 dpavlin 2
2342 dpavlin 14 snprintf(tmps, sizeof(tmps), "boot=%s", bootarg);
2343     tmps[sizeof(tmps)-1] = '\0';
2344     add_environment_string(cpu, tmps, &addr);
2345 dpavlin 2
2346 dpavlin 14 snprintf(tmps, sizeof(tmps), "bitmap=0x%x", (uint32_t)((
2347     DEC_MEMMAP_ADDR + sizeof(memmap.pagesize))
2348     & 0xffffffffULL));
2349     tmps[sizeof(tmps)-1] = '\0';
2350     add_environment_string(cpu, tmps, &addr);
2351 dpavlin 2
2352 dpavlin 14 snprintf(tmps, sizeof(tmps), "bitmaplen=0x%x",
2353     machine->physical_ram_in_mb * 1048576 / 4096 / 8);
2354     tmps[sizeof(tmps)-1] = '\0';
2355     add_environment_string(cpu, tmps, &addr);
2356     }
2357 dpavlin 2
2358 dpavlin 14 add_environment_string(cpu, "scsiid0=7", &addr);
2359     add_environment_string(cpu, "bootmode=a", &addr);
2360     add_environment_string(cpu, "testaction=q", &addr);
2361     add_environment_string(cpu, "haltaction=h", &addr);
2362     add_environment_string(cpu, "more=24", &addr);
2363 dpavlin 2
2364 dpavlin 14 /* Used in at least Ultrix on the 5100: */
2365     add_environment_string(cpu, "scsiid=7", &addr);
2366     add_environment_string(cpu, "baud0=9600", &addr);
2367     add_environment_string(cpu, "baud1=9600", &addr);
2368     add_environment_string(cpu, "baud2=9600", &addr);
2369     add_environment_string(cpu, "baud3=9600", &addr);
2370     add_environment_string(cpu, "iooption=0x1", &addr);
2371 dpavlin 2
2372 dpavlin 14 /* The end: */
2373     add_environment_string(cpu, "", &addr);
2374     }
2375 dpavlin 2
2376     break;
2377    
2378     case MACHINE_COBALT:
2379     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2380     machine->machine_name = "Cobalt";
2381    
2382     /*
2383     * Interrupts seem to be the following:
2384     * (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)
2385     *
2386     * 2 Galileo chip (timer)
2387     * 3 Tulip 0 + NCR SCSI
2388     * 4 Tulip 1
2389     * 5 16550 UART (serial console)
2390     * 6 VIA southbridge PIC
2391 dpavlin 12 * 7 PCI (Note: Not used. The PCI controller
2392     * interrupts at ISA interrupt 9.)
2393 dpavlin 2 */
2394 dpavlin 12
2395     /* ISA interrupt controllers: */
2396     snprintf(tmpstr, sizeof(tmpstr), "8259 irq=24 addr=0x10000020");
2397 dpavlin 14 machine->isa_pic_data.pic1 = device_add(machine, tmpstr);
2398 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "8259 irq=24 addr=0x100000a0");
2399 dpavlin 14 machine->isa_pic_data.pic2 = device_add(machine, tmpstr);
2400 dpavlin 20 machine->md_interrupt = isa8_interrupt;
2401     machine->isa_pic_data.native_irq = 6;
2402 dpavlin 12
2403 dpavlin 2 dev_mc146818_init(machine, mem, 0x10000070, 0, MC146818_PC_CMOS, 4);
2404 dpavlin 6
2405 dpavlin 12 machine->main_console_handle = (size_t)
2406     device_add(machine, "ns16550 irq=5 addr=0x1c800000 name2=tty0 in_use=1");
2407 dpavlin 2
2408 dpavlin 20 /* TODO: bus_isa() ? */
2409    
2410 dpavlin 6 #if 0
2411 dpavlin 12 device_add(machine, "ns16550 irq=0 addr=0x1f000010 name2=tty1 in_use=0");
2412 dpavlin 6 #endif
2413    
2414 dpavlin 2 /*
2415     * According to NetBSD/cobalt:
2416     *
2417     * pchb0 at pci0 dev 0 function 0: Galileo GT-64111 System Controller, rev 1 (NOTE: added by dev_gt_init())
2418     * tlp0 at pci0 dev 7 function 0: DECchip 21143 Ethernet, pass 4.1
2419     * Symbios Logic 53c860 (SCSI mass storage, revision 0x02) at pci0 dev 8
2420     * pcib0 at pci0 dev 9 function 0, VIA Technologies VT82C586 (Apollo VP) PCI-ISA Bridge, rev 37
2421     * pciide0 at pci0 dev 9 function 1: VIA Technologies VT82C586 (Apollo VP) ATA33 cr
2422     * tlp1 at pci0 dev 12 function 0: DECchip 21143 Ethernet, pass 4.1
2423 dpavlin 12 *
2424     * The PCI controller interrupts at ISA interrupt 9.
2425 dpavlin 2 */
2426 dpavlin 12 pci_data = dev_gt_init(machine, mem, 0x14000000, 2, 8 + 9, 11);
2427 dpavlin 20 bus_pci_add(machine, pci_data, mem, 0, 7, 0, "dec21143");
2428     /* bus_pci_add(machine, pci_data, mem, 0, 8, 0, "symbios_860"); PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_860 */
2429     bus_pci_add(machine, pci_data, mem, 0, 9, 0, "vt82c586_isa");
2430     bus_pci_add(machine, pci_data, mem, 0, 9, 1, "vt82c586_ide");
2431     /* bus_pci_add(machine, pci_data, mem, 0, 12, 0, "dec21143"); */
2432 dpavlin 2
2433 dpavlin 14 if (machine->prom_emulation) {
2434     /*
2435     * NetBSD/cobalt expects memsize in a0, but it seems that what
2436     * it really wants is the end of memory + 0x80000000.
2437     *
2438     * The bootstring is stored 512 bytes before the end of
2439     * physical ram.
2440     */
2441     cpu->cd.mips.gpr[MIPS_GPR_A0] =
2442     machine->physical_ram_in_mb * 1048576 + 0xffffffff80000000ULL;
2443     bootstr = "root=/dev/hda1 ro";
2444     /* bootstr = "nfsroot=/usr/cobalt/"; */
2445     /* TODO: bootarg, and/or automagic boot device detection */
2446     store_string(cpu, cpu->cd.mips.gpr[MIPS_GPR_A0] - 512, bootstr);
2447     }
2448 dpavlin 2 break;
2449    
2450     case MACHINE_HPCMIPS:
2451     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2452     memset(&hpc_bootinfo, 0, sizeof(hpc_bootinfo));
2453     /*
2454     NOTE: See http://forums.projectmayo.com/viewtopic.php?topic=2743&forum=23
2455     for info on framebuffer addresses.
2456     */
2457    
2458     switch (machine->machine_subtype) {
2459     case MACHINE_HPCMIPS_CASIO_BE300:
2460     /* 166MHz VR4131 */
2461     machine->machine_name = "Casio Cassiopeia BE-300";
2462 dpavlin 18 hpc_fb_addr = 0x0a200000;
2463     hpc_fb_xsize = 240;
2464     hpc_fb_ysize = 320;
2465     hpc_fb_xsize_mem = 256;
2466     hpc_fb_ysize_mem = 320;
2467     hpc_fb_bits = 15;
2468     hpc_fb_encoding = BIFB_D16_0000;
2469 dpavlin 2
2470 dpavlin 12 /* TODO: irq? */
2471     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr=0x0a008680 addr_mult=4 in_use=%i", machine->use_x11? 0 : 1);
2472     machine->main_console_handle = (size_t)device_add(machine, tmpstr);
2473    
2474 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4131);
2475 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2476    
2477 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2478     hpc_platid_cpu_series = 1; /* VR */
2479     hpc_platid_cpu_model = 1; /* VR41XX */
2480     hpc_platid_cpu_submodel = 6; /* VR4131 */
2481     hpc_platid_vendor = 3; /* Casio */
2482     hpc_platid_series = 1; /* CASSIOPEIAE */
2483     hpc_platid_model = 2; /* EXXX */
2484     hpc_platid_submodel = 3; /* E500 */
2485 dpavlin 2 /* TODO: Don't use model number for E500, it's a BE300! */
2486     break;
2487     case MACHINE_HPCMIPS_CASIO_E105:
2488     /* 131MHz VR4121 */
2489     machine->machine_name = "Casio Cassiopeia E-105";
2490 dpavlin 18 hpc_fb_addr = 0x0a200000; /* TODO? */
2491     hpc_fb_xsize = 240;
2492     hpc_fb_ysize = 320;
2493     hpc_fb_xsize_mem = 256;
2494     hpc_fb_ysize_mem = 320;
2495     hpc_fb_bits = 16;
2496     hpc_fb_encoding = BIFB_D16_0000;
2497 dpavlin 2
2498 dpavlin 12 /* TODO: irq? */
2499     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr=0x0a008680 addr_mult=4 in_use=%i", machine->use_x11? 0 : 1);
2500     machine->main_console_handle = (size_t)device_add(machine, tmpstr);
2501    
2502 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2503 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2504    
2505 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2506     hpc_platid_cpu_series = 1; /* VR */
2507     hpc_platid_cpu_model = 1; /* VR41XX */
2508     hpc_platid_cpu_submodel = 3; /* VR4121 */
2509     hpc_platid_vendor = 3; /* Casio */
2510     hpc_platid_series = 1; /* CASSIOPEIAE */
2511     hpc_platid_model = 2; /* EXXX */
2512     hpc_platid_submodel = 2; /* E105 */
2513 dpavlin 2 break;
2514     case MACHINE_HPCMIPS_NEC_MOBILEPRO_770:
2515     /* 131 MHz VR4121 */
2516     machine->machine_name = "NEC MobilePro 770";
2517 dpavlin 18 hpc_fb_addr = 0xa000000;
2518     hpc_fb_xsize = 640;
2519     hpc_fb_ysize = 240;
2520     hpc_fb_xsize_mem = 800;
2521     hpc_fb_ysize_mem = 240;
2522     hpc_fb_bits = 16;
2523     hpc_fb_encoding = BIFB_D16_0000;
2524 dpavlin 2
2525 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2526 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2527    
2528 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2529     hpc_platid_cpu_series = 1; /* VR */
2530     hpc_platid_cpu_model = 1; /* VR41XX */
2531     hpc_platid_cpu_submodel = 3; /* VR4121 */
2532     hpc_platid_vendor = 1; /* NEC */
2533     hpc_platid_series = 2; /* NEC MCR */
2534     hpc_platid_model = 2; /* MCR 5XX */
2535     hpc_platid_submodel = 4; /* MCR 520A */
2536 dpavlin 2 break;
2537     case MACHINE_HPCMIPS_NEC_MOBILEPRO_780:
2538     /* 166 (or 168) MHz VR4121 */
2539     machine->machine_name = "NEC MobilePro 780";
2540 dpavlin 18 hpc_fb_addr = 0xa180100;
2541     hpc_fb_xsize = 640;
2542     hpc_fb_ysize = 240;
2543     hpc_fb_xsize_mem = 640;
2544     hpc_fb_ysize_mem = 240;
2545     hpc_fb_bits = 16;
2546     hpc_fb_encoding = BIFB_D16_0000;
2547 dpavlin 2
2548 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2549 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2550    
2551 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2552     hpc_platid_cpu_series = 1; /* VR */
2553     hpc_platid_cpu_model = 1; /* VR41XX */
2554     hpc_platid_cpu_submodel = 3; /* VR4121 */
2555     hpc_platid_vendor = 1; /* NEC */
2556     hpc_platid_series = 2; /* NEC MCR */
2557     hpc_platid_model = 2; /* MCR 5XX */
2558     hpc_platid_submodel = 8; /* MCR 530A */
2559 dpavlin 2 break;
2560     case MACHINE_HPCMIPS_NEC_MOBILEPRO_800:
2561     /* 131 MHz VR4121 */
2562     machine->machine_name = "NEC MobilePro 800";
2563 dpavlin 18 hpc_fb_addr = 0xa000000;
2564     hpc_fb_xsize = 800;
2565     hpc_fb_ysize = 600;
2566     hpc_fb_xsize_mem = 800;
2567     hpc_fb_ysize_mem = 600;
2568     hpc_fb_bits = 16;
2569     hpc_fb_encoding = BIFB_D16_0000;
2570 dpavlin 2
2571 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2572 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2573    
2574 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2575     hpc_platid_cpu_series = 1; /* VR */
2576     hpc_platid_cpu_model = 1; /* VR41XX */
2577     hpc_platid_cpu_submodel = 3; /* VR4121 */
2578     hpc_platid_vendor = 1; /* NEC */
2579     hpc_platid_series = 2; /* NEC MCR */
2580     hpc_platid_model = 3; /* MCR 7XX */
2581     hpc_platid_submodel = 2; /* MCR 700A */
2582 dpavlin 2 break;
2583     case MACHINE_HPCMIPS_NEC_MOBILEPRO_880:
2584     /* 168 MHz VR4121 */
2585     machine->machine_name = "NEC MobilePro 880";
2586 dpavlin 18 hpc_fb_addr = 0xa0ea600;
2587     hpc_fb_xsize = 800;
2588     hpc_fb_ysize = 600;
2589     hpc_fb_xsize_mem = 800;
2590     hpc_fb_ysize_mem = 600;
2591     hpc_fb_bits = 16;
2592     hpc_fb_encoding = BIFB_D16_0000;
2593 dpavlin 2
2594 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2595 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2596    
2597 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2598     hpc_platid_cpu_series = 1; /* VR */
2599     hpc_platid_cpu_model = 1; /* VR41XX */
2600     hpc_platid_cpu_submodel = 3; /* VR4121 */
2601     hpc_platid_vendor = 1; /* NEC */
2602     hpc_platid_series = 2; /* NEC MCR */
2603     hpc_platid_model = 3; /* MCR 7XX */
2604     hpc_platid_submodel = 4; /* MCR 730A */
2605 dpavlin 2 break;
2606     case MACHINE_HPCMIPS_AGENDA_VR3:
2607     /* 66 MHz VR4181 */
2608     machine->machine_name = "Agenda VR3";
2609     /* TODO: */
2610 dpavlin 18 hpc_fb_addr = 0x1000;
2611     hpc_fb_xsize = 160;
2612     hpc_fb_ysize = 240;
2613     hpc_fb_xsize_mem = 160;
2614     hpc_fb_ysize_mem = 240;
2615     hpc_fb_bits = 4;
2616     hpc_fb_encoding = BIFB_D4_M2L_F;
2617 dpavlin 2
2618 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4181);
2619 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2620    
2621     /* TODO: Hm... irq 17 according to linux, but
2622     VRIP_INTR_SIU (=9) here? */
2623     {
2624     int x;
2625 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x0c000010", 8 + VRIP_INTR_SIU);
2626     x = (size_t)device_add(machine, tmpstr);
2627 dpavlin 2
2628     if (!machine->use_x11)
2629     machine->main_console_handle = x;
2630     }
2631    
2632 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2633     hpc_platid_cpu_series = 1; /* VR */
2634     hpc_platid_cpu_model = 1; /* VR41XX */
2635     hpc_platid_cpu_submodel = 4; /* VR4181 */
2636     hpc_platid_vendor = 15; /* Agenda */
2637     hpc_platid_series = 1; /* VR */
2638     hpc_platid_model = 1; /* VR3 */
2639     hpc_platid_submodel = 0; /* - */
2640 dpavlin 2
2641 dpavlin 18 dev_ram_init(machine, 0x0f000000, 0x01000000,
2642     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, 0x0);
2643 dpavlin 2 break;
2644     case MACHINE_HPCMIPS_IBM_WORKPAD_Z50:
2645     /* 131 MHz VR4121 */
2646 dpavlin 12 machine->machine_name = "IBM Workpad Z50";
2647 dpavlin 2 /* TODO: */
2648 dpavlin 18 hpc_fb_addr = 0xa000000;
2649     hpc_fb_xsize = 640;
2650     hpc_fb_ysize = 480;
2651     hpc_fb_xsize_mem = 640;
2652     hpc_fb_ysize_mem = 480;
2653     hpc_fb_bits = 16;
2654     hpc_fb_encoding = BIFB_D16_0000;
2655 dpavlin 2
2656 dpavlin 6 machine->md_int.vr41xx_data = dev_vr41xx_init(machine, mem, 4121);
2657 dpavlin 2 machine->md_interrupt = vr41xx_interrupt;
2658    
2659 dpavlin 18 hpc_platid_cpu_arch = 1; /* MIPS */
2660     hpc_platid_cpu_series = 1; /* VR */
2661     hpc_platid_cpu_model = 1; /* VR41XX */
2662     hpc_platid_cpu_submodel = 3; /* VR4121 */
2663     hpc_platid_vendor = 9; /* IBM */
2664     hpc_platid_series = 1; /* WorkPad */
2665     hpc_platid_model = 1; /* Z50 */
2666     hpc_platid_submodel = 0; /* 0 */
2667 dpavlin 2 break;
2668     default:
2669     printf("Unimplemented hpcmips machine number.\n");
2670     exit(1);
2671     }
2672    
2673 dpavlin 18 store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
2674     (hpc_platid_cpu_arch << 26) + (hpc_platid_cpu_series << 20)
2675     + (hpc_platid_cpu_model << 14) + (hpc_platid_cpu_submodel << 8)
2676     + hpc_platid_flags);
2677     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
2678     (hpc_platid_vendor << 22) + (hpc_platid_series << 16)
2679     + (hpc_platid_model << 8) + hpc_platid_submodel);
2680    
2681 dpavlin 2 if (machine->use_x11)
2682     machine->main_console_handle =
2683 dpavlin 6 machine->md_int.vr41xx_data->kiu_console_handle;
2684 dpavlin 2
2685 dpavlin 14 if (machine->prom_emulation) {
2686     /* NetBSD/hpcmips and possibly others expects the following: */
2687 dpavlin 2
2688 dpavlin 14 cpu->cd.mips.gpr[MIPS_GPR_A0] = 1; /* argc */
2689     cpu->cd.mips.gpr[MIPS_GPR_A1] = machine->physical_ram_in_mb * 1048576
2690     + 0xffffffff80000000ULL - 512; /* argv */
2691     cpu->cd.mips.gpr[MIPS_GPR_A2] = machine->physical_ram_in_mb * 1048576
2692     + 0xffffffff80000000ULL - 256; /* ptr to hpc_bootinfo */
2693 dpavlin 2
2694 dpavlin 14 bootstr = machine->boot_kernel_filename;
2695     store_32bit_word(cpu, 0xffffffff80000000ULL + machine->physical_ram_in_mb * 1048576 - 512,
2696     0xffffffff80000000ULL + machine->physical_ram_in_mb * 1048576 - 512 + 16);
2697     store_32bit_word(cpu, 0xffffffff80000000ULL + machine->physical_ram_in_mb * 1048576 - 512 + 4, 0);
2698     store_string(cpu, 0xffffffff80000000ULL + machine->physical_ram_in_mb * 1048576 - 512 + 16, bootstr);
2699 dpavlin 2
2700 dpavlin 14 /* Special case for the Agenda VR3: */
2701     if (machine->machine_subtype == MACHINE_HPCMIPS_AGENDA_VR3) {
2702     const int tmplen = 1000;
2703     char *tmp = malloc(tmplen);
2704 dpavlin 2
2705 dpavlin 14 cpu->cd.mips.gpr[MIPS_GPR_A0] = 2; /* argc */
2706 dpavlin 2
2707 dpavlin 14 store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 4, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64);
2708     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 8, 0);
2709 dpavlin 2
2710 dpavlin 14 snprintf(tmp, tmplen, "root=/dev/rom video=vr4181fb:xres:160,yres:240,bpp:4,"
2711     "gray,hpck:3084,inv ether=0,0x03fe0300,eth0");
2712     tmp[tmplen-1] = '\0';
2713 dpavlin 2
2714 dpavlin 14 if (!machine->use_x11)
2715     snprintf(tmp+strlen(tmp), tmplen-strlen(tmp), " console=ttyS0,115200");
2716     tmp[tmplen-1] = '\0';
2717 dpavlin 2
2718 dpavlin 14 if (machine->boot_string_argument[0])
2719     snprintf(tmp+strlen(tmp), tmplen-strlen(tmp), " %s", machine->boot_string_argument);
2720     tmp[tmplen-1] = '\0';
2721 dpavlin 2
2722 dpavlin 14 store_string(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64, tmp);
2723 dpavlin 2
2724 dpavlin 14 bootarg = tmp;
2725     } else if (machine->boot_string_argument[0]) {
2726     cpu->cd.mips.gpr[MIPS_GPR_A0] ++; /* argc */
2727 dpavlin 2
2728 dpavlin 14 store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 4, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64);
2729     store_32bit_word(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 8, 0);
2730 dpavlin 2
2731 dpavlin 14 store_string(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 512 + 64,
2732     machine->boot_string_argument);
2733 dpavlin 2
2734 dpavlin 14 bootarg = machine->boot_string_argument;
2735     }
2736 dpavlin 2
2737 dpavlin 14 store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.length, sizeof(hpc_bootinfo));
2738     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.magic, HPC_BOOTINFO_MAGIC);
2739 dpavlin 18 store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_addr, 0x80000000 + hpc_fb_addr);
2740     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_line_bytes, hpc_fb_xsize_mem * (((hpc_fb_bits-1)|7)+1) / 8);
2741     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_width, hpc_fb_xsize);
2742     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_height, hpc_fb_ysize);
2743     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_type, hpc_fb_encoding);
2744 dpavlin 14 store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.bi_cnuse, BI_CNUSE_BUILTIN); /* _BUILTIN or _SERIAL */
2745 dpavlin 2
2746 dpavlin 14 /* printf("hpc_bootinfo.platid_cpu = 0x%08x\n", hpc_bootinfo.platid_cpu);
2747     printf("hpc_bootinfo.platid_machine = 0x%08x\n", hpc_bootinfo.platid_machine); */
2748     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.timezone, 0);
2749     store_buf(cpu, 0x80000000 + machine->physical_ram_in_mb * 1048576 - 256, (char *)&hpc_bootinfo, sizeof(hpc_bootinfo));
2750     }
2751 dpavlin 2
2752 dpavlin 18 if (hpc_fb_addr != 0) {
2753     dev_fb_init(machine, mem, hpc_fb_addr, VFB_HPC,
2754     hpc_fb_xsize, hpc_fb_ysize,
2755     hpc_fb_xsize_mem, hpc_fb_ysize_mem,
2756     hpc_fb_bits, machine->machine_name);
2757 dpavlin 2
2758     /* NetBSD/hpcmips uses framebuffer at physical
2759     address 0x8.......: */
2760 dpavlin 18 dev_ram_init(machine, 0x80000000, 0x20000000,
2761     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, 0x0);
2762 dpavlin 2 }
2763    
2764     break;
2765    
2766     case MACHINE_PS2:
2767     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2768     machine->machine_name = "Playstation 2";
2769    
2770     if (machine->physical_ram_in_mb != 32)
2771     fprintf(stderr, "WARNING! Playstation 2 machines are supposed to have exactly 32 MB RAM. Continuing anyway.\n");
2772     if (!machine->use_x11)
2773     fprintf(stderr, "WARNING! Playstation 2 without -X is pretty meaningless. Continuing anyway.\n");
2774    
2775     /*
2776     * According to NetBSD:
2777     * Hardware irq 0 is timer/interrupt controller
2778     * Hardware irq 1 is dma controller
2779     *
2780     * Some things are not yet emulated (at all), and hence are detected incorrectly:
2781     * sbus0 at mainbus0: controller type 2
2782     * ohci0 at sbus0 (at 0x1f801600, according to linux)
2783     * ohci0: OHCI version 1.0
2784     */
2785    
2786 dpavlin 6 machine->md_int.ps2_data = dev_ps2_stuff_init(machine, mem, 0x10000000);
2787 dpavlin 2 device_add(machine, "ps2_gs addr=0x12000000");
2788 dpavlin 4 device_add(machine, "ps2_ether addr=0x14001000");
2789 dpavlin 18 dev_ram_init(machine, 0x1c000000, 4 * 1048576, DEV_RAM_RAM, 0); /* TODO: how much? */
2790 dpavlin 4 /* irq = 8 + 32 + 1 (SBUS/USB) */
2791     device_add(machine, "ohci addr=0x1f801600 irq=41");
2792 dpavlin 2
2793     machine->md_interrupt = ps2_interrupt;
2794    
2795 dpavlin 4 /* Set the Harddisk controller present flag, if either
2796     disk 0 or 1 is present: */
2797 dpavlin 6 if (diskimage_exist(machine, 0, DISKIMAGE_IDE) ||
2798     diskimage_exist(machine, 1, DISKIMAGE_IDE)) {
2799 dpavlin 14 if (machine->prom_emulation)
2800     store_32bit_word(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x0, 0x100);
2801 dpavlin 4 dev_ps2_spd_init(machine, mem, 0x14000000);
2802     }
2803 dpavlin 2
2804 dpavlin 14 if (machine->prom_emulation) {
2805 dpavlin 4 int tmplen = 1000;
2806     char *tmp = malloc(tmplen);
2807 dpavlin 14 time_t timet;
2808     struct tm *tm_ptr;
2809    
2810     add_symbol_name(&machine->symbol_context,
2811     PLAYSTATION2_SIFBIOS, 0x10000, "[SIFBIOS entry]", 0, 0);
2812     store_32bit_word(cpu, PLAYSTATION2_BDA + 0, PLAYSTATION2_SIFBIOS);
2813     store_buf(cpu, PLAYSTATION2_BDA + 4, "PS2b", 4);
2814    
2815     store_32bit_word(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x4, PLAYSTATION2_OPTARGS);
2816 dpavlin 4 if (tmp == NULL) {
2817     fprintf(stderr, "out of memory\n");
2818     exit(1);
2819     }
2820 dpavlin 2
2821 dpavlin 10 strlcpy(tmp, "root=/dev/hda1 crtmode=vesa0,60", tmplen);
2822 dpavlin 4
2823     if (machine->boot_string_argument[0])
2824     snprintf(tmp+strlen(tmp), tmplen-strlen(tmp),
2825     " %s", machine->boot_string_argument);
2826     tmp[tmplen-1] = '\0';
2827    
2828     bootstr = tmp;
2829     store_string(cpu, PLAYSTATION2_OPTARGS, bootstr);
2830    
2831 dpavlin 14 /* TODO: netbsd's bootinfo.h, for symbolic names */
2832 dpavlin 2
2833     /* RTC data given by the BIOS: */
2834     timet = time(NULL) + 9*3600; /* PS2 uses Japanese time */
2835 dpavlin 14 tm_ptr = gmtime(&timet);
2836 dpavlin 2 /* TODO: are these 0- or 1-based? */
2837 dpavlin 14 store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 1, int_to_bcd(tm_ptr->tm_sec));
2838     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 2, int_to_bcd(tm_ptr->tm_min));
2839     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 3, int_to_bcd(tm_ptr->tm_hour));
2840     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 5, int_to_bcd(tm_ptr->tm_mday));
2841     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 6, int_to_bcd(tm_ptr->tm_mon + 1));
2842     store_byte(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x10 + 7, int_to_bcd(tm_ptr->tm_year - 100));
2843    
2844     /* "BOOTINFO_PCMCIA_TYPE" in NetBSD's bootinfo.h. This contains the sbus controller type. */
2845     store_32bit_word(cpu, 0xa0000000 + machine->physical_ram_in_mb*1048576 - 0x1000 + 0x1c, 2);
2846 dpavlin 2 }
2847    
2848     break;
2849    
2850     case MACHINE_SGI:
2851     case MACHINE_ARC:
2852     /*
2853     * SGI and ARC emulation share a lot of code. (SGI is a special case of
2854     * "almost ARC".)
2855     *
2856     * http://obsolete.majix.org/computers/sgi/iptable.shtml contains a pretty
2857     * detailed list of IP ("Inhouse Processor") model numbers.
2858     * (Or http://hardware.majix.org/computers/sgi/iptable.shtml)
2859     */
2860 dpavlin 10 machine->machine_name = malloc(MACHINE_NAME_MAXBUF);
2861 dpavlin 2 if (machine->machine_name == NULL) {
2862     fprintf(stderr, "out of memory\n");
2863     exit(1);
2864     }
2865    
2866     if (machine->machine_type == MACHINE_SGI) {
2867     cpu->byte_order = EMUL_BIG_ENDIAN;
2868 dpavlin 10 snprintf(machine->machine_name, MACHINE_NAME_MAXBUF,
2869     "SGI-IP%i", machine->machine_subtype);
2870 dpavlin 2
2871     sgi_ram_offset = 1048576 * machine->memory_offset_in_mb;
2872    
2873     /* Special cases for IP20,22,24,26 memory offset: */
2874     if (machine->machine_subtype == 20 || machine->machine_subtype == 22 ||
2875     machine->machine_subtype == 24 || machine->machine_subtype == 26) {
2876 dpavlin 18 dev_ram_init(machine, 0x00000000, 0x10000, DEV_RAM_MIRROR
2877     | DEV_RAM_MIGHT_POINT_TO_DEVICES, sgi_ram_offset);
2878     dev_ram_init(machine, 0x00050000, sgi_ram_offset-0x50000,
2879     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, sgi_ram_offset + 0x50000);
2880 dpavlin 2 }
2881    
2882     /* Special cases for IP28,30 memory offset: */
2883     if (machine->machine_subtype == 28 || machine->machine_subtype == 30) {
2884     /* TODO: length below should maybe not be 128MB? */
2885 dpavlin 18 dev_ram_init(machine, 0x00000000, 128*1048576, DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, sgi_ram_offset);
2886 dpavlin 2 }
2887     } else {
2888     cpu->byte_order = EMUL_LITTLE_ENDIAN;
2889 dpavlin 10 snprintf(machine->machine_name,
2890     MACHINE_NAME_MAXBUF, "ARC");
2891 dpavlin 2 }
2892    
2893     if (machine->machine_type == MACHINE_SGI) {
2894     /* TODO: Other SGI machine types? */
2895     switch (machine->machine_subtype) {
2896 dpavlin 18 case 10:
2897     strlcat(machine->machine_name, " (4D/25)", MACHINE_NAME_MAXBUF);
2898     /* TODO */
2899     break;
2900 dpavlin 2 case 12:
2901 dpavlin 10 strlcat(machine->machine_name,
2902     " (Iris Indigo IP12)", MACHINE_NAME_MAXBUF);
2903 dpavlin 2
2904     /* TODO */
2905     /* 33 MHz R3000, according to http://www.irisindigo.com/ */
2906     /* "capable of addressing up to 96MB of memory." */
2907    
2908     break;
2909     case 19:
2910 dpavlin 10 strlcat(machine->machine_name,
2911     " (Everest IP19)", MACHINE_NAME_MAXBUF);
2912 dpavlin 2 machine->main_console_handle =
2913     dev_zs_init(machine, mem, 0x1fbd9830, 0, 1, "serial zs"); /* serial? netbsd? */
2914     dev_scc_init(machine, mem, 0x10086000, 0, machine->use_x11, 0, 8); /* serial? irix? */
2915    
2916     device_add(machine, "sgi_ip19 addr=0x18000000");
2917    
2918     /* Irix' <everest_du_init+0x130> reads this device: */
2919     device_add(machine, "random addr=0x10006000 len=16");
2920    
2921     /* Irix' get_mpconf() looks for this: (TODO) */
2922     store_32bit_word(cpu, 0xa0000000 + 0x3000,
2923     0xbaddeed2);
2924    
2925     /* Memory size, not 4096 byte pages, but 256 bytes? (16 is size of kernel... approx) */
2926     store_32bit_word(cpu, 0xa0000000 + 0x26d0,
2927     30000); /* (machine->physical_ram_in_mb - 16) * (1048576 / 256)); */
2928    
2929     break;
2930     case 20:
2931 dpavlin 10 strlcat(machine->machine_name,
2932     " (Indigo)", MACHINE_NAME_MAXBUF);
2933 dpavlin 2
2934     /*
2935     * Guesses based on NetBSD 2.0 beta, 20040606.
2936     *
2937     * int0 at mainbus0 addr 0x1fb801c0: bus 1MHz, CPU 2MHz
2938     * imc0 at mainbus0 addr 0x1fa00000: revision 0
2939     * gio0 at imc0
2940     * unknown GIO card (product 0x00 revision 0x00) at gio0 slot 0 addr 0x1f400000 not configured
2941     * unknown GIO card (product 0x00 revision 0x00) at gio0 slot 1 addr 0x1f600000 not configured
2942     * unknown GIO card (product 0x00 revision 0x00) at gio0 slot 2 addr 0x1f000000 not configured
2943     * hpc0 at gio0 addr 0x1fb80000: SGI HPC1
2944     * zsc0 at hpc0 offset 0xd10 (channels 0 and 1, channel 1 for console)
2945     * zsc1 at hpc0 offset 0xd00 (2 channels)
2946     * sq0 at hpc0 offset 0x100: SGI Seeq 80c03
2947     * wdsc0 at hpc0 offset 0x11f
2948     * dpclock0 at hpc0 offset 0xe00
2949     */
2950    
2951     /* int0 at mainbus0 addr 0x1fb801c0 */
2952 dpavlin 6 machine->md_int.sgi_ip20_data = dev_sgi_ip20_init(cpu, mem, DEV_SGI_IP20_BASE);
2953 dpavlin 2
2954     /* imc0 at mainbus0 addr 0x1fa00000: revision 0: TODO (or in dev_sgi_ip20?) */
2955    
2956     dev_zs_init(machine, mem, 0x1fbd9830, 0, 1, "zs console");
2957    
2958     /* This is the zsc0 reported by NetBSD: TODO: irqs */
2959     machine->main_console_handle = dev_zs_init(machine, mem, 0x1fb80d10, 0, 1, "zsc0"); /* zsc0 */
2960     dev_zs_init(machine, mem, 0x1fb80d00, 0, 1, "zsc1"); /* zsc1 */
2961    
2962     /* WDSC SCSI controller: */
2963     dev_wdsc_init(machine, mem, 0x1fb8011f, 0, 0);
2964    
2965     /* Return memory read errors so that hpc1
2966     and hpc2 are not detected: */
2967     device_add(machine, "unreadable addr=0x1fb00000 len=0x10000");
2968     device_add(machine, "unreadable addr=0x1f980000 len=0x10000");
2969    
2970     /* Return nothing for gio slots 0, 1, and 2: */
2971     device_add(machine, "unreadable addr=0x1f400000 len=0x1000"); /* gio0 slot 0 */
2972     device_add(machine, "unreadable addr=0x1f600000 len=0x1000"); /* gio0 slot 1 */
2973     device_add(machine, "unreadable addr=0x1f000000 len=0x1000"); /* gio0 slot 2 */
2974    
2975     break;
2976     case 21:
2977 dpavlin 10 strlcat(machine->machine_name, /* TODO */
2978     " (uknown SGI-IP21 ?)", MACHINE_NAME_MAXBUF);
2979 dpavlin 2 /* NOTE: Special case for arc_wordlen: */
2980     arc_wordlen = sizeof(uint64_t);
2981    
2982     device_add(machine, "random addr=0x418000200, len=0x20000");
2983    
2984     break;
2985     case 22:
2986     case 24:
2987     if (machine->machine_subtype == 22) {
2988 dpavlin 10 strlcat(machine->machine_name,
2989     " (Indy, Indigo2, Challenge S; Full-house)",
2990     MACHINE_NAME_MAXBUF);
2991 dpavlin 6 machine->md_int.sgi_ip22_data = dev_sgi_ip22_init(machine, mem, 0x1fbd9000, 0);
2992 dpavlin 2 } else {
2993 dpavlin 10 strlcat(machine->machine_name,
2994     " (Indy, Indigo2, Challenge S; Guiness)",
2995     MACHINE_NAME_MAXBUF);
2996 dpavlin 6 machine->md_int.sgi_ip22_data = dev_sgi_ip22_init(machine, mem, 0x1fbd9880, 1);
2997 dpavlin 2 }
2998    
2999     /*
3000     Why is this here? TODO
3001 dpavlin 18 dev_ram_init(machine, 0x88000000ULL,
3002 dpavlin 2 128 * 1048576, DEV_RAM_MIRROR, 0x08000000);
3003     */
3004     machine->md_interrupt = sgi_ip22_interrupt;
3005    
3006     /*
3007     * According to NetBSD 1.6.2:
3008     *
3009     * imc0 at mainbus0 addr 0x1fa00000, Revision 0
3010     * gio0 at imc0
3011     * hpc0 at gio0 addr 0x1fb80000: SGI HPC3
3012     * zsc0 at hpc0 offset 0x59830
3013     * zstty0 at zsc0 channel 1 (console i/o)
3014     * zstty1 at zsc0 channel 0
3015     * sq0 at hpc0 offset 0x54000: SGI Seeq 80c03 (Ethernet)
3016     * wdsc0 at hpc0 offset 0x44000: WD33C93 SCSI, rev=0, target 7
3017     * scsibus2 at wdsc0: 8 targets, 8 luns per target
3018     * dsclock0 at hpc0 offset 0x60000
3019     *
3020     * According to Linux/IP22:
3021     * tty00 at 0xbfbd9830 (irq = 45) is a Zilog8530
3022     * tty01 at 0xbfbd9838 (irq = 45) is a Zilog8530
3023     *
3024     * and according to NetBSD 2.0_BETA (20040606):
3025     *
3026     * haltwo0 at hpc0 offset 0x58000: HAL2 revision 0.0.0
3027     * audio0 at haltwo0: half duplex
3028     *
3029     * IRQ numbers are of the form 8 + x, where x = 0..31 for local0
3030     * interrupts, and 32..63 for local1. + y*65 for "mappable".
3031     */
3032    
3033     /* zsc0 serial console. */
3034     i = dev_zs_init(machine, mem, 0x1fbd9830,
3035     8 + 32 + 3 + 64*5, 1, "zsc0");
3036    
3037     /* Not supported by NetBSD 1.6.2, but by 2.0_BETA: */
3038     j = dev_pckbc_init(machine, mem, 0x1fbd9840, PCKBC_8242,
3039 dpavlin 6 0, 0, machine->use_x11, 0); /* TODO: irq numbers */
3040 dpavlin 2
3041     if (machine->use_x11)
3042     machine->main_console_handle = j;
3043    
3044     /* sq0: Ethernet. TODO: This should have irq_nr = 8 + 3 */
3045     /* dev_sq_init... */
3046    
3047     /* wdsc0: SCSI */
3048     dev_wdsc_init(machine, mem, 0x1fbc4000, 0, 8 + 1);
3049    
3050     /* wdsc1: SCSI TODO: irq nr */
3051     dev_wdsc_init(machine, mem, 0x1fbcc000, 1, 8 + 1);
3052    
3053     /* dsclock0: TODO: possibly irq 8 + 33 */
3054    
3055     /* Return memory read errors so that hpc1 and hpc2 are not detected: */
3056     device_add(machine, "unreadable addr=0x1fb00000, len=0x10000");
3057     device_add(machine, "unreadable addr=0x1f980000, len=0x10000");
3058    
3059     /* Similarly for gio slots 0, 1, and 2: */
3060     device_add(machine, "unreadable addr=0x1f400000, len=0x1000"); /* gio0 slot 0 */
3061     device_add(machine, "unreadable addr=0x1f600000, len=0x1000"); /* gio0 slot 1 */
3062     device_add(machine, "unreadable addr=0x1f000000, len=0x1000"); /* gio0 slot 2 */
3063    
3064     break;
3065     case 25:
3066     /* NOTE: Special case for arc_wordlen: */
3067     arc_wordlen = sizeof(uint64_t);
3068 dpavlin 10 strlcat(machine->machine_name,
3069     " (Everest IP25)", MACHINE_NAME_MAXBUF);
3070 dpavlin 2
3071     /* serial? irix? */
3072     dev_scc_init(machine, mem,
3073     0x400086000ULL, 0, machine->use_x11, 0, 8);
3074    
3075     /* NOTE: ip19! (perhaps not really the same */
3076     device_add(machine, "sgi_ip19 addr=0x18000000");
3077    
3078     /*
3079     * Memory size, not 4096 byte pages, but 256
3080     * bytes? (16 is size of kernel... approx)
3081     */
3082     store_32bit_word(cpu, 0xa0000000ULL + 0x26d0,
3083     30000); /* (machine->physical_ram_in_mb - 16)
3084     * (1048576 / 256)); */
3085    
3086     break;
3087     case 26:
3088     /* NOTE: Special case for arc_wordlen: */
3089     arc_wordlen = sizeof(uint64_t);
3090 dpavlin 10 strlcat(machine->machine_name,
3091     " (uknown SGI-IP26 ?)",
3092     MACHINE_NAME_MAXBUF); /* TODO */
3093 dpavlin 2 machine->main_console_handle =
3094     dev_zs_init(machine, mem, 0x1fbd9830,
3095     0, 1, "zs console");
3096     break;
3097     case 27:
3098 dpavlin 10 strlcat(machine->machine_name,
3099     " (Origin 200/2000, Onyx2)",
3100     MACHINE_NAME_MAXBUF);
3101 dpavlin 2 arc_wordlen = sizeof(uint64_t);
3102     /* 2 cpus per node */
3103    
3104     machine->main_console_handle =
3105     dev_zs_init(machine, mem, 0x1fbd9830,
3106     0, 1, "zs console");
3107     break;
3108     case 28:
3109     /* NOTE: Special case for arc_wordlen: */
3110     arc_wordlen = sizeof(uint64_t);
3111 dpavlin 10 strlcat(machine->machine_name,
3112     " (Impact Indigo2 ?)", MACHINE_NAME_MAXBUF);
3113 dpavlin 2
3114     device_add(machine, "random addr=0x1fbe0000, len=1");
3115    
3116     /* Something at paddr 0x1880fb0000. */
3117    
3118     break;
3119     case 30:
3120     /* NOTE: Special case for arc_wordlen: */
3121     arc_wordlen = sizeof(uint64_t);
3122 dpavlin 10 strlcat(machine->machine_name,
3123     " (Octane)", MACHINE_NAME_MAXBUF);
3124 dpavlin 2
3125 dpavlin 6 machine->md_int.sgi_ip30_data = dev_sgi_ip30_init(machine, mem, 0x0ff00000);
3126 dpavlin 2 machine->md_interrupt = sgi_ip30_interrupt;
3127    
3128 dpavlin 18 dev_ram_init(machine, 0xa0000000ULL,
3129     128 * 1048576, DEV_RAM_MIRROR
3130     | DEV_RAM_MIGHT_POINT_TO_DEVICES,
3131     0x00000000);
3132 dpavlin 2
3133 dpavlin 18 dev_ram_init(machine, 0x80000000ULL,
3134 dpavlin 2 32 * 1048576, DEV_RAM_RAM, 0x00000000);
3135    
3136     /*
3137     * Something at paddr=1f022004: TODO
3138     * Something at paddr=813f0510 - paddr=813f0570 ?
3139     * Something at paddr=813f04b8
3140     * Something at paddr=f8000003c used by Linux/Octane
3141     *
3142     * 16550 serial port at paddr=1f620178, addr mul 1
3143     * (Error messages are printed to this serial port by the PROM.)
3144     *
3145     * There seems to also be a serial port at 1f620170. The "symmon"
3146     * program dumps something there, but it doesn't look like
3147     * readable text. (TODO)
3148     */
3149    
3150 dpavlin 12 /* TODO: irq! */
3151     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr=0x1f620170 name2=tty0 in_use=%i", machine->use_x11? 0 : 1);
3152     machine->main_console_handle = (size_t)device_add(machine, tmpstr);
3153     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr=0x1f620178 name2=tty1 in_use=0");
3154     device_add(machine, tmpstr);
3155    
3156 dpavlin 2 /* MardiGras graphics: */
3157     device_add(machine, "sgi_mardigras addr=0x1c000000");
3158    
3159     break;
3160     case 32:
3161 dpavlin 10 strlcat(machine->machine_name,
3162     " (O2)", MACHINE_NAME_MAXBUF);
3163 dpavlin 2
3164     /* TODO: Find out where the physical ram is actually located. */
3165 dpavlin 18 dev_ram_init(machine, 0x07ffff00ULL, 256, DEV_RAM_MIRROR, 0x03ffff00);
3166     dev_ram_init(machine, 0x10000000ULL, 256, DEV_RAM_MIRROR, 0x00000000);
3167     dev_ram_init(machine, 0x11ffff00ULL, 256, DEV_RAM_MIRROR, 0x01ffff00);
3168     dev_ram_init(machine, 0x12000000ULL, 256, DEV_RAM_MIRROR, 0x02000000);
3169     dev_ram_init(machine, 0x17ffff00ULL, 256, DEV_RAM_MIRROR, 0x03ffff00);
3170     dev_ram_init(machine, 0x20000000ULL, 128 * 1048576, DEV_RAM_MIRROR, 0x00000000);
3171     dev_ram_init(machine, 0x40000000ULL, 128 * 1048576, DEV_RAM_MIRROR, 0x10000000);
3172 dpavlin 2
3173 dpavlin 6 machine->md_int.ip32.crime_data = dev_crime_init(machine, mem, 0x14000000, 2, machine->use_x11); /* crime0 */
3174 dpavlin 2 dev_sgi_mte_init(mem, 0x15000000); /* mte ??? memory thing */
3175     dev_sgi_gbe_init(machine, mem, 0x16000000); /* gbe? framebuffer? */
3176    
3177     /*
3178     * A combination of NetBSD and Linux info:
3179     *
3180     * 17000000 vice (Video Image Compression Engine)
3181     * 1f000000 mace
3182     * 1f080000 macepci
3183     * 1f100000 vin1
3184     * 1f180000 vin2
3185     * 1f200000 vout
3186     * 1f280000 enet (mec0, MAC-110 Ethernet)
3187     * 1f300000 perif:
3188     * 1f300000 audio
3189     * 1f310000 isa
3190     * 1f318000 (accessed by Irix' pciio_pio_write64)
3191     * 1f320000 kbdms
3192     * 1f330000 i2c
3193     * 1f340000 ust
3194     * 1f380000 isa ext
3195     * 1f390000 com0 (serial)
3196     * 1f398000 com1 (serial)
3197     * 1f3a0000 mcclock0
3198     */
3199    
3200 dpavlin 6 machine->md_int.ip32.mace_data = dev_mace_init(mem, 0x1f310000, 2);
3201 dpavlin 2 machine->md_interrupt = sgi_ip32_interrupt;
3202    
3203     /*
3204     * IRQ mapping is really ugly. TODO: fix
3205     *
3206     * com0 at mace0 offset 0x390000 intr 4 intrmask 0x3f00000: ns16550a, working fifo
3207     * com1 at mace0 offset 0x398000 intr 4 intrmask 0xfc000000: ns16550a, working fifo
3208     * pckbc0 at mace0 offset 0x320000 intr 5 intrmask 0x0
3209     * mcclock0 at mace0 offset 0x3a0000 intrmask 0x0
3210     * macepci0 at mace0 offset 0x80000 intr 7 intrmask 0x0: rev 1
3211     *
3212     * intr 4 = MACE_PERIPH_SERIAL
3213     * intr 5 = MACE_PERIPH_MISC
3214     * intr 7 = MACE_PCI_BRIDGE
3215     */
3216    
3217     net_generate_unique_mac(machine, macaddr);
3218 dpavlin 10 eaddr_string = malloc(ETHERNET_STRING_MAXLEN);
3219 dpavlin 2 if (eaddr_string == NULL) {
3220     fprintf(stderr, "out of memory\n");
3221     exit(1);
3222     }
3223 dpavlin 10 snprintf(eaddr_string, ETHERNET_STRING_MAXLEN,
3224     "eaddr=%02x:%02x:%02x:%02x:%02x:%02x",
3225 dpavlin 2 macaddr[0], macaddr[1], macaddr[2],
3226     macaddr[3], macaddr[4], macaddr[5]);
3227 dpavlin 10 dev_sgi_mec_init(machine, mem, 0x1f280000,
3228     MACE_ETHERNET, macaddr);
3229 dpavlin 2
3230     dev_sgi_ust_init(mem, 0x1f340000); /* ust? */
3231    
3232 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x1f390000 addr_mult=0x100 in_use=%i name2=tty0",
3233     (1<<20) + MACE_PERIPH_SERIAL, machine->use_x11? 0 : 1);
3234     j = (size_t)device_add(machine, tmpstr);
3235     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=%i addr=0x1f398000 addr_mult=0x100 in_use=%i name2=tty1",
3236     (1<<26) + MACE_PERIPH_SERIAL, 0);
3237     device_add(machine, tmpstr);
3238 dpavlin 14
3239     machine->main_console_handle = j;
3240    
3241     /* TODO: Once this works, it should be enabled
3242     always, not just when using X! */
3243     if (machine->use_x11) {
3244     i = dev_pckbc_init(machine, mem, 0x1f320000,
3245     PCKBC_8242, 0x200 + MACE_PERIPH_MISC,
3246     0x800 + MACE_PERIPH_MISC, machine->use_x11, 0);
3247     /* keyb+mouse (mace irq numbers) */
3248 dpavlin 2 machine->main_console_handle = i;
3249 dpavlin 14 }
3250 dpavlin 2
3251     dev_mc146818_init(machine, mem, 0x1f3a0000, (1<<8) + MACE_PERIPH_MISC, MC146818_SGI, 0x40); /* mcclock0 */
3252     dev_zs_init(machine, mem, 0x1fbd9830, 0, 1, "zs console");
3253    
3254     /*
3255     * PCI devices: (according to NetBSD's GENERIC config file for sgimips)
3256     *
3257     * ne* at pci? dev ? function ?
3258     * ahc0 at pci0 dev 1 function ?
3259     * ahc1 at pci0 dev 2 function ?
3260     */
3261    
3262     pci_data = dev_macepci_init(mem, 0x1f080000, MACE_PCI_BRIDGE); /* macepci0 */
3263 dpavlin 20 /* bus_pci_add(machine, pci_data, mem, 0, 0, 0, "ne2000"); TODO */
3264 dpavlin 6
3265     /* TODO: make this nicer */
3266     if (diskimage_exist(machine, 0, DISKIMAGE_SCSI) ||
3267     diskimage_exist(machine, 1, DISKIMAGE_SCSI) ||
3268     diskimage_exist(machine, 2, DISKIMAGE_SCSI) ||
3269     diskimage_exist(machine, 3, DISKIMAGE_SCSI) ||
3270     diskimage_exist(machine, 4, DISKIMAGE_SCSI) ||
3271     diskimage_exist(machine, 5, DISKIMAGE_SCSI) ||
3272     diskimage_exist(machine, 6, DISKIMAGE_SCSI) ||
3273     diskimage_exist(machine, 7, DISKIMAGE_SCSI))
3274 dpavlin 20 bus_pci_add(machine, pci_data, mem, 0, 1, 0, "ahc");
3275 dpavlin 6
3276     /* TODO: second ahc */
3277 dpavlin 20 /* bus_pci_add(machine, pci_data, mem, 0, 2, 0, "ahc"); */
3278 dpavlin 2
3279     break;
3280     case 35:
3281 dpavlin 10 strlcat(machine->machine_name,
3282     " (Origin 3000)", MACHINE_NAME_MAXBUF);
3283 dpavlin 2 /* 4 cpus per node */
3284    
3285     machine->main_console_handle =
3286     dev_zs_init(machine, mem, 0x1fbd9830,
3287     0, 1, "zs console");
3288     break;
3289     case 53:
3290 dpavlin 10 strlcat(machine->machine_name,
3291     " (Origin 350)", MACHINE_NAME_MAXBUF);
3292 dpavlin 2 /*
3293     * According to http://kumba.drachentekh.net/xml/myguide.html
3294     * Origin 350, Tezro IP53 R16000
3295     */
3296     break;
3297     default:
3298     fatal("unimplemented SGI machine type IP%i\n",
3299     machine->machine_subtype);
3300     exit(1);
3301     }
3302     } else {
3303     switch (machine->machine_subtype) {
3304    
3305     case MACHINE_ARC_NEC_RD94:
3306     case MACHINE_ARC_NEC_R94:
3307     case MACHINE_ARC_NEC_R96:
3308     /*
3309     * "NEC-RD94" (NEC RISCstation 2250)
3310     * "NEC-R94" (NEC RISCstation 2200)
3311     * "NEC-R96" (NEC Express RISCserver)
3312     *
3313     * http://mirror.aarnet.edu.au/pub/NetBSD/misc/chs/arcdiag.out (NEC-R96)
3314     */
3315    
3316     switch (machine->machine_subtype) {
3317     case MACHINE_ARC_NEC_RD94:
3318 dpavlin 10 strlcat(machine->machine_name,
3319     " (NEC-RD94, NEC RISCstation 2250)",
3320     MACHINE_NAME_MAXBUF);
3321 dpavlin 2 break;
3322     case MACHINE_ARC_NEC_R94:
3323 dpavlin 10 strlcat(machine->machine_name, " (NEC-R94; NEC RISCstation 2200)",
3324     MACHINE_NAME_MAXBUF);
3325 dpavlin 2 break;
3326     case MACHINE_ARC_NEC_R96:
3327 dpavlin 10 strlcat(machine->machine_name, " (NEC-R96; NEC Express RISCserver)",
3328     MACHINE_NAME_MAXBUF);
3329 dpavlin 2 break;
3330     }
3331    
3332     /* TODO: interrupt controller! */
3333    
3334     pci_data = device_add(machine,
3335     "rd94 addr=0x80000000, irq=0");
3336    
3337     device_add(machine, "sn addr=0x80001000 irq=0");
3338     dev_mc146818_init(machine, mem, 0x80004000ULL, 0, MC146818_ARC_NEC, 1);
3339 dpavlin 6 i = dev_pckbc_init(machine, mem, 0x80005000ULL, PCKBC_8042, 0, 0, machine->use_x11, 0);
3340 dpavlin 2
3341 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=3 addr=0x80006000 in_use=%i name2=tty0", machine->use_x11? 0 : 1);
3342     j = (size_t)device_add(machine, tmpstr);
3343     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr=0x80007000 in_use=%i name2=tty1", 0);
3344     device_add(machine, tmpstr);
3345    
3346 dpavlin 2 if (machine->use_x11)
3347     machine->main_console_handle = i;
3348     else
3349     machine->main_console_handle = j;
3350    
3351     /* lpt at 0x80008000 */
3352    
3353     device_add(machine, "fdc addr=0x8000c000, irq=0");
3354    
3355     switch (machine->machine_subtype) {
3356     case MACHINE_ARC_NEC_RD94:
3357     case MACHINE_ARC_NEC_R94:
3358     /* PCI devices: (NOTE: bus must be 0, device must be 3, 4, or 5, for NetBSD to accept interrupts) */
3359 dpavlin 20 bus_pci_add(machine, pci_data, mem, 0, 3, 0, "dec21030"); /* tga graphics */
3360 dpavlin 2 break;
3361     case MACHINE_ARC_NEC_R96:
3362     dev_fb_init(machine, mem, 0x100e00000ULL,
3363     VFB_GENERIC, 640,480, 1024,480,
3364 dpavlin 12 8, "necvdfrb");
3365 dpavlin 2 break;
3366     }
3367     break;
3368    
3369     case MACHINE_ARC_NEC_R98:
3370     /*
3371     * "NEC-R98" (NEC RISCserver 4200)
3372     *
3373     * According to http://mail-index.netbsd.org/port-arc/2004/02/01/0001.html:
3374     *
3375     * Network adapter at "start: 0x 0 18600000, length: 0x1000, level: 4, vector: 9"
3376     * Disk at "start: 0x 0 18c103f0, length: 0x1000, level: 5, vector: 6"
3377     * Keyboard at "start: 0x 0 18c20060, length: 0x1000, level: 5, vector: 3"
3378     * Serial at "start: 0x 0 18c103f8, length: 0x1000, level: 5, vector: 4"
3379     * Serial at "start: 0x 0 18c102f8, length: 0x1000, level: 5, vector: 4"
3380     * Parallel at "start: 0x 0 18c10278, length: 0x1000, level: 5, vector: 5"
3381     */
3382    
3383 dpavlin 10 strlcat(machine->machine_name,
3384     " (NEC-R98; NEC RISCserver 4200)",
3385     MACHINE_NAME_MAXBUF);
3386 dpavlin 2
3387     /*
3388     * Windows NT access stuff at these addresses:
3389     *
3390     * 19980308, 18000210, 18c0a008,
3391     * 19022018, 19026010, andso on.
3392     */
3393     break;
3394    
3395     case MACHINE_ARC_JAZZ_PICA:
3396     case MACHINE_ARC_JAZZ_MAGNUM:
3397     /*
3398     * "PICA-61"
3399     *
3400     * According to NetBSD 1.6.2:
3401     *
3402     * jazzio0 at mainbus0
3403     * timer0 at jazzio0 addr 0xe0000228
3404     * mcclock0 at jazzio0 addr 0xe0004000: mc146818 or compatible
3405     * lpt at jazzio0 addr 0xe0008000 intr 0 not configured
3406     * fdc at jazzio0 addr 0xe0003000 intr 1 not configured
3407     * MAGNUM at jazzio0 addr 0xe000c000 intr 2 not configured
3408     * ALI_S3 at jazzio0 addr 0xe0800000 intr 3 not configured
3409     * sn0 at jazzio0 addr 0xe0001000 intr 4: SONIC Ethernet
3410     * sn0: Ethernet address 69:6a:6b:6c:00:00
3411     * asc0 at jazzio0 addr 0xe0002000 intr 5: NCR53C94, target 0
3412     * pckbd at jazzio0 addr 0xe0005000 intr 6 not configured
3413     * pms at jazzio0 addr 0xe0005000 intr 7 not configured
3414     * com0 at jazzio0 addr 0xe0006000 intr 8: ns16550a, working fifo
3415     * com at jazzio0 addr 0xe0007000 intr 9 not configured
3416     * jazzisabr0 at mainbus0
3417     * isa0 at jazzisabr0 isa_io_base 0xe2000000 isa_mem_base 0xe3000000
3418     *
3419     * "Microsoft-Jazz", "MIPS Magnum"
3420     *
3421     * timer0 at jazzio0 addr 0xe0000228
3422     * mcclock0 at jazzio0 addr 0xe0004000: mc146818 or compatible
3423     * lpt at jazzio0 addr 0xe0008000 intr 0 not configured
3424     * fdc at jazzio0 addr 0xe0003000 intr 1 not configured
3425     * MAGNUM at jazzio0 addr 0xe000c000 intr 2 not configured
3426     * VXL at jazzio0 addr 0xe0800000 intr 3 not configured
3427     * sn0 at jazzio0 addr 0xe0001000 intr 4: SONIC Ethernet
3428     * sn0: Ethernet address 69:6a:6b:6c:00:00
3429     * asc0 at jazzio0 addr 0xe0002000 intr 5: NCR53C94, target 0
3430     * scsibus0 at asc0: 8 targets, 8 luns per target
3431     * pckbd at jazzio0 addr 0xe0005000 intr 6 not configured
3432     * pms at jazzio0 addr 0xe0005000 intr 7 not configured
3433     * com0 at jazzio0 addr 0xe0006000 intr 8: ns16550a, working fifo
3434     * com at jazzio0 addr 0xe0007000 intr 9 not configured
3435     * jazzisabr0 at mainbus0
3436     * isa0 at jazzisabr0 isa_io_base 0xe2000000 isa_mem_base 0xe3000000
3437     */
3438    
3439     switch (machine->machine_subtype) {
3440     case MACHINE_ARC_JAZZ_PICA:
3441 dpavlin 10 strlcat(machine->machine_name, " (Microsoft Jazz, Acer PICA-61)",
3442     MACHINE_NAME_MAXBUF);
3443 dpavlin 2 break;
3444     case MACHINE_ARC_JAZZ_MAGNUM:
3445 dpavlin 10 strlcat(machine->machine_name, " (Microsoft Jazz, MIPS Magnum)",
3446     MACHINE_NAME_MAXBUF);
3447 dpavlin 2 break;
3448     default:
3449     fatal("error in machine.c. jazz\n");
3450     exit(1);
3451     }
3452    
3453 dpavlin 6 machine->md_int.jazz_data = device_add(machine,
3454 dpavlin 2 "jazz addr=0x80000000");
3455     machine->md_interrupt = jazz_interrupt;
3456    
3457 dpavlin 6 i = dev_pckbc_init(machine, mem, 0x80005000ULL,
3458     PCKBC_JAZZ, 8 + 6, 8 + 7, machine->use_x11, 0);
3459    
3460 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=16 addr=0x80006000 in_use=%i name2=tty0", machine->use_x11? 0 : 1);
3461     j = (size_t)device_add(machine, tmpstr);
3462     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=17 addr=0x80007000 in_use=%i name2=tty1", 0);
3463     device_add(machine, tmpstr);
3464 dpavlin 6
3465     if (machine->use_x11)
3466     machine->main_console_handle = i;
3467     else
3468     machine->main_console_handle = j;
3469    
3470 dpavlin 2 switch (machine->machine_subtype) {
3471     case MACHINE_ARC_JAZZ_PICA:
3472 dpavlin 6 if (machine->use_x11) {
3473     dev_vga_init(machine, mem,
3474     0x400a0000ULL, 0x600003c0ULL,
3475     machine->machine_name);
3476     arcbios_console_init(machine,
3477     0x400b8000ULL, 0x600003c0ULL);
3478     }
3479 dpavlin 2 break;
3480     case MACHINE_ARC_JAZZ_MAGNUM:
3481     /* PROM mirror? */
3482 dpavlin 18 dev_ram_init(machine, 0xfff00000, 0x100000,
3483     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, 0x1fc00000);
3484 dpavlin 2
3485     /* VXL. TODO */
3486     /* control at 0x60100000? */
3487     dev_fb_init(machine, mem, 0x60200000ULL,
3488     VFB_GENERIC, 1024,768, 1024,768,
3489 dpavlin 12 8, "VXL");
3490 dpavlin 2 break;
3491     }
3492    
3493     /* irq 8 + 4 */
3494     device_add(machine, "sn addr=0x80001000 irq=12");
3495    
3496     dev_asc_init(machine, mem,
3497     0x80002000ULL, 8 + 5, NULL, DEV_ASC_PICA,
3498 dpavlin 6 dev_jazz_dma_controller,
3499     machine->md_int.jazz_data);
3500 dpavlin 2
3501     device_add(machine, "fdc addr=0x80003000, irq=0");
3502    
3503     dev_mc146818_init(machine, mem,
3504     0x80004000ULL, 2, MC146818_ARC_JAZZ, 1);
3505    
3506     #if 0
3507     Not yet.
3508 dpavlin 14 /* irq = 8+16 + 14 */
3509     device_add(machine, "wdc addr=0x900001f0, irq=38");
3510 dpavlin 2 #endif
3511    
3512     break;
3513    
3514     case MACHINE_ARC_JAZZ_M700:
3515     /*
3516     * "Microsoft-Jazz", "Olivetti M700"
3517     *
3518     * Different enough from Pica and Magnum to be
3519     * separate here.
3520     *
3521     * See http://mail-index.netbsd.org/port-arc/2000/10/18/0001.html.
3522     */
3523    
3524 dpavlin 10 strlcat(machine->machine_name, " (Microsoft Jazz, Olivetti M700)",
3525     MACHINE_NAME_MAXBUF);
3526 dpavlin 2
3527 dpavlin 6 machine->md_int.jazz_data = device_add(machine,
3528 dpavlin 2 "jazz addr=0x80000000");
3529     machine->md_interrupt = jazz_interrupt;
3530    
3531     dev_mc146818_init(machine, mem,
3532     0x80004000ULL, 2, MC146818_ARC_JAZZ, 1);
3533    
3534     i = 0; /* TODO: Yuck! */
3535     #if 0
3536     i = dev_pckbc_init(machine, mem, 0x80005000ULL,
3537 dpavlin 6 PCKBC_JAZZ, 8 + 6, 8 + 7, machine->use_x11, 0);
3538 dpavlin 2 #endif
3539    
3540 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=16 addr=0x80006000 in_use=%i name2=tty0", machine->use_x11? 0 : 1);
3541     j = (size_t)device_add(machine, tmpstr);
3542     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=17 addr=0x80007000 in_use=%i name2=tty1", 0);
3543     device_add(machine, tmpstr);
3544    
3545 dpavlin 2 if (machine->use_x11)
3546     machine->main_console_handle = i;
3547     else
3548     machine->main_console_handle = j;
3549    
3550     dev_m700_fb_init(machine, mem,
3551     0x180080000ULL, 0x100000000ULL);
3552    
3553     break;
3554    
3555     case MACHINE_ARC_DESKTECH_TYNE:
3556     /*
3557     * "Deskstation Tyne" (?)
3558     *
3559     * TODO
3560     * http://mail-index.netbsd.org/port-arc/2000/10/14/0000.html
3561     */
3562    
3563 dpavlin 10 strlcat(machine->machine_name, " (Deskstation Tyne)",
3564     MACHINE_NAME_MAXBUF);
3565 dpavlin 2
3566 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr=0x9000003f8 in_use=%i name2=tty0", machine->use_x11? 0 : 1);
3567     i = (size_t)device_add(machine, tmpstr);
3568     device_add(machine, "ns16550 irq=0 addr=0x9000002f8 in_use=0 name2=tty1");
3569     device_add(machine, "ns16550 irq=0 addr=0x9000003e8 in_use=0 name2=tty2");
3570     device_add(machine, "ns16550 irq=0 addr=0x9000002e8 in_use=0 name2=tty3");
3571 dpavlin 2
3572     dev_mc146818_init(machine, mem,
3573     0x900000070ULL, 2, MC146818_PC_CMOS, 1);
3574    
3575     #if 0
3576 dpavlin 14 /* TODO: irq, etc */
3577     device_add(machine, "wdc addr=0x9000001f0, irq=0");
3578     device_add(machine, "wdc addr=0x900000170, irq=0");
3579 dpavlin 2 #endif
3580     /* PC kbd */
3581     j = dev_pckbc_init(machine, mem, 0x900000060ULL,
3582 dpavlin 6 PCKBC_8042, 0, 0, machine->use_x11, 0);
3583 dpavlin 2
3584     if (machine->use_x11)
3585     machine->main_console_handle = j;
3586     else
3587     machine->main_console_handle = i;
3588    
3589 dpavlin 6 if (machine->use_x11) {
3590     dev_vga_init(machine, mem, 0x1000a0000ULL,
3591     0x9000003c0ULL, machine->machine_name);
3592    
3593     arcbios_console_init(machine,
3594     0x1000b8000ULL, 0x9000003c0ULL);
3595     }
3596 dpavlin 2 break;
3597    
3598     default:
3599     fatal("Unimplemented ARC machine type %i\n",
3600     machine->machine_subtype);
3601     exit(1);
3602     }
3603     }
3604    
3605     /*
3606     * This is important: :-)
3607     *
3608 dpavlin 6 * TODO: There should not be any use of ARCBIOS before this
3609     * point.
3610 dpavlin 2 */
3611    
3612 dpavlin 14 if (machine->prom_emulation) {
3613     arcbios_init(machine, arc_wordlen == sizeof(uint64_t),
3614 dpavlin 6 sgi_ram_offset);
3615 dpavlin 2
3616 dpavlin 14 /*
3617     * TODO: How to build the component tree intermixed with
3618     * the rest of device initialization?
3619     */
3620 dpavlin 2
3621 dpavlin 14 /*
3622     * Boot string in ARC format:
3623     *
3624     * TODO: How about floppies? multi()disk()fdisk()
3625     * Is tftp() good for netbooting?
3626     */
3627     init_bootpath = malloc(500);
3628     if (init_bootpath == NULL) {
3629     fprintf(stderr, "out of mem, bootpath\n");
3630     exit(1);
3631 dpavlin 2 }
3632 dpavlin 14 init_bootpath[0] = '\0';
3633 dpavlin 2
3634 dpavlin 14 if (bootdev_id < 0 || machine->force_netboot) {
3635     snprintf(init_bootpath, 400, "tftp()");
3636     } else {
3637     /* TODO: Make this nicer. */
3638     if (machine->machine_type == MACHINE_SGI) {
3639     if (machine->machine_subtype == 30)
3640     strlcat(init_bootpath, "xio(0)pci(15)",
3641     MACHINE_NAME_MAXBUF);
3642     if (machine->machine_subtype == 32)
3643     strlcat(init_bootpath, "pci(0)",
3644     MACHINE_NAME_MAXBUF);
3645     }
3646 dpavlin 2
3647 dpavlin 14 if (diskimage_is_a_cdrom(machine, bootdev_id,
3648     bootdev_type))
3649     snprintf(init_bootpath + strlen(init_bootpath),
3650     400,"scsi(0)cdrom(%i)fdisk(0)", bootdev_id);
3651     else
3652     snprintf(init_bootpath + strlen(init_bootpath),
3653     400,"scsi(0)disk(%i)rdisk(0)partition(1)",
3654     bootdev_id);
3655     }
3656 dpavlin 2
3657 dpavlin 14 if (machine->machine_type == MACHINE_ARC)
3658     strlcat(init_bootpath, "\\", MACHINE_NAME_MAXBUF);
3659 dpavlin 2
3660 dpavlin 14 bootstr = malloc(BOOTSTR_BUFLEN);
3661     if (bootstr == NULL) {
3662     fprintf(stderr, "out of memory\n");
3663     exit(1);
3664     }
3665     strlcpy(bootstr, init_bootpath, BOOTSTR_BUFLEN);
3666     if (strlcat(bootstr, machine->boot_kernel_filename,
3667     BOOTSTR_BUFLEN) >= BOOTSTR_BUFLEN) {
3668     fprintf(stderr, "boot string too long?\n");
3669     exit(1);
3670     }
3671 dpavlin 2
3672 dpavlin 14 /* Boot args., eg "-a" */
3673     bootarg = machine->boot_string_argument;
3674 dpavlin 2
3675 dpavlin 14 /* argc, argv, envp in a0, a1, a2: */
3676     cpu->cd.mips.gpr[MIPS_GPR_A0] = 0; /* note: argc is increased later */
3677 dpavlin 2
3678 dpavlin 14 /* TODO: not needed? */
3679     cpu->cd.mips.gpr[MIPS_GPR_SP] = (int64_t)(int32_t)
3680     (machine->physical_ram_in_mb * 1048576 + 0x80000000 - 0x2080);
3681 dpavlin 2
3682 dpavlin 14 /* Set up argc/argv: */
3683     addr = ARC_ENV_STRINGS;
3684     addr2 = ARC_ARGV_START;
3685     cpu->cd.mips.gpr[MIPS_GPR_A1] = addr2;
3686 dpavlin 2
3687 dpavlin 14 /* bootstr: */
3688 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3689 dpavlin 14 add_environment_string(cpu, bootstr, &addr);
3690 dpavlin 2 cpu->cd.mips.gpr[MIPS_GPR_A0] ++;
3691    
3692 dpavlin 14 /* bootarg: */
3693     if (bootarg[0] != '\0') {
3694     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3695     add_environment_string(cpu, bootarg, &addr);
3696     cpu->cd.mips.gpr[MIPS_GPR_A0] ++;
3697     }
3698 dpavlin 2
3699 dpavlin 14 cpu->cd.mips.gpr[MIPS_GPR_A2] = addr2;
3700    
3701     /*
3702     * Add environment variables. For each variable, add it
3703     * as a string using add_environment_string(), and add a
3704     * pointer to it to the ARC_ENV_POINTERS array.
3705     */
3706     if (machine->use_x11) {
3707     if (machine->machine_type == MACHINE_ARC) {
3708     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3709     add_environment_string(cpu, "CONSOLEIN=multi()key()keyboard()console()", &addr);
3710     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3711     add_environment_string(cpu, "CONSOLEOUT=multi()video()monitor()console()", &addr);
3712     } else {
3713     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3714     add_environment_string(cpu, "ConsoleIn=keyboard()", &addr);
3715     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3716     add_environment_string(cpu, "ConsoleOut=video()", &addr);
3717    
3718     /* g for graphical mode. G for graphical mode
3719     with SGI logo visible on Irix? */
3720     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3721     add_environment_string(cpu, "console=g", &addr);
3722     }
3723     } else {
3724     if (machine->machine_type == MACHINE_ARC) {
3725     /* TODO: serial console for ARC? */
3726     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3727     add_environment_string(cpu, "CONSOLEIN=multi()serial(0)", &addr);
3728     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3729     add_environment_string(cpu, "CONSOLEOUT=multi()serial(0)", &addr);
3730     } else {
3731     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3732     add_environment_string(cpu, "ConsoleIn=serial(0)", &addr);
3733     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3734     add_environment_string(cpu, "ConsoleOut=serial(0)", &addr);
3735    
3736     /* 'd' or 'd2' in Irix, 'ttyS0' in Linux? */
3737     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3738     add_environment_string(cpu, "console=d", &addr); /* d2 = serial? */
3739     }
3740     }
3741    
3742     if (machine->machine_type == MACHINE_SGI) {
3743 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3744 dpavlin 14 add_environment_string(cpu, "AutoLoad=No", &addr);
3745 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3746 dpavlin 14 add_environment_string(cpu, "diskless=0", &addr);
3747 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3748 dpavlin 14 add_environment_string(cpu, "volume=80", &addr);
3749 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3750 dpavlin 14 add_environment_string(cpu, "sgilogo=y", &addr);
3751 dpavlin 2
3752     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3753 dpavlin 14 add_environment_string(cpu, "monitor=h", &addr);
3754 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3755 dpavlin 14 add_environment_string(cpu, "TimeZone=GMT", &addr);
3756 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3757 dpavlin 14 add_environment_string(cpu, "nogfxkbd=1", &addr);
3758    
3759     /* TODO: 'xio(0)pci(15)scsi(0)disk(1)rdisk(0)partition(0)' on IP30 at least */
3760    
3761 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3762 dpavlin 14 add_environment_string(cpu, "SystemPartition=pci(0)scsi(0)disk(2)rdisk(0)partition(8)", &addr);
3763 dpavlin 2 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3764 dpavlin 14 add_environment_string(cpu, "OSLoadPartition=pci(0)scsi(0)disk(2)rdisk(0)partition(0)", &addr);
3765     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3766     add_environment_string(cpu, "OSLoadFilename=/unix", &addr);
3767     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3768     add_environment_string(cpu, "OSLoader=sash", &addr);
3769 dpavlin 2
3770     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3771 dpavlin 14 add_environment_string(cpu, "rbaud=9600", &addr);
3772     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3773     add_environment_string(cpu, "rebound=y", &addr);
3774     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3775     add_environment_string(cpu, "crt_option=1", &addr);
3776     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3777     add_environment_string(cpu, "netaddr=10.0.0.1", &addr);
3778 dpavlin 2
3779 dpavlin 14 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3780     add_environment_string(cpu, "keybd=US", &addr);
3781 dpavlin 2
3782 dpavlin 14 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3783     add_environment_string(cpu, "cpufreq=3", &addr);
3784     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3785     add_environment_string(cpu, "dbaud=9600", &addr);
3786     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3787     add_environment_string(cpu, eaddr_string, &addr);
3788     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3789     add_environment_string(cpu, "verbose=istrue", &addr);
3790     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3791     add_environment_string(cpu, "showconfig=istrue", &addr);
3792     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3793     add_environment_string(cpu, "diagmode=v", &addr);
3794     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3795     add_environment_string(cpu, "kernname=unix", &addr);
3796     } else {
3797     char *tmp;
3798     size_t mlen = strlen(bootarg) + strlen("OSLOADOPTIONS=") + 2;
3799     tmp = malloc(mlen);
3800     snprintf(tmp, mlen, "OSLOADOPTIONS=%s", bootarg);
3801     store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3802     add_environment_string(cpu, tmp, &addr);
3803 dpavlin 2
3804 dpavlin 14 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3805     add_environment_string(cpu, "OSLOADPARTITION=scsi(0)cdrom(6)fdisk(0);scsi(0)disk(0)rdisk(0)partition(1)", &addr);
3806 dpavlin 2
3807 dpavlin 14 store_pointer_and_advance(cpu, &addr2, addr, arc_wordlen==sizeof(uint64_t));
3808     add_environment_string(cpu, "SYSTEMPARTITION=scsi(0)cdrom(6)fdisk(0);scsi(0)disk(0)rdisk(0)partition(1)", &addr);
3809     }
3810 dpavlin 2
3811 dpavlin 14 /* End the environment strings with an empty zero-terminated
3812     string, and the envp array with a NULL pointer. */
3813     add_environment_string(cpu, "", &addr); /* the end */
3814     store_pointer_and_advance(cpu, &addr2,
3815     0, arc_wordlen==sizeof(uint64_t));
3816 dpavlin 2
3817 dpavlin 14 /* Return address: (0x20 = ReturnFromMain()) */
3818     cpu->cd.mips.gpr[MIPS_GPR_RA] = ARC_FIRMWARE_ENTRIES + 0x20;
3819 dpavlin 2 }
3820    
3821     break;
3822    
3823     case MACHINE_MESHCUBE:
3824     machine->machine_name = "MeshCube";
3825    
3826     if (machine->physical_ram_in_mb != 64)
3827     fprintf(stderr, "WARNING! MeshCubes are supposed to have exactly 64 MB RAM. Continuing anyway.\n");
3828     if (machine->use_x11)
3829     fprintf(stderr, "WARNING! MeshCube with -X is meaningless. Continuing anyway.\n");
3830    
3831     /* First of all, the MeshCube has an Au1500 in it: */
3832     machine->md_interrupt = au1x00_interrupt;
3833 dpavlin 6 machine->md_int.au1x00_ic_data = dev_au1x00_init(machine, mem);
3834 dpavlin 2
3835     /*
3836     * TODO: Which non-Au1500 devices, and at what addresses?
3837     *
3838     * "4G Systems MTX-1 Board" at ?
3839     * 1017fffc, 14005004, 11700000, 11700008, 11900014,
3840     * 1190002c, 11900100, 11900108, 1190010c,
3841     * 10400040 - 10400074,
3842     * 14001000 (possibly LCD?)
3843     * 11100028 (possibly ttySx?)
3844     *
3845     * "usb_ohci=base:0x10100000,len:0x100000,irq:26"
3846     */
3847    
3848     device_add(machine, "random addr=0x1017fffc len=4");
3849    
3850 dpavlin 14 if (machine->prom_emulation) {
3851     /*
3852     * TODO: A Linux kernel wants "memsize" from somewhere... I
3853     * haven't found any docs on how it is used though.
3854     */
3855     cpu->cd.mips.gpr[MIPS_GPR_A0] = 1;
3856     cpu->cd.mips.gpr[MIPS_GPR_A1] = 0xa0001000ULL;
3857     store_32bit_word(cpu, cpu->cd.mips.gpr[MIPS_GPR_A1],
3858     0xa0002000ULL);
3859     store_string(cpu, 0xa0002000ULL, "something=somethingelse");
3860 dpavlin 2
3861 dpavlin 14 cpu->cd.mips.gpr[MIPS_GPR_A2] = 0xa0003000ULL;
3862     store_string(cpu, 0xa0002000ULL, "hello=world\n");
3863     }
3864 dpavlin 2 break;
3865    
3866     case MACHINE_NETGEAR:
3867 dpavlin 14 machine->machine_name = "NetGear WG602v1";
3868 dpavlin 2
3869     if (machine->use_x11)
3870     fprintf(stderr, "WARNING! NetGear with -X is meaningless. Continuing anyway.\n");
3871     if (machine->physical_ram_in_mb != 16)
3872 dpavlin 14 fprintf(stderr, "WARNING! Real NetGear WG602v1 boxes have exactly 16 MB RAM. Continuing anyway.\n");
3873 dpavlin 2
3874     /*
3875     * Lots of info about the IDT 79RC 32334
3876     * http://www.idt.com/products/pages/Integrated_Processors-79RC32334.html
3877     */
3878     device_add(machine, "8250 addr=0x18000800 addr_mult=4 irq=0");
3879     break;
3880    
3881     case MACHINE_SONYNEWS:
3882     /*
3883     * There are several models, according to
3884     * http://www.netbsd.org/Ports/newsmips/:
3885     *
3886     * "R3000 and hyper-bus based models"
3887     * NWS-3470D, -3410, -3460, -3710, -3720
3888     *
3889     * "R4000/4400 and apbus based models"
3890     * NWS-5000
3891     *
3892     * For example: (found using google)
3893     *
3894     * cpu_model = news3700
3895     * SONY NET WORK STATION, Model NWS-3710, Machine ID #30145
3896     * cpu0: MIPS R3000 (0x220) Rev. 2.0 with MIPS R3010 Rev.2.0
3897     * 64KB/4B direct-mapped I, 64KB/4B direct-mapped w-thr. D
3898     *
3899     * See http://katsu.watanabe.name/doc/sonynews/model.html
3900     * for more details.
3901     */
3902     cpu->byte_order = EMUL_BIG_ENDIAN;
3903     machine->machine_name = "Sony NeWS (NET WORK STATION)";
3904    
3905 dpavlin 14 if (machine->prom_emulation) {
3906     /* This is just a test. TODO */
3907 dpavlin 2 int i;
3908     for (i=0; i<32; i++)
3909     cpu->cd.mips.gpr[i] =
3910     0x01230000 + (i << 8) + 0x55;
3911     }
3912    
3913     machine->main_console_handle =
3914     dev_zs_init(machine, mem, 0x1e950000, 0, 1, "zs console");
3915    
3916     break;
3917    
3918 dpavlin 8 case MACHINE_EVBMIPS:
3919 dpavlin 10 /* http://www.netbsd.org/Ports/evbmips/ */
3920     cpu->byte_order = EMUL_LITTLE_ENDIAN;
3921    
3922 dpavlin 8 switch (machine->machine_subtype) {
3923     case MACHINE_EVBMIPS_MALTA:
3924 dpavlin 12 case MACHINE_EVBMIPS_MALTA_BE:
3925     machine->machine_name = "MALTA (evbmips, little endian)";
3926     cpu->byte_order = EMUL_LITTLE_ENDIAN;
3927 dpavlin 10
3928 dpavlin 12 if (machine->machine_subtype == MACHINE_EVBMIPS_MALTA_BE) {
3929     machine->machine_name = "MALTA (evbmips, big endian)";
3930     cpu->byte_order = EMUL_BIG_ENDIAN;
3931     }
3932    
3933 dpavlin 20 machine->md_interrupt = isa8_interrupt;
3934     machine->isa_pic_data.native_irq = 2;
3935 dpavlin 10
3936 dpavlin 20 bus_isa(machine, 0, 0x18000000, 0x10000000, 8, 24);
3937 dpavlin 10
3938 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=4 addr=0x%x name2=tty2", MALTA_CBUSUART);
3939     device_add(machine, tmpstr);
3940 dpavlin 20
3941 dpavlin 12 pci_data = dev_gt_init(machine, mem, 0x1be00000, 8+9, 8+9, 120);
3942 dpavlin 10
3943 dpavlin 20 if (machine->use_x11) {
3944     if (strlen(machine->boot_string_argument) < 3)
3945     fatal("WARNING: remember to use -o 'console=tty0' "
3946     "if you are emulating Linux. (Not needed for NetBSD.)\n");
3947     bus_pci_add(machine, pci_data, mem, 0xc0, 8, 0, "s3_virge");
3948     }
3949 dpavlin 10
3950 dpavlin 20 bus_pci_add(machine, pci_data, mem, 0, 9, 0, "i82371ab_isa");
3951     bus_pci_add(machine, pci_data, mem, 0, 9, 1, "i82371ab_ide");
3952    
3953 dpavlin 10 device_add(machine, "malta_lcd addr=0x1f000400");
3954 dpavlin 8 break;
3955     case MACHINE_EVBMIPS_PB1000:
3956     machine->machine_name = "PB1000 (evbmips)";
3957 dpavlin 12 cpu->byte_order = EMUL_BIG_ENDIAN;
3958    
3959 dpavlin 10 machine->md_interrupt = au1x00_interrupt;
3960 dpavlin 12 machine->md_int.au1x00_ic_data = dev_au1x00_init(machine, mem);
3961     /* TODO */
3962 dpavlin 8 break;
3963     default:
3964     fatal("Unimplemented EVBMIPS model.\n");
3965     exit(1);
3966     }
3967    
3968 dpavlin 12 if (machine->prom_emulation) {
3969     /* NetBSD/evbmips wants these: (at least for Malta) */
3970 dpavlin 8
3971 dpavlin 12 /* a0 = argc */
3972     cpu->cd.mips.gpr[MIPS_GPR_A0] = 2;
3973 dpavlin 10
3974 dpavlin 12 /* a1 = argv */
3975     cpu->cd.mips.gpr[MIPS_GPR_A1] = (int32_t)0x9fc01000;
3976     store_32bit_word(cpu, (int32_t)0x9fc01000, 0x9fc01040);
3977     store_32bit_word(cpu, (int32_t)0x9fc01004, 0x9fc01200);
3978     store_32bit_word(cpu, (int32_t)0x9fc01008, 0);
3979 dpavlin 10
3980 dpavlin 12 bootstr = strdup(machine->boot_kernel_filename);
3981     bootarg = strdup(machine->boot_string_argument);
3982     store_string(cpu, (int32_t)0x9fc01040, bootstr);
3983     store_string(cpu, (int32_t)0x9fc01200, bootarg);
3984 dpavlin 10
3985 dpavlin 12 /* a2 = (yamon_env_var *)envp */
3986     cpu->cd.mips.gpr[MIPS_GPR_A2] = (int32_t)0x9fc01800;
3987     {
3988     uint64_t env = cpu->cd.mips.gpr[MIPS_GPR_A2];
3989     uint64_t tmpptr = 0xffffffff9fc01c00ULL;
3990     char tmps[50];
3991 dpavlin 10
3992 dpavlin 12 snprintf(tmps, sizeof(tmps), "0x%08x",
3993     machine->physical_ram_in_mb * 1048576);
3994     add_environment_string_dual(cpu,
3995     &env, &tmpptr, "memsize", tmps);
3996 dpavlin 10
3997 dpavlin 12 add_environment_string_dual(cpu,
3998     &env, &tmpptr, "yamonrev", "02.06");
3999    
4000     /* End of env: */
4001     tmpptr = 0;
4002     add_environment_string_dual(cpu,
4003     &env, &tmpptr, NULL, NULL);
4004     }
4005    
4006     /* a3 = memsize */
4007     cpu->cd.mips.gpr[MIPS_GPR_A3] =
4008     machine->physical_ram_in_mb * 1048576;
4009     /* Hm. Linux ignores a3. */
4010    
4011     /*
4012     * TODO:
4013     * Core ID numbers.
4014     * How much of this is not valid for PBxxxx?
4015     *
4016     * See maltareg.h for more info.
4017     */
4018     store_32bit_word(cpu, (int32_t)(0x80000000 + MALTA_REVISION), (1 << 10) + 0x26);
4019    
4020     /* Call vectors at 0x9fc005xx: */
4021     for (i=0; i<0x100; i+=4)
4022     store_32bit_word(cpu, (int64_t)(int32_t)0x9fc00500 + i,
4023     (int64_t)(int32_t)0x9fc00800 + i);
4024     }
4025 dpavlin 8 break;
4026    
4027 dpavlin 10 case MACHINE_PSP:
4028     /*
4029     * The Playstation Portable seems to be a strange beast.
4030     *
4031     * http://yun.cup.com/psppg004.html (in Japanese) seems to
4032     * suggest that virtual addresses are not displaced by
4033     * 0x80000000 as on normal CPUs, but by 0x40000000?
4034     */
4035     machine->machine_name = "Playstation Portable";
4036     cpu->byte_order = EMUL_LITTLE_ENDIAN;
4037    
4038     if (!machine->use_x11 && !quiet_mode)
4039     fprintf(stderr, "-------------------------------------"
4040     "------------------------------------------\n"
4041     "\n WARNING! You are emulating a PSP without -X. "
4042     "You will miss graphical output!\n\n"
4043     "-------------------------------------"
4044     "------------------------------------------\n");
4045    
4046     /* 480 x 272 pixels framebuffer (512 bytes per line) */
4047 dpavlin 18 fb = dev_fb_init(machine, mem, 0x04000000, VFB_HPC,
4048 dpavlin 12 480,272, 512,1088, -15, "Playstation Portable");
4049 dpavlin 10
4050     /*
4051     * TODO/NOTE: This is ugly, but necessary since GXemul doesn't
4052     * emulate any MIPS CPU without MMU right now.
4053     */
4054     mips_coproc_tlb_set_entry(cpu, 0, 1048576*16,
4055     0x44000000 /*vaddr*/, 0x4000000, 0x4000000 + 1048576*16,
4056     1,1,1,1,1, 0, 2, 2);
4057     mips_coproc_tlb_set_entry(cpu, 1, 1048576*16,
4058     0x8000000 /*vaddr*/, 0x0, 0x0 + 1048576*16,
4059     1,1,1,1,1, 0, 2, 2);
4060     mips_coproc_tlb_set_entry(cpu, 2, 1048576*16,
4061     0x9000000 /*vaddr*/, 0x01000000, 0x01000000 + 1048576*16,
4062     1,1,1,1,1, 0, 2, 2);
4063     mips_coproc_tlb_set_entry(cpu, 3, 1048576*16,
4064     0x0 /*vaddr*/, 0, 0 + 1048576*16, 1,1,1,1,1, 0, 2, 2);
4065    
4066     cpu->cd.mips.gpr[MIPS_GPR_SP] = 0xfff0;
4067    
4068     break;
4069 dpavlin 20
4070     case MACHINE_ALGOR:
4071     switch (machine->machine_subtype) {
4072     case MACHINE_ALGOR_P4032:
4073     machine->machine_name = "\"Algor\" P4032";
4074     break;
4075     case MACHINE_ALGOR_P5064:
4076     machine->machine_name = "\"Algor\" P5064";
4077     break;
4078     default:fatal("Unimplemented Algor machine.\n");
4079     exit(1);
4080     }
4081    
4082     machine->md_interrupt = isa8_interrupt;
4083     machine->isa_pic_data.native_irq = 6;
4084    
4085     /* TODO: correct isa irq? 6 is just a bogus guess */
4086    
4087     bus_isa(machine, 0, 0x1d000000, 0xc0000000, 8, 24);
4088    
4089     if (machine->prom_emulation) {
4090     /* NetBSD/algor wants these: */
4091    
4092     /* a0 = argc */
4093     cpu->cd.mips.gpr[MIPS_GPR_A0] = 2;
4094    
4095     /* a1 = argv */
4096     cpu->cd.mips.gpr[MIPS_GPR_A1] = (int32_t)0x9fc01000;
4097     store_32bit_word(cpu, (int32_t)0x9fc01000, 0x9fc01040);
4098     store_32bit_word(cpu, (int32_t)0x9fc01004, 0x9fc01200);
4099     store_32bit_word(cpu, (int32_t)0x9fc01008, 0);
4100    
4101     bootstr = strdup(machine->boot_kernel_filename);
4102     bootarg = strdup(machine->boot_string_argument);
4103     store_string(cpu, (int32_t)0x9fc01040, bootstr);
4104     store_string(cpu, (int32_t)0x9fc01200, bootarg);
4105    
4106     /* a2 = (yamon_env_var *)envp */
4107     cpu->cd.mips.gpr[MIPS_GPR_A2] = (int32_t)0x9fc01800;
4108     {
4109     char tmps[50];
4110    
4111     store_32bit_word(cpu, (int32_t)0x9fc01800, 0x9fc01900);
4112     store_32bit_word(cpu, (int32_t)0x9fc01804, 0x9fc01a00);
4113     store_32bit_word(cpu, (int32_t)0x9fc01808, 0);
4114    
4115     snprintf(tmps, sizeof(tmps), "memsize=0x%08x",
4116     machine->physical_ram_in_mb * 1048576);
4117     store_string(cpu, (int)0x9fc01900, tmps);
4118     store_string(cpu, (int)0x9fc01a00, "ethaddr=10:20:30:30:20:10");
4119     }
4120     }
4121     break;
4122 dpavlin 12 #endif /* ENABLE_MIPS */
4123 dpavlin 10
4124 dpavlin 12 #ifdef ENABLE_PPC
4125 dpavlin 2 case MACHINE_BAREPPC:
4126     /*
4127     * A "bare" PPC machine.
4128     *
4129     * NOTE: NO devices at all.
4130     */
4131     machine->machine_name = "\"Bare\" PPC machine";
4132     break;
4133    
4134     case MACHINE_TESTPPC:
4135     /*
4136     * A PPC test machine, similar to the test machine for MIPS.
4137     */
4138     machine->machine_name = "PPC test machine";
4139    
4140     /* TODO: interrupt for PPC? */
4141 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4142     (long long)DEV_CONS_ADDRESS);
4143     cons_data = device_add(machine, tmpstr);
4144     machine->main_console_handle = cons_data->console_handle;
4145 dpavlin 2
4146 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4147 dpavlin 2 (long long)DEV_MP_ADDRESS);
4148     device_add(machine, tmpstr);
4149    
4150 dpavlin 12 fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4151     640,480, 640,480, 24, "testppc generic");
4152    
4153     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4154     (long long)DEV_DISK_ADDRESS);
4155     device_add(machine, tmpstr);
4156    
4157     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4158     (long long)DEV_ETHER_ADDRESS);
4159     device_add(machine, tmpstr);
4160    
4161 dpavlin 2 break;
4162    
4163     case MACHINE_WALNUT:
4164     /*
4165     * NetBSD/evbppc (http://www.netbsd.org/Ports/evbppc/)
4166     */
4167     machine->machine_name = "Walnut evaluation board";
4168    
4169 dpavlin 20 /* "OpenBIOS" entrypoint (?): */
4170     dev_ram_init(machine, 0xfffe0b50, 8, DEV_RAM_RAM, 0);
4171     store_32bit_word(cpu, 0xfffe0b50, 0xfffe0b54);
4172     store_32bit_word(cpu, 0xfffe0b54, 0x4e800020); /* blr */
4173    
4174 dpavlin 2 break;
4175    
4176     case MACHINE_PMPPC:
4177     /*
4178     * NetBSD/pmppc (http://www.netbsd.org/Ports/pmppc/)
4179     */
4180     machine->machine_name = "Artesyn's PM/PPC board";
4181 dpavlin 20 machine->emulated_hz = 10000000;
4182 dpavlin 2
4183     dev_pmppc_init(mem);
4184    
4185 dpavlin 20 machine->md_int.cpc700_data = dev_cpc700_init(machine, mem);
4186     machine->md_interrupt = cpc700_interrupt;
4187 dpavlin 2
4188 dpavlin 20 /* RTC at "ext int 5" = "int 25" in IBM jargon, int
4189     31-25 = 6 for the rest of us. */
4190     dev_mc146818_init(machine, mem, 0x7ff00000, 31-25, MC146818_PMPPC, 1);
4191 dpavlin 12
4192 dpavlin 20 bus_pci_add(machine, machine->md_int.cpc700_data->pci_data,
4193     mem, 0, 8, 0, "dec21143");
4194    
4195 dpavlin 2 break;
4196    
4197     case MACHINE_SANDPOINT:
4198     /*
4199     * NetBSD/sandpoint (http://www.netbsd.org/Ports/sandpoint/)
4200     */
4201     machine->machine_name = "Motorola Sandpoint";
4202    
4203 dpavlin 20 /* r4 should point to first free byte after the loaded kernel: */
4204     cpu->cd.ppc.gpr[4] = 6 * 1048576;
4205 dpavlin 2
4206     break;
4207    
4208     case MACHINE_BEBOX:
4209     /*
4210     * NetBSD/bebox (http://www.netbsd.org/Ports/bebox/)
4211     */
4212     machine->machine_name = "BeBox";
4213    
4214 dpavlin 20 machine->md_int.bebox_data = device_add(machine, "bebox");
4215     machine->isa_pic_data.native_irq = 5;
4216     machine->md_interrupt = isa32_interrupt;
4217 dpavlin 2
4218 dpavlin 20 pci_data = dev_eagle_init(machine, mem,
4219     32 /* isa irq base */, 0 /* pci irq: TODO */);
4220 dpavlin 2
4221 dpavlin 20 bus_isa(machine, BUS_ISA_IDE0 | BUS_ISA_VGA,
4222     0x80000000, 0xc0000000, 32, 48);
4223 dpavlin 14
4224     if (machine->prom_emulation) {
4225 dpavlin 20 /* According to the docs, and also used by NetBSD: */
4226 dpavlin 14 store_32bit_word(cpu, 0x3010, machine->physical_ram_in_mb * 1048576);
4227 dpavlin 2
4228 dpavlin 20 /* Used by Linux: */
4229     store_32bit_word(cpu, 0x32f8, machine->physical_ram_in_mb * 1048576);
4230    
4231 dpavlin 14 /* TODO: List of stuff, see http://www.beatjapan.org/
4232     mirror/www.be.com/aboutbe/benewsletter/
4233     Issue27.html#Cookbook for the details. */
4234     store_32bit_word(cpu, 0x301c, 0);
4235 dpavlin 2
4236 dpavlin 14 /* NetBSD/bebox: r3 = startkernel, r4 = endkernel,
4237     r5 = args, r6 = ptr to bootinfo? */
4238     cpu->cd.ppc.gpr[3] = 0x3100;
4239 dpavlin 20 cpu->cd.ppc.gpr[4] = 0x400000;
4240 dpavlin 14 cpu->cd.ppc.gpr[5] = 0x2000;
4241     store_string(cpu, cpu->cd.ppc.gpr[5], "-a");
4242     cpu->cd.ppc.gpr[6] = machine->physical_ram_in_mb * 1048576 - 0x100;
4243 dpavlin 2
4244 dpavlin 14 /* See NetBSD's bebox/include/bootinfo.h for details */
4245     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 0, 12); /* next */
4246     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 4, 0); /* mem */
4247     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 8,
4248     machine->physical_ram_in_mb * 1048576);
4249 dpavlin 2
4250 dpavlin 14 store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 12, 20); /* next */
4251     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 16, 1); /* console */
4252     store_buf(cpu, cpu->cd.ppc.gpr[6] + 20,
4253     machine->use_x11? "vga" : "com", 4);
4254     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 24, 0x3f8);/* addr */
4255     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 28, 9600);/* speed */
4256 dpavlin 2
4257 dpavlin 14 store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 32, 0); /* next */
4258     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 36, 2); /* clock */
4259     store_32bit_word(cpu, cpu->cd.ppc.gpr[6] + 40, 100);
4260     }
4261 dpavlin 2 break;
4262    
4263     case MACHINE_PREP:
4264     /*
4265     * NetBSD/prep (http://www.netbsd.org/Ports/prep/)
4266     */
4267     machine->machine_name = "PowerPC Reference Platform";
4268 dpavlin 20 machine->emulated_hz = 20000000;
4269 dpavlin 2
4270 dpavlin 20 machine->md_int.bebox_data = device_add(machine, "prep");
4271     machine->isa_pic_data.native_irq = 1; /* Semi-bogus */
4272     machine->md_interrupt = isa32_interrupt;
4273    
4274     pci_data = dev_eagle_init(machine, mem,
4275     32 /* isa irq base */, 0 /* pci irq: TODO */);
4276    
4277     bus_isa(machine, BUS_ISA_IDE0 | BUS_ISA_IDE1,
4278     0x80000000, 0xc0000000, 32, 48);
4279    
4280     bus_pci_add(machine, pci_data, mem, 0, 13, 0, "dec21143");
4281    
4282     if (machine->use_x11)
4283     bus_pci_add(machine, pci_data, mem, 0, 14, 0, "s3_virge");
4284    
4285 dpavlin 14 if (machine->prom_emulation) {
4286     /* Linux on PReP has 0xdeadc0de at address 0? (See
4287     http://joshua.raleigh.nc.us/docs/linux-2.4.10_html/113568.html) */
4288     store_32bit_word(cpu, 0, 0xdeadc0de);
4289    
4290 dpavlin 20 /* r4 should point to first free byte after the loaded kernel: */
4291     cpu->cd.ppc.gpr[4] = 6 * 1048576;
4292    
4293     /*
4294     * r6 should point to bootinfo.
4295     * (See NetBSD's prep/include/bootinfo.h for details.)
4296     */
4297     cpu->cd.ppc.gpr[6] = machine->physical_ram_in_mb * 1048576 - 0x8000;
4298    
4299     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+ 0, 12); /* next */
4300     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+ 4, 2); /* type: clock */
4301     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+ 8, machine->emulated_hz);
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); /* type: console */
4305     store_buf(cpu, cpu->cd.ppc.gpr[6] + 20,
4306     machine->use_x11? "vga" : "com", 4);
4307     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+24, 0x3f8); /* addr */
4308     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+28, 9600); /* speed */
4309    
4310     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+32, 0); /* next */
4311     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+36, 0); /* type: residual */
4312     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+40, /* addr of data */
4313     cpu->cd.ppc.gpr[6] + 0x100);
4314    
4315     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+0x100, 0x200); /* TODO: residual */
4316     /* store_string(cpu, cpu->cd.ppc.gpr[6]+0x100+0x8, "IBM PPS Model 7248 (E)"); */
4317     store_string(cpu, cpu->cd.ppc.gpr[6]+0x100+0x8, "IBM PPS Model 6050/6070 (E)");
4318    
4319     store_32bit_word(cpu, cpu->cd.ppc.gpr[6]+0x100+0x1f8, machine->physical_ram_in_mb * 1048576); /* memsize */
4320 dpavlin 2 }
4321     break;
4322    
4323     case MACHINE_MACPPC:
4324     /*
4325     * NetBSD/macppc (http://www.netbsd.org/Ports/macppc/)
4326     * OpenBSD/macppc (http://www.openbsd.org/macppc.html)
4327     */
4328     machine->machine_name = "Macintosh (PPC)";
4329    
4330 dpavlin 14 if (machine->prom_emulation) {
4331     uint64_t b = 8 * 1048576, a = b - 0x800;
4332     int i;
4333     /*
4334     * r3 = pointer to boot_args (for the Mach kernel).
4335     * See http://darwinsource.opendarwin.org/10.3/
4336     * BootX-59/bootx.tproj/include.subproj/boot_args.h
4337     * for more info.
4338     */
4339     cpu->cd.ppc.gpr[3] = a;
4340     store_16bit_word(cpu, a + 0x0000, 1); /* revision */
4341     store_16bit_word(cpu, a + 0x0002, 2); /* version */
4342     store_buf(cpu, a + 0x0004, machine->boot_string_argument, 256);
4343     /* 26 dram banks; "long base; long size" */
4344     store_32bit_word(cpu, a + 0x0104, 0); /* base */
4345     store_32bit_word(cpu, a + 0x0108, machine->physical_ram_in_mb
4346     * 256); /* size (in pages) */
4347     for (i=8; i<26*8; i+= 4)
4348     store_32bit_word(cpu, a + 0x0104 + i, 0);
4349     a += (0x104 + 26 * 8);
4350     /* Video info: */
4351     store_32bit_word(cpu, a+0, 0xd0000000); /* video base */
4352     store_32bit_word(cpu, a+4, 0); /* display code (?) */
4353     store_32bit_word(cpu, a+8, 800); /* bytes per pixel row */
4354     store_32bit_word(cpu, a+12, 800); /* width */
4355     store_32bit_word(cpu, a+16, 600); /* height */
4356     store_32bit_word(cpu, a+20, 8); /* pixel depth */
4357     a += 24;
4358     store_32bit_word(cpu, a+0, 127); /* gestalt number (TODO) */
4359     store_32bit_word(cpu, a+4, 0); /* device tree pointer (TODO) */
4360     store_32bit_word(cpu, a+8, 0); /* device tree length */
4361     store_32bit_word(cpu, a+12, b); /* last address of kernel data area */
4362 dpavlin 2
4363 dpavlin 14 /* r4 = "MOSX" (0x4D4F5358) */
4364     cpu->cd.ppc.gpr[4] = 0x4D4F5358;
4365    
4366     /*
4367     * r5 = OpenFirmware entry point. NOTE: See
4368     * cpu_ppc.c for the rest of this semi-ugly hack.
4369     */
4370 dpavlin 18 dev_ram_init(machine, cpu->cd.ppc.of_emul_addr,
4371 dpavlin 14 0x1000, DEV_RAM_RAM, 0x0);
4372     store_32bit_word(cpu, cpu->cd.ppc.of_emul_addr,
4373     0x44ee0002);
4374     cpu->cd.ppc.gpr[5] = cpu->cd.ppc.of_emul_addr;
4375     }
4376 dpavlin 2 break;
4377    
4378     case MACHINE_DB64360:
4379     /* For playing with PMON2000 for PPC: */
4380     machine->machine_name = "DB64360";
4381    
4382 dpavlin 14 machine->main_console_handle = (size_t)device_add(machine,
4383     "ns16550 irq=0 addr=0x1d000020 addr_mult=4");
4384 dpavlin 2
4385 dpavlin 14 if (machine->prom_emulation) {
4386 dpavlin 2 int i;
4387     for (i=0; i<32; i++)
4388     cpu->cd.ppc.gpr[i] =
4389     0x12340000 + (i << 8) + 0x55;
4390     }
4391    
4392     break;
4393 dpavlin 12 #endif /* ENABLE_PPC */
4394 dpavlin 2
4395 dpavlin 14 #ifdef ENABLE_SH
4396     case MACHINE_BARESH:
4397     /* A bare SH machine, with no devices. */
4398     machine->machine_name = "\"Bare\" SH machine";
4399     break;
4400    
4401     case MACHINE_TESTSH:
4402     machine->machine_name = "SH test machine";
4403    
4404     snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4405     (long long)DEV_CONS_ADDRESS);
4406     cons_data = device_add(machine, tmpstr);
4407     machine->main_console_handle = cons_data->console_handle;
4408    
4409     snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4410     (long long)DEV_MP_ADDRESS);
4411     device_add(machine, tmpstr);
4412    
4413     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4414     640,480, 640,480, 24, "testsh generic");
4415    
4416     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4417     (long long)DEV_DISK_ADDRESS);
4418     device_add(machine, tmpstr);
4419    
4420     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4421     (long long)DEV_ETHER_ADDRESS);
4422     device_add(machine, tmpstr);
4423    
4424     break;
4425    
4426     case MACHINE_HPCSH:
4427     /* Handheld SH-based machines: */
4428     machine->machine_name = "HPCsh";
4429    
4430     /* TODO */
4431    
4432     break;
4433     #endif /* ENABLE_SH */
4434    
4435     #ifdef ENABLE_HPPA
4436     case MACHINE_BAREHPPA:
4437     /* A bare HPPA machine, with no devices. */
4438     machine->machine_name = "\"Bare\" HPPA machine";
4439     break;
4440    
4441     case MACHINE_TESTHPPA:
4442     machine->machine_name = "HPPA test machine";
4443    
4444     snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4445     (long long)DEV_CONS_ADDRESS);
4446     cons_data = device_add(machine, tmpstr);
4447     machine->main_console_handle = cons_data->console_handle;
4448    
4449     snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4450     (long long)DEV_MP_ADDRESS);
4451     device_add(machine, tmpstr);
4452    
4453     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4454     640,480, 640,480, 24, "testhppa generic");
4455    
4456     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4457     (long long)DEV_DISK_ADDRESS);
4458     device_add(machine, tmpstr);
4459    
4460     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4461     (long long)DEV_ETHER_ADDRESS);
4462     device_add(machine, tmpstr);
4463    
4464     break;
4465     #endif /* ENABLE_HPPA */
4466    
4467     #ifdef ENABLE_I960
4468     case MACHINE_BAREI960:
4469     /* A bare I960 machine, with no devices. */
4470     machine->machine_name = "\"Bare\" i960 machine";
4471     break;
4472    
4473     case MACHINE_TESTI960:
4474     machine->machine_name = "i960 test machine";
4475    
4476     snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4477     (long long)DEV_CONS_ADDRESS);
4478     cons_data = device_add(machine, tmpstr);
4479     machine->main_console_handle = cons_data->console_handle;
4480    
4481     snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4482     (long long)DEV_MP_ADDRESS);
4483     device_add(machine, tmpstr);
4484    
4485     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4486     640,480, 640,480, 24, "testi960 generic");
4487    
4488     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4489     (long long)DEV_DISK_ADDRESS);
4490     device_add(machine, tmpstr);
4491    
4492     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4493     (long long)DEV_ETHER_ADDRESS);
4494     device_add(machine, tmpstr);
4495    
4496     break;
4497     #endif /* ENABLE_I960 */
4498    
4499 dpavlin 12 #ifdef ENABLE_SPARC
4500 dpavlin 2 case MACHINE_BARESPARC:
4501     /* A bare SPARC machine, with no devices. */
4502     machine->machine_name = "\"Bare\" SPARC machine";
4503     break;
4504    
4505 dpavlin 12 case MACHINE_TESTSPARC:
4506     machine->machine_name = "SPARC test machine";
4507    
4508     snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4509     (long long)DEV_CONS_ADDRESS);
4510     cons_data = device_add(machine, tmpstr);
4511     machine->main_console_handle = cons_data->console_handle;
4512    
4513     snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4514     (long long)DEV_MP_ADDRESS);
4515     device_add(machine, tmpstr);
4516    
4517     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4518     640,480, 640,480, 24, "testsparc generic");
4519    
4520     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4521     (long long)DEV_DISK_ADDRESS);
4522     device_add(machine, tmpstr);
4523    
4524     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4525     (long long)DEV_ETHER_ADDRESS);
4526     device_add(machine, tmpstr);
4527    
4528     break;
4529    
4530 dpavlin 2 case MACHINE_ULTRA1:
4531     /*
4532     * NetBSD/sparc64 (http://www.netbsd.org/Ports/sparc64/)
4533     * OpenBSD/sparc64 (http://www.openbsd.org/sparc64.html)
4534     */
4535     machine->machine_name = "Sun Ultra1";
4536     break;
4537 dpavlin 12 #endif /* ENABLE_SPARC */
4538 dpavlin 2
4539 dpavlin 12 #ifdef ENABLE_ALPHA
4540     case MACHINE_BAREALPHA:
4541     machine->machine_name = "\"Bare\" Alpha machine";
4542 dpavlin 2 break;
4543    
4544 dpavlin 12 case MACHINE_TESTALPHA:
4545     machine->machine_name = "Alpha test machine";
4546 dpavlin 2
4547 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4548     (long long)DEV_CONS_ADDRESS);
4549     cons_data = device_add(machine, tmpstr);
4550     machine->main_console_handle = cons_data->console_handle;
4551 dpavlin 2
4552 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4553     (long long)DEV_MP_ADDRESS);
4554     device_add(machine, tmpstr);
4555 dpavlin 2
4556 dpavlin 12 fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4557     640,480, 640,480, 24, "testalpha generic");
4558 dpavlin 2
4559 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4560     (long long)DEV_DISK_ADDRESS);
4561     device_add(machine, tmpstr);
4562 dpavlin 2
4563 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4564     (long long)DEV_ETHER_ADDRESS);
4565     device_add(machine, tmpstr);
4566 dpavlin 2
4567     break;
4568    
4569 dpavlin 12 case MACHINE_ALPHA:
4570     if (machine->prom_emulation) {
4571     struct rpb rpb;
4572     struct crb crb;
4573     struct ctb ctb;
4574 dpavlin 2
4575 dpavlin 14 /* TODO: Most of these... They are used by NetBSD/alpha: */
4576     /* a0 = First free Page Frame Number */
4577     /* a1 = PFN of current Level 1 page table */
4578     /* a2 = Bootinfo magic */
4579     /* a3 = Bootinfo pointer */
4580     /* a4 = Bootinfo version */
4581     cpu->cd.alpha.r[ALPHA_A0] = 16*1024*1024 / 8192;
4582     cpu->cd.alpha.r[ALPHA_A1] = 0;
4583     cpu->cd.alpha.r[ALPHA_A2] = 0;
4584     cpu->cd.alpha.r[ALPHA_A3] = 0;
4585     cpu->cd.alpha.r[ALPHA_A4] = 0;
4586    
4587 dpavlin 12 /* HWRPB: Hardware Restart Parameter Block */
4588     memset(&rpb, 0, sizeof(struct rpb));
4589     store_64bit_word_in_host(cpu, (unsigned char *)
4590     &(rpb.rpb_phys), HWRPB_ADDR);
4591     strlcpy((char *)&(rpb.rpb_magic), "HWRPB", 8);
4592     store_64bit_word_in_host(cpu, (unsigned char *)
4593     &(rpb.rpb_size), sizeof(struct rpb));
4594     store_64bit_word_in_host(cpu, (unsigned char *)
4595     &(rpb.rpb_page_size), 8192);
4596     store_64bit_word_in_host(cpu, (unsigned char *)
4597     &(rpb.rpb_type), machine->machine_subtype);
4598     store_64bit_word_in_host(cpu, (unsigned char *)
4599     &(rpb.rpb_cc_freq), 100000000);
4600     store_64bit_word_in_host(cpu, (unsigned char *)
4601     &(rpb.rpb_ctb_off), CTB_ADDR - HWRPB_ADDR);
4602     store_64bit_word_in_host(cpu, (unsigned char *)
4603     &(rpb.rpb_crb_off), CRB_ADDR - HWRPB_ADDR);
4604    
4605     /* CTB: Console Terminal Block */
4606     memset(&ctb, 0, sizeof(struct ctb));
4607     store_64bit_word_in_host(cpu, (unsigned char *)
4608     &(ctb.ctb_term_type), machine->use_x11?
4609     CTB_GRAPHICS : CTB_PRINTERPORT);
4610    
4611     /* CRB: Console Routine Block */
4612     memset(&crb, 0, sizeof(struct crb));
4613     store_64bit_word_in_host(cpu, (unsigned char *)
4614     &(crb.crb_v_dispatch), CRB_ADDR - 0x100);
4615     store_64bit_word(cpu, CRB_ADDR - 0x100 + 8, 0x10000);
4616    
4617     /*
4618     * Place a special "hack" palcode call at 0x10000:
4619     * (Hopefully nothing else will be there.)
4620     */
4621     store_32bit_word(cpu, 0x10000, 0x3fffffe);
4622    
4623     store_buf(cpu, HWRPB_ADDR, (char *)&rpb, sizeof(struct rpb));
4624     store_buf(cpu, CTB_ADDR, (char *)&ctb, sizeof(struct ctb));
4625     store_buf(cpu, CRB_ADDR, (char *)&crb, sizeof(struct crb));
4626     }
4627    
4628     switch (machine->machine_subtype) {
4629     case ST_DEC_3000_300:
4630     machine->machine_name = "DEC 3000/300";
4631 dpavlin 14 machine->main_console_handle =
4632     dev_zs_init(machine, mem, 0x1b0200000ULL,
4633     0, 4, "serial zs"); /* serial? netbsd? */
4634 dpavlin 12 break;
4635 dpavlin 14 case ST_EB164:
4636     machine->machine_name = "EB164";
4637     break;
4638 dpavlin 12 default:fatal("Unimplemented Alpha machine type %i\n",
4639     machine->machine_subtype);
4640     exit(1);
4641     }
4642    
4643 dpavlin 2 break;
4644 dpavlin 12 #endif /* ENABLE_ALPHA */
4645 dpavlin 2
4646 dpavlin 12 #ifdef ENABLE_ARM
4647 dpavlin 6 case MACHINE_BAREARM:
4648     machine->machine_name = "\"Bare\" ARM machine";
4649     break;
4650    
4651     case MACHINE_TESTARM:
4652     machine->machine_name = "ARM test machine";
4653    
4654 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
4655     (long long)DEV_CONS_ADDRESS);
4656     cons_data = device_add(machine, tmpstr);
4657     machine->main_console_handle = cons_data->console_handle;
4658 dpavlin 10
4659 dpavlin 12 snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
4660     (long long)DEV_MP_ADDRESS);
4661     device_add(machine, tmpstr);
4662    
4663     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
4664     640,480, 640,480, 24, "testarm generic");
4665    
4666     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
4667     (long long)DEV_DISK_ADDRESS);
4668     device_add(machine, tmpstr);
4669    
4670     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
4671     (long long)DEV_ETHER_ADDRESS);
4672     device_add(machine, tmpstr);
4673    
4674     /* Place a tiny stub at end of memory, and set the link
4675     register to point to it. This stub halts the machine. */
4676     cpu->cd.arm.r[ARM_SP] =
4677     machine->physical_ram_in_mb * 1048576 - 4096;
4678     cpu->cd.arm.r[ARM_LR] = cpu->cd.arm.r[ARM_SP] + 32;
4679     store_32bit_word(cpu, cpu->cd.arm.r[ARM_LR] + 0, 0xe3a00201);
4680     store_32bit_word(cpu, cpu->cd.arm.r[ARM_LR] + 4, 0xe5c00010);
4681     store_32bit_word(cpu, cpu->cd.arm.r[ARM_LR] + 8,
4682     0xeafffffe);
4683 dpavlin 6 break;
4684 dpavlin 14
4685     case MACHINE_CATS:
4686     machine->machine_name = "CATS evaluation board";
4687    
4688 dpavlin 16 if (machine->emulated_hz == 0)
4689     machine->emulated_hz = 50000000;
4690    
4691 dpavlin 14 if (machine->physical_ram_in_mb > 256)
4692     fprintf(stderr, "WARNING! Real CATS machines cannot"
4693     " have more than 256 MB RAM. Continuing anyway.\n");
4694    
4695     machine->md_int.footbridge_data =
4696     device_add(machine, "footbridge addr=0x42000000");
4697 dpavlin 20 machine->md_interrupt = isa32_interrupt;
4698     machine->isa_pic_data.native_irq = 10;
4699 dpavlin 14
4700 dpavlin 20 /*
4701     * DC21285_ROM_BASE (0x41000000): "reboot" code. Works
4702     * with NetBSD.
4703     */
4704     dev_ram_init(machine, 0x41000000, 12, DEV_RAM_RAM, 0);
4705     store_32bit_word(cpu, 0x41000008ULL, 0xef8c64ebUL);
4706    
4707     /* OpenBSD reboot needs 0xf??????? to be mapped to phys.: */
4708     dev_ram_init(machine, 0xf0000000, 0x1000000,
4709     DEV_RAM_MIRROR, 0x0);
4710    
4711 dpavlin 14 /* NetBSD and OpenBSD clean their caches here: */
4712 dpavlin 18 dev_ram_init(machine, 0x50000000, 0x4000, DEV_RAM_RAM, 0);
4713 dpavlin 14
4714 dpavlin 16 /* Interrupt ack space? */
4715 dpavlin 18 dev_ram_init(machine, 0x80000000, 0x1000, DEV_RAM_RAM, 0);
4716 dpavlin 16
4717 dpavlin 20 bus_isa(machine, BUS_ISA_PCKBC_FORCE_USE | BUS_ISA_PCKBC_NONPCSTYLE,
4718     0x7c000000, 0x80000000, 32, 48);
4719 dpavlin 14
4720 dpavlin 20 bus_pci_add(machine, machine->md_int.footbridge_data->pcibus,
4721     mem, 0xc0, 8, 0, "s3_virge");
4722 dpavlin 14
4723     if (machine->prom_emulation) {
4724     struct ebsaboot ebsaboot;
4725 dpavlin 16 char bs[300];
4726     int boot_id = bootdev_id >= 0? bootdev_id : 0;
4727 dpavlin 14
4728     cpu->cd.arm.r[0] = /* machine->physical_ram_in_mb */
4729     7 * 1048576 - 0x1000;
4730    
4731     memset(&ebsaboot, 0, sizeof(struct ebsaboot));
4732     store_32bit_word_in_host(cpu, (unsigned char *)
4733     &(ebsaboot.bt_magic), BT_MAGIC_NUMBER_CATS);
4734     store_32bit_word_in_host(cpu, (unsigned char *)
4735     &(ebsaboot.bt_vargp), 0);
4736     store_32bit_word_in_host(cpu, (unsigned char *)
4737     &(ebsaboot.bt_pargp), 0);
4738     store_32bit_word_in_host(cpu, (unsigned char *)
4739     &(ebsaboot.bt_args), cpu->cd.arm.r[0]
4740     + sizeof(struct ebsaboot));
4741     store_32bit_word_in_host(cpu, (unsigned char *)
4742     &(ebsaboot.bt_l1), 7 * 1048576 - 32768);
4743     store_32bit_word_in_host(cpu, (unsigned char *)
4744     &(ebsaboot.bt_memstart), 0);
4745     store_32bit_word_in_host(cpu, (unsigned char *)
4746     &(ebsaboot.bt_memend),
4747     machine->physical_ram_in_mb * 1048576);
4748     store_32bit_word_in_host(cpu, (unsigned char *)
4749     &(ebsaboot.bt_memavail), 7 * 1048576);
4750     store_32bit_word_in_host(cpu, (unsigned char *)
4751     &(ebsaboot.bt_fclk), 50 * 1000000);
4752     store_32bit_word_in_host(cpu, (unsigned char *)
4753     &(ebsaboot.bt_pciclk), 66 * 1000000);
4754     /* TODO: bt_vers */
4755     /* TODO: bt_features */
4756    
4757     store_buf(cpu, cpu->cd.arm.r[0],
4758     (char *)&ebsaboot, sizeof(struct ebsaboot));
4759 dpavlin 16
4760 dpavlin 20 snprintf(bs, sizeof(bs), "(hd%i)%s root=/dev/wd%i%s%s",
4761     boot_id, machine->boot_kernel_filename, boot_id,
4762 dpavlin 16 (machine->boot_string_argument[0])? " " : "",
4763 dpavlin 14 machine->boot_string_argument);
4764    
4765 dpavlin 16 store_string(cpu, cpu->cd.arm.r[0] +
4766     sizeof(struct ebsaboot), bs);
4767    
4768 dpavlin 14 arm_setup_initial_translation_table(cpu,
4769     7 * 1048576 - 32768);
4770     }
4771     break;
4772    
4773     case MACHINE_HPCARM:
4774 dpavlin 18 cpu->byte_order = EMUL_LITTLE_ENDIAN;
4775     memset(&hpc_bootinfo, 0, sizeof(hpc_bootinfo));
4776     switch (machine->machine_subtype) {
4777     case MACHINE_HPCARM_IPAQ:
4778     /* SA-1110 206MHz */
4779     machine->machine_name = "Compaq iPAQ H3600";
4780     hpc_fb_addr = 0x48200000; /* TODO */
4781     hpc_fb_xsize = 240;
4782     hpc_fb_ysize = 320;
4783     hpc_fb_xsize_mem = 256;
4784     hpc_fb_ysize_mem = 320;
4785     hpc_fb_bits = 15;
4786     hpc_fb_encoding = BIFB_D16_0000;
4787     hpc_platid_cpu_arch = 3; /* ARM */
4788     hpc_platid_cpu_series = 1; /* StrongARM */
4789     hpc_platid_cpu_model = 2; /* SA-1110 */
4790     hpc_platid_cpu_submodel = 0;
4791     hpc_platid_vendor = 7; /* Compaq */
4792     hpc_platid_series = 4; /* IPAQ */
4793     hpc_platid_model = 2; /* H36xx */
4794     hpc_platid_submodel = 1; /* H3600 */
4795     break;
4796     case MACHINE_HPCARM_JORNADA720:
4797     /* SA-1110 206MHz */
4798     machine->machine_name = "Jornada 720";
4799     hpc_fb_addr = 0x48200000;
4800     hpc_fb_xsize = 640;
4801     hpc_fb_ysize = 240;
4802     hpc_fb_xsize_mem = 640;
4803     hpc_fb_ysize_mem = 240;
4804     hpc_fb_bits = 16;
4805     hpc_fb_encoding = BIFB_D16_0000;
4806     hpc_platid_cpu_arch = 3; /* ARM */
4807     hpc_platid_cpu_series = 1; /* StrongARM */
4808     hpc_platid_cpu_model = 2; /* SA-1110 */
4809     hpc_platid_cpu_submodel = 0;
4810     hpc_platid_vendor = 11; /* HP */
4811     hpc_platid_series = 2; /* Jornada */
4812     hpc_platid_model = 2; /* 7xx */
4813     hpc_platid_submodel = 1; /* 720 */
4814     break;
4815     default:
4816     printf("Unimplemented hpcarm machine number.\n");
4817     exit(1);
4818     }
4819 dpavlin 14
4820 dpavlin 18 store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_cpu,
4821     (hpc_platid_cpu_arch << 26) + (hpc_platid_cpu_series << 20)
4822     + (hpc_platid_cpu_model << 14) + (hpc_platid_cpu_submodel << 8)
4823     + hpc_platid_flags);
4824     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.platid_machine,
4825     (hpc_platid_vendor << 22) + (hpc_platid_series << 16)
4826     + (hpc_platid_model << 8) + hpc_platid_submodel);
4827 dpavlin 14
4828     if (machine->prom_emulation) {
4829 dpavlin 18 /* NetBSD/hpcarm and possibly others expects the following: */
4830    
4831     cpu->cd.arm.r[0] = 1; /* argc */
4832     cpu->cd.arm.r[1] = machine->physical_ram_in_mb * 1048576 - 512; /* argv */
4833     cpu->cd.arm.r[2] = machine->physical_ram_in_mb * 1048576 - 256; /* ptr to hpc_bootinfo */
4834    
4835     bootstr = machine->boot_kernel_filename;
4836     store_32bit_word(cpu, machine->physical_ram_in_mb * 1048576 - 512,
4837     machine->physical_ram_in_mb * 1048576 - 512 + 16);
4838     store_32bit_word(cpu, machine->physical_ram_in_mb * 1048576 - 512 + 4, 0);
4839     store_string(cpu, machine->physical_ram_in_mb * 1048576 - 512 + 16, bootstr);
4840    
4841     if (machine->boot_string_argument[0]) {
4842     cpu->cd.arm.r[0] ++; /* argc */
4843    
4844     store_32bit_word(cpu, machine->physical_ram_in_mb * 1048576 - 512 + 4, machine->physical_ram_in_mb * 1048576 - 512 + 64);
4845     store_32bit_word(cpu, machine->physical_ram_in_mb * 1048576 - 512 + 8, 0);
4846    
4847     store_string(cpu, machine->physical_ram_in_mb * 1048576 - 512 + 64,
4848     machine->boot_string_argument);
4849    
4850     bootarg = machine->boot_string_argument;
4851     }
4852    
4853     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.length, sizeof(hpc_bootinfo));
4854     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.magic, HPC_BOOTINFO_MAGIC);
4855     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_addr, hpc_fb_addr);
4856     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_line_bytes, hpc_fb_xsize_mem * (((hpc_fb_bits-1)|7)+1) / 8);
4857     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_width, hpc_fb_xsize);
4858     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_height, hpc_fb_ysize);
4859     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.fb_type, hpc_fb_encoding);
4860     store_16bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.bi_cnuse,
4861     machine->use_x11? BI_CNUSE_BUILTIN : BI_CNUSE_SERIAL);
4862    
4863     store_32bit_word_in_host(cpu, (unsigned char *)&hpc_bootinfo.timezone, 0);
4864     store_buf(cpu, machine->physical_ram_in_mb * 1048576 - 256, (char *)&hpc_bootinfo, sizeof(hpc_bootinfo));
4865    
4866     /*
4867     * TODO: ugly hack, only works with small NetBSD
4868     * kernels!
4869     */
4870     cpu->cd.arm.r[ARM_SP] = 0xc02c0000;
4871 dpavlin 14 }
4872 dpavlin 18
4873     /* Physical RAM at 0xc0000000: */
4874     dev_ram_init(machine, 0xc0000000, 0x20000000,
4875     DEV_RAM_MIRROR, 0x0);
4876    
4877     /* Cache flush region: */
4878     dev_ram_init(machine, 0xe0000000, 0x10000, DEV_RAM_RAM, 0x0);
4879    
4880     if (hpc_fb_addr != 0) {
4881     dev_fb_init(machine, mem, hpc_fb_addr, VFB_HPC,
4882     hpc_fb_xsize, hpc_fb_ysize,
4883     hpc_fb_xsize_mem, hpc_fb_ysize_mem,
4884     hpc_fb_bits, machine->machine_name);
4885     }
4886 dpavlin 14 break;
4887    
4888     case MACHINE_ZAURUS:
4889     machine->machine_name = "Zaurus";
4890 dpavlin 18 dev_ram_init(machine, 0xa0000000, 0x20000000,
4891     DEV_RAM_MIRROR, 0x0);
4892 dpavlin 20 dev_ram_init(machine, 0xc0000000, 0x20000000,
4893     DEV_RAM_MIRROR, 0x0);
4894    
4895     /* TODO: replace this with the correct device */
4896     dev_ram_init(machine, 0x40d00000, 0x1000, DEV_RAM_RAM, 0);
4897    
4898 dpavlin 14 device_add(machine, "ns16550 irq=0 addr=0x40100000 addr_mult=4");
4899 dpavlin 20 device_add(machine, "ns16550 irq=0 addr=0xfd400000 addr_mult=4");
4900    
4901 dpavlin 14 /* TODO */
4902     if (machine->prom_emulation) {
4903     arm_setup_initial_translation_table(cpu, 0x4000);
4904     }
4905     break;
4906    
4907     case MACHINE_NETWINDER:
4908     machine->machine_name = "NetWinder";
4909    
4910     if (machine->physical_ram_in_mb > 256)
4911     fprintf(stderr, "WARNING! Real NetWinders cannot"
4912     " have more than 256 MB RAM. Continuing anyway.\n");
4913    
4914     machine->md_int.footbridge_data =
4915     device_add(machine, "footbridge addr=0x42000000");
4916 dpavlin 20 machine->md_interrupt = isa32_interrupt;
4917     machine->isa_pic_data.native_irq = 11;
4918 dpavlin 14
4919 dpavlin 20 bus_isa(machine, 0, 0x7c000000, 0x80000000, 32, 48);
4920     #if 0
4921 dpavlin 14 snprintf(tmpstr, sizeof(tmpstr), "8259 irq=64 addr=0x7c000020");
4922     machine->isa_pic_data.pic1 = device_add(machine, tmpstr);
4923     snprintf(tmpstr, sizeof(tmpstr), "8259 irq=64 addr=0x7c0000a0");
4924     machine->isa_pic_data.pic2 = device_add(machine, tmpstr);
4925    
4926     device_add(machine, "ns16550 irq=36 addr=0x7c0003f8 name2=com0");
4927     device_add(machine, "ns16550 irq=35 addr=0x7c0002f8 name2=com1");
4928    
4929     dev_vga_init(machine, mem, 0x800a0000ULL, 0x7c0003c0, machine->machine_name);
4930     j = dev_pckbc_init(machine, mem, 0x7c000060, PCKBC_8042,
4931     32 + 1, 32 + 12, machine->use_x11, 0);
4932     machine->main_console_handle = j;
4933 dpavlin 20 #endif
4934     if (machine->use_x11) {
4935     bus_pci_add(machine, machine->md_int.footbridge_data->pcibus,
4936     mem, 0xc0, 8, 0, "igsfb");
4937 dpavlin 14 }
4938    
4939     if (machine->prom_emulation) {
4940     arm_setup_initial_translation_table(cpu, 0x4000);
4941     }
4942     break;
4943    
4944     case MACHINE_SHARK:
4945     machine->machine_name = "Digital DNARD (\"Shark\")";
4946     if (machine->prom_emulation) {
4947     arm_setup_initial_translation_table(cpu,
4948     machine->physical_ram_in_mb * 1048576 - 65536);
4949    
4950     /*
4951     * r0 = OpenFirmware entry point. NOTE: See
4952     * cpu_arm.c for the rest of this semi-ugly hack.
4953     */
4954     cpu->cd.arm.r[0] = cpu->cd.arm.of_emul_addr;
4955     }
4956     break;
4957    
4958     case MACHINE_IQ80321:
4959     /*
4960     * Intel IQ80321. See http://sources.redhat.com/ecos/docs-latest/redboot/iq80321.html
4961     * for more details about the memory map.
4962     */
4963     machine->machine_name = "Intel IQ80321 (ARM)";
4964     cpu->cd.arm.coproc[6] = arm_coproc_i80321;
4965     cpu->cd.arm.coproc[14] = arm_coproc_i80321_14;
4966     device_add(machine, "ns16550 irq=0 addr=0xfe800000");
4967 dpavlin 18
4968 dpavlin 20 /* Used by "Redboot": */
4969     dev_ram_init(machine, 0xa800024, 4, DEV_RAM_RAM, 0);
4970     store_32bit_word(cpu, 0xa800024, 0x7fff);
4971     device_add(machine, "ns16550 irq=0 addr=0x0d800000 addr_mult=4");
4972     device_add(machine, "ns16550 irq=0 addr=0x0d800020 addr_mult=4");
4973    
4974 dpavlin 18 /* 0xa0000000 = physical ram, 0xc0000000 = uncached */
4975     dev_ram_init(machine, 0xa0000000, 0x20000000,
4976     DEV_RAM_MIRROR, 0x0);
4977     dev_ram_init(machine, 0xc0000000, 0x20000000,
4978     DEV_RAM_MIRROR, 0x0);
4979    
4980     /* 0xe0000000 and 0xff000000 = cache flush regions */
4981     dev_ram_init(machine, 0xe0000000, 0x100000, DEV_RAM_RAM, 0x0);
4982     dev_ram_init(machine, 0xff000000, 0x100000, DEV_RAM_RAM, 0x0);
4983    
4984     device_add(machine, "i80321 addr=0xffffe000");
4985    
4986 dpavlin 14 if (machine->prom_emulation) {
4987 dpavlin 18 arm_setup_initial_translation_table(cpu, 0x4000);
4988     arm_translation_table_set_l1(cpu, 0xa0000000, 0xa0000000);
4989     arm_translation_table_set_l1(cpu, 0xc0000000, 0xa0000000);
4990     arm_translation_table_set_l1(cpu, 0xe0000000, 0xe0000000);
4991     arm_translation_table_set_l1(cpu, 0xf0000000, 0xf0000000);
4992 dpavlin 14 }
4993     break;
4994    
4995     case MACHINE_IYONIX:
4996     machine->machine_name = "Iyonix";
4997     cpu->cd.arm.coproc[6] = arm_coproc_i80321;
4998     cpu->cd.arm.coproc[14] = arm_coproc_i80321_14;
4999 dpavlin 18
5000     device_add(machine, "ns16550 irq=0 addr=0xfe800000");
5001 dpavlin 20 device_add(machine, "ns16550 irq=0 addr=0x900003f8");
5002     device_add(machine, "ns16550 irq=0 addr=0x900002f8");
5003 dpavlin 18
5004     /* 0xa0000000 = physical ram, 0xc0000000 = uncached */
5005     dev_ram_init(machine, 0xa0000000, 0x20000000,
5006     DEV_RAM_MIRROR, 0x0);
5007     dev_ram_init(machine, 0xc0000000, 0x20000000,
5008     DEV_RAM_MIRROR, 0x0);
5009 dpavlin 20 dev_ram_init(machine, 0xf0000000, 0x08000000,
5010     DEV_RAM_MIRROR, 0x0);
5011 dpavlin 18
5012     device_add(machine, "i80321 addr=0xffffe000");
5013    
5014 dpavlin 14 if (machine->prom_emulation) {
5015     arm_setup_initial_translation_table(cpu,
5016     machine->physical_ram_in_mb * 1048576 - 65536);
5017 dpavlin 18 arm_translation_table_set_l1(cpu, 0xa0000000, 0xa0000000);
5018     arm_translation_table_set_l1(cpu, 0xc0000000, 0xa0000000);
5019     arm_translation_table_set_l1_b(cpu, 0xff000000, 0xff000000);
5020 dpavlin 14 }
5021     break;
5022 dpavlin 12 #endif /* ENABLE_ARM */
5023 dpavlin 6
5024 dpavlin 14 #ifdef ENABLE_AVR
5025     case MACHINE_BAREAVR:
5026     /* A bare Atmel AVR machine, with no devices. */
5027     machine->machine_name = "\"Bare\" Atmel AVR machine";
5028     break;
5029     #endif /* ENABLE_AVR */
5030    
5031 dpavlin 12 #ifdef ENABLE_IA64
5032     case MACHINE_BAREIA64:
5033     machine->machine_name = "\"Bare\" IA64 machine";
5034     break;
5035    
5036     case MACHINE_TESTIA64:
5037     machine->machine_name = "IA64 test machine";
5038    
5039     snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
5040     (long long)DEV_CONS_ADDRESS);
5041     cons_data = device_add(machine, tmpstr);
5042     machine->main_console_handle = cons_data->console_handle;
5043    
5044     snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
5045     (long long)DEV_MP_ADDRESS);
5046     device_add(machine, tmpstr);
5047    
5048     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
5049     640,480, 640,480, 24, "testia64 generic");
5050    
5051     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
5052     (long long)DEV_DISK_ADDRESS);
5053     device_add(machine, tmpstr);
5054    
5055     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
5056     (long long)DEV_ETHER_ADDRESS);
5057     device_add(machine, tmpstr);
5058    
5059     break;
5060     #endif /* ENABLE_IA64 */
5061    
5062     #ifdef ENABLE_M68K
5063     case MACHINE_BAREM68K:
5064     machine->machine_name = "\"Bare\" M68K machine";
5065     break;
5066    
5067     case MACHINE_TESTM68K:
5068     machine->machine_name = "M68K test machine";
5069    
5070     snprintf(tmpstr, sizeof(tmpstr), "cons addr=0x%llx irq=0",
5071     (long long)DEV_CONS_ADDRESS);
5072     cons_data = device_add(machine, tmpstr);
5073     machine->main_console_handle = cons_data->console_handle;
5074    
5075     snprintf(tmpstr, sizeof(tmpstr), "mp addr=0x%llx",
5076     (long long)DEV_MP_ADDRESS);
5077     device_add(machine, tmpstr);
5078    
5079     fb = dev_fb_init(machine, mem, DEV_FB_ADDRESS, VFB_GENERIC,
5080     640,480, 640,480, 24, "testm68k generic");
5081    
5082     snprintf(tmpstr, sizeof(tmpstr), "disk addr=0x%llx",
5083     (long long)DEV_DISK_ADDRESS);
5084     device_add(machine, tmpstr);
5085    
5086     snprintf(tmpstr, sizeof(tmpstr), "ether addr=0x%llx irq=0",
5087     (long long)DEV_ETHER_ADDRESS);
5088     device_add(machine, tmpstr);
5089    
5090     break;
5091     #endif /* ENABLE_M68K */
5092    
5093     #ifdef ENABLE_X86
5094 dpavlin 4 case MACHINE_BAREX86:
5095     machine->machine_name = "\"Bare\" x86 machine";
5096     break;
5097    
5098     case MACHINE_X86:
5099 dpavlin 6 if (machine->machine_subtype == MACHINE_X86_XT)
5100     machine->machine_name = "PC XT";
5101     else
5102     machine->machine_name = "Generic x86 PC";
5103 dpavlin 4
5104 dpavlin 6 machine->md_interrupt = x86_pc_interrupt;
5105    
5106 dpavlin 20 bus_isa(machine, BUS_ISA_IDE0 | BUS_ISA_IDE1 | BUS_ISA_VGA |
5107     BUS_ISA_PCKBC_FORCE_USE |
5108     (machine->machine_subtype == MACHINE_X86_XT?
5109     BUS_ISA_NO_SECOND_PIC : 0) | BUS_ISA_FDC,
5110     X86_IO_BASE, 0x00000000, 0, 16);
5111 dpavlin 6
5112     if (machine->prom_emulation)
5113     pc_bios_init(cpu);
5114 dpavlin 4
5115 dpavlin 6 if (!machine->use_x11 && !quiet_mode)
5116     fprintf(stderr, "-------------------------------------"
5117     "------------------------------------------\n"
5118     "\n WARNING! You are emulating a PC without -X. "
5119     "You will miss graphical output!\n\n"
5120     "-------------------------------------"
5121     "------------------------------------------\n");
5122 dpavlin 4 break;
5123 dpavlin 12 #endif /* ENABLE_X86 */
5124 dpavlin 4
5125 dpavlin 2 default:
5126     fatal("Unknown emulation type %i\n", machine->machine_type);
5127     exit(1);
5128     }
5129    
5130     if (machine->machine_name != NULL)
5131     debug("machine: %s", machine->machine_name);
5132    
5133     if (machine->emulated_hz > 0)
5134     debug(" (%.2f MHz)", (float)machine->emulated_hz / 1000000);
5135     debug("\n");
5136    
5137 dpavlin 20 /* Default fake speed: 5 MHz */
5138 dpavlin 2 if (machine->emulated_hz < 1)
5139 dpavlin 20 machine->emulated_hz = 5000000;
5140 dpavlin 2
5141     if (bootstr != NULL) {
5142     debug("bootstring%s: %s", (bootarg!=NULL &&
5143     strlen(bootarg) >= 1)? "(+bootarg)" : "", bootstr);
5144     if (bootarg != NULL && strlen(bootarg) >= 1)
5145     debug(" %s", bootarg);
5146     debug("\n");
5147     }
5148     }
5149    
5150    
5151     /*
5152     * machine_memsize_fix():
5153     *
5154     * Sets physical_ram_in_mb (if not already set), and memory_offset_in_mb,
5155     * depending on machine type.
5156     */
5157     void machine_memsize_fix(struct machine *m)
5158     {
5159     if (m == NULL) {
5160     fatal("machine_defaultmemsize(): m == NULL?\n");
5161     exit(1);
5162     }
5163    
5164     if (m->physical_ram_in_mb == 0) {
5165     switch (m->machine_type) {
5166     case MACHINE_PS2:
5167     m->physical_ram_in_mb = 32;
5168     break;
5169     case MACHINE_SGI:
5170     m->physical_ram_in_mb = 64;
5171     break;
5172     case MACHINE_HPCMIPS:
5173     /* Most have 32 MB by default. */
5174     m->physical_ram_in_mb = 32;
5175     switch (m->machine_subtype) {
5176     case MACHINE_HPCMIPS_CASIO_BE300:
5177     m->physical_ram_in_mb = 16;
5178     break;
5179     case MACHINE_HPCMIPS_CASIO_E105:
5180     m->physical_ram_in_mb = 32;
5181     break;
5182     case MACHINE_HPCMIPS_AGENDA_VR3:
5183     m->physical_ram_in_mb = 16;
5184     break;
5185     }
5186     break;
5187     case MACHINE_MESHCUBE:
5188     m->physical_ram_in_mb = 64;
5189     break;
5190     case MACHINE_NETGEAR:
5191     m->physical_ram_in_mb = 16;
5192     break;
5193 dpavlin 10 case MACHINE_EVBMIPS:
5194     m->physical_ram_in_mb = 64;
5195     break;
5196     case MACHINE_PSP:
5197     /*
5198     * According to
5199     * http://wiki.ps2dev.org/psp:memory_map:
5200     * 0×08000000 = 8 MB kernel memory
5201     * 0×08800000 = 24 MB user memory
5202     */
5203     m->physical_ram_in_mb = 8 + 24;
5204     break;
5205 dpavlin 2 case MACHINE_ARC:
5206     switch (m->machine_subtype) {
5207     case MACHINE_ARC_JAZZ_PICA:
5208     m->physical_ram_in_mb = 64;
5209     break;
5210     case MACHINE_ARC_JAZZ_M700:
5211     m->physical_ram_in_mb = 64;
5212     break;
5213     default:
5214     m->physical_ram_in_mb = 32;
5215     }
5216     break;
5217     case MACHINE_DEC:
5218     switch (m->machine_subtype) {
5219     case MACHINE_DEC_PMAX_3100:
5220     m->physical_ram_in_mb = 24;
5221     break;
5222     default:
5223     m->physical_ram_in_mb = 32;
5224     }
5225     break;
5226 dpavlin 12 case MACHINE_ALPHA:
5227 dpavlin 2 case MACHINE_BEBOX:
5228 dpavlin 20 case MACHINE_PREP:
5229 dpavlin 14 case MACHINE_CATS:
5230     case MACHINE_ZAURUS:
5231     m->physical_ram_in_mb = 64;
5232     break;
5233     case MACHINE_HPCARM:
5234     m->physical_ram_in_mb = 32;
5235     break;
5236     case MACHINE_NETWINDER:
5237     m->physical_ram_in_mb = 16;
5238     break;
5239 dpavlin 6 case MACHINE_X86:
5240     if (m->machine_subtype == MACHINE_X86_XT)
5241     m->physical_ram_in_mb = 1;
5242     break;
5243 dpavlin 2 }
5244     }
5245    
5246 dpavlin 6 /* Special hack for hpcmips machines: */
5247     if (m->machine_type == MACHINE_HPCMIPS) {
5248 dpavlin 2 m->dbe_on_nonexistant_memaccess = 0;
5249     }
5250    
5251     /* Special SGI memory offsets: */
5252     if (m->machine_type == MACHINE_SGI) {
5253     switch (m->machine_subtype) {
5254     case 20:
5255     case 22:
5256     case 24:
5257     case 26:
5258     m->memory_offset_in_mb = 128;
5259     break;
5260     case 28:
5261     case 30:
5262     m->memory_offset_in_mb = 512;
5263     break;
5264     }
5265     }
5266    
5267     if (m->physical_ram_in_mb == 0)
5268     m->physical_ram_in_mb = DEFAULT_RAM_IN_MB;
5269     }
5270    
5271    
5272     /*
5273     * machine_default_cputype():
5274     *
5275     * Sets m->cpu_name, if it isn't already set, depending on the machine
5276     * type.
5277     */
5278     void machine_default_cputype(struct machine *m)
5279     {
5280     if (m == NULL) {
5281     fatal("machine_default_cputype(): m == NULL?\n");
5282     exit(1);
5283     }
5284    
5285     if (m->cpu_name != NULL)
5286     return;
5287    
5288     switch (m->machine_type) {
5289     case MACHINE_BAREMIPS:
5290     case MACHINE_TESTMIPS:
5291     m->cpu_name = strdup("R4000");
5292     break;
5293     case MACHINE_PS2:
5294     m->cpu_name = strdup("R5900");
5295     break;
5296     case MACHINE_DEC:
5297     if (m->machine_subtype > 2)
5298     m->cpu_name = strdup("R3000A");
5299     if (m->machine_subtype > 1 && m->cpu_name == NULL)
5300     m->cpu_name = strdup("R3000");
5301     if (m->cpu_name == NULL)
5302     m->cpu_name = strdup("R2000");
5303     break;
5304     case MACHINE_SONYNEWS:
5305     m->cpu_name = strdup("R3000");
5306     break;
5307     case MACHINE_HPCMIPS:
5308     switch (m->machine_subtype) {
5309     case MACHINE_HPCMIPS_CASIO_BE300:
5310     m->cpu_name = strdup("VR4131");
5311     break;
5312     case MACHINE_HPCMIPS_CASIO_E105:
5313     m->cpu_name = strdup("VR4121");
5314     break;
5315     case MACHINE_HPCMIPS_NEC_MOBILEPRO_770:
5316     case MACHINE_HPCMIPS_NEC_MOBILEPRO_780:
5317     case MACHINE_HPCMIPS_NEC_MOBILEPRO_800:
5318     case MACHINE_HPCMIPS_NEC_MOBILEPRO_880:
5319     m->cpu_name = strdup("VR4121");
5320     break;
5321     case MACHINE_HPCMIPS_AGENDA_VR3:
5322     m->cpu_name = strdup("VR4181");
5323     break;
5324     case MACHINE_HPCMIPS_IBM_WORKPAD_Z50:
5325     m->cpu_name = strdup("VR4121");
5326     break;
5327     default:
5328     printf("Unimplemented HPCMIPS model?\n");
5329     exit(1);
5330     }
5331     break;
5332     case MACHINE_COBALT:
5333     m->cpu_name = strdup("RM5200");
5334     break;
5335     case MACHINE_MESHCUBE:
5336     m->cpu_name = strdup("R4400");
5337     /* TODO: Should be AU1500, but Linux doesn't like
5338     the absence of caches in the emulator */
5339     break;
5340     case MACHINE_NETGEAR:
5341     m->cpu_name = strdup("RC32334");
5342     break;
5343     case MACHINE_ARC:
5344     switch (m->machine_subtype) {
5345     case MACHINE_ARC_JAZZ_PICA:
5346     m->cpu_name = strdup("R4000");
5347     break;
5348     default:
5349     m->cpu_name = strdup("R4400");
5350     }
5351     break;
5352     case MACHINE_SGI:
5353     if (m->machine_subtype <= 12)
5354     m->cpu_name = strdup("R3000");
5355     if (m->cpu_name == NULL && m->machine_subtype == 35)
5356     m->cpu_name = strdup("R12000");
5357     if (m->cpu_name == NULL && (m->machine_subtype == 25 ||
5358     m->machine_subtype == 27 ||
5359     m->machine_subtype == 28 ||
5360     m->machine_subtype == 30 ||
5361     m->machine_subtype == 32))
5362     m->cpu_name = strdup("R10000");
5363     if (m->cpu_name == NULL && (m->machine_subtype == 21 ||
5364     m->machine_subtype == 26))
5365     m->cpu_name = strdup("R8000");
5366     if (m->cpu_name == NULL && m->machine_subtype == 24)
5367     m->cpu_name = strdup("R5000");
5368    
5369     /* Other SGIs should probably work with
5370     R4000, R4400 or R5000 or similar: */
5371     if (m->cpu_name == NULL)
5372     m->cpu_name = strdup("R4400");
5373     break;
5374 dpavlin 10 case MACHINE_EVBMIPS:
5375     switch (m->machine_subtype) {
5376     case MACHINE_EVBMIPS_MALTA:
5377 dpavlin 12 case MACHINE_EVBMIPS_MALTA_BE:
5378 dpavlin 10 m->cpu_name = strdup("5Kc");
5379     break;
5380     case MACHINE_EVBMIPS_PB1000:
5381     m->cpu_name = strdup("AU1000");
5382     break;
5383     default:fatal("Unimpl. evbmips.\n");
5384     exit(1);
5385     }
5386     break;
5387     case MACHINE_PSP:
5388     m->cpu_name = strdup("Allegrex");
5389     break;
5390 dpavlin 20 case MACHINE_ALGOR:
5391     m->cpu_name = strdup("RM5200");
5392     break;
5393 dpavlin 2
5394     /* PowerPC: */
5395     case MACHINE_BAREPPC:
5396     case MACHINE_TESTPPC:
5397     m->cpu_name = strdup("PPC970");
5398     break;
5399     case MACHINE_WALNUT:
5400     /* For NetBSD/evbppc. */
5401     m->cpu_name = strdup("PPC405GP");
5402     break;
5403     case MACHINE_PMPPC:
5404     /* For NetBSD/pmppc. */
5405     m->cpu_name = strdup("PPC750");
5406     break;
5407     case MACHINE_SANDPOINT:
5408     /*
5409     * For NetBSD/sandpoint. According to NetBSD's page:
5410     *
5411     * "Unity" module has an MPC8240.
5412     * "Altimus" module has an MPC7400 (G4) or an MPC107.
5413     */
5414     m->cpu_name = strdup("MPC7400");
5415     break;
5416     case MACHINE_BEBOX:
5417     /* For NetBSD/bebox. Dual 133 MHz 603e CPUs, for example. */
5418     m->cpu_name = strdup("PPC603e");
5419     break;
5420     case MACHINE_PREP:
5421 dpavlin 20 /* For NetBSD/prep. TODO: Differs between models! */
5422     m->cpu_name = strdup("PPC604");
5423 dpavlin 2 break;
5424     case MACHINE_MACPPC:
5425     switch (m->machine_subtype) {
5426     case MACHINE_MACPPC_G4:
5427 dpavlin 14 m->cpu_name = strdup("PPC750");
5428 dpavlin 2 break;
5429     case MACHINE_MACPPC_G5:
5430     m->cpu_name = strdup("PPC970");
5431     break;
5432     }
5433     break;
5434     case MACHINE_DB64360:
5435     m->cpu_name = strdup("PPC750");
5436     break;
5437    
5438 dpavlin 14 /* SH: */
5439     case MACHINE_BARESH:
5440     case MACHINE_TESTSH:
5441     case MACHINE_HPCSH:
5442     m->cpu_name = strdup("SH");
5443     break;
5444    
5445     /* HPPA: */
5446     case MACHINE_BAREHPPA:
5447     case MACHINE_TESTHPPA:
5448     m->cpu_name = strdup("HPPA");
5449     break;
5450    
5451     /* i960: */
5452     case MACHINE_BAREI960:
5453     case MACHINE_TESTI960:
5454     m->cpu_name = strdup("i960");
5455     break;
5456    
5457 dpavlin 2 /* SPARC: */
5458     case MACHINE_BARESPARC:
5459 dpavlin 12 case MACHINE_TESTSPARC:
5460 dpavlin 2 case MACHINE_ULTRA1:
5461 dpavlin 12 m->cpu_name = strdup("SPARCv9");
5462 dpavlin 2 break;
5463    
5464     /* Alpha: */
5465     case MACHINE_BAREALPHA:
5466     case MACHINE_TESTALPHA:
5467 dpavlin 12 case MACHINE_ALPHA:
5468     m->cpu_name = strdup("Alpha");
5469 dpavlin 2 break;
5470 dpavlin 4
5471 dpavlin 6 /* ARM: */
5472     case MACHINE_BAREARM:
5473     case MACHINE_TESTARM:
5474 dpavlin 14 case MACHINE_HPCARM:
5475     m->cpu_name = strdup("SA1110");
5476 dpavlin 6 break;
5477 dpavlin 14 case MACHINE_IQ80321:
5478     case MACHINE_IYONIX:
5479     m->cpu_name = strdup("80321_600_B0");
5480     break;
5481     case MACHINE_CATS:
5482     case MACHINE_NETWINDER:
5483     case MACHINE_SHARK:
5484     m->cpu_name = strdup("SA110");
5485     break;
5486     case MACHINE_ZAURUS:
5487     m->cpu_name = strdup("PXA210");
5488     break;
5489 dpavlin 6
5490 dpavlin 14 /* AVR: */
5491     case MACHINE_BAREAVR:
5492     m->cpu_name = strdup("AVR");
5493     break;
5494    
5495 dpavlin 12 /* IA64: */
5496     case MACHINE_BAREIA64:
5497     case MACHINE_TESTIA64:
5498     m->cpu_name = strdup("IA64");
5499     break;
5500    
5501     /* M68K: */
5502     case MACHINE_BAREM68K:
5503     case MACHINE_TESTM68K:
5504     m->cpu_name = strdup("68020");
5505     break;
5506    
5507 dpavlin 4 /* x86: */
5508     case MACHINE_BAREX86:
5509     case MACHINE_X86:
5510 dpavlin 6 if (m->machine_subtype == MACHINE_X86_XT)
5511     m->cpu_name = strdup("8086");
5512     else
5513     m->cpu_name = strdup("AMD64");
5514 dpavlin 4 break;
5515 dpavlin 2 }
5516    
5517     if (m->cpu_name == NULL) {
5518     fprintf(stderr, "machine_default_cputype(): no default"
5519     " cpu for machine type %i subtype %i\n",
5520     m->machine_type, m->machine_subtype);
5521     exit(1);
5522     }
5523     }
5524    
5525    
5526     /*
5527     * machine_dumpinfo():
5528     *
5529     * Dumps info about a machine in some kind of readable format. (Used by
5530     * the 'machine' debugger command.)
5531     */
5532     void machine_dumpinfo(struct machine *m)
5533     {
5534     int i;
5535    
5536     debug("serial nr: %i", m->serial_nr);
5537     if (m->nr_of_nics > 0)
5538     debug(" (nr of nics: %i)", m->nr_of_nics);
5539     debug("\n");
5540    
5541     debug("memory: %i MB", m->physical_ram_in_mb);
5542     if (m->memory_offset_in_mb != 0)
5543     debug(" (offset by %i MB)", m->memory_offset_in_mb);
5544     if (m->random_mem_contents)
5545     debug(", randomized contents");
5546     if (m->dbe_on_nonexistant_memaccess)
5547     debug(", dbe_on_nonexistant_memaccess");
5548     debug("\n");
5549    
5550     if (m->single_step_on_bad_addr)
5551     debug("single-step on bad addresses\n");
5552    
5553 dpavlin 12 if (m->arch == ARCH_MIPS) {
5554     if (m->bintrans_enable)
5555     debug("bintrans enabled (%i MB cache)\n",
5556     (int) (m->bintrans_size / 1048576));
5557     else
5558     debug("bintrans disabled, other speedtricks %s\n",
5559     m->speed_tricks? "enabled" : "disabled");
5560     }
5561 dpavlin 2
5562     debug("clock: ");
5563     if (m->automatic_clock_adjustment)
5564     debug("adjusted automatically");
5565     else
5566     debug("fixed at %i Hz", m->emulated_hz);
5567     debug("\n");
5568    
5569     if (!m->prom_emulation)
5570     debug("PROM emulation disabled\n");
5571    
5572     for (i=0; i<m->ncpus; i++)
5573     cpu_dumpinfo(m, m->cpus[i]);
5574    
5575     if (m->ncpus > 1)
5576     debug("Bootstrap cpu is nr %i\n", m->bootstrap_cpu);
5577    
5578     if (m->slow_serial_interrupts_hack_for_linux)
5579     debug("Using slow_serial_interrupts_hack_for_linux\n");
5580    
5581     if (m->use_x11) {
5582     debug("Using X11");
5583     if (m->x11_scaledown > 1)
5584     debug(", scaledown %i", m->x11_scaledown);
5585 dpavlin 20 if (m->x11_scaleup > 1)
5586     debug(", scaleup %i", m->x11_scaleup);
5587 dpavlin 2 if (m->x11_n_display_names > 0) {
5588     for (i=0; i<m->x11_n_display_names; i++) {
5589     debug(i? ", " : " (");
5590     debug("\"%s\"", m->x11_display_names[i]);
5591     }
5592     debug(")");
5593     }
5594     debug("\n");
5595     }
5596    
5597     diskimage_dump_info(m);
5598    
5599     if (m->force_netboot)
5600     debug("Forced netboot\n");
5601     }
5602    
5603    
5604     /*
5605     * machine_entry_new():
5606     *
5607     * This function creates a new machine_entry struct, and fills it with some
5608     * valid data; it is up to the caller to add additional data that weren't
5609     * passed as arguments to this function.
5610     *
5611     * For internal use.
5612     */
5613     static struct machine_entry *machine_entry_new(const char *name,
5614     int arch, int oldstyle_type, int n_aliases, int n_subtypes)
5615     {
5616     struct machine_entry *me;
5617    
5618     me = malloc(sizeof(struct machine_entry));
5619     if (me == NULL) {
5620     fprintf(stderr, "machine_entry_new(): out of memory (1)\n");
5621     exit(1);
5622     }
5623    
5624     memset(me, 0, sizeof(struct machine_entry));
5625    
5626     me->name = name;
5627     me->arch = arch;
5628     me->machine_type = oldstyle_type;
5629     me->n_aliases = n_aliases;
5630     me->aliases = malloc(sizeof(char *) * n_aliases);
5631     if (me->aliases == NULL) {
5632     fprintf(stderr, "machine_entry_new(): out of memory (2)\n");
5633     exit(1);
5634     }
5635     me->n_subtypes = n_subtypes;
5636    
5637     if (n_subtypes > 0) {
5638     me->subtype = malloc(sizeof(struct machine_entry_subtype *) *
5639     n_subtypes);
5640     if (me->subtype == NULL) {
5641     fprintf(stderr, "machine_entry_new(): out of "
5642     "memory (3)\n");
5643     exit(1);
5644     }
5645     }
5646    
5647     return me;
5648     }
5649    
5650    
5651     /*
5652     * machine_entry_subtype_new():
5653     *
5654     * This function creates a new machine_entry_subtype struct, and fills it with
5655     * some valid data; it is up to the caller to add additional data that weren't
5656     * passed as arguments to this function.
5657     *
5658     * For internal use.
5659     */
5660     static struct machine_entry_subtype *machine_entry_subtype_new(
5661     const char *name, int oldstyle_type, int n_aliases)
5662     {
5663     struct machine_entry_subtype *mes;
5664    
5665     mes = malloc(sizeof(struct machine_entry_subtype));
5666     if (mes == NULL) {
5667     fprintf(stderr, "machine_entry_subtype_new(): out "
5668     "of memory (1)\n");
5669     exit(1);
5670     }
5671    
5672     memset(mes, 0, sizeof(struct machine_entry_subtype));
5673     mes->name = name;
5674     mes->machine_subtype = oldstyle_type;
5675     mes->n_aliases = n_aliases;
5676     mes->aliases = malloc(sizeof(char *) * n_aliases);
5677     if (mes->aliases == NULL) {
5678     fprintf(stderr, "machine_entry_subtype_new(): "
5679     "out of memory (2)\n");
5680     exit(1);
5681     }
5682    
5683     return mes;
5684     }
5685    
5686    
5687     /*
5688     * machine_list_available_types_and_cpus():
5689     *
5690     * List all available machine types (for example when running the emulator
5691     * with just -H as command line argument).
5692     */
5693     void machine_list_available_types_and_cpus(void)
5694     {
5695     struct machine_entry *me;
5696     int iadd = 8;
5697    
5698     debug("Available CPU types:\n\n");
5699    
5700     debug_indentation(iadd);
5701     cpu_list_available_types();
5702     debug_indentation(-iadd);
5703    
5704     debug("\nMost of the CPU types are bogus, and not really implemented."
5705     " The main effect of\nselecting a specific CPU type is to choose "
5706     "what kind of 'id' it will have.\n\nAvailable machine types (with "
5707     "aliases) and their subtypes:\n\n");
5708    
5709     debug_indentation(iadd);
5710     me = first_machine_entry;
5711    
5712     if (me == NULL)
5713     fatal("No machines defined!\n");
5714    
5715     while (me != NULL) {
5716     int i, j, iadd = 4;
5717    
5718     debug("%s", me->name);
5719     debug(" (");
5720     for (i=0; i<me->n_aliases; i++)
5721     debug("%s\"%s\"", i? ", " : "", me->aliases[i]);
5722     debug(")\n");
5723    
5724     debug_indentation(iadd);
5725     for (i=0; i<me->n_subtypes; i++) {
5726     struct machine_entry_subtype *mes;
5727     mes = me->subtype[i];
5728     debug("- %s", mes->name);
5729     debug(" (");
5730     for (j=0; j<mes->n_aliases; j++)
5731     debug("%s\"%s\"", j? ", " : "",
5732     mes->aliases[j]);
5733     debug(")\n");
5734     }
5735     debug_indentation(-iadd);
5736    
5737     me = me->next;
5738     }
5739     debug_indentation(-iadd);
5740    
5741     debug("\nMost of the machine types are bogus too. Please read the "
5742 dpavlin 20 "GXemul documentation\nfor information about which machine types "
5743     "that actually work. Use the alias\nwhen selecting a machine type "
5744     "or subtype, not the real name.\n");
5745 dpavlin 2
5746     debug("\n");
5747    
5748     useremul_list_emuls();
5749 dpavlin 12 debug("Userland emulation works for programs with the complexity"
5750     " of Hello World,\nbut not much more.\n");
5751 dpavlin 2 }
5752    
5753    
5754     /*
5755     * machine_init():
5756     *
5757     * This function should be called before any other machine_*() function
5758     * is used.
5759     */
5760     void machine_init(void)
5761     {
5762     struct machine_entry *me;
5763    
5764     /*
5765     * NOTE: This list is in reverse order, so that the
5766     * entries will appear in normal order when listed. :-)
5767     */
5768    
5769 dpavlin 14 /* Zaurus: */
5770     me = machine_entry_new("Zaurus (ARM)",
5771     ARCH_ARM, MACHINE_ZAURUS, 1, 0);
5772     me->aliases[0] = "zaurus";
5773     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
5774     me->next = first_machine_entry; first_machine_entry = me;
5775     }
5776    
5777 dpavlin 4 /* X86 machine: */
5778 dpavlin 6 me = machine_entry_new("x86-based PC", ARCH_X86,
5779     MACHINE_X86, 2, 2);
5780 dpavlin 4 me->aliases[0] = "pc";
5781     me->aliases[1] = "x86";
5782 dpavlin 6 me->subtype[0] = machine_entry_subtype_new("Generic PC",
5783 dpavlin 20 MACHINE_X86_GENERIC, 2);
5784     me->subtype[0]->aliases[0] = "pc";
5785     me->subtype[0]->aliases[1] = "generic";
5786 dpavlin 6 me->subtype[1] = machine_entry_subtype_new("PC XT", MACHINE_X86_XT, 1);
5787     me->subtype[1]->aliases[0] = "xt";
5788 dpavlin 4 if (cpu_family_ptr_by_number(ARCH_X86) != NULL) {
5789     me->next = first_machine_entry; first_machine_entry = me;
5790     }
5791    
5792 dpavlin 2 /* Walnut: (NetBSD/evbppc) */
5793     me = machine_entry_new("Walnut evaluation board", ARCH_PPC,
5794     MACHINE_WALNUT, 2, 0);
5795     me->aliases[0] = "walnut";
5796     me->aliases[1] = "evbppc";
5797     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
5798     me->next = first_machine_entry; first_machine_entry = me;
5799     }
5800    
5801 dpavlin 12 /* Test-machine for SPARC: */
5802     me = machine_entry_new("Test-machine for SPARC", ARCH_SPARC,
5803     MACHINE_TESTSPARC, 1, 0);
5804     me->aliases[0] = "testsparc";
5805     if (cpu_family_ptr_by_number(ARCH_SPARC) != NULL) {
5806 dpavlin 2 me->next = first_machine_entry; first_machine_entry = me;
5807     }
5808    
5809 dpavlin 14 /* Test-machine for SH: */
5810     me = machine_entry_new("Test-machine for SH", ARCH_SH,
5811     MACHINE_TESTSH, 1, 0);
5812     me->aliases[0] = "testsh";
5813     if (cpu_family_ptr_by_number(ARCH_SH) != NULL) {
5814     me->next = first_machine_entry; first_machine_entry = me;
5815     }
5816    
5817 dpavlin 2 /* Test-machine for PPC: */
5818     me = machine_entry_new("Test-machine for PPC", ARCH_PPC,
5819     MACHINE_TESTPPC, 1, 0);
5820     me->aliases[0] = "testppc";
5821     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
5822     me->next = first_machine_entry; first_machine_entry = me;
5823     }
5824    
5825     /* Test-machine for MIPS: */
5826     me = machine_entry_new("Test-machine for MIPS", ARCH_MIPS,
5827     MACHINE_TESTMIPS, 1, 0);
5828     me->aliases[0] = "testmips";
5829     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5830     me->next = first_machine_entry; first_machine_entry = me;
5831     }
5832    
5833 dpavlin 12 /* Test-machine for M68K: */
5834     me = machine_entry_new("Test-machine for M68K", ARCH_M68K,
5835     MACHINE_TESTM68K, 1, 0);
5836     me->aliases[0] = "testm68k";
5837     if (cpu_family_ptr_by_number(ARCH_M68K) != NULL) {
5838 dpavlin 2 me->next = first_machine_entry; first_machine_entry = me;
5839     }
5840    
5841 dpavlin 12 /* Test-machine for IA64: */
5842     me = machine_entry_new("Test-machine for IA64", ARCH_IA64,
5843     MACHINE_TESTIA64, 1, 0);
5844     me->aliases[0] = "testia64";
5845     if (cpu_family_ptr_by_number(ARCH_IA64) != NULL) {
5846     me->next = first_machine_entry; first_machine_entry = me;
5847     }
5848    
5849 dpavlin 14 /* Test-machine for i960: */
5850     me = machine_entry_new("Test-machine for i960", ARCH_I960,
5851     MACHINE_TESTI960, 1, 0);
5852     me->aliases[0] = "testi960";
5853     if (cpu_family_ptr_by_number(ARCH_I960) != NULL) {
5854     me->next = first_machine_entry; first_machine_entry = me;
5855     }
5856    
5857     /* Test-machine for HPPA: */
5858     me = machine_entry_new("Test-machine for HPPA", ARCH_HPPA,
5859     MACHINE_TESTHPPA, 1, 0);
5860     me->aliases[0] = "testhppa";
5861     if (cpu_family_ptr_by_number(ARCH_HPPA) != NULL) {
5862     me->next = first_machine_entry; first_machine_entry = me;
5863     }
5864    
5865 dpavlin 6 /* Test-machine for ARM: */
5866     me = machine_entry_new("Test-machine for ARM", ARCH_ARM,
5867     MACHINE_TESTARM, 1, 0);
5868     me->aliases[0] = "testarm";
5869     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
5870     me->next = first_machine_entry; first_machine_entry = me;
5871     }
5872    
5873 dpavlin 2 /* Test-machine for Alpha: */
5874     me = machine_entry_new("Test-machine for Alpha", ARCH_ALPHA,
5875     MACHINE_TESTALPHA, 1, 0);
5876     me->aliases[0] = "testalpha";
5877     if (cpu_family_ptr_by_number(ARCH_ALPHA) != NULL) {
5878     me->next = first_machine_entry; first_machine_entry = me;
5879     }
5880    
5881     /* Sun Ultra1: */
5882     me = machine_entry_new("Sun Ultra1", ARCH_SPARC, MACHINE_ULTRA1, 1, 0);
5883     me->aliases[0] = "ultra1";
5884     if (cpu_family_ptr_by_number(ARCH_SPARC) != NULL) {
5885     me->next = first_machine_entry; first_machine_entry = me;
5886     }
5887    
5888     /* Sony Playstation 2: */
5889     me = machine_entry_new("Sony Playstation 2", ARCH_MIPS,
5890     MACHINE_PS2, 2, 0);
5891     me->aliases[0] = "playstation2";
5892     me->aliases[1] = "ps2";
5893     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5894     me->next = first_machine_entry; first_machine_entry = me;
5895     }
5896    
5897     /* Sony NeWS: */
5898     me = machine_entry_new("Sony NeWS", ARCH_MIPS,
5899     MACHINE_SONYNEWS, 2, 0);
5900     me->aliases[0] = "sonynews";
5901     me->aliases[1] = "news";
5902     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5903     me->next = first_machine_entry; first_machine_entry = me;
5904     }
5905    
5906     /* SGI: */
5907 dpavlin 12 me = machine_entry_new("SGI", ARCH_MIPS, MACHINE_SGI, 2, 10);
5908 dpavlin 2 me->aliases[0] = "silicon graphics";
5909     me->aliases[1] = "sgi";
5910 dpavlin 12 me->subtype[0] = machine_entry_subtype_new("IP12", 12, 1);
5911     me->subtype[0]->aliases[0] = "ip12";
5912     me->subtype[1] = machine_entry_subtype_new("IP19", 19, 1);
5913     me->subtype[1]->aliases[0] = "ip19";
5914     me->subtype[2] = machine_entry_subtype_new("IP20", 20, 1);
5915     me->subtype[2]->aliases[0] = "ip20";
5916     me->subtype[3] = machine_entry_subtype_new("IP22", 22, 2);
5917     me->subtype[3]->aliases[0] = "ip22";
5918     me->subtype[3]->aliases[1] = "indy";
5919     me->subtype[4] = machine_entry_subtype_new("IP24", 24, 1);
5920     me->subtype[4]->aliases[0] = "ip24";
5921     me->subtype[5] = machine_entry_subtype_new("IP27", 27, 3);
5922     me->subtype[5]->aliases[0] = "ip27";
5923     me->subtype[5]->aliases[1] = "origin 200";
5924     me->subtype[5]->aliases[2] = "origin 2000";
5925     me->subtype[6] = machine_entry_subtype_new("IP28", 28, 1);
5926     me->subtype[6]->aliases[0] = "ip28";
5927     me->subtype[7] = machine_entry_subtype_new("IP30", 30, 2);
5928     me->subtype[7]->aliases[0] = "ip30";
5929     me->subtype[7]->aliases[1] = "octane";
5930     me->subtype[8] = machine_entry_subtype_new("IP32", 32, 2);
5931     me->subtype[8]->aliases[0] = "ip32";
5932     me->subtype[8]->aliases[1] = "o2";
5933     me->subtype[9] = machine_entry_subtype_new("IP35", 35, 1);
5934     me->subtype[9]->aliases[0] = "ip35";
5935 dpavlin 2 if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5936     me->next = first_machine_entry; first_machine_entry = me;
5937     }
5938    
5939     /* PReP: (NetBSD/prep etc.) */
5940     me = machine_entry_new("PowerPC Reference Platform", ARCH_PPC,
5941     MACHINE_PREP, 1, 0);
5942     me->aliases[0] = "prep";
5943     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
5944     me->next = first_machine_entry; first_machine_entry = me;
5945     }
5946    
5947 dpavlin 10 /* Playstation Portable: */
5948     me = machine_entry_new("Playstation Portable", ARCH_MIPS,
5949     MACHINE_PSP, 1, 0);
5950     me->aliases[0] = "psp";
5951     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5952     me->next = first_machine_entry; first_machine_entry = me;
5953     }
5954    
5955 dpavlin 14 /* NetWinder: */
5956     me = machine_entry_new("NetWinder", ARCH_ARM, MACHINE_NETWINDER, 1, 0);
5957     me->aliases[0] = "netwinder";
5958     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
5959     me->next = first_machine_entry; first_machine_entry = me;
5960     }
5961    
5962 dpavlin 2 /* NetGear: */
5963 dpavlin 14 me = machine_entry_new("NetGear WG602v1", ARCH_MIPS,
5964 dpavlin 2 MACHINE_NETGEAR, 2, 0);
5965     me->aliases[0] = "netgear";
5966 dpavlin 14 me->aliases[1] = "wg602v1";
5967 dpavlin 2 if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5968     me->next = first_machine_entry; first_machine_entry = me;
5969     }
5970    
5971     /* Motorola Sandpoint: (NetBSD/sandpoint) */
5972     me = machine_entry_new("Motorola Sandpoint",
5973     ARCH_PPC, MACHINE_SANDPOINT, 1, 0);
5974     me->aliases[0] = "sandpoint";
5975     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
5976     me->next = first_machine_entry; first_machine_entry = me;
5977     }
5978    
5979     /* Meshcube: */
5980     me = machine_entry_new("Meshcube", ARCH_MIPS, MACHINE_MESHCUBE, 1, 0);
5981     me->aliases[0] = "meshcube";
5982     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
5983     me->next = first_machine_entry; first_machine_entry = me;
5984     }
5985    
5986     /* Macintosh (PPC): */
5987     me = machine_entry_new("Macintosh (PPC)", ARCH_PPC,
5988     MACHINE_MACPPC, 1, 2);
5989     me->aliases[0] = "macppc";
5990     me->subtype[0] = machine_entry_subtype_new("MacPPC G4",
5991     MACHINE_MACPPC_G4, 1);
5992     me->subtype[0]->aliases[0] = "g4";
5993     me->subtype[1] = machine_entry_subtype_new("MacPPC G5",
5994     MACHINE_MACPPC_G5, 1);
5995     me->subtype[1]->aliases[0] = "g5";
5996     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
5997     me->next = first_machine_entry; first_machine_entry = me;
5998     }
5999    
6000 dpavlin 14 /* Iyonix: */
6001     me = machine_entry_new("Iyonix", ARCH_ARM,
6002     MACHINE_IYONIX, 1, 0);
6003     me->aliases[0] = "iyonix";
6004     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
6005     me->next = first_machine_entry; first_machine_entry = me;
6006     }
6007    
6008     /* Intel IQ80321 (ARM): */
6009     me = machine_entry_new("Intel IQ80321 (ARM)", ARCH_ARM,
6010     MACHINE_IQ80321, 1, 0);
6011     me->aliases[0] = "iq80321";
6012     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
6013     me->next = first_machine_entry; first_machine_entry = me;
6014     }
6015    
6016     /* HPCarm: */
6017     me = machine_entry_new("Handheld SH (HPCsh)",
6018     ARCH_SH, MACHINE_HPCSH, 1, 2);
6019     me->aliases[0] = "hpcsh";
6020     me->subtype[0] = machine_entry_subtype_new("Jornada 680",
6021     MACHINE_HPCSH_JORNADA680, 1);
6022     me->subtype[0]->aliases[0] = "jornada680";
6023     me->subtype[1] = machine_entry_subtype_new(
6024     "Jornada 690", MACHINE_HPCSH_JORNADA690, 1);
6025     me->subtype[1]->aliases[0] = "jornada690";
6026     if (cpu_family_ptr_by_number(ARCH_SH) != NULL) {
6027     me->next = first_machine_entry; first_machine_entry = me;
6028     }
6029    
6030 dpavlin 2 /* HPCmips: */
6031 dpavlin 12 me = machine_entry_new("Handheld MIPS (HPCmips)",
6032     ARCH_MIPS, MACHINE_HPCMIPS, 1, 8);
6033 dpavlin 2 me->aliases[0] = "hpcmips";
6034     me->subtype[0] = machine_entry_subtype_new(
6035     "Casio Cassiopeia BE-300", MACHINE_HPCMIPS_CASIO_BE300, 2);
6036     me->subtype[0]->aliases[0] = "be-300";
6037     me->subtype[0]->aliases[1] = "be300";
6038     me->subtype[1] = machine_entry_subtype_new(
6039     "Casio Cassiopeia E-105", MACHINE_HPCMIPS_CASIO_E105, 2);
6040     me->subtype[1]->aliases[0] = "e-105";
6041     me->subtype[1]->aliases[1] = "e105";
6042     me->subtype[2] = machine_entry_subtype_new(
6043     "Agenda VR3", MACHINE_HPCMIPS_AGENDA_VR3, 2);
6044     me->subtype[2]->aliases[0] = "agenda";
6045     me->subtype[2]->aliases[1] = "vr3";
6046     me->subtype[3] = machine_entry_subtype_new(
6047     "IBM WorkPad Z50", MACHINE_HPCMIPS_IBM_WORKPAD_Z50, 2);
6048     me->subtype[3]->aliases[0] = "workpad";
6049     me->subtype[3]->aliases[1] = "z50";
6050     me->subtype[4] = machine_entry_subtype_new(
6051     "NEC MobilePro 770", MACHINE_HPCMIPS_NEC_MOBILEPRO_770, 1);
6052     me->subtype[4]->aliases[0] = "mobilepro770";
6053     me->subtype[5] = machine_entry_subtype_new(
6054     "NEC MobilePro 780", MACHINE_HPCMIPS_NEC_MOBILEPRO_780, 1);
6055     me->subtype[5]->aliases[0] = "mobilepro780";
6056     me->subtype[6] = machine_entry_subtype_new(
6057     "NEC MobilePro 800", MACHINE_HPCMIPS_NEC_MOBILEPRO_800, 1);
6058     me->subtype[6]->aliases[0] = "mobilepro800";
6059     me->subtype[7] = machine_entry_subtype_new(
6060     "NEC MobilePro 880", MACHINE_HPCMIPS_NEC_MOBILEPRO_880, 1);
6061     me->subtype[7]->aliases[0] = "mobilepro880";
6062     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6063     me->next = first_machine_entry; first_machine_entry = me;
6064     }
6065    
6066 dpavlin 14 /* HPCarm: */
6067     me = machine_entry_new("Handheld ARM (HPCarm)",
6068     ARCH_ARM, MACHINE_HPCARM, 1, 2);
6069     me->aliases[0] = "hpcarm";
6070     me->subtype[0] = machine_entry_subtype_new("Ipaq",
6071     MACHINE_HPCARM_IPAQ, 1);
6072     me->subtype[0]->aliases[0] = "ipaq";
6073     me->subtype[1] = machine_entry_subtype_new(
6074     "Jornada 720", MACHINE_HPCARM_JORNADA720, 1);
6075     me->subtype[1]->aliases[0] = "jornada720";
6076     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
6077     me->next = first_machine_entry; first_machine_entry = me;
6078     }
6079    
6080 dpavlin 4 /* Generic "bare" X86 machine: */
6081     me = machine_entry_new("Generic \"bare\" X86 machine", ARCH_X86,
6082     MACHINE_BAREX86, 1, 0);
6083     me->aliases[0] = "barex86";
6084     if (cpu_family_ptr_by_number(ARCH_X86) != NULL) {
6085     me->next = first_machine_entry; first_machine_entry = me;
6086     }
6087    
6088 dpavlin 2 /* Generic "bare" SPARC machine: */
6089     me = machine_entry_new("Generic \"bare\" SPARC machine", ARCH_SPARC,
6090     MACHINE_BARESPARC, 1, 0);
6091     me->aliases[0] = "baresparc";
6092     if (cpu_family_ptr_by_number(ARCH_SPARC) != NULL) {
6093     me->next = first_machine_entry; first_machine_entry = me;
6094     }
6095    
6096 dpavlin 14 /* Generic "bare" SH machine: */
6097     me = machine_entry_new("Generic \"bare\" SH machine", ARCH_SH,
6098     MACHINE_BARESH, 1, 0);
6099     me->aliases[0] = "baresh";
6100     if (cpu_family_ptr_by_number(ARCH_SH) != NULL) {
6101     me->next = first_machine_entry; first_machine_entry = me;
6102     }
6103    
6104 dpavlin 2 /* Generic "bare" PPC machine: */
6105     me = machine_entry_new("Generic \"bare\" PPC machine", ARCH_PPC,
6106     MACHINE_BAREPPC, 1, 0);
6107     me->aliases[0] = "bareppc";
6108     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
6109     me->next = first_machine_entry; first_machine_entry = me;
6110     }
6111    
6112     /* Generic "bare" MIPS machine: */
6113     me = machine_entry_new("Generic \"bare\" MIPS machine", ARCH_MIPS,
6114     MACHINE_BAREMIPS, 1, 0);
6115     me->aliases[0] = "baremips";
6116     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6117     me->next = first_machine_entry; first_machine_entry = me;
6118     }
6119    
6120 dpavlin 12 /* Generic "bare" M68K machine: */
6121     me = machine_entry_new("Generic \"bare\" M68K machine", ARCH_M68K,
6122     MACHINE_BAREM68K, 1, 0);
6123     me->aliases[0] = "barem68k";
6124     if (cpu_family_ptr_by_number(ARCH_M68K) != NULL) {
6125 dpavlin 2 me->next = first_machine_entry; first_machine_entry = me;
6126     }
6127    
6128 dpavlin 12 /* Generic "bare" IA64 machine: */
6129     me = machine_entry_new("Generic \"bare\" IA64 machine", ARCH_IA64,
6130     MACHINE_BAREIA64, 1, 0);
6131     me->aliases[0] = "bareia64";
6132     if (cpu_family_ptr_by_number(ARCH_IA64) != NULL) {
6133     me->next = first_machine_entry; first_machine_entry = me;
6134     }
6135    
6136 dpavlin 14 /* Generic "bare" i960 machine: */
6137     me = machine_entry_new("Generic \"bare\" i960 machine", ARCH_I960,
6138     MACHINE_BAREI960, 1, 0);
6139     me->aliases[0] = "barei960";
6140     if (cpu_family_ptr_by_number(ARCH_I960) != NULL) {
6141     me->next = first_machine_entry; first_machine_entry = me;
6142     }
6143    
6144     /* Generic "bare" HPPA machine: */
6145     me = machine_entry_new("Generic \"bare\" HPPA machine", ARCH_HPPA,
6146     MACHINE_BAREHPPA, 1, 0);
6147     me->aliases[0] = "barehppa";
6148     if (cpu_family_ptr_by_number(ARCH_HPPA) != NULL) {
6149     me->next = first_machine_entry; first_machine_entry = me;
6150     }
6151    
6152     /* Generic "bare" Atmel AVR machine: */
6153     me = machine_entry_new("Generic \"bare\" Atmel AVR machine", ARCH_AVR,
6154     MACHINE_BAREAVR, 1, 0);
6155     me->aliases[0] = "bareavr";
6156     if (cpu_family_ptr_by_number(ARCH_AVR) != NULL) {
6157     me->next = first_machine_entry; first_machine_entry = me;
6158     }
6159    
6160 dpavlin 6 /* Generic "bare" ARM machine: */
6161     me = machine_entry_new("Generic \"bare\" ARM machine", ARCH_ARM,
6162     MACHINE_BAREARM, 1, 0);
6163     me->aliases[0] = "barearm";
6164     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
6165     me->next = first_machine_entry; first_machine_entry = me;
6166     }
6167    
6168 dpavlin 2 /* Generic "bare" Alpha machine: */
6169     me = machine_entry_new("Generic \"bare\" Alpha machine", ARCH_ALPHA,
6170     MACHINE_BAREALPHA, 1, 0);
6171     me->aliases[0] = "barealpha";
6172     if (cpu_family_ptr_by_number(ARCH_ALPHA) != NULL) {
6173     me->next = first_machine_entry; first_machine_entry = me;
6174     }
6175    
6176 dpavlin 12 /* Evaluation Boards (MALTA etc): */
6177     me = machine_entry_new("Evaluation boards (evbmips)", ARCH_MIPS,
6178     MACHINE_EVBMIPS, 1, 3);
6179     me->aliases[0] = "evbmips";
6180     me->subtype[0] = machine_entry_subtype_new("Malta",
6181     MACHINE_EVBMIPS_MALTA, 1);
6182     me->subtype[0]->aliases[0] = "malta";
6183     me->subtype[1] = machine_entry_subtype_new("Malta (Big-Endian)",
6184     MACHINE_EVBMIPS_MALTA_BE, 1);
6185     me->subtype[1]->aliases[0] = "maltabe";
6186     me->subtype[2] = machine_entry_subtype_new("PB1000",
6187     MACHINE_EVBMIPS_PB1000, 1);
6188     me->subtype[2]->aliases[0] = "pb1000";
6189     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6190     me->next = first_machine_entry; first_machine_entry = me;
6191     }
6192    
6193 dpavlin 14 /* Digital DNARD ("Shark"): */
6194     me = machine_entry_new("Digital DNARD (\"Shark\")", ARCH_ARM,
6195     MACHINE_SHARK, 2, 0);
6196     me->aliases[0] = "shark";
6197     me->aliases[1] = "dnard";
6198     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
6199     me->next = first_machine_entry; first_machine_entry = me;
6200     }
6201    
6202 dpavlin 2 /* DECstation: */
6203     me = machine_entry_new("DECstation/DECsystem",
6204     ARCH_MIPS, MACHINE_DEC, 3, 9);
6205     me->aliases[0] = "decstation";
6206     me->aliases[1] = "decsystem";
6207     me->aliases[2] = "dec";
6208     me->subtype[0] = machine_entry_subtype_new(
6209     "DECstation 3100 (PMAX)", MACHINE_DEC_PMAX_3100, 3);
6210     me->subtype[0]->aliases[0] = "pmax";
6211     me->subtype[0]->aliases[1] = "3100";
6212     me->subtype[0]->aliases[2] = "2100";
6213    
6214     me->subtype[1] = machine_entry_subtype_new(
6215     "DECstation 5000/200 (3MAX)", MACHINE_DEC_3MAX_5000, 2);
6216     me->subtype[1]->aliases[0] = "3max";
6217     me->subtype[1]->aliases[1] = "5000/200";
6218    
6219     me->subtype[2] = machine_entry_subtype_new(
6220     "DECstation 5000/1xx (3MIN)", MACHINE_DEC_3MIN_5000, 2);
6221     me->subtype[2]->aliases[0] = "3min";
6222     me->subtype[2]->aliases[1] = "5000/1xx";
6223    
6224     me->subtype[3] = machine_entry_subtype_new(
6225     "DECstation 5000 (3MAXPLUS)", MACHINE_DEC_3MAXPLUS_5000, 2);
6226     me->subtype[3]->aliases[0] = "3maxplus";
6227     me->subtype[3]->aliases[1] = "3max+";
6228    
6229     me->subtype[4] = machine_entry_subtype_new(
6230     "DECsystem 58x0", MACHINE_DEC_5800, 2);
6231     me->subtype[4]->aliases[0] = "5800";
6232     me->subtype[4]->aliases[1] = "58x0";
6233    
6234     me->subtype[5] = machine_entry_subtype_new(
6235     "DECsystem 5400", MACHINE_DEC_5400, 1);
6236     me->subtype[5]->aliases[0] = "5400";
6237    
6238     me->subtype[6] = machine_entry_subtype_new(
6239     "DECstation Maxine (5000)", MACHINE_DEC_MAXINE_5000, 1);
6240     me->subtype[6]->aliases[0] = "maxine";
6241    
6242     me->subtype[7] = machine_entry_subtype_new(
6243     "DECsystem 5500", MACHINE_DEC_5500, 1);
6244     me->subtype[7]->aliases[0] = "5500";
6245    
6246     me->subtype[8] = machine_entry_subtype_new(
6247     "DECstation MipsMate (5100)", MACHINE_DEC_MIPSMATE_5100, 2);
6248     me->subtype[8]->aliases[0] = "5100";
6249     me->subtype[8]->aliases[1] = "mipsmate";
6250    
6251     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6252     me->next = first_machine_entry; first_machine_entry = me;
6253     }
6254    
6255     /* DB64360: (for playing with PMON for PPC) */
6256     me = machine_entry_new("DB64360", ARCH_PPC, MACHINE_DB64360, 1, 0);
6257     me->aliases[0] = "db64360";
6258     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
6259     me->next = first_machine_entry; first_machine_entry = me;
6260     }
6261    
6262     /* Cobalt: */
6263     me = machine_entry_new("Cobalt", ARCH_MIPS, MACHINE_COBALT, 1, 0);
6264     me->aliases[0] = "cobalt";
6265     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6266     me->next = first_machine_entry; first_machine_entry = me;
6267     }
6268    
6269 dpavlin 14 /* CATS (ARM) evaluation board: */
6270     me = machine_entry_new("CATS evaluation board (ARM)", ARCH_ARM,
6271     MACHINE_CATS, 1, 0);
6272     me->aliases[0] = "cats";
6273     if (cpu_family_ptr_by_number(ARCH_ARM) != NULL) {
6274     me->next = first_machine_entry; first_machine_entry = me;
6275     }
6276    
6277 dpavlin 2 /* BeBox: (NetBSD/bebox) */
6278     me = machine_entry_new("BeBox", ARCH_PPC, MACHINE_BEBOX, 1, 0);
6279     me->aliases[0] = "bebox";
6280     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
6281     me->next = first_machine_entry; first_machine_entry = me;
6282     }
6283    
6284     /* Artesyn's PM/PPC board: (NetBSD/pmppc) */
6285     me = machine_entry_new("Artesyn's PM/PPC board", ARCH_PPC,
6286     MACHINE_PMPPC, 1, 0);
6287     me->aliases[0] = "pmppc";
6288     if (cpu_family_ptr_by_number(ARCH_PPC) != NULL) {
6289     me->next = first_machine_entry; first_machine_entry = me;
6290     }
6291    
6292     /* ARC: */
6293     me = machine_entry_new("ARC", ARCH_MIPS, MACHINE_ARC, 1, 8);
6294     me->aliases[0] = "arc";
6295    
6296     me->subtype[0] = machine_entry_subtype_new(
6297     "Acer PICA-61", MACHINE_ARC_JAZZ_PICA, 3);
6298     me->subtype[0]->aliases[0] = "pica-61";
6299     me->subtype[0]->aliases[1] = "acer pica";
6300     me->subtype[0]->aliases[2] = "pica";
6301    
6302     me->subtype[1] = machine_entry_subtype_new(
6303     "Deskstation Tyne", MACHINE_ARC_DESKTECH_TYNE, 3);
6304     me->subtype[1]->aliases[0] = "deskstation tyne";
6305     me->subtype[1]->aliases[1] = "desktech";
6306     me->subtype[1]->aliases[2] = "tyne";
6307    
6308     me->subtype[2] = machine_entry_subtype_new(
6309     "Jazz Magnum", MACHINE_ARC_JAZZ_MAGNUM, 2);
6310     me->subtype[2]->aliases[0] = "magnum";
6311     me->subtype[2]->aliases[1] = "jazz magnum";
6312    
6313     me->subtype[3] = machine_entry_subtype_new(
6314     "NEC-R94", MACHINE_ARC_NEC_R94, 2);
6315     me->subtype[3]->aliases[0] = "nec-r94";
6316     me->subtype[3]->aliases[1] = "r94";
6317    
6318     me->subtype[4] = machine_entry_subtype_new(
6319     "NEC-RD94", MACHINE_ARC_NEC_RD94, 2);
6320     me->subtype[4]->aliases[0] = "nec-rd94";
6321     me->subtype[4]->aliases[1] = "rd94";
6322    
6323     me->subtype[5] = machine_entry_subtype_new(
6324     "NEC-R96", MACHINE_ARC_NEC_R96, 2);
6325     me->subtype[5]->aliases[0] = "nec-r96";
6326     me->subtype[5]->aliases[1] = "r96";
6327    
6328     me->subtype[6] = machine_entry_subtype_new(
6329     "NEC-R98", MACHINE_ARC_NEC_R98, 2);
6330     me->subtype[6]->aliases[0] = "nec-r98";
6331     me->subtype[6]->aliases[1] = "r98";
6332    
6333     me->subtype[7] = machine_entry_subtype_new(
6334     "Olivetti M700", MACHINE_ARC_JAZZ_M700, 2);
6335     me->subtype[7]->aliases[0] = "olivetti";
6336     me->subtype[7]->aliases[1] = "m700";
6337    
6338     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6339     me->next = first_machine_entry; first_machine_entry = me;
6340     }
6341 dpavlin 12
6342     /* Alpha: */
6343 dpavlin 14 me = machine_entry_new("Alpha", ARCH_ALPHA, MACHINE_ALPHA, 1, 2);
6344 dpavlin 12 me->aliases[0] = "alpha";
6345     me->subtype[0] = machine_entry_subtype_new(
6346     "DEC 3000/300", ST_DEC_3000_300, 1);
6347     me->subtype[0]->aliases[0] = "3000/300";
6348 dpavlin 14 me->subtype[1] = machine_entry_subtype_new(
6349     "EB164", ST_EB164, 1);
6350     me->subtype[1]->aliases[0] = "eb164";
6351 dpavlin 12 if (cpu_family_ptr_by_number(ARCH_ALPHA) != NULL) {
6352     me->next = first_machine_entry; first_machine_entry = me;
6353     }
6354 dpavlin 20
6355     /* Algor evaluation board: */
6356     me = machine_entry_new("Algor", ARCH_MIPS, MACHINE_ALGOR, 1, 2);
6357     me->aliases[0] = "algor";
6358     me->subtype[0] = machine_entry_subtype_new("P4032",
6359     MACHINE_ALGOR_P4032, 1);
6360     me->subtype[0]->aliases[0] = "p4032";
6361     me->subtype[1] = machine_entry_subtype_new("P5064",
6362     MACHINE_ALGOR_P5064, 1);
6363     me->subtype[1]->aliases[0] = "p5064";
6364     if (cpu_family_ptr_by_number(ARCH_MIPS) != NULL) {
6365     me->next = first_machine_entry; first_machine_entry = me;
6366     }
6367 dpavlin 2 }
6368    

  ViewVC Help
Powered by ViewVC 1.1.26