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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 27 - (hide annotations)
Mon Oct 8 16:20:18 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7504 byte(s)
0.4.0.1
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 24 * $Id: ps2_bios.c,v 1.3 2006/03/30 19:36:05 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 dpavlin 24 debug("[ SIFBIOS halt(0x%"PRIx64") ]\n",
65     (uint64_t) cpu->cd.mips.gpr[MIPS_GPR_A1]);
66 dpavlin 14 cpu->running = 0;
67     cpu->dead = 1;
68     break;
69     case 2: /* setdve(int mode) */
70 dpavlin 24 debug("[ SIFBIOS setdve(0x%"PRIx64") ]\n",
71     (uint64_t) cpu->cd.mips.gpr[MIPS_GPR_A1]);
72 dpavlin 14 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 dpavlin 24 fatal("[ SIFBIOS SBR_IOPH_INIT(0x%"PRIx32",0x%"PRIx32",0x%"
115     PRIx32"): TODO ]\n",
116     (uint32_t) cpu->cd.mips.gpr[MIPS_GPR_A1],
117     (uint32_t) cpu->cd.mips.gpr[MIPS_GPR_A2],
118     (uint32_t) cpu->cd.mips.gpr[MIPS_GPR_A3]);
119 dpavlin 14
120     /*
121     * This is really really ugly: TODO
122     *
123     * Linux and NetBSD seem to work, but it's an ugly hack.
124     * This should really be a callback thingy...
125     *
126     * NetBSD has a done-word which should be set to 1.
127     * Linux has one done-word which should be set to 1, and
128     * one which should be set to 0.
129     *
130     * The code as it is right now probably overwrites stuff in
131     * memory that shouldn't be touched. Not good.
132     *
133     * Linux: err = sbios_rpc(SBR_IOPH_INIT, NULL, &result);
134     * err should be 0 (just as NetBSD),
135     * and result should be set to 0 as well.
136     */
137     {
138     uint32_t tmpaddr;
139    
140     tmpaddr = load_32bit_word(cpu,
141     cpu->cd.mips.gpr[MIPS_GPR_A1] + 0);
142     fatal(" +0: %08x\n", tmpaddr);
143     tmpaddr = load_32bit_word(cpu,
144     cpu->cd.mips.gpr[MIPS_GPR_A1] + 4);
145     fatal(" +4: %08x\n", tmpaddr);
146     tmpaddr = load_32bit_word(cpu,
147     cpu->cd.mips.gpr[MIPS_GPR_A1] + 8);
148     fatal(" +8: %08x\n", tmpaddr);
149     tmpaddr = load_32bit_word(cpu,
150     cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
151     fatal(" +12: %08x\n", tmpaddr);
152    
153     /* TODO: This is probably netbsd specific */
154     tmpaddr = load_32bit_word(cpu,
155     cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
156     fatal("tmpaddr 1 = 0x%08x\n", tmpaddr);
157    
158     /* "done" word for NetBSD: */
159     store_32bit_word(cpu, tmpaddr, 1);
160     /* "done" word A for Linux: */
161     store_32bit_word(cpu, tmpaddr + 4, 1);
162     /* "done" word B for Linux: */
163     store_32bit_word(cpu,
164     cpu->cd.mips.gpr[MIPS_GPR_A1] + 0, 0);
165     }
166     cpu->cd.mips.gpr[MIPS_GPR_V0] = 0;
167     break;
168     case 65:
169 dpavlin 24 fatal("[ SIFBIOS alloc iop heap(0x"PRIx32") ]\n",
170     (uint32_t)cpu->cd.mips.gpr[MIPS_GPR_A1]);
171 dpavlin 14
172     /*
173     * Linux uses this to allocate "heap" for the OHCI USB
174     * controller.
175     *
176     * TODO: This naïve implementation does not allow for a
177     * "free iop heap" function: :-/
178     */
179    
180     {
181     uint32_t tmpaddr;
182     static uint32_t return_addr = 0x1000;
183     /* 0xbc000000; */
184     uint32_t size;
185    
186     tmpaddr = load_32bit_word(cpu,
187     cpu->cd.mips.gpr[MIPS_GPR_A1] + 0);
188     fatal(" +0: %08x (result should be placed here)\n",
189     tmpaddr);
190     tmpaddr = load_32bit_word(cpu,
191     cpu->cd.mips.gpr[MIPS_GPR_A1] + 4);
192     fatal(" +4: %08x (*arg)\n", tmpaddr);
193     size = load_32bit_word(cpu, tmpaddr + 0);
194     fatal(" size = %08x\n", size);
195     tmpaddr = load_32bit_word(cpu,
196     cpu->cd.mips.gpr[MIPS_GPR_A1] + 8);
197     fatal(" +8: %08x (*func (void *, int))\n", tmpaddr);
198     tmpaddr = load_32bit_word(cpu,
199     cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
200     fatal(" +12: %08x (*para)\n", tmpaddr);
201    
202     /* TODO: This is probably netbsd specific */
203     tmpaddr = load_32bit_word(cpu,
204     cpu->cd.mips.gpr[MIPS_GPR_A1] + 12);
205     fatal("tmpaddr 1 = 0x%08x\n", tmpaddr);
206    
207     /* "done" word for NetBSD: */
208     store_32bit_word(cpu, tmpaddr, 1);
209     /* "done" word A for Linux: */
210     store_32bit_word(cpu, tmpaddr + 4, 1);
211    
212     /* Result: */
213     store_32bit_word(cpu,
214     cpu->cd.mips.gpr[MIPS_GPR_A1] + 0, return_addr);
215    
216     return_addr += size;
217     /* Round up to next page: */
218     return_addr += 4095;
219     return_addr &= ~4095;
220     }
221     cpu->cd.mips.gpr[MIPS_GPR_V0] = 0;
222     break;
223     case 66:
224     debug("[ SIFBIOS iopmem_free(): TODO ]\n");
225     cpu->cd.mips.gpr[MIPS_GPR_V0] = 0; /* TODO */
226     break;
227     default:
228     quiet_mode = 0;
229     cpu_register_dump(cpu->machine, cpu, 1, 0x1);
230     printf("\n");
231     fatal("Playstation 2 SIFBIOS emulation: "
232     "unimplemented call nr 0x%x\n", callnr);
233     cpu->running = 0;
234     cpu->dead = 1;
235     }
236    
237     return 1;
238     }
239    

  ViewVC Help
Powered by ViewVC 1.1.26