machine_playstation2.cc Source File

Back to the index.

machine_playstation2.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2003-2009 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  * COMMENT: Sony PlayStation 2
29  */
30 
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <time.h>
35 
36 #include "cpu.h"
37 #include "device.h"
38 #include "devices.h"
39 #include "diskimage.h"
40 #include "machine.h"
41 #include "memory.h"
42 #include "misc.h"
43 
44 #define PLAYSTATION2_BDA 0xffffffffa0001000ULL
45 #define PLAYSTATION2_OPTARGS 0xffffffff81fff100ULL
46 #define PLAYSTATION2_SIFBIOS 0xffffffffbfc10000ULL
47 
48 
49 static int int_to_bcd(int i)
50 {
51  return (i/10) * 16 + (i % 10);
52 }
53 
54 
55 MACHINE_SETUP(playstation2)
56 {
57  char tmpstr[200];
58  int tmplen;
59  char *tmp;
60  time_t timet;
61  struct tm *tm_ptr;
62 
63  machine->machine_name = strdup("Playstation 2");
65 
66  if (machine->physical_ram_in_mb != 32)
67  fprintf(stderr, "WARNING! Playstation 2 machines are supposed "
68  "to have exactly 32 MB RAM. Continuing anyway.\n");
69  if (!machine->x11_md.in_use)
70  fprintf(stderr, "WARNING! Playstation 2 without -X is pretty "
71  "meaningless. Continuing anyway.\n");
72 
73  /*
74  * According to NetBSD:
75  *
76  * Hardware irq 0 is timer/interrupt controller
77  * Hardware irq 1 is dma controller
78  *
79  * Some things are not yet emulated (at all), and hence are detected
80  * incorrectly:
81  *
82  * sbus0 at mainbus0: controller type 2
83  * ohci0 at sbus0 (at 0x1f801600, according to linux)
84  * ohci0: OHCI version 1.0
85  */
86 
87  device_add(machine, "ps2 addr=0x10000000");
88  device_add(machine, "ps2_gs addr=0x12000000");
89  device_add(machine, "ps2_ether addr=0x14001000");
90 
91  /* TODO: how much? */
92  dev_ram_init(machine, 0x1c000000, 4 * 1048576, DEV_RAM_RAM, 0);
93 
94  /* OHCI at SBUS irq 1: */
95  snprintf(tmpstr, sizeof(tmpstr), "ohci addr=0x1f801600 irq="
96  "%s.cpu[%i].ps2_sbus.1", machine->path, machine->bootstrap_cpu);
97  device_add(machine, tmpstr);
98 
99  /* Set the Harddisk controller present flag, if either
100  disk 0 or 1 is present: */
103  if (machine->prom_emulation)
104  store_32bit_word(cpu, 0xa0000000 + machine->
105  physical_ram_in_mb*1048576 - 0x1000 + 0x0, 0x100);
106  device_add(machine, "ps2_spd addr=0x14000000");
107  }
108 
109  if (!machine->prom_emulation)
110  return;
111 
112 
113  tmplen = 1000;
114  CHECK_ALLOCATION(tmp = (char *) malloc(tmplen));
115 
117  PLAYSTATION2_SIFBIOS, 0x10000, "[SIFBIOS entry]", 0, 0);
120  store_buf(cpu, PLAYSTATION2_BDA + 4, "PS2b", 4);
121 
122  /* "Magic trap" instruction for software PROM emulation: */
124 
126  * 1048576 - 0x1000 + 0x4, PLAYSTATION2_OPTARGS);
127 
128  strlcpy(tmp, "root=/dev/hda1 crtmode=vesa0,60", tmplen);
129 
131  snprintf(tmp+strlen(tmp), tmplen-strlen(tmp),
132  " %s", machine->boot_string_argument);
133  tmp[tmplen-1] = '\0';
134 
135  machine->bootstr = tmp;
137 
138  /* TODO: netbsd's bootinfo.h, for symbolic names */
139 
140  /* RTC data given by the BIOS: */
141  timet = time(NULL) + 9*3600; /* PS2 uses Japanese time */
142  tm_ptr = gmtime(&timet);
143  /* TODO: are these 0- or 1-based? */
145  * 1048576 - 0x1000 + 0x10 + 1, int_to_bcd(tm_ptr->tm_sec));
147  * 1048576 - 0x1000 + 0x10 + 2, int_to_bcd(tm_ptr->tm_min));
149  * 1048576 - 0x1000 + 0x10 + 3, int_to_bcd(tm_ptr->tm_hour));
151  * 1048576 - 0x1000 + 0x10 + 5, int_to_bcd(tm_ptr->tm_mday));
153  * 1048576 - 0x1000 + 0x10 + 6, int_to_bcd(tm_ptr->tm_mon+1));
155  * 1048576 - 0x1000 + 0x10 + 7, int_to_bcd(tm_ptr->tm_year-100));
156 
157  /* "BOOTINFO_PCMCIA_TYPE" in NetBSD's bootinfo.h. This
158  contains the sbus controller type. */
160  * 1048576 - 0x1000 + 0x1c, 2);
161 }
162 
163 
164 MACHINE_DEFAULT_CPU(playstation2)
165 {
166  machine->cpu_name = strdup("R5900");
167 }
168 
169 
170 MACHINE_DEFAULT_RAM(playstation2)
171 {
173 }
174 
175 
176 MACHINE_REGISTER(playstation2)
177 {
178  MR_DEFAULT(playstation2, "Playstation 2", ARCH_MIPS, MACHINE_PS2);
179 
180  machine_entry_add_alias(me, "playstation2");
181  machine_entry_add_alias(me, "ps2");
182 
183  me->set_default_ram = machine_default_ram_playstation2;
184 }
185 
int prom_emulation
Definition: machine.h:149
char * cpu_name
Definition: machine.h:133
int store_32bit_word(struct cpu *cpu, uint64_t addr, uint64_t data32)
Definition: memory.cc:783
int diskimage_exist(struct machine *machine, int id, int type)
Definition: diskimage.cc:106
#define PLAYSTATION2_BDA
#define DEV_RAM_RAM
Definition: devices.h:364
void store_string(struct cpu *cpu, uint64_t addr, const char *s)
Definition: memory.cc:695
MACHINE_DEFAULT_CPU(playstation2)
void * device_add(struct machine *machine, const char *name_and_params)
Definition: device.cc:252
int physical_ram_in_mb
Definition: machine.h:147
#define EMUL_LITTLE_ENDIAN
Definition: misc.h:164
char * boot_string_argument
Definition: machine.h:171
#define CHECK_ALLOCATION(ptr)
Definition: misc.h:239
char * path
Definition: machine.h:108
#define DISKIMAGE_IDE
Definition: diskimage.h:41
int bootstrap_cpu
Definition: machine.h:136
void dev_ram_init(struct machine *machine, uint64_t baseaddr, uint64_t length, int mode, uint64_t otheraddress, const char *name)
Definition: dev_ram.cc:134
void machine_entry_add_alias(struct machine_entry *me, const char *name)
Definition: machine.cc:697
#define PLAYSTATION2_OPTARGS
struct x11_md x11_md
Definition: machine.h:179
void add_symbol_name(struct symbol_context *, uint64_t addr, uint64_t len, const char *name, int type, int n_args)
Definition: symbol.cc:199
char * bootstr
Definition: machine.h:155
Definition: cpu.h:326
void COMBINE() strlen(struct cpu *cpu, struct arm_instr_call *ic, int low_addr)
MACHINE_REGISTER(playstation2)
struct symbol_context symbol_context
Definition: machine.h:144
void store_byte(struct cpu *cpu, uint64_t addr, uint8_t data)
Definition: memory.cc:679
int in_use
Definition: machine.h:82
#define MACHINE_PS2
Definition: machine.h:216
uint8_t byte_order
Definition: cpu.h:347
MACHINE_SETUP(playstation2)
#define PLAYSTATION2_SIFBIOS
void store_buf(struct cpu *cpu, uint64_t addr, const char *s, size_t len)
Definition: memory.cc:826
MACHINE_DEFAULT_RAM(playstation2)
#define MR_DEFAULT(x, name, arch, type)
Definition: machine.h:370
const char * machine_name
Definition: machine.h:115
#define ARCH_MIPS
Definition: machine.h:203

Generated on Sun Sep 30 2018 16:05:18 for GXemul by doxygen 1.8.13