/[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

Contents of /upstream/0.3.5/src/cpu_alpha_palcode.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show 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 /*
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