home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / SKELETON / Dev32 / init.c < prev    next >
C/C++ Source or Header  |  2002-04-26  |  6KB  |  230 lines

  1. /* $Id: init.c,v 1.2 2002/04/26 23:09:38 smilcke Exp $ */
  2.  
  3. /*
  4.  * init.c
  5.  * Autor:               Stefan Milcke
  6.  * Erstellt am:         07.09.2001
  7.  * Letzte Aenderung am: 28.03.2002
  8.  *
  9. */
  10.  
  11. // Device support
  12. extern "C"
  13. {
  14. #define INCL_NOPMAPI
  15. #define INCL_DOSINFOSEG
  16. #include <os2.h>
  17. };
  18.  
  19. #include <devhelp.h>
  20. #include <devtype.h>
  21. #include <devrp.h>
  22. #include <ldefos2.h>
  23. #include "devown.h"
  24. #include "Ver_32.h"
  25.  
  26. #include <string.h>
  27. #include "sprintf.h"
  28.  
  29. extern "C"
  30. {
  31. #include <lxapilib.h>
  32. #include <linux/types.h>
  33. #include <linux/module.h>
  34. #include <linux/kmod.h>
  35. };
  36.  
  37. #ifdef KEE
  38. #include <kee.h>
  39. #endif
  40.  
  41. #include <lxapilib.h>
  42.  
  43. #define PAGE_SIZE 4096
  44.  
  45. extern "C" int verbose;
  46. extern "C" int verbose_modulelist;
  47. extern "C" int doint3;
  48. extern "C" int nocoremodule;
  49. extern "C" int nomodule;
  50.  
  51. extern unsigned long build_level;
  52.  
  53. static char ERR_ERROR[] = "ERROR: ";
  54. static char ERR_LOCK[]  = "Unable to lock 32 bit data & code segments, exiting...\r\r\n";
  55. static char ERR_SIGN[]  = "SK32 skeleton driver V%d.%d Build %d Copyright 2001-2002 by Stefan Milcke\r\n";
  56. static char LOADEDMODULE[] = "Loaded module:";
  57. static char NOMODULE[] = "No module loaded.\r\n";
  58. static char ERR_LXAPI32[] = "Unable to attach to LXAPI32.SYS\r\n";
  59. static char CRLF[]      = "\r\n";
  60. static char buffer[400];
  61.  
  62. typedef struct {
  63.  USHORT MsgLength;
  64.  WORD32 MsgPtr;
  65. } MSG_TABLE;
  66.  
  67. extern "C" WORD32 MSG_TABLE32;
  68.  
  69. extern "C" int sprintf(char *buffer,const char *format, ...);
  70.  
  71. //------------------------------- DevSaveMessage -------------------------------
  72. //Print messages with DosWrite when init is done or has failed (see startup.asm)
  73. void DevSaveMessage(char __far *str, int length)
  74. {
  75.  MSG_TABLE __far *msg = (MSG_TABLE __far *)__Make48Pointer(MSG_TABLE32);
  76.  char __far *str16 = (char __far *)__Make48Pointer(msg->MsgPtr);
  77.  int i;
  78.  for(i=0;i<length;i++)
  79.   str16[msg->MsgLength + i] = str[i];
  80.  str16[msg->MsgLength + length] = 0;
  81.  msg->MsgLength += length;
  82.  return;
  83. }
  84.  
  85. //-------------------------------- LockSegments --------------------------------
  86. int LockSegments(void)
  87. {
  88. #ifdef KEE
  89.  KEEVMLock lock;
  90. #else
  91.  char   lock[12];
  92.  ULONG  PgCount;
  93. #endif
  94.  ULONG  segsize;
  95.  
  96.     /*
  97.      * Locks DGROUP into physical memory
  98.      */
  99.     //NOTE: VMLock rounds base address down to nearest page
  100.     //      So we MUST take this into account when calculating the
  101.     //      size of our code/data
  102.     segsize = OffsetFinalDS32 - ((OffsetBeginDS32) & ~0xFFF);
  103.     if(segsize & 0xFFF) {
  104.     segsize += PAGE_SIZE;
  105.     }
  106.     segsize &= ~0xFFF;
  107. #ifdef KEE
  108.     if(KernVMLock(VMDHL_LONG,
  109.                   (PVOID)((OffsetBeginDS32) & ~0xFFF),
  110.                   segsize,
  111.                   &lock,
  112.                   (KEEVMPageList*)-1,
  113.                   0)) {
  114. #else
  115.     if(DevVMLock(VMDHL_LONG,
  116.                    ((OffsetBeginDS32) & ~0xFFF),
  117.                    segsize,
  118.                    (LINEAR)-1,
  119.                    __StackToFlat((ULONG)lock),
  120.                    (LINEAR)__StackToFlat((ULONG)&PgCount))) {
  121. #endif
  122.     return(1);
  123.     }
  124.     /*
  125.      * Locks CODE32 into physical memory
  126.      */
  127.     segsize = OffsetFinalCS32 - ((OffsetBeginCS32) & ~0xFFF);
  128.     if(segsize & 0xFFF) {
  129.     segsize += PAGE_SIZE;
  130.     }
  131.     segsize &= ~0xFFF;
  132. #ifdef KEE
  133.     if(KernVMLock(VMDHL_LONG,
  134.                   (PVOID)((OffsetBeginCS32) & ~0xFFF),
  135.                   segsize,
  136.                   &lock,
  137.                   (KEEVMPageList*)-1,
  138.                   0)) {
  139. #else
  140.     if(DevVMLock(VMDHL_LONG,
  141.                  ((OffsetBeginCS32) & ~0xFFF),
  142.                  segsize,
  143.                  (LINEAR)-1,
  144.                  __StackToFlat((ULONG)lock),
  145.                  (LINEAR)__StackToFlat((ULONG)&PgCount))) {
  146. #endif
  147.     return(1);
  148.     }
  149.     return 0;
  150. }
  151.  
  152.  
  153. //-------------------------------- WriteString ---------------------------------
  154. static VOID WriteString(const char __far* str, int length)
  155. {
  156.   // Write the string
  157.   DevSaveMessage((char __far *)str, length);
  158.   return;
  159. }
  160.  
  161.  
  162. extern "C" void parseArgs(RPInit __far *rp);
  163.  
  164. extern "C" int skel_init_module(void);
  165. extern "C" void skel_cleanup_module(void);
  166.  
  167. //----------------------------- extern definitions -----------------------------
  168. extern "C"
  169. {
  170. extern struct os2lx_parm *skeldrv_parms;
  171. extern int num_skeldrv_parms;
  172. };
  173.  
  174. struct os2lx_module skel_module={"skeleton",0,skel_init_module,skel_cleanup_module,&skeldrv_parms,&num_skeldrv_parms};
  175.  
  176. //------------------------------ DiscardableInit -------------------------------
  177. WORD32 DiscardableInit(RPInit __far* rp)
  178. {
  179.  GetTKSSBase();
  180.  if(LockSegments())
  181.  {
  182.   WriteString(ERR_ERROR, sizeof(ERR_ERROR)-1);
  183.   WriteString(ERR_LOCK, sizeof(ERR_LOCK)-1);
  184.   return RPDONE | RPERR;
  185.  }
  186.  rp->Out.FinalCS = 0;
  187.  rp->Out.FinalDS = 0;
  188.  if(OS2_initlxapi())
  189.  {
  190.   WriteString(ERR_LXAPI32,strlen(ERR_LXAPI32));
  191.   return RPDONE | RPERR;
  192.  }
  193.  
  194.  // Add all supported modules
  195.  OS2_add_module(&skel_module);
  196.  
  197.  //Do you init here:
  198.  parseArgs(rp);
  199.  if(doint3)
  200.   DebugInt3();
  201.  if(!nocoremodule)
  202.  {
  203.   request_module("timer");
  204.   request_module("pci core");
  205.   request_module("i2c core");
  206.   request_module("videodev");
  207.  }
  208.  if(!nomodule)
  209.  {
  210.   request_module("skeleton");
  211.  }
  212.  if(verbose)
  213.  {
  214.   sprintf(buffer
  215.           ,ERR_SIGN
  216.           ,SK32_DRV_MAJOR_VERSION
  217.           ,SK32_DRV_MINOR_VERSION
  218.           ,BUILD_LEVEL);
  219.   WriteString(buffer,strlen(buffer));
  220.  }
  221.  
  222.  // Complete the installation
  223.  rp->Out.FinalCS = _OffsetFinalCS16;
  224.  rp->Out.FinalDS = _OffsetFinalDS16;
  225.  
  226.  // Confirm a successful installation
  227.  return RPDONE;
  228. }
  229.  
  230.