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

Comparing SheepShaver/src/thunks.cpp (file contents):
Revision 1.7 by gbeauche, 2004-04-18T23:03:50Z vs.
Revision 1.16 by gbeauche, 2006-05-03T21:45:14Z

# Line 37 | Line 37
37  
38  
39   /*              NativeOp instruction format:
40 <                +------------+--------------------------+--+----------+------------+
41 <                |      6     |                          |FN|    OP    |      2     |
42 <                +------------+--------------------------+--+----------+------------+
43 <                 0         5 |6                       19 20 21      25 26        31
40 >                +------------+-------------------------+--+-----------+------------+
41 >                |      6     |                         |FN|    OP     |      2     |
42 >                +------------+-------------------------+--+-----------+------------+
43 >                 0         5 |6                      18 19 20      25 26        31
44   */
45  
46 < #define POWERPC_NATIVE_OP(LR, OP) \
47 <                (POWERPC_EMUL_OP | ((LR) << 11) | (((uint32)OP) << 6) | 2)
46 > #define POWERPC_NATIVE_OP(FN, OP) \
47 >                (POWERPC_EMUL_OP | ((FN) << 12) | (((uint32)OP) << 6) | 2)
48  
49   /*
50   *  Return the fake PowerPC opcode to handle specified native code
# Line 55 | Line 55 | uint32 NativeOpcode(int selector)
55   {
56          uint32 opcode;
57          switch (selector) {
58        case NATIVE_DISABLE_INTERRUPT:
59        case NATIVE_ENABLE_INTERRUPT:
58          case NATIVE_CHECK_LOAD_INVOC:
59 +        case NATIVE_NAMED_CHECK_LOAD_INVOC:
60                  opcode = POWERPC_NATIVE_OP(0, selector);
61                  break;
62          case NATIVE_PATCH_NAME_REGISTRY:
63          case NATIVE_VIDEO_INSTALL_ACCEL:
64          case NATIVE_VIDEO_VBL:
65          case NATIVE_VIDEO_DO_DRIVER_IO:
66 +        case NATIVE_ETHER_AO_GET_HWADDR:
67 +        case NATIVE_ETHER_AO_ADD_MULTI:
68 +        case NATIVE_ETHER_AO_DEL_MULTI:
69 +        case NATIVE_ETHER_AO_SEND_PACKET:
70          case NATIVE_ETHER_IRQ:
71          case NATIVE_ETHER_INIT:
72          case NATIVE_ETHER_TERM:
# Line 83 | Line 86 | uint32 NativeOpcode(int selector)
86          case NATIVE_GET_IND_RESOURCE:
87          case NATIVE_GET_1_IND_RESOURCE:
88          case NATIVE_R_GET_RESOURCE:
89 +        case NATIVE_GET_NAMED_RESOURCE:
90 +        case NATIVE_GET_1_NAMED_RESOURCE:
91          case NATIVE_MAKE_EXECUTABLE:
92          case NATIVE_SYNC_HOOK:
93          case NATIVE_BITBLT_HOOK:
94          case NATIVE_FILLRECT_HOOK:
95          case NATIVE_BITBLT:
96          case NATIVE_INVRECT:
97 <        case NATIVE_FILLRECT_8:
93 <        case NATIVE_FILLRECT_32:
97 >        case NATIVE_FILLRECT:
98                  opcode = POWERPC_NATIVE_OP(1, selector);
99                  break;
100          default:
# Line 111 | Line 115 | static uint32 get_1_resource_func;
115   static uint32 get_ind_resource_func;
116   static uint32 get_1_ind_resource_func;
117   static uint32 r_get_resource_func;
118 + static uint32 get_named_resource_func;
119 + static uint32 get_1_named_resource_func;
120  
121   static void generate_powerpc_thunks(void)
122   {
123 +        // check_load_invoc() thunk
124 +        uint32 check_load_invoc_opcode = NativeOpcode(NATIVE_CHECK_LOAD_INVOC);
125 +        uint32 base;
126 +
127          static uint32 get_resource_template[] = {
128                  PL(0x7c0802a6),         // mflr    r0
129                  PL(0x90010008),         // stw     r0,8(r1)
# Line 151 | Line 161 | static void generate_powerpc_thunks(void
161          }
162          assert(xlm_index != -1 && check_load_invoc_index != -1);
163  
154        uint32 check_load_invoc_opcode = NativeOpcode(NATIVE_CHECK_LOAD_INVOC);
155        uintptr base;
156
164          // GetResource()
165          get_resource_func = base = SheepMem::Reserve(get_resource_template_size);
166          Host2Mac_memcpy(base, get_resource_template, get_resource_template_size);
# Line 183 | Line 190 | static void generate_powerpc_thunks(void
190          Host2Mac_memcpy(base, get_resource_template, get_resource_template_size);
191          WriteMacInt32(base + xlm_index * 4, 0x80000000 | XLM_R_GET_RESOURCE);
192          WriteMacInt32(base + check_load_invoc_index * 4, check_load_invoc_opcode);
193 +
194 +        // named_check_load_invoc() thunk
195 +        check_load_invoc_opcode = NativeOpcode(NATIVE_NAMED_CHECK_LOAD_INVOC);
196 +
197 +        static uint32 get_named_resource_template[] = {
198 +                PL(0x7c0802a6),         // mflr    r0
199 +                PL(0x90010008),         // stw     r0,8(r1)
200 +                PL(0x9421ffbc),         // stwu    r1,-68(r1)
201 +                PL(0x90610038),         // stw     r3,56(r1)
202 +                PL(0x9081003c),         // stw     r4,60(r1)
203 +                PL(0x00000000),         // lwz     r0,XLM_GET_NAMED_RESOURCE(r0)
204 +                PL(0x80402834),         // lwz     r2,XLM_RES_LIB_TOC(r0)
205 +                PL(0x7c0903a6),         // mtctr   r0
206 +                PL(0x4e800421),         // bctrl
207 +                PL(0x90610040),         // stw     r3,64(r1)
208 +                PL(0x80610038),         // lwz     r3,56(r1)
209 +                PL(0x8081003c),         // lwz     r4,60(r1)
210 +                PL(0x80a10040),         // lwz     r5,64(r1)
211 +                PL(0x00000001),         // <named_check_load_invoc>
212 +                PL(0x80610040),         // lwz     r3,64(r1)
213 +                PL(0x8001004c),         // lwz     r0,76(r1)
214 +                PL(0x7c0803a6),         // mtlr    r0
215 +                PL(0x38210044),         // addi    r1,r1,68
216 +                PL(0x4e800020)          // blr
217 +        };
218 +        const uint32 get_named_resource_template_size = sizeof(get_named_resource_template);
219 +
220 +        xlm_index = -1, check_load_invoc_index = -1;
221 +        for (int i = 0; i < get_resource_template_size/4; i++) {
222 +                uint32 opcode = ntohl(get_resource_template[i]);
223 +                switch (opcode) {
224 +                case 0x00000000:
225 +                        xlm_index = i;
226 +                        break;
227 +                case 0x00000001:
228 +                        check_load_invoc_index = i;
229 +                        break;
230 +                }
231 +        }
232 +        assert(xlm_index != -1 && check_load_invoc_index != -1);
233 +
234 +        // GetNamedResource()
235 +        get_named_resource_func = base = SheepMem::Reserve(get_named_resource_template_size);
236 +        Host2Mac_memcpy(base, get_named_resource_template, get_named_resource_template_size);
237 +        WriteMacInt32(base + xlm_index * 4, 0x80000000 | XLM_GET_NAMED_RESOURCE);
238 +        WriteMacInt32(base + check_load_invoc_index * 4, check_load_invoc_opcode);
239 +
240 +        // Get1NamedResource()
241 +        get_1_named_resource_func = base = SheepMem::Reserve(get_named_resource_template_size);
242 +        Host2Mac_memcpy(base, get_named_resource_template, get_named_resource_template_size);
243 +        WriteMacInt32(base + xlm_index * 4, 0x80000000 | XLM_GET_1_NAMED_RESOURCE);
244 +        WriteMacInt32(base + check_load_invoc_index * 4, check_load_invoc_opcode);
245   }
246   #endif
247  
# Line 216 | Line 275 | bool ThunksInit(void)
275          native_op[NATIVE_GET_IND_RESOURCE].func = get_ind_resource_func;
276          native_op[NATIVE_GET_1_IND_RESOURCE].func = get_1_ind_resource_func;
277          native_op[NATIVE_R_GET_RESOURCE].func = r_get_resource_func;
278 +        native_op[NATIVE_GET_NAMED_RESOURCE].func = get_named_resource_func;
279 +        native_op[NATIVE_GET_1_NAMED_RESOURCE].func = get_1_named_resource_func;
280   #endif
281   #else
282 < #if defined(__linux__) || (defined(__APPLE__) && defined(__MACH__))
282 > #if defined(__linux__) || defined(__NetBSD__) || (defined(__APPLE__) && defined(__MACH__))
283   #define DEFINE_NATIVE_OP(ID, FUNC) do {                         \
284                  uintptr base = SheepMem::Reserve(8);            \
285                  WriteMacInt32(base + 0, (uint32)FUNC);          \
286 <                WriteMacInt32(base + 4, 0); /*Fake TVECT*/      \
286 >                WriteMacInt32(base + 4, (uint32)TOC);           \
287                  native_op[ID].tvect = base;                                     \
288                  native_op[ID].func  = (uint32)FUNC;                     \
289          } while (0)
# Line 239 | Line 300 | bool ThunksInit(void)
300          DEFINE_NATIVE_OP(NATIVE_VIDEO_INSTALL_ACCEL, VideoInstallAccel);
301          DEFINE_NATIVE_OP(NATIVE_VIDEO_VBL, VideoVBL);
302          DEFINE_NATIVE_OP(NATIVE_VIDEO_DO_DRIVER_IO, VideoDoDriverIO);
303 +        DEFINE_NATIVE_OP(NATIVE_ETHER_AO_GET_HWADDR, AO_get_ethernet_address);
304 +        DEFINE_NATIVE_OP(NATIVE_ETHER_AO_ADD_MULTI, AO_enable_multicast);
305 +        DEFINE_NATIVE_OP(NATIVE_ETHER_AO_DEL_MULTI, AO_disable_multicast);
306 +        DEFINE_NATIVE_OP(NATIVE_ETHER_AO_SEND_PACKET, AO_transmit_packet);
307          DEFINE_NATIVE_OP(NATIVE_ETHER_IRQ, EtherIRQ);
308          DEFINE_NATIVE_OP(NATIVE_ETHER_INIT, InitStreamModule);
309          DEFINE_NATIVE_OP(NATIVE_ETHER_TERM, TerminateStreamModule);
# Line 256 | Line 321 | bool ThunksInit(void)
321          DEFINE_NATIVE_OP(NATIVE_MAKE_EXECUTABLE, MakeExecutable);
322          DEFINE_NATIVE_OP(NATIVE_SYNC_HOOK, NQD_sync_hook);
323          DEFINE_NATIVE_OP(NATIVE_BITBLT_HOOK, NQD_bitblt_hook);
324 < //      DEFINE_NATIVE_OP(NATIVE_FILLRECT_HOOK, NQD_fillrect_hook);
324 >        DEFINE_NATIVE_OP(NATIVE_FILLRECT_HOOK, NQD_fillrect_hook);
325          DEFINE_NATIVE_OP(NATIVE_BITBLT, NQD_bitblt);
326 < //      DEFINE_NATIVE_OP(NATIVE_INVRECT, NQD_invrect);
327 < //      DEFINE_NATIVE_OP(NATIVE_FILLRECT_8, NQD_fillrect8);
263 < //      DEFINE_NATIVE_OP(NATIVE_FILLRECT_32, NQD_fillrect32);
326 >        DEFINE_NATIVE_OP(NATIVE_INVRECT, NQD_invrect);
327 >        DEFINE_NATIVE_OP(NATIVE_FILLRECT, NQD_fillrect);
328   #undef DEFINE_NATIVE_OP
329   #endif
330  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines