/[gxemul]/upstream/0.3.5/src/cpu_alpha_palcode.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.5/src/cpu_alpha_palcode.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide annotations)
Mon Oct 8 16:18:43 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 6568 byte(s)
0.3.5
1 dpavlin 12 /*
2     * Copyright (C) 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: cpu_alpha_palcode.c,v 1.6 2005/08/04 00:25:08 debug Exp $
29     *
30     * Alpha PALcode-related functionality.
31     */
32    
33    
34     #include <stdio.h>
35     #include <stdlib.h>
36     #include <string.h>
37     #include <ctype.h>
38    
39     #include "misc.h"
40    
41    
42     #ifndef ENABLE_ALPHA
43    
44    
45     #include "cpu_alpha.h"
46    
47    
48     void alpha_palcode_name(uint32_t palcode, char *buf, size_t buflen)
49     { buf[0]='\0'; }
50     void alpha_palcode(struct cpu *cpu, uint32_t palcode) { }
51    
52    
53     #else /* ENABLE_ALPHA */
54    
55    
56     #include "console.h"
57     #include "cpu.h"
58     #include "machine.h"
59     #include "memory.h"
60     #include "symbol.h"
61    
62    
63     /*
64     * alpha_palcode_name():
65     *
66     * Return the name of a PALcode number, as a string.
67     */
68     void alpha_palcode_name(uint32_t palcode, char *buf, size_t buflen)
69     {
70     switch (palcode) {
71     case 0x10: snprintf(buf, buflen, "PAL_OSF1_rdmces"); break;
72     case 0x11: snprintf(buf, buflen, "PAL_OSF1_wrmces"); break;
73     case 0x2b: snprintf(buf, buflen, "PAL_OSF1_wrfen"); break;
74     case 0x2d: snprintf(buf, buflen, "PAL_OSF1_wrvptptr"); break;
75     case 0x30: snprintf(buf, buflen, "PAL_OSF1_swpctx"); break;
76     case 0x31: snprintf(buf, buflen, "PAL_OSF1_wrval"); break;
77     case 0x32: snprintf(buf, buflen, "PAL_OSF1_rdval"); break;
78     case 0x33: snprintf(buf, buflen, "PAL_OSF1_tbi"); break;
79     case 0x34: snprintf(buf, buflen, "PAL_OSF1_wrent"); break;
80     case 0x35: snprintf(buf, buflen, "PAL_OSF1_swpipl"); break;
81     case 0x36: snprintf(buf, buflen, "PAL_OSF1_rdps"); break;
82     case 0x37: snprintf(buf, buflen, "PAL_OSF1_wrkgp"); break;
83     case 0x38: snprintf(buf, buflen, "PAL_OSF1_wrusp"); break;
84     case 0x39: snprintf(buf, buflen, "PAL_OSF1_wrperfmon"); break;
85     case 0x3a: snprintf(buf, buflen, "PAL_OSF1_rdusp"); break;
86     case 0x3c: snprintf(buf, buflen, "PAL_OSF1_whami"); break;
87     case 0x3d: snprintf(buf, buflen, "PAL_OSF1_retsys"); break;
88     case 0x3f: snprintf(buf, buflen, "PAL_OSF1_rti"); break;
89     case 0x83: snprintf(buf, buflen, "PAL_OSF1_callsys"); break;
90     case 0x86: snprintf(buf, buflen, "PAL_OSF1_imb"); break;
91     case 0x92: snprintf(buf, buflen, "PAL_OSF1_urti"); break;
92     case 0x3fffffe: snprintf(buf, buflen, "GXemul_PROM"); break;
93     default:snprintf(buf, buflen, "UNKNOWN 0x%x", palcode);
94     }
95     }
96    
97    
98     /*
99     * alpha_prom_call():
100     */
101     void alpha_prom_call(struct cpu *cpu)
102     {
103     uint64_t addr;
104    
105     switch (cpu->cd.alpha.r[ALPHA_A0]) {
106     case 0x02:
107     /* put string. a1 = channel, a2 = ptr to buf, a3 = len */
108     for (addr = cpu->cd.alpha.r[ALPHA_A2];
109     addr < cpu->cd.alpha.r[ALPHA_A2] +
110     cpu->cd.alpha.r[ALPHA_A3]; addr ++) {
111     unsigned char ch;
112     cpu->memory_rw(cpu, cpu->mem, addr, &ch, sizeof(ch),
113     MEM_READ, CACHE_DATA | NO_EXCEPTIONS);
114     console_putchar(cpu->machine->main_console_handle, ch);
115     }
116     cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.r[ALPHA_A3];
117     break;
118     case 0x22:
119     fatal("[ Alpha PALcode: GXemul PROM call 0x22: TODO ]\n");
120     break;
121     default:fatal("[ Alpha PALcode: GXemul PROM call, a0=0x%llx ]\n",
122     (long long)cpu->cd.alpha.r[ALPHA_A0]);
123     cpu->running = 0;
124     }
125    
126     /* Return from the PROM call. */
127     cpu->pc = cpu->cd.alpha.r[ALPHA_RA];
128     }
129    
130    
131     /*
132     * alpha_palcode():
133     *
134     * Execute an Alpha PALcode instruction. (Most of these correspond to
135     * NetBSD/alpha code).
136     */
137     void alpha_palcode(struct cpu *cpu, uint32_t palcode)
138     {
139     switch (palcode) {
140     case 0x10: /* PAL_OSF1_rdmces */
141     /* TODO? Return something in v0. */
142     break;
143     case 0x11: /* PAL_OSF1_wrmces */
144     /* TODO? Set something to a0. */
145     break;
146     case 0x2b: /* PAL_OSF1_wrfen */
147     /* Floating point enable: a0 = 1 or 0. */
148     /* TODO */
149     break;
150     case 0x33: /* PAL_OSF1_tbi */
151     /* a0 = op, a1 = vaddr */
152     debug("[ Alpha PALcode: PAL_OSF1_tbi: a0=%lli a1=0x%llx ]\n",
153     (signed long long)cpu->cd.alpha.r[ALPHA_A0],
154     (long long)cpu->cd.alpha.r[ALPHA_A1]);
155     /* TODO */
156     break;
157     case 0x34: /* PAL_OSF1_wrent (Write System Entry Address) */
158     /* a0 = new vector, a1 = vector selector */
159     debug("[ Alpha PALcode: PAL_OSF1_tbi: a0=%lli a1=0x%llx ]\n",
160     (signed long long)cpu->cd.alpha.r[ALPHA_A0],
161     (long long)cpu->cd.alpha.r[ALPHA_A1]);
162     /* TODO */
163     break;
164     case 0x35: /* PAL_OSF1_swpipl */
165     /* a0 = new ipl, v0 = return old ipl */
166     cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.ipl;
167     cpu->cd.alpha.ipl = cpu->cd.alpha.r[ALPHA_A0];
168     break;
169     case 0x36: /* PAL_OSF1_rdps */
170     /* TODO */
171     cpu->cd.alpha.r[ALPHA_V0] = 0;
172     break;
173     case 0x37: /* PAL_OSF1_wrkgp */
174     /* "clobbers a0, t0, t8-t11" according to comments in
175     NetBSD sources */
176    
177     /* KGP shoudl be set to a0. (TODO) */
178     break;
179     case 0x3c: /* PAL_OSF1_whami */
180     /* Returns CPU id in v0: */
181     cpu->cd.alpha.r[ALPHA_V0] = cpu->cpu_id;
182     break;
183     case 0x83: /* PAL_OSF1_syscall */
184     if (cpu->machine->userland_emul != NULL)
185     useremul_syscall(cpu, 0);
186     else {
187     fatal("[ Alpha PALcode: syscall, but no"
188     " syscall handler? ]\n");
189     cpu->running = 0;
190     }
191     break;
192     case 0x86: /* PAL_OSF1_imb */
193     /* TODO */
194     break;
195     case 0x3fffffe:
196     alpha_prom_call(cpu);
197     break;
198     default:fatal("[ Alpha PALcode 0x%x unimplemented! ]\n", palcode);
199     cpu->running = 0;
200     }
201     }
202    
203    
204     #endif /* ENABLE_ALPHA */

  ViewVC Help
Powered by ViewVC 1.1.26