/[gxemul]/trunk/src/cpus/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

Diff of /trunk/src/cpus/cpu_alpha_palcode.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 24 by dpavlin, Mon Oct 8 16:19:56 2007 UTC revision 42 by dpavlin, Mon Oct 8 16:22:32 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   *  Copyright (C) 2005-2006  Anders Gavare.  All rights reserved.   *  Copyright (C) 2005-2007  Anders Gavare.  All rights reserved.
3   *   *
4   *  Redistribution and use in source and binary forms, with or without   *  Redistribution and use in source and binary forms, with or without
5   *  modification, are permitted provided that the following conditions are met:   *  modification, are permitted provided that the following conditions are met:
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *   *
27   *   *
28   *  $Id: cpu_alpha_palcode.c,v 1.8 2006/06/02 18:11:38 debug Exp $   *  $Id: cpu_alpha_palcode.c,v 1.18 2007/06/15 00:41:21 debug Exp $
29   *   *
30   *  Alpha PALcode-related functionality.   *  Alpha PALcode-related functionality.
31     *
32     *  (See http://www.alphalinux.org/docs/alphaahb.html for good descriptions
33     *  of many PALcode functions.)
34   */   */
35    
36    
# Line 36  Line 39 
39  #include <string.h>  #include <string.h>
40  #include <ctype.h>  #include <ctype.h>
41    
 #include "misc.h"  
   
   
 #ifndef ENABLE_ALPHA    
   
   
 #include "cpu_alpha.h"  
   
   
 void alpha_palcode_name(uint32_t palcode, char *buf, size_t buflen)  
 { buf[0]='\0'; }  
 void alpha_palcode(struct cpu *cpu, uint32_t palcode) { }  
   
   
 #else   /*  ENABLE_ALPHA  */  
   
   
42  #include "console.h"  #include "console.h"
43  #include "cpu.h"  #include "cpu.h"
44  #include "machine.h"  #include "machine.h"
45  #include "memory.h"  #include "memory.h"
46    #include "misc.h"
47  #include "symbol.h"  #include "symbol.h"
48    #include "useremul.h"
49    
50    #include "alpha_prom.h"
51    
52    
53  /*  /*
# Line 91  void alpha_palcode_name(uint32_t palcode Line 81  void alpha_palcode_name(uint32_t palcode
81          case 0x86: snprintf(buf, buflen, "PAL_OSF1_imb"); break;          case 0x86: snprintf(buf, buflen, "PAL_OSF1_imb"); break;
82          case 0x92: snprintf(buf, buflen, "PAL_OSF1_urti"); break;          case 0x92: snprintf(buf, buflen, "PAL_OSF1_urti"); break;
83          case 0x3fffffe: snprintf(buf, buflen, "GXemul_PROM"); break;          case 0x3fffffe: snprintf(buf, buflen, "GXemul_PROM"); break;
84          default:snprintf(buf, buflen, "UNKNOWN 0x%x", palcode);          default:snprintf(buf, buflen, "UNKNOWN 0x%"PRIx32, palcode);
85          }          }
86  }  }
87    
# Line 101  void alpha_palcode_name(uint32_t palcode Line 91  void alpha_palcode_name(uint32_t palcode
91   */   */
92  void alpha_prom_call(struct cpu *cpu)  void alpha_prom_call(struct cpu *cpu)
93  {  {
94          uint64_t addr;          uint64_t addr, a1 = cpu->cd.alpha.r[ALPHA_A1];
95            uint64_t a2 = cpu->cd.alpha.r[ALPHA_A2], a3 = cpu->cd.alpha.r[ALPHA_A3];
96            uint64_t len;
97            char *s = "";
98    
99          switch (cpu->cd.alpha.r[ALPHA_A0]) {          switch (cpu->cd.alpha.r[ALPHA_A0]) {
100          case 0x02:  
101                  /*  puts: a1 = channel, a2 = ptr to buf, a3 = len  */          case PROM_R_PUTS:
102                  for (addr = cpu->cd.alpha.r[ALPHA_A2];                  /*  a1 = channel, a2 = ptr to buf, a3 = len  */
103                       addr < cpu->cd.alpha.r[ALPHA_A2] +                  for (addr = a2; addr < a2 + a3; addr ++) {
                      cpu->cd.alpha.r[ALPHA_A3]; addr ++) {  
104                          unsigned char ch;                          unsigned char ch;
105                          cpu->memory_rw(cpu, cpu->mem, addr, &ch, sizeof(ch),                          cpu->memory_rw(cpu, cpu->mem, addr, &ch, sizeof(ch),
106                              MEM_READ, CACHE_DATA | NO_EXCEPTIONS);                              MEM_READ, CACHE_DATA | NO_EXCEPTIONS);
107                          console_putchar(cpu->machine->main_console_handle, ch);                          console_putchar(cpu->machine->main_console_handle, ch);
108                  }                  }
109                  cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.r[ALPHA_A3];                  cpu->cd.alpha.r[ALPHA_V0] = a3;
110                  break;                  break;
111          case 0x22:  
112                  /*  getenv  */          case PROM_R_GETENV:
113                  fatal("[ Alpha PALcode: GXemul PROM call 0x22: TODO ]\n");                  /*  a1 = variable id, a2 = char *buf, a3 = bufsize  */
114                    switch (a1) {
115                    case PROM_E_BOOTED_DEV:
116                            s = "";         /*  TODO  */
117                            break;
118                    case PROM_E_BOOTED_FILE:
119                            s = cpu->machine->boot_kernel_filename;
120                            break;
121                    case PROM_E_BOOTED_OSFLAGS:
122                            s = cpu->machine->boot_string_argument;
123                            break;
124                    case PROM_E_TTY_DEV:
125                            s = "";         /*  TODO  */
126                            break;
127                    default:fatal("[ Alpha PALcode: GXemul PROM getenv %i: TODO "
128                                "]\n", cpu->cd.alpha.r[ALPHA_A1]);
129                            cpu->running = 0;
130                    }
131                    /*  Copy at most a3 bytes.  */
132                    len = a3;
133                    if (strlen(s) < len)
134                            len = strlen(s) + 1;
135                    store_buf(cpu, a2, s, len);
136                  break;                  break;
137    
138          default:fatal("[ Alpha PALcode: GXemul PROM call, a0=0x%"PRIx64" ]\n",          default:fatal("[ Alpha PALcode: GXemul PROM call, a0=0x%"PRIx64" ]\n",
139                      (uint64_t) cpu->cd.alpha.r[ALPHA_A0]);                      (uint64_t) cpu->cd.alpha.r[ALPHA_A0]);
140                  cpu->running = 0;                  cpu->running = 0;
# Line 138  void alpha_prom_call(struct cpu *cpu) Line 153  void alpha_prom_call(struct cpu *cpu)
153   */   */
154  void alpha_palcode(struct cpu *cpu, uint32_t palcode)  void alpha_palcode(struct cpu *cpu, uint32_t palcode)
155  {  {
156            uint64_t a0 = cpu->cd.alpha.r[ALPHA_A0], a1 = cpu->cd.alpha.r[ALPHA_A1];
157    
158          switch (palcode) {          switch (palcode) {
159            case 0x02:      /*  PAL_draina  */
160                    /*  TODO?  */
161                    break;
162          case 0x10:      /*  PAL_OSF1_rdmces  */          case 0x10:      /*  PAL_OSF1_rdmces  */
163                  /*  TODO? Return something in v0.  */                  /*  TODO. Return Machine Check status in v0.  */
164                    cpu->cd.alpha.r[ALPHA_V0] = 0;
165                  break;                  break;
166          case 0x11:      /*  PAL_OSF1_wrmces  */          case 0x11:      /*  PAL_OSF1_wrmces  */
167                  /*  TODO? Set something to a0.  */                  /*  TODO. Clear Machine Check and Error status.  */
168                  break;                  break;
169          case 0x2b:      /*  PAL_OSF1_wrfen  */          case 0x2b:      /*  PAL_OSF1_wrfen  */
170                  /*  Floating point enable: a0 = 1 or 0.  */                  /*  Floating point enable: a0 = 1 or 0.  */
171                  /*  TODO  */                  /*  TODO  */
172                  break;                  break;
173          case 0x2d:      /*  PAL_OSF1_wrvptptr  */          case 0x2d:      /*  PAL_OSF1_wrvptptr  */
174                  /*  a0 = value  */                  /*  Write Virtual Page Table Pointer. a0 = value  */
175                  cpu->cd.alpha.wrvptptr = cpu->cd.alpha.r[ALPHA_A0];                  cpu->cd.alpha.vptptr = a0;
176                  break;                  break;
177          case 0x30:      /*  PAL_OSF1_swpctx  */          case 0x30:      /*  PAL_OSF1_swpctx  */
178                  /*  TODO  */                  /*  Save old context:  */
179                  /*  Swap context  */                  store_64bit_word(cpu, cpu->cd.alpha.ctx + 0,
180                        cpu->cd.alpha.pcb.apcb_ksp);
181                    store_64bit_word(cpu, cpu->cd.alpha.ctx + 8,
182                        cpu->cd.alpha.pcb.apcb_usp);
183                    store_64bit_word(cpu, cpu->cd.alpha.ctx + 16,
184                        cpu->cd.alpha.pcb.apcb_ptbr);
185                    store_32bit_word(cpu, cpu->cd.alpha.ctx + 24,
186                        cpu->cd.alpha.pcb.apcb_cpc);
187                    store_32bit_word(cpu, cpu->cd.alpha.ctx + 28,
188                        cpu->cd.alpha.pcb.apcb_asn);
189                    store_64bit_word(cpu, cpu->cd.alpha.ctx + 32,
190                        cpu->cd.alpha.pcb.apcb_unique);
191                    store_64bit_word(cpu, cpu->cd.alpha.ctx + 40,
192                        cpu->cd.alpha.pcb.apcb_flags);
193                    store_64bit_word(cpu, cpu->cd.alpha.ctx + 48,
194                        cpu->cd.alpha.pcb.apcb_decrsv0);
195                    store_64bit_word(cpu, cpu->cd.alpha.ctx + 56,
196                        cpu->cd.alpha.pcb.apcb_decrsv1);
197                    /*  Load new context:  */
198                    cpu->cd.alpha.ctx = a0;
199                    cpu->cd.alpha.pcb.apcb_ksp =
200                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 0);
201                    cpu->cd.alpha.pcb.apcb_usp =
202                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 8);
203                    cpu->cd.alpha.pcb.apcb_ptbr =
204                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 16);
205                    cpu->cd.alpha.pcb.apcb_cpc =
206                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 24);
207                    cpu->cd.alpha.pcb.apcb_asn =
208                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 28);
209                    cpu->cd.alpha.pcb.apcb_unique =
210                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 32);
211                    cpu->cd.alpha.pcb.apcb_flags =
212                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 40);
213                    cpu->cd.alpha.pcb.apcb_decrsv0 =
214                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 48);
215                    cpu->cd.alpha.pcb.apcb_decrsv1 =
216                        load_64bit_word(cpu, cpu->cd.alpha.ctx + 56);
217                  break;                  break;
218          case 0x31:      /*  PAL_OSF1_wrval  */          case 0x31:      /*  PAL_OSF1_wrval  */
219                  /*  a0 = value  */                  /*  a0 = value  */
220                  cpu->cd.alpha.sysvalue = cpu->cd.alpha.r[ALPHA_A0];                  cpu->cd.alpha.sysvalue = a0;
221                  break;                  break;
222          case 0x32:      /*  PAL_OSF1_rdval  */          case 0x32:      /*  PAL_OSF1_rdval  */
223                  /*  return: v0 = value  */                  /*  return: v0 = value  */
224                  cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.sysvalue;                  cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.sysvalue;
225                  break;                  break;
226          case 0x33:      /*  PAL_OSF1_tbi  */          case 0x33:      /*  PAL_OSF1_tbi  */
227                  /*  a0 = op, a1 = vaddr  */                  /*
228                  debug("[ Alpha PALcode: PAL_OSF1_tbi: a0=%"PRIi64" a1=0x%"                   *  a0 = op, a1 = vaddr
229                      PRIx64" ]\n", (int64_t)cpu->cd.alpha.r[ALPHA_A0],                   */
230                      (uint64_t)cpu->cd.alpha.r[ALPHA_A1]);                  fatal("[ Alpha PALcode: PAL_OSF1_tbi: a0=%"PRIi64" a1=0x%"
231                  /*  TODO  */                      PRIx64" ]\n", (int64_t)a0, (uint64_t)a1);
232                    cpu->invalidate_translation_caches(cpu, a1, INVALIDATE_VADDR);
233                  break;                  break;
234          case 0x34:      /*  PAL_OSF1_wrent (Write System Entry Address)  */          case 0x34:      /*  PAL_OSF1_wrent (Write System Entry Address)  */
235                  /*  a0 = new vector, a1 = vector selector  */                  /*  a0 = new vector, a1 = vector selector  */
236                  debug("[ Alpha PALcode: PAL_OSF1_tbi: a0=%"PRIi64" a1=0x%"                  if (a1 < N_ALPHA_KENTRY)
237                      PRIx64" ]\n", (int64_t) cpu->cd.alpha.r[ALPHA_A0],                          cpu->cd.alpha.kentry[a1] = a0;
238                      (uint64_t) cpu->cd.alpha.r[ALPHA_A1]);                  else {
239                  /*  TODO  */                          fatal("[ Alpha PALcode: PAL_OSF1_wrent: attempt to "
240                                "write to non-implemented selector %i ]\n",
241                                (int)a1);
242                            cpu->running = 0;
243                    }
244                  break;                  break;
245          case 0x35:      /*  PAL_OSF1_swpipl  */          case 0x35:      /*  PAL_OSF1_swpipl  */
246                  /*  a0 = new ipl, v0 = return old ipl  */                  /*  a0 = new ipl, v0 = return old ipl  */
247                  cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.ipl;                  cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.ipl;
248                  cpu->cd.alpha.ipl = cpu->cd.alpha.r[ALPHA_A0];                  cpu->cd.alpha.ipl = a0;
249                  break;                  break;
250          case 0x36:      /*  PAL_OSF1_rdps  */          case 0x36:      /*  PAL_OSF1_rdps  */
251                  /*  TODO  */                  /*  TODO  */
# Line 191  void alpha_palcode(struct cpu *cpu, uint Line 254  void alpha_palcode(struct cpu *cpu, uint
254          case 0x37:      /*  PAL_OSF1_wrkgp  */          case 0x37:      /*  PAL_OSF1_wrkgp  */
255                  /*  "clobbers a0, t0, t8-t11" according to comments in                  /*  "clobbers a0, t0, t8-t11" according to comments in
256                      NetBSD sources  */                      NetBSD sources  */
257                    cpu->cd.alpha.kgp = a0;
258                  /*  KGP shoudl be set to a0.  (TODO)  */                  break;
259            case 0x38:      /*  PAL_OSF1_wrusp  */
260                    /*  a0 = value  */
261                    cpu->cd.alpha.pcb.apcb_usp = a0;
262                    break;
263            case 0x3a:      /*  PAL_OSF1_rdusp  */
264                    /*  return: v0 = value  */
265                    cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.pcb.apcb_usp;
266                  break;                  break;
267          case 0x3c:      /*  PAL_OSF1_whami  */          case 0x3c:      /*  PAL_OSF1_whami  */
268                  /*  Returns CPU id in v0:  */                  /*  Returns CPU id in v0:  */
# Line 213  void alpha_palcode(struct cpu *cpu, uint Line 283  void alpha_palcode(struct cpu *cpu, uint
283          case 0x86:      /*  PAL_OSF1_imb  */          case 0x86:      /*  PAL_OSF1_imb  */
284                  /*  TODO  */                  /*  TODO  */
285                  break;                  break;
286            case 0x3fffffc:
287                    fatal("[ Alpha: KENTRY not set! Halting. ]");
288                    cpu->running = 0;
289                    break;
290          case 0x3fffffd:          case 0x3fffffd:
291                  fatal("[ Alpha PALcode: Fixup: TODO ]\n");                  fatal("[ Alpha PALcode: Fixup: TODO ]\n");
292                  /*  Return from the fixup call.  */                  /*  Return from the fixup call.  */
# Line 227  void alpha_palcode(struct cpu *cpu, uint Line 301  void alpha_palcode(struct cpu *cpu, uint
301          }          }
302  }  }
303    
   
 #endif  /*  ENABLE_ALPHA  */  

Legend:
Removed from v.24  
changed lines
  Added in v.42

  ViewVC Help
Powered by ViewVC 1.1.26