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.17 by gbeauche, 2003-11-10T16:23:58Z

# Line 35 | Line 35
35   #include "video.h"
36   #include "name_registry.h"
37   #include "serial.h"
38 + #include "ether.h"
39  
40   #include <stdio.h>
41  
# Line 88 | Line 89 | static void enter_mon(void)
89   // Pointer to Kernel Data
90   static KernelData * const kernel_data = (KernelData *)KERNEL_DATA_BASE;
91  
92 + // SIGSEGV handler
93 + static sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t);
94 +
95  
96   /**
97   *              PowerPC emulator glue with special 'sheep' opcodes
# Line 135 | Line 139 | public:
139          // FIXME: really make surre array allocation fail at link time?
140          void *operator new[](size_t);
141          void operator delete[](void *p);
142 +
143 +        // Make sure the SIGSEGV handler can access CPU registers
144 +        friend sigsegv_return_t sigsegv_handler(sigsegv_address_t, sigsegv_address_t);
145   };
146  
147   lazy_allocator< sheepshaver_cpu > allocator_helper< sheepshaver_cpu, lazy_allocator >::allocator;
# Line 553 | Line 560 | static sigsegv_return_t sigsegv_handler(
560          if ((addr - ROM_BASE) < ROM_SIZE)
561                  return SIGSEGV_RETURN_SKIP_INSTRUCTION;
562  
563 <        // Ignore all other faults, if requested
564 <        if (PrefsFindBool("ignoresegv"))
565 <                return SIGSEGV_RETURN_FAILURE;
563 >        // Get program counter of target CPU
564 >        sheepshaver_cpu * const cpu = current_cpu;
565 >        const uint32 pc = cpu->pc();
566 >        
567 >        // Fault in Mac ROM or RAM?
568 >        bool mac_fault = (pc >= ROM_BASE) && (pc < (ROM_BASE + ROM_AREA_SIZE)) || (pc >= RAMBase) && (pc < (RAMBase + RAMSize));
569 >        if (mac_fault) {
570 >
571 >                // "VM settings" during MacOS 8 installation
572 >                if (pc == ROM_BASE + 0x488160 && cpu->gpr(20) == 0xf8000000)
573 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
574 >        
575 >                // MacOS 8.5 installation
576 >                else if (pc == ROM_BASE + 0x488140 && cpu->gpr(16) == 0xf8000000)
577 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
578 >        
579 >                // MacOS 8 serial drivers on startup
580 >                else if (pc == ROM_BASE + 0x48e080 && (cpu->gpr(8) == 0xf3012002 || cpu->gpr(8) == 0xf3012000))
581 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
582 >        
583 >                // MacOS 8.1 serial drivers on startup
584 >                else if (pc == ROM_BASE + 0x48c5e0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000))
585 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
586 >                else if (pc == ROM_BASE + 0x4a10a0 && (cpu->gpr(20) == 0xf3012002 || cpu->gpr(20) == 0xf3012000))
587 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
588 >
589 >                // Ignore all other faults, if requested
590 >                if (PrefsFindBool("ignoresegv"))
591 >                        return SIGSEGV_RETURN_SKIP_INSTRUCTION;
592 >        }
593   #else
594   #error "FIXME: You don't have the capability to skip instruction within signal handlers"
595   #endif
# Line 673 | Line 707 | void TriggerInterrupt(void)
707   void sheepshaver_cpu::handle_interrupt(void)
708   {
709          // Do nothing if interrupts are disabled
710 <        if (int32(ReadMacInt32(XLM_IRQ_NEST)) > 0)
710 >        if (*(int32 *)XLM_IRQ_NEST > 0)
711                  return;
712  
713          // Do nothing if there is no interrupt pending
# Line 816 | Line 850 | static void NativeOp(int selector)
850                  GPR(3) = (int32)(int16)VideoDoDriverIO((void *)GPR(3), (void *)GPR(4),
851                                                                                             (void *)GPR(5), GPR(6), GPR(7));
852                  break;
853 <        case NATIVE_GET_RESOURCE:
854 <                get_resource();
853 > #ifdef WORDS_BIGENDIAN
854 >        case NATIVE_ETHER_IRQ:
855 >                EtherIRQ();
856                  break;
857 <        case NATIVE_GET_1_RESOURCE:
858 <                get_1_resource();
857 >        case NATIVE_ETHER_INIT:
858 >                GPR(3) = InitStreamModule((void *)GPR(3));
859                  break;
860 <        case NATIVE_GET_IND_RESOURCE:
861 <                get_ind_resource();
860 >        case NATIVE_ETHER_TERM:
861 >                TerminateStreamModule();
862                  break;
863 <        case NATIVE_GET_1_IND_RESOURCE:
864 <                get_1_ind_resource();
863 >        case NATIVE_ETHER_OPEN:
864 >                GPR(3) = ether_open((queue_t *)GPR(3), (void *)GPR(4), GPR(5), GPR(6), (void*)GPR(7));
865 >                break;
866 >        case NATIVE_ETHER_CLOSE:
867 >                GPR(3) = ether_close((queue_t *)GPR(3), GPR(4), (void *)GPR(5));
868                  break;
869 <        case NATIVE_R_GET_RESOURCE:
870 <                r_get_resource();
869 >        case NATIVE_ETHER_WPUT:
870 >                GPR(3) = ether_wput((queue_t *)GPR(3), (mblk_t *)GPR(4));
871                  break;
872 +        case NATIVE_ETHER_RSRV:
873 +                GPR(3) = ether_rsrv((queue_t *)GPR(3));
874 +                break;
875 + #else
876 +        case NATIVE_ETHER_INIT:
877 +                // FIXME: needs more complicated thunks
878 +                GPR(3) = false;
879 +                break;
880 + #endif
881          case NATIVE_SERIAL_NOTHING:
882          case NATIVE_SERIAL_OPEN:
883          case NATIVE_SERIAL_PRIME_IN:
# Line 851 | Line 898 | static void NativeOp(int selector)
898                  GPR(3) = serial_callbacks[selector - NATIVE_SERIAL_NOTHING](GPR(3), GPR(4));
899                  break;
900          }
901 +        case NATIVE_GET_RESOURCE:
902 +        case NATIVE_GET_1_RESOURCE:
903 +        case NATIVE_GET_IND_RESOURCE:
904 +        case NATIVE_GET_1_IND_RESOURCE:
905 +        case NATIVE_R_GET_RESOURCE: {
906 +                typedef void (*GetResourceCallback)(void);
907 +                static const GetResourceCallback get_resource_callbacks[] = {
908 +                        get_resource,
909 +                        get_1_resource,
910 +                        get_ind_resource,
911 +                        get_1_ind_resource,
912 +                        r_get_resource
913 +                };
914 +                get_resource_callbacks[selector - NATIVE_GET_RESOURCE]();
915 +                break;
916 +        }
917          case NATIVE_DISABLE_INTERRUPT:
918                  DisableInterrupt();
919                  break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines