/[gxemul]/upstream/0.3.8/src/promemul/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

Annotation of /upstream/0.3.8/src/promemul/ps2_bios.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide annotations)
Mon Oct 8 16:19:43 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7437 byte(s)
0.3.8
1 dpavlin 14 /*
2 dpavlin 22 * Copyright (C) 2003-2006 Anders Gavare. All rights reserved.
3 dpavlin 14 *
4     * Redistribution and use in source and binary forms, with or without
5     * modification, are permitted provided that the following conditions are met:
6     *
7     * 1. Redistributions of source code must retain the above copyright
8     * notice, this list of conditions and the following disclaimer.
9     * 2. Redistributions in binary form must reproduce the above copyright
10     * notice, this list of conditions and the following disclaimer in the
11     * documentation and/or other materials provided with the distribution.
12     * 3. The name of the author may not be used to endorse or promote products
13     * derived from this software without specific prior written permission.
14     *
15     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18     * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25     * SUCH DAMAGE.
26     *
27     *
28 dpavlin 22 * $Id: ps2_bios.c,v 1.2 2006/02/16 05:57:10 debug Exp $
29 dpavlin 14 *
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