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.1 by gbeauche, 2003-12-04T17:26:35Z vs.
Revision 1.5 by gbeauche, 2004-01-18T22:10:09Z

# Line 29 | Line 29
29   #include "name_registry.h"
30   #include "serial.h"
31   #include "ether.h"
32 + #include "macos_util.h"
33  
34  
35   /*              NativeOp instruction format:
# Line 41 | Line 42
42   #define POWERPC_NATIVE_OP(LR, OP) \
43                  (POWERPC_EMUL_OP | ((LR) << 11) | (((uint32)OP) << 6) | 2)
44  
45 < // Return the fake PowerPC opcode to handle specified native code
45 > /*
46 > *  Return the fake PowerPC opcode to handle specified native code
47 > */
48 >
49   #if EMULATED_PPC
50   uint32 NativeOpcode(int selector)
51   {
# Line 84 | Line 88 | uint32 NativeOpcode(int selector)
88   }
89   #endif
90  
91 < // NativeOp -> { TVECT, function base } mappings
91 >
92 > /*
93 > *  Initialize the thunks system
94 > */
95 >
96   struct native_op_t {
97          uint32 tvect;
98          uint32 func;
99 +        SheepRoutineDescriptor *desc;
100   };
101   static native_op_t native_op[NATIVE_OP_MAX];
102  
94 // Initialize the thunks system
103   bool ThunksInit(void)
104   {
105   #if EMULATED_PPC
# Line 104 | Line 112 | bool ThunksInit(void)
112                  native_op[i].func  = base + 8;
113          }
114   #else
115 < #if defined(__linux__)
115 > #if defined(__linux__) || (defined(__APPLE__) && defined(__MACH__))
116   #define DEFINE_NATIVE_OP(ID, FUNC) do {                         \
117                  uintptr base = SheepMem::Reserve(8);            \
118                  WriteMacInt32(base + 0, (uint32)FUNC);          \
# Line 120 | Line 128 | bool ThunksInit(void)
128   #else
129   #error "FIXME: define NativeOp for your platform"
130   #endif
131 +        // FIXME: add GetResource() and friends for completeness
132 +        DEFINE_NATIVE_OP(NATIVE_PATCH_NAME_REGISTRY, DoPatchNameRegistry);
133 +        DEFINE_NATIVE_OP(NATIVE_VIDEO_INSTALL_ACCEL, VideoInstallAccel);
134 +        DEFINE_NATIVE_OP(NATIVE_VIDEO_VBL, VideoVBL);
135 +        DEFINE_NATIVE_OP(NATIVE_VIDEO_DO_DRIVER_IO, VideoDoDriverIO);
136 +        DEFINE_NATIVE_OP(NATIVE_ETHER_IRQ, EtherIRQ);
137 +        DEFINE_NATIVE_OP(NATIVE_ETHER_INIT, InitStreamModule);
138 +        DEFINE_NATIVE_OP(NATIVE_ETHER_TERM, TerminateStreamModule);
139 +        DEFINE_NATIVE_OP(NATIVE_ETHER_OPEN, ether_open);
140 +        DEFINE_NATIVE_OP(NATIVE_ETHER_CLOSE, ether_close);
141 +        DEFINE_NATIVE_OP(NATIVE_ETHER_WPUT, ether_wput);
142 +        DEFINE_NATIVE_OP(NATIVE_ETHER_RSRV, ether_rsrv);
143          DEFINE_NATIVE_OP(NATIVE_SERIAL_NOTHING, SerialNothing);
144          DEFINE_NATIVE_OP(NATIVE_SERIAL_OPEN, SerialOpen);
145          DEFINE_NATIVE_OP(NATIVE_SERIAL_PRIME_IN, SerialPrimeIn);
# Line 130 | Line 150 | bool ThunksInit(void)
150          DEFINE_NATIVE_OP(NATIVE_MAKE_EXECUTABLE, MakeExecutable);
151   #undef DEFINE_NATIVE_OP
152   #endif
153 +
154 +        // Initialize routine descriptors (if TVECT exists)
155 +        for (int i = 0; i < NATIVE_OP_MAX; i++) {
156 +                uint32 tvect = native_op[i].tvect;
157 +                if (tvect)
158 +                        native_op[i].desc = new SheepRoutineDescriptor(0, tvect);
159 +        }
160 +
161          return true;
162   }
163  
164 < // Return the native function descriptor (TVECT)
164 >
165 > /*
166 > *  Delete generated thunks
167 > */
168 >
169 > void ThunksExit(void)
170 > {
171 >        for (int i = 0; i < NATIVE_OP_MAX; i++) {
172 >                SheepRoutineDescriptor *desc = native_op[i].desc;
173 >                if (desc)
174 >                        delete desc;
175 >        }
176 > }
177 >
178 >
179 > /*
180 > *  Return the native function descriptor (TVECT)
181 > */
182 >
183   uint32 NativeTVECT(int selector)
184   {
185          assert(selector < NATIVE_OP_MAX);
186          const uint32 tvect = native_op[selector].tvect;
187          assert(tvect != 0);
188 <        return native_op[selector].tvect;
188 >        return tvect;
189   }
190  
191 < // Return the native function address
191 >
192 > /*
193 > *  Return the native function address
194 > */
195 >
196   uint32 NativeFunction(int selector)
197   {
198          assert(selector < NATIVE_OP_MAX);
199          const uint32 func = native_op[selector].func;
200          assert(func != 0);
201 <        return native_op[selector].func;
201 >        return func;
202 > }
203 >
204 >
205 > /*
206 > *  Return the routine descriptor address of the native function
207 > */
208 >
209 > uint32 NativeRoutineDescriptor(int selector)
210 > {
211 >        assert(selector < NATIVE_OP_MAX);
212 >        SheepRoutineDescriptor * const desc = native_op[selector].desc;
213 >        assert(desc != 0);
214 >        return desc->addr();
215 > }
216 >
217 >
218 > /*
219 > *  Execute native code from EMUL_OP routine (real mode switch)
220 > */
221 >
222 > void ExecuteNative(int selector)
223 > {
224 >        M68kRegisters r;
225 >        Execute68k(NativeRoutineDescriptor(selector), &r);
226   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines