ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp
(Generate patch)

Comparing SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp (file contents):
Revision 1.15 by gbeauche, 2003-11-04T20:48:29Z vs.
Revision 1.18 by gbeauche, 2003-11-24T23:45:41Z

# Line 30 | Line 30
30   #include "sigsegv.h"
31   #include "cpu/ppc/ppc-cpu.hpp"
32   #include "cpu/ppc/ppc-operations.hpp"
33 + #include "cpu/ppc/ppc-instructions.hpp"
34  
35   // Used for NativeOp trampolines
36   #include "video.h"
37   #include "name_registry.h"
38   #include "serial.h"
39 + #include "ether.h"
40  
41   #include <stdio.h>
42  
# Line 88 | Line 90 | static void enter_mon(void)
90   // Pointer to Kernel Data
91   static KernelData * const kernel_data = (KernelData *)KERNEL_DATA_BASE;
92  
93 + // SIGSEGV handler
94 + static sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t);
95 +
96  
97   /**
98   *              PowerPC emulator glue with special 'sheep' opcodes
99   **/
100  
101 + enum {
102 +        PPC_I(SHEEP) = PPC_I(MAX),
103 +        PPC_I(SHEEP_MAX)
104 + };
105 +
106   class sheepshaver_cpu
107          : public powerpc_cpu
108   {
# Line 135 | Line 145 | public:
145          // FIXME: really make surre array allocation fail at link time?
146          void *operator new[](size_t);
147          void operator delete[](void *p);
148 +
149 +        // Make sure the SIGSEGV handler can access CPU registers
150 +        friend sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t);
151   };
152  
153   lazy_allocator< sheepshaver_cpu > allocator_helper< sheepshaver_cpu, lazy_allocator >::allocator;
# Line 158 | Line 171 | void sheepshaver_cpu::init_decoder()
171                  { "sheep",
172                    (execute_pmf)&sheepshaver_cpu::execute_sheep,
173                    NULL,
174 +                  PPC_I(SHEEP),
175                    D_form, 6, 0, CFLOW_JUMP | CFLOW_TRAP
176                  }
177          };
# Line 553 | Line 567 | static sigsegv_return_t sigsegv_handler(
567          if ((addr - ROM_BASE) < ROM_SIZE)
568                  return SIGSEGV_RETURN_SKIP_INSTRUCTION;
569  
570 <        // Ignore all other faults, if requested
571 <        if (PrefsFindBool("ignoresegv"))
572 <                return SIGSEGV_RETURN_FAILURE;
570 >        // Get program counter of target CPU
571 >        sheepshaver_cpu * const cpu = current_cpu;
572 >        const uint32 pc = cpu->pc();
573 >        
574 >        // Fault in Mac ROM or RAM?
575 >        bool mac_fault = (pc >= ROM_BASE) && (pc < (ROM_BASE + ROM_AREA_SIZE)) || (pc >= RAMBase) && (pc < (RAMBase + RAMSize));
576 >        if (mac_fault) {
577 >
578 >                // "VM settings" during MacOS 8 installation
579 >                if (pc == ROM_BASE + 0x488160 && cpu->gpr(20) == 0xf8000000)
580 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
581 >        
582 >                // MacOS 8.5 installation
583 >                else if (pc == ROM_BASE + 0x488140 && cpu->gpr(16) == 0xf8000000)
584 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
585 >        
586 >                // MacOS 8 serial drivers on startup
587 >                else if (pc == ROM_BASE + 0x48e080 && (cpu->gpr(8) == 0xf3012002 || cpu->gpr(8) == 0xf3012000))
588 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
589 >        
590 >                // MacOS 8.1 serial drivers on startup
591 >                else if (pc == ROM_BASE + 0x48c5e0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000))
592 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
593 >                else if (pc == ROM_BASE + 0x4a10a0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000))
594 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
595 >
596 >                // Ignore all other faults, if requested
597 >                if (PrefsFindBool("ignoresegv"))
598 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
599 >        }
600   #else
601   #error "FIXME: You don't have the capability to skip instruction within signal handlers"
602   #endif
# Line 673 | Line 714 | void TriggerInterrupt(void)
714   void sheepshaver_cpu::handle_interrupt(void)
715   {
716          // Do nothing if interrupts are disabled
717 <        if (int32(ReadMacInt32(XLM_IRQ_NEST)) > 0)
717 >        if (*(int32 *)XLM_IRQ_NEST > 0)
718                  return;
719  
720          // Do nothing if there is no interrupt pending
# Line 816 | Line 857 | static void NativeOp(int selector)
857                  GPR(3) = (int32)(int16)VideoDoDriverIO((void *)GPR(3), (void *)GPR(4),
858                                                                                             (void *)GPR(5), GPR(6), GPR(7));
859                  break;
860 <        case NATIVE_GET_RESOURCE:
861 <                get_resource();
860 > #ifdef WORDS_BIGENDIAN
861 >        case NATIVE_ETHER_IRQ:
862 >                EtherIRQ();
863                  break;
864 <        case NATIVE_GET_1_RESOURCE:
865 <                get_1_resource();
864 >        case NATIVE_ETHER_INIT:
865 >                GPR(3) = InitStreamModule((void *)GPR(3));
866                  break;
867 <        case NATIVE_GET_IND_RESOURCE:
868 <                get_ind_resource();
867 >        case NATIVE_ETHER_TERM:
868 >                TerminateStreamModule();
869                  break;
870 <        case NATIVE_GET_1_IND_RESOURCE:
871 <                get_1_ind_resource();
870 >        case NATIVE_ETHER_OPEN:
871 >                GPR(3) = ether_open((queue_t *)GPR(3), (void *)GPR(4), GPR(5), GPR(6), (void*)GPR(7));
872                  break;
873 <        case NATIVE_R_GET_RESOURCE:
874 <                r_get_resource();
873 >        case NATIVE_ETHER_CLOSE:
874 >                GPR(3) = ether_close((queue_t *)GPR(3), GPR(4), (void *)GPR(5));
875                  break;
876 +        case NATIVE_ETHER_WPUT:
877 +                GPR(3) = ether_wput((queue_t *)GPR(3), (mblk_t *)GPR(4));
878 +                break;
879 +        case NATIVE_ETHER_RSRV:
880 +                GPR(3) = ether_rsrv((queue_t *)GPR(3));
881 +                break;
882 + #else
883 +        case NATIVE_ETHER_INIT:
884 +                // FIXME: needs more complicated thunks
885 +                GPR(3) = false;
886 +                break;
887 + #endif
888          case NATIVE_SERIAL_NOTHING:
889          case NATIVE_SERIAL_OPEN:
890          case NATIVE_SERIAL_PRIME_IN:
# Line 851 | Line 905 | static void NativeOp(int selector)
905                  GPR(3) = serial_callbacks[selector - NATIVE_SERIAL_NOTHING](GPR(3), GPR(4));
906                  break;
907          }
908 +        case NATIVE_GET_RESOURCE:
909 +        case NATIVE_GET_1_RESOURCE:
910 +        case NATIVE_GET_IND_RESOURCE:
911 +        case NATIVE_GET_1_IND_RESOURCE:
912 +        case NATIVE_R_GET_RESOURCE: {
913 +                typedef void (*GetResourceCallback)(void);
914 +                static const GetResourceCallback get_resource_callbacks[] = {
915 +                        get_resource,
916 +                        get_1_resource,
917 +                        get_ind_resource,
918 +                        get_1_ind_resource,
919 +                        r_get_resource
920 +                };
921 +                get_resource_callbacks[selector - NATIVE_GET_RESOURCE]();
922 +                break;
923 +        }
924          case NATIVE_DISABLE_INTERRUPT:
925                  DisableInterrupt();
926                  break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines