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

Comparing SheepShaver/src/rsrc_patches.cpp (file contents):
Revision 1.16 by gbeauche, 2005-07-02T17:51:43Z vs.
Revision 1.17 by gbeauche, 2006-05-03T21:45:14Z

# Line 581 | Line 581 | void CheckLoad(uint32 type, int16 id, ui
581  
582  
583   /*
584 + *  Resource patches via GetNamedResource() and Get1NamedResource()
585 + */
586 +
587 + void CheckLoad(uint32 type, const char *name, uint8 *p, uint32 size)
588 + {
589 +        uint16 *p16;
590 +        uint32 base;
591 +        D(bug("vCheckLoad %c%c%c%c (%08x) name \"%*s\", data %p, size %d\n", type >> 24, (type >> 16) & 0xff, (type >> 8) & 0xff, type & 0xff, type, name[0], &name[1], p, size));
592 +
593 +        // Don't modify resources in ROM
594 +        if ((uintptr)p >= (uintptr)ROMBaseHost && (uintptr)p <= (uintptr)(ROMBaseHost + ROM_SIZE))
595 +                return;
596 + }
597 +
598 +
599 + /*
600   *  Native Resource Manager patches
601   */
602  
# Line 602 | Line 618 | void check_load_invoc(uint32 type, int16
618   }
619  
620   #ifdef __BEOS__
621 + static
622 + #else
623 + extern "C"
624 + #endif
625 + void named_check_load_invoc(uint32 type, uint32 name, uint32 h)
626 + {
627 +        if (h == 0)
628 +                return;
629 +        uint32 p = ReadMacInt32(h);
630 +        if (p == 0)
631 +                return;
632 +        uint32 size = ReadMacInt32(p - 2 * 4) & 0xffffff;
633 +
634 +        CheckLoad(type, (char *)Mac2HostAddr(name), Mac2HostAddr(p), size);
635 + }
636 +
637 + #ifdef __BEOS__
638   static asm void **get_resource(register uint32 type, register int16 id)
639   {
640          // Create stack frame
# Line 766 | Line 799 | static asm void **r_get_resource(registe
799          addi    r1,r1,56+12
800          blr
801   }
802 +
803 + static asm void **get_named_resource(register uint32 type, register uint32 name)
804 + {
805 +        // Create stack frame
806 +        mflr    r0
807 +        stw             r0,8(r1)
808 +        stwu    r1,-(56+12)(r1)
809 +
810 +        // Save type/ID
811 +        stw             r3,56(r1)
812 +        stw             r4,56+4(r1)
813 +
814 +        // Call old routine
815 +        lwz             r0,XLM_GET_NAMED_RESOURCE
816 +        lwz             r2,XLM_RES_LIB_TOC
817 +        mtctr   r0
818 +        bctrl
819 +        lwz             r2,XLM_TOC              // Get TOC
820 +        stw             r3,56+8(r1)             // Save handle
821 +
822 +        // Call CheckLoad
823 +        lwz             r3,56(r1)
824 +        lwz             r4,56+4(r1)
825 +        lwz             r5,56+8(r1)
826 +        bl              named_check_load_invoc
827 +        lwz             r3,56+8(r1)             // Restore handle
828 +
829 +        // Return to caller
830 +        lwz             r0,56+12+8(r1)
831 +        mtlr    r0
832 +        addi    r1,r1,56+12
833 +        blr
834 + }
835 +
836 + static asm void **get_1_named_resource(register uint32 type, register uint32 name)
837 + {
838 +        // Create stack frame
839 +        mflr    r0
840 +        stw             r0,8(r1)
841 +        stwu    r1,-(56+12)(r1)
842 +
843 +        // Save type/ID
844 +        stw             r3,56(r1)
845 +        stw             r4,56+4(r1)
846 +
847 +        // Call old routine
848 +        lwz             r0,XLM_GET_1_NAMED_RESOURCE
849 +        lwz             r2,XLM_RES_LIB_TOC
850 +        mtctr   r0
851 +        bctrl
852 +        lwz             r2,XLM_TOC              // Get TOC
853 +        stw             r3,56+8(r1)             // Save handle
854 +
855 +        // Call CheckLoad
856 +        lwz             r3,56(r1)
857 +        lwz             r4,56+4(r1)
858 +        lwz             r5,56+8(r1)
859 +        bl              named_check_load_invoc
860 +        lwz             r3,56+8(r1)             // Restore handle
861 +
862 +        // Return to caller
863 +        lwz             r0,56+12+8(r1)
864 +        mtlr    r0
865 +        addi    r1,r1,56+12
866 +        blr
867 + }
868   #else
869   // Routines in asm_linux.S
870   extern "C" void get_resource(void);
# Line 773 | Line 872 | extern "C" void get_1_resource(void);
872   extern "C" void get_ind_resource(void);
873   extern "C" void get_1_ind_resource(void);
874   extern "C" void r_get_resource(void);
875 + extern "C" void get_named_resource(void);
876 + extern "C" void get_1_named_resource(void);
877   #endif
878  
879   void PatchNativeResourceManager(void)
# Line 866 | Line 967 | void PatchNativeResourceManager(void)
967          WriteMacInt32(tvec, (uint32)r_get_resource);
968   #endif
969   #endif
970 +
971 +        // Patch native GetNamedResource()
972 +        upp = ReadMacInt32(0x1484);
973 +        tvec = ReadMacInt32(upp + 5 * 4);
974 +        D(bug(" GetNamedResource() entry %08x, TOC %08x\n", ReadMacInt32(tvec), ReadMacInt32(tvec + 4)));
975 +        WriteMacInt32(XLM_GET_NAMED_RESOURCE, ReadMacInt32(tvec));
976 + #if EMULATED_PPC
977 +        WriteMacInt32(tvec, NativeFunction(NATIVE_GET_NAMED_RESOURCE));
978 + #else
979 + #ifdef __BEOS__
980 +        tvec2 = (uint32 *)get_named_resource;
981 +        WriteMacInt32(tvec, tvec2[0]);
982 +        WriteMacInt32(tvec + 4, tvec2[1]);
983 + #else
984 +        WriteMacInt32(tvec, (uint32)get_named_resource);
985 + #endif
986 + #endif
987 +
988 +        // Patch native Get1NamedResource()
989 +        upp = ReadMacInt32(0x0e80);
990 +        tvec = ReadMacInt32(upp + 5 * 4);
991 +        D(bug(" Get1NamedResource() entry %08x, TOC %08x\n", ReadMacInt32(tvec), ReadMacInt32(tvec + 4)));
992 +        WriteMacInt32(XLM_GET_1_NAMED_RESOURCE, ReadMacInt32(tvec));
993 + #if EMULATED_PPC
994 +        WriteMacInt32(tvec, NativeFunction(NATIVE_GET_1_NAMED_RESOURCE));
995 + #else
996 + #ifdef __BEOS__
997 +        tvec2 = (uint32 *)get_1_named_resource;
998 +        WriteMacInt32(tvec, tvec2[0]);
999 +        WriteMacInt32(tvec + 4, tvec2[1]);
1000 + #else
1001 +        WriteMacInt32(tvec, (uint32)get_1_named_resource);
1002 + #endif
1003 + #endif
1004   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines