Fixed binary search: no more infinite loops when vendor is unknown.
[tangerine.git] / arch / all-mingw32 / exec / preparecontext.c
blob5f517ef2df462b026c27eb675b5ab175a159e18b
1 /*
2 Copyright © 1995-2008, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: mingw32 version of PrepareContext().
6 Lang: english
7 */
9 #define DEBUG 0
11 #include <aros/debug.h>
12 #include <exec/types.h>
13 #include <exec/execbase.h>
14 #include <exec/memory.h>
15 #include <utility/tagitem.h>
16 #include <proto/kernel.h>
17 #include <aros/kernel.h>
18 #include "etask.h"
19 #include "exec_util.h"
20 #include "../kernel/cpucontext.h"
22 #include <aros/libcall.h>
23 #include <proto/arossupport.h>
24 #include <proto/kernel.h>
26 /* Put a value of type SP_TYPE on the stack or get it off the stack. */
27 #define _PUSH(sp,val) (*--sp = (SP_TYPE)(val))
28 #define _POP(sp) (*sp++)
30 #define SP_TYPE IPTR
32 #define GetSP(task) (*(SP_TYPE **)(&task->tc_SPReg))
34 AROS_LH4(BOOL, PrepareContext,
35 AROS_LHA(struct Task *, task, A0),
36 AROS_LHA(APTR, entryPoint, A1),
37 AROS_LHA(APTR, fallBack, A2),
38 AROS_LHA(struct TagItem *, tagList, A3),
39 struct ExecBase *, SysBase, 6, Exec)
41 AROS_LIBFUNC_INIT
42 IPTR args[8] = {0};
43 WORD numargs = 0;
44 struct AROSCPUContext *ctx;
46 D(kprintf("[PrepareContext] preparing task \"%s\" entry: %p fallback: %p\n",task->tc_Node.ln_Name,entryPoint,fallBack));
48 if (!(task->tc_Flags & TF_ETASK) )
49 return FALSE;
51 ctx = KrnCreateContext();
52 GetIntETask (task)->iet_Context = ctx;
53 if (!ctx)
54 return FALSE;
56 while(tagList)
58 switch(tagList->ti_Tag)
60 case TAG_MORE:
61 tagList = (struct TagItem *)tagList->ti_Data;
62 continue;
64 case TAG_SKIP:
65 tagList += tagList->ti_Data;
66 break;
68 case TAG_DONE:
69 tagList = NULL;
70 break;
72 #define HANDLEARG(x) \
73 case TASKTAG_ARG ## x: \
74 args[x - 1] = (IPTR)tagList->ti_Data; \
75 if (x > numargs) numargs = x; \
76 break;
78 HANDLEARG(1)
79 HANDLEARG(2)
80 HANDLEARG(3)
81 HANDLEARG(4)
82 HANDLEARG(5)
83 HANDLEARG(6)
84 HANDLEARG(7)
85 HANDLEARG(8)
87 #undef HANDLEARG
90 if (tagList) tagList++;
92 if (numargs)
95 /* Assume C function gets all param on stack */
97 while(numargs--)
99 D(kprintf(" arg %i: %p\n",numargs, args[numargs]));
100 _PUSH(GetSP(task), args[numargs]);
105 /* First we push the return address */
106 _PUSH(GetSP(task), fallBack);
108 /* Then set up the context */
109 PREPARE_INITIAL_CONTEXT(ctx, GetSP(task), entryPoint);
111 D(kprintf("Prepared task context: *****\n"));
112 D(PRINT_CPUCONTEXT(ctx));
114 return TRUE;
116 AROS_LIBFUNC_EXIT