/[cebix]/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp
ViewVC logotype

Diff of /SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp

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

revision 1.5 by gbeauche, Mon Sep 29 22:50:31 2003 UTC revision 1.6 by gbeauche, Sat Oct 11 09:33:27 2003 UTC
# Line 330  void sheepshaver_cpu::execute_68k(uint32 Line 330  void sheepshaver_cpu::execute_68k(uint32
330          uint32 saved_ctr= ctr();          uint32 saved_ctr= ctr();
331    
332          // Create MacOS stack frame          // Create MacOS stack frame
333            // FIXME: make sure MacOS doesn't expect PPC registers to live on top
334          uint32 sp = gpr(1);          uint32 sp = gpr(1);
335          gpr(1) -= 56 + 19*4 + 18*8;          gpr(1) -= 56;
336          WriteMacInt32(gpr(1), sp);          WriteMacInt32(gpr(1), sp);
337    
338          // Save PowerPC registers          // Save PowerPC registers
339          for (int i = 13; i < 32; i++)          uint32 saved_GPRs[19];
340                  WriteMacInt32(gpr(1) + 56 + i*4, gpr(i));          memcpy(&saved_GPRs[0], &gpr(13), sizeof(uint32)*(32-13));
341  #if SAVE_FP_EXEC_68K  #if SAVE_FP_EXEC_68K
342          memcpy(Mac2HostAddr(gpr(1)+56+19*4), &fpr(14), sizeof(double)*(32-14));          double saved_FPRs[18];
343            memcpy(&saved_FPRs[0], &fpr(14), sizeof(double)*(32-14));
344  #endif  #endif
345    
346          // Setup registers for 68k emulator          // Setup registers for 68k emulator
# Line 385  void sheepshaver_cpu::execute_68k(uint32 Line 387  void sheepshaver_cpu::execute_68k(uint32
387            r->a[i] = gpr(16 + i);            r->a[i] = gpr(16 + i);
388    
389          // Restore PowerPC registers          // Restore PowerPC registers
390          for (int i = 13; i < 32; i++)          memcpy(&gpr(13), &saved_GPRs[0], sizeof(uint32)*(32-13));
                 gpr(i) = ReadMacInt32(gpr(1) + 56 + i*4);  
391  #if SAVE_FP_EXEC_68K  #if SAVE_FP_EXEC_68K
392          memcpy(&fpr(14), Mac2HostAddr(gpr(1)+56+19*4), sizeof(double)*(32-14));          memcpy(&fpr(14), &saved_FPRs[0], sizeof(double)*(32-14));
393  #endif  #endif
394    
395          // Cleanup stack          // Cleanup stack
396          gpr(1) += 56 + 19*4 + 18*8;          gpr(1) += 56;
397    
398          // Restore program counters and branch registers          // Restore program counters and branch registers
399          pc() = saved_pc;          pc() = saved_pc;
# Line 449  inline void sheepshaver_cpu::execute_ppc Line 450  inline void sheepshaver_cpu::execute_ppc
450  {  {
451          // Save branch registers          // Save branch registers
452          uint32 saved_lr = lr();          uint32 saved_lr = lr();
         uint32 saved_ctr= ctr();  
453    
454          const uint32 trampoline[] = { htonl(POWERPC_EMUL_OP | 1) };          const uint32 trampoline[] = { htonl(POWERPC_EMUL_OP | 1) };
   
455          lr() = (uint32)trampoline;          lr() = (uint32)trampoline;
456          ctr()= entry;  
457          execute(entry);          execute(entry);
458    
459          // Restore branch registers          // Restore branch registers
460          lr() = saved_lr;          lr() = saved_lr;
         ctr()= saved_ctr;  
461  }  }
462    
463  // Resource Manager thunk  // Resource Manager thunk

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.6

Christian Bauer">Christian Bauer
ViewVC Help
Powered by ViewVC 1.1.15