home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / misc / amigem.lha / amigem / exec / init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-01  |  7.5 KB  |  246 lines

  1. #include <exec/alerts.h>
  2. #include <exec/resident.h>
  3. #include <clib/_expansion.h>
  4. #include <clib/_exec.h>
  5. #include <amigem/utils.h>
  6. #include "exec.h"
  7.  
  8. #include <amigem/fd_lib.h>
  9. #define LIBBASE struct ExecBase *SysBase
  10.  
  11. extern const struct Resident Exec_RomTag;
  12. extern const char Exec_Name[];
  13. extern const char Exec_VStr[];
  14. extern void (*const exec_funcTable[])();
  15.  
  16. void __SoftIntHandler(void);
  17. void __Dispatcher(void);
  18. void InitKernel(struct ExecBase *SysBase);
  19.  
  20. FC2(0,void,Exec_Bootup,A0,struct ExecBase *SysBase,A6,APTR sp,A7)
  21. ;
  22.  
  23. FC3(0,LONG,Exec_Init,A1,struct ExecBase *SysBase,D0,BPTR segList,A0,struct ExpansionBase *ExpansionBase,A6)
  24. {
  25.   { /* Build library */
  26.     APTR *f;
  27.     UBYTE *t;
  28.     ULONG s=0;
  29.     UBYTE *freemem;
  30.     struct ConfigDev *cd;
  31.  
  32.     freemem=(UBYTE *)ExpansionBase->ConfigDevList.lh_TailPred+sizeof(struct ConfigDev);
  33.     freemem=(UBYTE *)ALIGN(freemem,sizeof(struct MemChunk));
  34.  
  35.     f=(APTR *)exec_funcTable;
  36.     while((LONG)*f++!=-1)
  37.       s+=LIB_VECTSIZE;
  38.  
  39.     s=(ULONG)ALIGN(s,sizeof(LONG));
  40.     SysBase=(struct ExecBase *)(freemem+=s);
  41.     freemem+=sizeof(struct ExecBase);
  42.     freemem=(UBYTE *)ALIGN(freemem,sizeof(struct MemChunk));
  43.  
  44.     f=(APTR *)exec_funcTable;
  45.     t=(UBYTE *)SysBase;
  46.     while((long)*f!=-1)
  47.     {
  48.       t-=LIB_VECTSIZE;
  49.       MINSETFUNCTION(t,*f);
  50.       f++;
  51.     }
  52.     /* Copy addresses of Un*x functions (and some more) */
  53.     cd=(struct ConfigDev *)ExpansionBase->ConfigDevList.lh_Head;
  54.     while(cd->cd_Rom.er_Manufacturer!=2011||cd->cd_Rom.er_Product!=88||
  55.           cd->cd_Rom.er_SerialNumber!=42424242)
  56.       cd=(struct ConfigDev *)cd->cd_Node.ln_Succ;/* There's nothing I can do if this fails */
  57.     f=(APTR *)cd->cd_BoardAddr;
  58.     SysBase->functable[ 0]=f[10]; /* CacheClearU */
  59.     SysBase->functable[ 1]=f[11]; /* CacheClearE */
  60.     SysBase->functable[ 2]=f[12]; /* CachePreDMA */
  61.     SysBase->functable[ 3]=f[13]; /* CachePostDMA */
  62.     SysBase->functable[ 4]=f[36]; /* setjmp */
  63.     SysBase->functable[ 5]=f[37]; /* longjmp */
  64.     SysBase->functable[ 6]=f[40]; /* kill */
  65.     SysBase->functable[ 7]=f[41]; /* getpid */
  66.     SysBase->functable[ 8]=f[50]; /* sigprocmask */
  67.     SysBase->functable[ 9]=f[51]; /* sigsuspend */
  68.     SysBase->functable[10]=f[52]; /* sigaction */
  69.     SysBase->functable[11]=f[80]; /* setitimer */
  70.     SysBase->functable[12]=f[63]; /* write */
  71.     SysBase->functable[13]=f[35]; /* exit */
  72.     (*(void (*)(void))SysBase->functable[0])(); /* CacheClearU */
  73.  
  74.     SysBase->LibNode.lib_Node.ln_Type    =NT_LIBRARY;
  75.     SysBase->LibNode.lib_Node.ln_Name    =(char *)Exec_Name;
  76.     SysBase->LibNode.lib_Flags        =LIBF_CHANGED|LIBF_SUMUSED;
  77.     SysBase->LibNode.lib_NegSize    =s;
  78.     SysBase->LibNode.lib_PosSize    =sizeof(struct ExecBase);
  79.     SysBase->LibNode.lib_Version    =LIB_VERSION;
  80.     SysBase->LibNode.lib_Revision    =LIB_REVISION;
  81.     SysBase->LibNode.lib_IdString    =(char *)LIB_ID(Exec_VStr);
  82.     SysBase->LibNode.lib_OpenCnt    =0;
  83.  
  84.     SysBase->SysFlags=0;
  85.     SysBase->AttnResched=0;
  86.     SysBase->IDNestCnt=0;
  87.     SysBase->TDNestCnt=0;
  88.     NEWLIST(&SysBase->MemList);
  89.     NEWLIST(&SysBase->ResourceList);
  90.     NEWLIST(&SysBase->DeviceList);
  91.     NEWLIST(&SysBase->IntrList);
  92.     NEWLIST(&SysBase->LibList);
  93.     NEWLIST(&SysBase->PortList);
  94.     NEWLIST(&SysBase->TaskReady);
  95.     NEWLIST(&SysBase->TaskWait);
  96.     NEWLIST(&SysBase->SemaphoreList);
  97.     /*
  98.      * Add all memory. Don't allocabs memory in use - the first 8 bytes of
  99.      * everything you AllocAbs() may be overwritten by a struct MemChunk.
  100.      * Just don't add this memory to the free memory pool.
  101.      */
  102.     AddMemList((UBYTE *)ExpansionBase->LocalMemStart+ExpansionBase->LocalMemSize-freemem,
  103.                MEMF_PUBLIC|MEMF_CHIP|MEMF_FAST|MEMF_LOCAL|MEMF_24BITDMA|MEMF_KICK,
  104.                -1,freemem,NULL);
  105.   }
  106.  
  107.   /* Tell expansion.library about us */
  108.   ExpansionBase->SysBase=SysBase;
  109.   InitSemaphore(&ExpansionBase->ConfigBinding);
  110.   /* May open expansion.library here - but what for? */
  111.  
  112.   AddLibrary(&ExpansionBase->LibNode);
  113.   AddLibrary(&SysBase->LibNode);
  114.  
  115.   { /* Clear all interrupt vectors */
  116.     int i;
  117.     for(i=0;i<16;i++)
  118.     {
  119.       SysBase->IntVects[i].iv_Data=NULL;
  120.       SysBase->IntVects[i].iv_Code=NULL;
  121.       SysBase->IntVects[i].iv_Node=NULL;
  122.     }
  123.   }
  124.  
  125.   { /* Clear the softint lists */
  126.     int i;
  127.     for(i=0;i<5;i++)
  128.       NEWLIST(&SysBase->SoftInts[i].sh_List);
  129.   }
  130.  
  131.   { /* Set supervisor stackpointer */
  132.     APTR s;
  133.     s=AllocMem(MINSTACKSIZE,MEMF_PUBLIC|MEMF_CLEAR);
  134.     if(s==NULL)
  135.       Alert(AT_DeadEnd|AO_ExecLib|AG_NoMemory);
  136.     SysBase->SysStkLower=s;
  137.     SysBase->SysStkUpper=(UBYTE *)s+MINSTACKSIZE;
  138.   }
  139.  
  140.   InitKernel(SysBase);
  141.  
  142.   { /* Add myself as the first task to the task lists */
  143.     struct Task *t;
  144.     APTR s;
  145.     struct MemList *ml;
  146.     ml=(struct MemList *)AllocMem(sizeof(struct MemList),MEMF_PUBLIC);
  147.     if(ml==NULL)
  148.       Alert(AT_DeadEnd|AO_ExecLib|AG_NoMemory);
  149.     t=(struct Task *)AllocMem(sizeof(struct Task),MEMF_PUBLIC|MEMF_CLEAR);
  150.     if(t==NULL)
  151.       Alert(AT_DeadEnd|AO_ExecLib|AG_NoMemory);
  152.     s=AllocMem(MINSTACKSIZE,MEMF_PUBLIC);
  153.     if(s==NULL)
  154.       Alert(AT_DeadEnd|AO_ExecLib|AG_NoMemory);
  155.     t->tc_Node.ln_Type=NT_TASK;
  156.     t->tc_Node.ln_Pri=0;
  157.     t->tc_Node.ln_Name="boot task";
  158.     t->tc_State=TS_RUN;
  159.     t->tc_SPLower=s; /* Oops, where am I running on now??? */
  160.     t->tc_SPUpper=(APTR)((UBYTE *)s+MINSTACKSIZE);
  161.     ml->ml_NumEntries=2;
  162.     ml->ml_ME[0].me_Addr=(APTR)t;
  163.     ml->ml_ME[0].me_Length=sizeof(struct Task);
  164.     ml->ml_ME[1].me_Addr=s;
  165.     ml->ml_ME[1].me_Length=MINSTACKSIZE;
  166.     NEWLIST(&t->tc_MemEntry);
  167.     AddHead(&t->tc_MemEntry,&ml->ml_Node);
  168.     SysBase->ThisTask=t;
  169.   }
  170.  
  171.   { /* Activate software interrupts */
  172.     struct Interrupt *i;
  173.     i=(struct Interrupt *)AllocMem(sizeof(struct Interrupt),MEMF_PUBLIC|MEMF_CLEAR);
  174.     if(i==NULL)
  175.       Alert(AT_DeadEnd|AN_IntrMem);
  176.     i->is_Node.ln_Type=NT_INTERRUPT;
  177.     i->is_Node.ln_Name="exec software interrupt handler";
  178.     i->is_Data        =NULL;
  179.     i->is_Code        =&__SoftIntHandler;    
  180.     SetIntVector(INTB_SOFTINT,i);
  181.   }
  182.  
  183.   { /* Install dispatcher */
  184.     struct Interrupt *i1,*i2;
  185.     i1=(struct Interrupt *)AllocMem(sizeof(struct Interrupt),MEMF_PUBLIC|MEMF_CLEAR);
  186.     if(i1==NULL)
  187.       Alert(AT_DeadEnd|AN_IntrMem);
  188.     i2=(struct Interrupt *)AllocMem(sizeof(struct Interrupt),MEMF_PUBLIC|MEMF_CLEAR);
  189.     if(i2==NULL)
  190.       Alert(AT_DeadEnd|AN_IntrMem);
  191.     i2->is_Node.ln_Type=i1->is_Node.ln_Type=NT_INTERRUPT;
  192.     i2->is_Node.ln_Name=i1->is_Node.ln_Name="exec dispatcher";
  193.     i2->is_Data        =i1->is_Data        =NULL;
  194.     i2->is_Code        =i1->is_Code        =&__Dispatcher;
  195.     AddIntServer(INTB_VERTB,i1);
  196.     SysBase->SoftDispatch=i2;
  197.     Enable();
  198.     Permit();
  199.   }
  200.  
  201.   /* Now initialize all other romtags */
  202.   Exec_Bootup(&__Exec_Bootup,SysBase,
  203.               STACKPOINTER(SysBase->ThisTask->tc_SPLower,SysBase->ThisTask->tc_SPUpper));
  204.   /* This point is never reached */
  205.  
  206.   return 1; /* All OK */  
  207. }
  208.  
  209. FC2(0,void,Exec_Bootup,A0,struct ExecBase *SysBase,A6,APTR sp,A7)
  210. {
  211.   UWORD *w=(UWORD *)&Exec_RomTag.rt_EndSkip; /* Top of scanning area */
  212.  
  213.   for(;;) /* Looking for more romtags. */
  214.   {
  215.     struct Resident *r=(struct Resident *)w;
  216.     if(r->rt_MatchWord==RTC_MATCHWORD&&r==r->rt_MatchTag)
  217.     {
  218.       if(!InitResident(r,NULL))
  219.         Alert(AT_DeadEnd|AO_ExecLib|AG_MakeLib);
  220.       w=(UWORD *)r->rt_EndSkip;
  221.     }else
  222.       w++;
  223.   }
  224. }
  225.   
  226. FD1(1,struct Library *,Exec_Open,ULONG version,D0)
  227.   SysBase->LibNode.lib_OpenCnt++;
  228.   return &SysBase->LibNode;
  229. }
  230.  
  231. FD0(2,BPTR,Exec_Close)
  232.   SysBase->LibNode.lib_OpenCnt--;
  233.   return 0;
  234. }
  235.  
  236. FD0(3,BPTR,Exec_Expunge)
  237. {
  238.   return 0;
  239. }
  240.  
  241. FD0(4,ULONG,Exec_Null)
  242. { return 0; }
  243.  
  244.