3 Interface from UDI calls in 32-bit mode to go32 in 16-bit mode.
4 Communication is done through a single interrupt vector, which passes
5 data through two linear buffers.
9 AL = UDI function number
11 ESI = pointer to IN buffer
12 EDI = pointer to OUT buffer
15 EAX = return value of UDI function
29 static char in_buffer
[4096];
30 static char out_buffer
[4096];
34 #define IN_INIT() in_ptr = in_buffer
35 #define IN_VAL(t,v) *((t *)in_ptr)++ = v
36 #define IN_DATA(ptr, cnt) memcpy(in_ptr, ptr, cnt), in_ptr += cnt
38 #define OUT_INIT() out_ptr = out_buffer
39 #define OUT_VAL(t) (*((t *)out_ptr)++)
40 #define OUT_DATA(ptr, cnt) memcpy(ptr, out_ptr, cnt), out_ptr += cnt
42 static int DO_CALL(int function
)
46 asm("movb %0, %%al" : : "g" (function
));
47 asm("movl _in_ptr, %ecx");
48 asm("movl $_in_buffer, %esi");
49 asm("subl %esi, %ecx");
50 asm("movl $_out_buffer, %edi");
51 asm("movb $0xfe, %ah");
57 /*----------------------------------------------------------------------*/
66 IN_VAL(long, 11111111);
68 IN_DATA("Hello, world\n", 17);
75 printf("main: p1=%d p2=%d rv=%d\n", p1
, p2
, r
);
80 /*----------------------------------------------------------------------*/
84 printf("unsupported UDI host call %s\n", s
);
89 char *Configuration
, /* In */
90 UDISessionId
*Session
/* Out */
94 out_buffer
[0] = 0; /* DJ - test */
96 IN_DATA(Configuration
, strlen(Configuration
)+1);
98 r
= DO_CALL(UDIConnect_c
);
101 *Session
= OUT_VAL(UDISessionId
);
105 UDIError
UDIDisconnect (
106 UDISessionId Session
, /* In */
107 UDIBool Terminate
/* In */
112 IN_VAL(UDISessionId
, Session
);
113 IN_VAL(UDIBool
, Terminate
);
115 return DO_CALL(UDIDisconnect_c
);
118 UDIError
UDISetCurrentConnection (
119 UDISessionId Session
/* In */
123 IN_VAL(UDISessionId
, Session
);
125 return DO_CALL(UDISetCurrentConnection_c
);
128 UDIError
UDICapabilities (
129 UDIUInt32
*TIPId
, /* Out */
130 UDIUInt32
*TargetId
, /* Out */
131 UDIUInt32 DFEId
, /* In */
132 UDIUInt32 DFE
, /* In */
133 UDIUInt32
*TIP
, /* Out */
134 UDIUInt32
*DFEIPCId
, /* Out */
135 UDIUInt32
*TIPIPCId
, /* Out */
136 char *TIPString
/* Out */
141 IN_VAL(UDIUInt32
, DFEId
);
142 IN_VAL(UDIUInt32
, DFE
);
143 r
= DO_CALL(UDICapabilities_c
);
145 *TIPId
= OUT_VAL(UDIUInt32
);
146 *TargetId
= OUT_VAL(UDIUInt32
);
147 *TIP
= OUT_VAL(UDIUInt32
);
148 *DFEIPCId
= OUT_VAL(UDIUInt32
);
149 *TIPIPCId
= OUT_VAL(UDIUInt32
);
150 strcpy(TIPString
, out_ptr
);
154 UDIError
UDIEnumerateTIPs (
155 UDIInt (*UDIETCallback
) /* In */
156 ( char *Configuration
) /* In to callback() */
159 UDIETCallback("montip.exe");
162 UDIError
UDIGetErrorMsg (
163 UDIError ErrorCode
, /* In */
164 UDISizeT MsgSize
, /* In */
166 UDISizeT
*CountDone
/* Out */
173 IN_VAL(UDIError
, ErrorCode
);
174 IN_VAL(UDISizeT
, MsgSize
);
176 r
= DO_CALL(UDIGetErrorMsg_c
);
179 *CountDone
= OUT_VAL(UDISizeT
);
180 OUT_DATA(Msg
, *CountDone
);
184 UDIError
UDIGetTargetConfig (
185 UDIMemoryRange KnownMemory
[], /* Out */
186 UDIInt
*NumberOfRanges
, /* In/Out */
187 UDIUInt32 ChipVersions
[], /* Out */
188 UDIInt
*NumberOfChips
/* In/Out */
192 int nr
= *NumberOfRanges
;
193 int nc
= *NumberOfChips
;
195 IN_VAL(UDIInt
, *NumberOfRanges
);
196 IN_VAL(UDIInt
, *NumberOfChips
);
197 r
= DO_CALL(UDIGetTargetConfig_c
);
198 if (r
== UDIErrorIncomplete
)
201 *NumberOfRanges
= OUT_VAL(UDIInt
);
202 *NumberOfChips
= OUT_VAL(UDIInt
);
205 KnownMemory
[i
].Space
= OUT_VAL(short);
206 KnownMemory
[i
].Offset
= OUT_VAL(CPUOffset
);
207 KnownMemory
[i
].Size
= OUT_VAL(CPUSizeT
);
211 ChipVersions
[i
] = OUT_VAL(UDIUInt32
);
216 UDIError
UDICreateProcess (
217 UDIPId
*PId
/* Out */
220 int r
= DO_CALL(UDICreateProcess_c
);
223 *PId
= OUT_VAL(UDIPId
);
228 UDIError
UDISetCurrentProcess (
235 return DO_CALL(UDISetCurrentProcess_c
);
238 UDIError
UDIDestroyProcess (
245 return DO_CALL(UDIDestroyProcess_c
);
248 UDIError
UDIInitializeProcess (
249 UDIMemoryRange ProcessMemory
[], /* In */
250 UDIInt NumberOfRanges
, /* In */
251 UDIResource EntryPoint
, /* In */
252 CPUSizeT StackSizes
[], /* In */
253 UDIInt NumberOfStacks
, /* In */
254 char *ArgString
/* In */
259 IN_VAL(UDIInt
, NumberOfRanges
);
260 for (i
=0; i
<NumberOfRanges
; i
++)
262 IN_VAL(short, ProcessMemory
[i
].Space
);
263 IN_VAL(CPUOffset
, ProcessMemory
[i
].Offset
);
264 IN_VAL(CPUSizeT
, ProcessMemory
[i
].Size
);
266 IN_VAL(short, EntryPoint
.Space
);
267 IN_VAL(CPUOffset
, EntryPoint
.Offset
);
268 IN_VAL(UDIInt
, NumberOfStacks
);
269 for (i
=0; i
<NumberOfStacks
; i
++)
270 IN_VAL(CPUSizeT
, StackSizes
[i
]);
271 IN_DATA(ArgString
, strlen(ArgString
)+1);
273 return DO_CALL(UDIInitializeProcess_c
);
277 UDIResource From
, /* In */
278 UDIHostMemPtr To
, /* Out */
279 UDICount Count
, /* In */
280 UDISizeT Size
, /* In */
281 UDICount
*CountDone
, /* Out */
282 UDIBool HostEndian
/* In */
285 int cleft
= Count
, cthis
, dthis
;
286 int cdone
= 0, r
, bsize
=2048/Size
;
290 cthis
= (cleft
<bsize
) ? cleft
: bsize
;
292 IN_VAL(short, From
.Space
);
293 IN_VAL(CPUOffset
, From
.Offset
);
294 IN_VAL(UDICount
, cthis
);
295 IN_VAL(UDISizeT
, Size
);
296 IN_VAL(UDIBool
, HostEndian
);
298 r
= DO_CALL(UDIRead_c
);
301 dthis
= OUT_VAL(UDICount
);
302 OUT_DATA(To
, dthis
*Size
);
318 UDIHostMemPtr From
, /* In */
319 UDIResource To
, /* In */
320 UDICount Count
, /* In */
321 UDISizeT Size
, /* In */
322 UDICount
*CountDone
, /* Out */
323 UDIBool HostEndian
/* In */
326 int cleft
= Count
, cthis
, dthis
;
327 int cdone
= 0, r
, bsize
=2048/Size
;
331 cthis
= (cleft
<bsize
) ? cleft
: bsize
;
333 IN_VAL(short, To
.Space
);
334 IN_VAL(CPUOffset
, To
.Offset
);
335 IN_VAL(UDICount
, cthis
);
336 IN_VAL(UDISizeT
, Size
);
337 IN_VAL(UDIBool
, HostEndian
);
338 IN_DATA(From
, cthis
*Size
);
341 r
= DO_CALL(UDIWrite_c
);
344 cdone
+= OUT_VAL(UDICount
);
358 UDIResource From
, /* In */
359 UDIResource To
, /* In */
360 UDICount Count
, /* In */
361 UDISizeT Size
, /* In */
362 UDICount
*CountDone
, /* Out */
363 UDIBool Direction
/* In */
368 IN_VAL(short, From
.Space
);
369 IN_VAL(CPUOffset
, From
.Offset
);
370 IN_VAL(short, To
.Space
);
371 IN_VAL(CPUOffset
, To
.Offset
);
372 IN_VAL(UDICount
, Count
);
373 IN_VAL(UDISizeT
, Size
);
374 IN_VAL(UDIBool
, Direction
);
376 r
= DO_CALL(UDICopy_c
);
379 *CountDone
= OUT_VAL(UDICount
);
384 UDIError
UDIExecute (
388 return DO_CALL(UDIExecute_c
);
392 UDIUInt32 Steps
, /* In */
393 UDIStepType StepType
, /* In */
394 UDIRange Range
/* In */
398 IN_VAL(UDIUInt32
, Steps
);
399 IN_VAL(UDIStepType
, StepType
);
400 IN_VAL(UDIRange
, Range
);
402 return DO_CALL(UDIStep_c
);
413 UDIInt32 MaxTime
, /* In */
414 UDIPId
*PId
, /* Out */
415 UDIUInt32
*StopReason
/* Out */
420 IN_VAL(UDIInt32
, MaxTime
);
421 r
= DO_CALL(UDIWait_c
);
423 *PId
= OUT_VAL(UDIPId
);
424 *StopReason
= OUT_VAL(UDIUInt32
);
428 UDIError
UDISetBreakpoint (
429 UDIResource Addr
, /* In */
430 UDIInt32 PassCount
, /* In */
431 UDIBreakType Type
, /* In */
432 UDIBreakId
*BreakId
/* Out */
437 IN_VAL(short, Addr
.Space
);
438 IN_VAL(CPUOffset
, Addr
.Offset
);
439 IN_VAL(UDIInt32
, PassCount
);
440 IN_VAL(UDIBreakType
, Type
);
442 r
= DO_CALL(UDISetBreakpoint_c
);
445 *BreakId
= OUT_VAL(UDIBreakId
);
449 UDIError
UDIQueryBreakpoint (
450 UDIBreakId BreakId
, /* In */
451 UDIResource
*Addr
, /* Out */
452 UDIInt32
*PassCount
, /* Out */
453 UDIBreakType
*Type
, /* Out */
454 UDIInt32
*CurrentCount
/* Out */
459 IN_VAL(UDIBreakId
, BreakId
);
461 r
= DO_CALL(UDIQueryBreakpoint_c
);
464 Addr
->Space
= OUT_VAL(short);
465 Addr
->Offset
= OUT_VAL(CPUOffset
);
466 *PassCount
= OUT_VAL(UDIInt32
);
467 *Type
= OUT_VAL(UDIBreakType
);
468 *CurrentCount
= OUT_VAL(UDIInt32
);
473 UDIError
UDIClearBreakpoint (
474 UDIBreakId BreakId
/* In */
478 IN_VAL(UDIBreakId
, BreakId
);
480 return DO_CALL(UDIClearBreakpoint_c
);
483 UDIError
UDIGetStdout (
484 UDIHostMemPtr Buf
, /* Out */
485 UDISizeT BufSize
, /* In */
486 UDISizeT
*CountDone
/* Out */
493 IN_VAL(UDISizeT
,BufSize
);
494 r
= DO_CALL(UDIGetStdout_c
);
496 *CountDone
= OUT_VAL(UDISizeT
);
497 if (*CountDone
<= BufSize
)
498 OUT_DATA(Buf
, *CountDone
);
502 UDIError
UDIGetStderr (
503 UDIHostMemPtr Buf
, /* Out */
504 UDISizeT BufSize
, /* In */
505 UDISizeT
*CountDone
/* Out */
512 IN_VAL(UDISizeT
,BufSize
);
513 r
= DO_CALL(UDIGetStderr_c
);
515 *CountDone
= OUT_VAL(UDISizeT
);
516 OUT_DATA(Buf
, *CountDone
);
520 UDIError
UDIPutStdin (
521 UDIHostMemPtr Buf
, /* In */
522 UDISizeT Count
, /* In */
523 UDISizeT
*CountDone
/* Out */
530 IN_VAL(UDISizeT
,Count
);
532 r
= DO_CALL(UDIPutStdin_c
);
534 *CountDone
= OUT_VAL(UDISizeT
);
538 UDIError
UDIStdinMode (
539 UDIMode
*Mode
/* Out */
544 r
= DO_CALL(UDIStdinMode_c
);
546 *Mode
= OUT_VAL(UDIMode
);
550 UDIError
UDIPutTrans (
551 UDIHostMemPtr Buf
, /* In */
552 UDISizeT Count
, /* In */
553 UDISizeT
*CountDone
/* Out */
560 IN_VAL(UDISizeT
,Count
);
562 r
= DO_CALL(UDIPutTrans_c
);
564 *CountDone
= OUT_VAL(UDISizeT
);
568 UDIError
UDIGetTrans (
569 UDIHostMemPtr Buf
, /* Out */
570 UDISizeT BufSize
, /* In */
571 UDISizeT
*CountDone
/* Out */
578 IN_VAL(UDISizeT
,BufSize
);
579 r
= DO_CALL(UDIGetTrans_c
);
581 *CountDone
= OUT_VAL(UDISizeT
);
582 OUT_DATA(Buf
, *CountDone
);
586 UDIError
UDITransMode (
587 UDIMode
*Mode
/* Out */
592 r
= DO_CALL(UDITransMode_c
);
594 *Mode
= OUT_VAL(UDIMode
);
598 #define DFEIPCIdCompany 0x0001 /* Company ID AMD */
599 #define DFEIPCIdProduct 0x1 /* Product ID 0 */
600 #define DFEIPCIdVersion 0x125 /* 1.2.5 */
602 unsigned UDIGetDFEIPCId ()
604 return((((UDIUInt32
)DFEIPCIdCompany
) << 16) |(DFEIPCIdProduct
<< 12) | DFEIPCIdVersion
);
607 #endif /* __GO32__ */