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

Contents of /trunk/src/machine.c

Parent Directory Parent Directory | Revision Log Revision Log


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

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

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


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

  ViewVC Help
Powered by ViewVC 1.1.26