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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (show annotations)
Mon Oct 8 16:18:06 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 7438 byte(s)
0.3.2
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: ps2_bios.c,v 1.30 2005/04/13 20:22:26 debug Exp $
29 *
30 * Playstation 2 SIFBIOS emulation.
31 */
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <sys/types.h>
37 #include <sys/time.h>
38 #include <sys/resource.h>
39
40 #include "console.h"
41 #include "cpu.h"
42 #include "cpu_mips.h"
43 #include "machine.h"
44 #include "misc.h"
45
46
47 extern int quiet_mode;
48
49
50 /*
51 * playstation2_sifbios_emul():
52 */
53 int playstation2_sifbios_emul(struct cpu *cpu)
54 {
55 int callnr;
56
57 callnr = cpu->cd.mips.gpr[MIPS_GPR_A0];
58
59 switch (callnr) {
60 case 0: /* getver() */
61 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0x200; /* TODO */
62 break;
63 case 1: /* halt(int mode) */
64 debug("[ SIFBIOS halt(0x%llx) ]\n",
65 (long long)cpu->cd.mips.gpr[MIPS_GPR_A1]);
66 cpu->running = 0;
67 cpu->dead = 1;
68 break;
69 case 2: /* setdve(int mode) */
70 debug("[ SIFBIOS setdve(0x%llx) ]\n",
71 (long long)cpu->cd.mips.gpr[MIPS_GPR_A1]);
72 break;
73 case 3: /* putchar(int ch) */
74 /* debug("[ SIFBIOS putchar(0x%x) ]\n",
75 (char)cpu->cd.mips.gpr[MIPS_GPR_A1]); */
76 console_putchar(cpu->machine->main_console_handle,
77 cpu->cd.mips.gpr[MIPS_GPR_A1]);
78 break;
79 case 4: /* getchar() */
80 /* This is untested. TODO */
81 /* debug("[ SIFBIOS getchar() ]\n"; */
82 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0;
83 if (console_charavail(cpu->machine->main_console_handle))
84 cpu->cd.mips.gpr[MIPS_GPR_V0] = console_readchar(
85 cpu->machine->main_console_handle);
86 break;
87 case 16: /* dma_init() */
88 debug("[ SIFBIOS dma_init() ]\n");
89 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0; /* TODO */
90 break;
91 case 17: /* dma_exit() */
92 debug("[ SIFBIOS dma_exit() ]\n");
93 break;
94 case 32: /* cmd_init() */
95 debug("[ SIFBIOS cmd_init() ]\n");
96 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0; /* TODO */
97 break;
98 case 33: /* cmd_exit() */
99 debug("[ SIFBIOS cmd_exit() ]\n");
100 break;
101 case 48:
102 debug("[ SIFBIOS rpc_init(): TODO ]\n");
103 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0; /* TODO */
104 break;
105 case 49:
106 debug("[ SIFBIOS rpc_exit(): TODO ]\n");
107 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0; /* TODO */
108 break;
109 case 51:
110 debug("[ SIFBIOS rpc_bind(): TODO ]\n");
111 cpu->cd.mips.gpr[MIPS_GPR_V0] = 1; /* TODO */
112 break;
113 case 64:
114 fatal("[ SIFBIOS SBR_IOPH_INIT(0x%x,0x%x,0x%x): TODO ]\n",
115 (int)cpu->cd.mips.gpr[MIPS_GPR_A1],
116 (int)cpu->cd.mips.gpr[MIPS_GPR_A2],
117 (int)cpu->cd.mips.gpr[MIPS_GPR_A3]);
118
119 /*
120 * This is really really ugly: TODO
121 *
122 * Linux and NetBSD seem to work, but it's an ugly hack.
123 * This should really be a callback thingy...
124 *
125 * NetBSD has a done-word which should be set to 1.
126 * Linux has one done-word which should be set to 1, and
127 * one which should be set to 0.
128 *
129 * The code as it is right now probably overwrites stuff in
130 * memory that shouldn't be touched. Not good.
131 *
132 * Linux: err = sbios_rpc(SBR_IOPH_INIT, NULL, &result);
133 * err should be 0 (just as NetBSD),
134 * and result should be set to 0 as well.
135 */
136 {
137 uint32_t tmpaddr;
138
139 tmpaddr = load_32bit_word(cpu,
140 cpu->cd.mips.gpr[MIPS_GPR_A1] + 0);
141 fatal(" +0: %08x\n", tmpaddr);
142 tmpaddr = load_32bit_word(cpu,
143 cpu->cd.mips.gpr[MIPS_GPR_A1] + 4);
144 fatal(" +4: %08x\n", tmpaddr);
145 tmpaddr = load_32bit_word(cpu,
146 cpu->cd.mips.gpr[MIPS_GPR_A1] + 8);
147 fatal(" +8: %08x\n", tmpaddr);
148 tmpaddr = load_32bit_word(cpu,
149 cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
150 fatal(" +12: %08x\n", tmpaddr);
151
152 /* TODO: This is probably netbsd specific */
153 tmpaddr = load_32bit_word(cpu,
154 cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
155 fatal("tmpaddr 1 = 0x%08x\n", tmpaddr);
156
157 /* "done" word for NetBSD: */
158 store_32bit_word(cpu, tmpaddr, 1);
159 /* "done" word A for Linux: */
160 store_32bit_word(cpu, tmpaddr + 4, 1);
161 /* "done" word B for Linux: */
162 store_32bit_word(cpu,
163 cpu->cd.mips.gpr[MIPS_GPR_A1] + 0, 0);
164 }
165 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0;
166 break;
167 case 65:
168 fatal("[ SIFBIOS alloc iop heap(0x%x) ]\n",
169 (int)cpu->cd.mips.gpr[MIPS_GPR_A1]);
170
171 /*
172 * Linux uses this to allocate "heap" for the OHCI USB
173 * controller.
174 *
175 * TODO: This naïve implementation does not allow for a
176 * "free iop heap" function: :-/
177 */
178
179 {
180 uint32_t tmpaddr;
181 static uint32_t return_addr = 0x1000;
182 /* 0xbc000000; */
183 uint32_t size;
184
185 tmpaddr = load_32bit_word(cpu,
186 cpu->cd.mips.gpr[MIPS_GPR_A1] + 0);
187 fatal(" +0: %08x (result should be placed here)\n",
188 tmpaddr);
189 tmpaddr = load_32bit_word(cpu,
190 cpu->cd.mips.gpr[MIPS_GPR_A1] + 4);
191 fatal(" +4: %08x (*arg)\n", tmpaddr);
192 size = load_32bit_word(cpu, tmpaddr + 0);
193 fatal(" size = %08x\n", size);
194 tmpaddr = load_32bit_word(cpu,
195 cpu->cd.mips.gpr[MIPS_GPR_A1] + 8);
196 fatal(" +8: %08x (*func (void *, int))\n", tmpaddr);
197 tmpaddr = load_32bit_word(cpu,
198 cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
199 fatal(" +12: %08x (*para)\n", tmpaddr);
200
201 /* TODO: This is probably netbsd specific */
202 tmpaddr = load_32bit_word(cpu,
203 cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
204 fatal("tmpaddr 1 = 0x%08x\n", tmpaddr);
205
206 /* "done" word for NetBSD: */
207 store_32bit_word(cpu, tmpaddr, 1);
208 /* "done" word A for Linux: */
209 store_32bit_word(cpu, tmpaddr + 4, 1);
210
211 /* Result: */
212 store_32bit_word(cpu,
213 cpu->cd.mips.gpr[MIPS_GPR_A1] + 0, return_addr);
214
215 return_addr += size;
216 /* Round up to next page: */
217 return_addr += 4095;
218 return_addr &= ~4095;
219 }
220 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0;
221 break;
222 case 66:
223 debug("[ SIFBIOS iopmem_free(): TODO ]\n");
224 cpu->cd.mips.gpr[MIPS_GPR_V0] = 0; /* TODO */
225 break;
226 default:
227 quiet_mode = 0;
228 cpu_register_dump(cpu->machine, cpu, 1, 0x1);
229 printf("\n");
230 fatal("Playstation 2 SIFBIOS emulation: "
231 "unimplemented call nr 0x%x\n", callnr);
232 cpu->running = 0;
233 cpu->dead = 1;
234 }
235
236 return 1;
237 }
238

  ViewVC Help
Powered by ViewVC 1.1.26