XF86DGA.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $XFree86: xc/lib/Xxf86dga/XF86DGA.c,v 3.19 2001/08/18 02:41:30 dawes Exp $ */
  2. /*
  3. Copyright (c) 1995  Jon Tombs
  4. Copyright (c) 1995,1996  The XFree86 Project, Inc
  5. */
  6. /* THIS IS NOT AN X CONSORTIUM STANDARD */
  7. #ifdef __EMX__ /* needed here to override certain constants in X headers */
  8. #define INCL_DOS
  9. #define INCL_DOSIOCTL
  10. #include <os2.h>
  11. #endif
  12. #if defined(linux)
  13. #define HAS_MMAP_ANON
  14. #include <sys/types.h>
  15. #include <sys/mman.h>
  16. #include <asm/page.h>   /* PAGE_SIZE */
  17. #define HAS_SC_PAGESIZE /* _SC_PAGESIZE may be an enum for Linux */
  18. #define HAS_GETPAGESIZE
  19. #endif /* linux */
  20. #if defined(CSRG_BASED)
  21. #define HAS_MMAP_ANON
  22. #define HAS_GETPAGESIZE
  23. #include <sys/types.h>
  24. #include <sys/mman.h>
  25. #endif /* CSRG_BASED */
  26. #if defined(DGUX)
  27. #define HAS_GETPAGESIZE
  28. #define MMAP_DEV_ZERO
  29. #include <sys/types.h>
  30. #include <sys/mman.h>
  31. #include <unistd.h>
  32. #endif /* DGUX */
  33. #if defined(SVR4) && !defined(DGUX)
  34. #define MMAP_DEV_ZERO
  35. #include <sys/types.h>
  36. #include <sys/mman.h>
  37. #include <unistd.h>
  38. #endif /* SVR4 && !DGUX */
  39. #if defined(sun) && !defined(SVR4) /* SunOS */
  40. #define MMAP_DEV_ZERO   /* doesn't SunOS have MAP_ANON ?? */
  41. #define HAS_GETPAGESIZE
  42. #include <sys/types.h>
  43. #include <sys/mman.h>
  44. #endif /* sun && !SVR4 */
  45. #ifdef XNO_SYSCONF
  46. #undef _SC_PAGESIZE
  47. #endif
  48. #define NEED_EVENTS
  49. #define NEED_REPLIES
  50. #include <X11/Xlibint.h>
  51. #include "xf86dga.h"
  52. #include "xf86dgastr.h"
  53. #include <X11/extensions/Xext.h>
  54. #include "extutil.h"
  55. extern XExtDisplayInfo* SDL_NAME(xdga_find_display)(Display*);
  56. extern char *SDL_NAME(xdga_extension_name);
  57. #define XF86DGACheckExtension(dpy,i,val) 
  58.   XextCheckExtension (dpy, i, SDL_NAME(xdga_extension_name), val)
  59. /*****************************************************************************
  60.  *                                                                           *
  61.  *     public XFree86-DGA Extension routines                    *
  62.  *                                                                           *
  63.  *****************************************************************************/
  64. Bool SDL_NAME(XF86DGAQueryExtension) (
  65.     Display *dpy,
  66.     int *event_basep,
  67.     int *error_basep
  68. ){
  69.     return SDL_NAME(XDGAQueryExtension)(dpy, event_basep, error_basep);
  70. }
  71. Bool SDL_NAME(XF86DGAQueryVersion)(
  72.     Display* dpy,
  73.     int* majorVersion, 
  74.     int* minorVersion
  75. ){
  76.     return SDL_NAME(XDGAQueryVersion)(dpy, majorVersion, minorVersion);
  77. }
  78. Bool SDL_NAME(XF86DGAGetVideoLL)(
  79.     Display* dpy,
  80.     int screen,
  81.     int *offset,
  82.     int *width, 
  83.     int *bank_size, 
  84.     int *ram_size
  85. ){
  86.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  87.     xXF86DGAGetVideoLLReply rep;
  88.     xXF86DGAGetVideoLLReq *req;
  89.     XF86DGACheckExtension (dpy, info, False);
  90.     LockDisplay(dpy);
  91.     GetReq(XF86DGAGetVideoLL, req);
  92.     req->reqType = info->codes->major_opcode;
  93.     req->dgaReqType = X_XF86DGAGetVideoLL;
  94.     req->screen = screen;
  95.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  96. UnlockDisplay(dpy);
  97. SyncHandle();
  98. return False;
  99.     }
  100.     *offset = /*(char *)*/rep.offset;
  101.     *width = rep.width;
  102.     *bank_size = rep.bank_size;
  103.     *ram_size = rep.ram_size;
  104.     UnlockDisplay(dpy);
  105.     SyncHandle();
  106.     return True;
  107. }
  108.     
  109. Bool SDL_NAME(XF86DGADirectVideoLL)(
  110.     Display* dpy,
  111.     int screen,
  112.     int enable
  113. ){
  114.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  115.     xXF86DGADirectVideoReq *req;
  116.     XF86DGACheckExtension (dpy, info, False);
  117.     LockDisplay(dpy);
  118.     GetReq(XF86DGADirectVideo, req);
  119.     req->reqType = info->codes->major_opcode;
  120.     req->dgaReqType = X_XF86DGADirectVideo;
  121.     req->screen = screen;
  122.     req->enable = enable;
  123.     UnlockDisplay(dpy);
  124.     SyncHandle();
  125.     XSync(dpy,False);
  126.     return True;
  127. }
  128. Bool SDL_NAME(XF86DGAGetViewPortSize)(
  129.     Display* dpy,
  130.     int screen,
  131.     int *width, 
  132.     int *height
  133. ){
  134.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  135.     xXF86DGAGetViewPortSizeReply rep;
  136.     xXF86DGAGetViewPortSizeReq *req;
  137.     XF86DGACheckExtension (dpy, info, False);
  138.     LockDisplay(dpy);
  139.     GetReq(XF86DGAGetViewPortSize, req);
  140.     req->reqType = info->codes->major_opcode;
  141.     req->dgaReqType = X_XF86DGAGetViewPortSize;
  142.     req->screen = screen;
  143.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  144. UnlockDisplay(dpy);
  145. SyncHandle();
  146. return False;
  147.     }
  148.     *width = rep.width;
  149.     *height = rep.height;
  150.     UnlockDisplay(dpy);
  151.     SyncHandle();
  152.     return True;
  153. }
  154.     
  155.     
  156. Bool SDL_NAME(XF86DGASetViewPort)(
  157.     Display* dpy,
  158.     int screen,
  159.     int x, 
  160.     int y
  161. ){
  162.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  163.     xXF86DGASetViewPortReq *req;
  164.     XF86DGACheckExtension (dpy, info, False);
  165.     LockDisplay(dpy);
  166.     GetReq(XF86DGASetViewPort, req);
  167.     req->reqType = info->codes->major_opcode;
  168.     req->dgaReqType = X_XF86DGASetViewPort;
  169.     req->screen = screen;
  170.     req->x = x;
  171.     req->y = y;
  172.     UnlockDisplay(dpy);
  173.     SyncHandle();
  174.     XSync(dpy,False);
  175.     return True;
  176. }
  177.     
  178. Bool SDL_NAME(XF86DGAGetVidPage)(
  179.     Display* dpy,
  180.     int screen,
  181.     int *vpage
  182. ){
  183.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  184.     xXF86DGAGetVidPageReply rep;
  185.     xXF86DGAGetVidPageReq *req;
  186.     XF86DGACheckExtension (dpy, info, False);
  187.     LockDisplay(dpy);
  188.     GetReq(XF86DGAGetVidPage, req);
  189.     req->reqType = info->codes->major_opcode;
  190.     req->dgaReqType = X_XF86DGAGetVidPage;
  191.     req->screen = screen;
  192.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  193. UnlockDisplay(dpy);
  194. SyncHandle();
  195. return False;
  196.     }
  197.     *vpage = rep.vpage;
  198.     UnlockDisplay(dpy);
  199.     SyncHandle();
  200.     return True;
  201. }
  202.     
  203. Bool SDL_NAME(XF86DGASetVidPage)(
  204.     Display* dpy,
  205.     int screen,
  206.     int vpage
  207. ){
  208.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  209.     xXF86DGASetVidPageReq *req;
  210.     XF86DGACheckExtension (dpy, info, False);
  211.     LockDisplay(dpy);
  212.     GetReq(XF86DGASetVidPage, req);
  213.     req->reqType = info->codes->major_opcode;
  214.     req->dgaReqType = X_XF86DGASetVidPage;
  215.     req->screen = screen;
  216.     req->vpage = vpage;
  217.     UnlockDisplay(dpy);
  218.     SyncHandle();
  219.     XSync(dpy,False);
  220.     return True;
  221. }
  222. Bool SDL_NAME(XF86DGAInstallColormap)(
  223.     Display* dpy,
  224.     int screen,
  225.     Colormap cmap
  226. ){
  227.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  228.     xXF86DGAInstallColormapReq *req;
  229.     XF86DGACheckExtension (dpy, info, False);
  230.     LockDisplay(dpy);
  231.     GetReq(XF86DGAInstallColormap, req);
  232.     req->reqType = info->codes->major_opcode;
  233.     req->dgaReqType = X_XF86DGAInstallColormap;
  234.     req->screen = screen;
  235.     req->id = cmap;
  236.     UnlockDisplay(dpy);
  237.     SyncHandle();
  238.     XSync(dpy,False);
  239.     return True;
  240. }
  241. Bool SDL_NAME(XF86DGAQueryDirectVideo)(
  242.     Display *dpy,
  243.     int screen,
  244.     int *flags
  245. ){
  246.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  247.     xXF86DGAQueryDirectVideoReply rep;
  248.     xXF86DGAQueryDirectVideoReq *req;
  249.     XF86DGACheckExtension (dpy, info, False);
  250.     LockDisplay(dpy);
  251.     GetReq(XF86DGAQueryDirectVideo, req);
  252.     req->reqType = info->codes->major_opcode;
  253.     req->dgaReqType = X_XF86DGAQueryDirectVideo;
  254.     req->screen = screen;
  255.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  256. UnlockDisplay(dpy);
  257. SyncHandle();
  258. return False;
  259.     }
  260.     *flags = rep.flags;
  261.     UnlockDisplay(dpy);
  262.     SyncHandle();
  263.     return True;
  264. }
  265. Bool SDL_NAME(XF86DGAViewPortChanged)(
  266.     Display *dpy,
  267.     int screen,
  268.     int n
  269. ){
  270.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  271.     xXF86DGAViewPortChangedReply rep;
  272.     xXF86DGAViewPortChangedReq *req;
  273.     XF86DGACheckExtension (dpy, info, False);
  274.     LockDisplay(dpy);
  275.     GetReq(XF86DGAViewPortChanged, req);
  276.     req->reqType = info->codes->major_opcode;
  277.     req->dgaReqType = X_XF86DGAViewPortChanged;
  278.     req->screen = screen;
  279.     req->n = n;
  280.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  281. UnlockDisplay(dpy);
  282. SyncHandle();
  283. return False;
  284.     }
  285.     UnlockDisplay(dpy);
  286.     SyncHandle();
  287.     return rep.result;
  288. }
  289. /* Helper functions */
  290. #include <X11/Xmd.h>
  291. #include <XFree86/extensions/xf86dga.h>
  292. #include <stdlib.h>
  293. #include <stdio.h>
  294. #include <fcntl.h>
  295. #if defined(ISC) 
  296. # define HAS_SVR3_MMAP
  297. # include <sys/types.h>
  298. # include <errno.h>
  299. # include <sys/at_ansi.h>
  300. # include <sys/kd.h>
  301. # include <sys/sysmacros.h>
  302. # include <sys/immu.h>
  303. # include <sys/region.h>
  304. # include <sys/mmap.h>
  305. #else
  306. # if !defined(Lynx)
  307. #  if !defined(__EMX__)
  308. #   include <sys/mman.h>
  309. #  endif
  310. # else
  311. #  include <sys/types.h>
  312. #  include <errno.h>
  313. #  include <smem.h>
  314. # endif
  315. #endif
  316. #include <sys/wait.h>
  317. #include <signal.h>
  318. #include <unistd.h>
  319. #if defined(SVR4) && !defined(sun) && !defined(SCO325)
  320. #define DEV_MEM "/dev/pmem"
  321. #elif defined(SVR4) && defined(sun)
  322. #define DEV_MEM "/dev/xsvc"
  323. #else
  324. #define DEV_MEM "/dev/mem"
  325. #endif
  326. typedef struct {
  327.     unsigned long physaddr; /* actual requested physical address */
  328.     unsigned long size; /* actual requested map size */
  329.     unsigned long delta; /* delta to account for page alignment */
  330.     void *   vaddr; /* mapped address, without the delta */
  331.     int   refcount; /* reference count */
  332. } MapRec, *MapPtr;
  333. typedef struct {
  334.     Display * display;
  335.     int screen;
  336.     MapPtr map;
  337. } ScrRec, *ScrPtr;
  338. static int mapFd = -1;
  339. static int numMaps = 0;
  340. static int numScrs = 0;
  341. static MapPtr *mapList = NULL;
  342. static ScrPtr *scrList = NULL;
  343. static MapPtr
  344. AddMap(void)
  345. {
  346.     MapPtr *old;
  347.     old = mapList;
  348.     mapList = realloc(mapList, sizeof(MapPtr) * (numMaps + 1));
  349.     if (!mapList) {
  350. mapList = old;
  351. return NULL;
  352.     }
  353.     mapList[numMaps] = malloc(sizeof(MapRec));
  354.     if (!mapList[numMaps])
  355. return NULL;
  356.     return mapList[numMaps++];
  357. }
  358. static ScrPtr
  359. AddScr(void)
  360. {
  361.     ScrPtr *old;
  362.     old = scrList;
  363.     scrList = realloc(scrList, sizeof(ScrPtr) * (numScrs + 1));
  364.     if (!scrList) {
  365. scrList = old;
  366. return NULL;
  367.     }
  368.     scrList[numScrs] = malloc(sizeof(ScrRec));
  369.     if (!scrList[numScrs])
  370. return NULL;
  371.     return scrList[numScrs++];
  372. }
  373. static MapPtr
  374. FindMap(unsigned long address, unsigned long size)
  375. {
  376.     int i;
  377.     for (i = 0; i < numMaps; i++) {
  378. if (mapList[i]->physaddr == address &&
  379.     mapList[i]->size == size)
  380.     return mapList[i];
  381.     }
  382.     return NULL;
  383. }
  384. static ScrPtr
  385. FindScr(Display *display, int screen)
  386. {
  387.     int i;
  388.     for (i = 0; i < numScrs; i++) {
  389. if (scrList[i]->display == display &&
  390.     scrList[i]->screen == screen)
  391.     return scrList[i];
  392.     }
  393.     return NULL;
  394. }
  395. static void *
  396. MapPhysAddress(unsigned long address, unsigned long size)
  397. {
  398.     unsigned long offset, delta;
  399.     int pagesize = -1;
  400.     void *vaddr;
  401.     MapPtr mp;
  402. #if defined(ISC) && defined(HAS_SVR3_MMAP)
  403.     struct kd_memloc mloc;
  404. #elif defined(__EMX__)
  405.     APIRET rc;
  406.     ULONG action;
  407.     HFILE hfd;
  408. #endif
  409.     if ((mp = FindMap(address, size))) {
  410. mp->refcount++;
  411. return (void *)((unsigned long)mp->vaddr + mp->delta);
  412.     }
  413. #if defined(_SC_PAGESIZE) && defined(HAS_SC_PAGESIZE)
  414.     pagesize = sysconf(_SC_PAGESIZE);
  415. #endif
  416. #ifdef _SC_PAGE_SIZE
  417.     if (pagesize == -1)
  418. pagesize = sysconf(_SC_PAGE_SIZE);
  419. #endif
  420. #ifdef HAS_GETPAGESIZE
  421.     if (pagesize == -1)
  422. pagesize = getpagesize();
  423. #endif
  424. #ifdef PAGE_SIZE
  425.     if (pagesize == -1)
  426. pagesize = PAGE_SIZE;
  427. #endif
  428.     if (pagesize == -1)
  429. pagesize = 4096;
  430.    delta = address % pagesize;
  431.    offset = address - delta;
  432. #if defined(ISC) && defined(HAS_SVR3_MMAP)
  433.     if (mapFd < 0) {
  434. if ((mapFd = open("/dev/mmap", O_RDWR)) < 0)
  435.     return NULL;
  436.     }
  437.     mloc.vaddr = (char *)0;
  438.     mloc.physaddr = (char *)offset;
  439.     mloc.length = size + delta;
  440.     mloc.ioflg=1;
  441.     if ((vaddr = (void *)ioctl(mapFd, MAP, &mloc)) == (void *)-1)
  442. return NULL;
  443. #elif defined (__EMX__)
  444.     /*
  445.      * Dragon warning here! /dev/pmap$ is never closed, except on progam exit.
  446.      * Consecutive calling of this routine will make PMAP$ driver run out
  447.      * of memory handles. Some umap/close mechanism should be provided
  448.      */
  449.     rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN,
  450.  OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL);
  451.     if (rc != 0)
  452. return NULL;
  453.     {
  454. struct map_ioctl {
  455. union {
  456. ULONG phys;
  457. void* user;
  458. } a;
  459. ULONG size;
  460. } pmap,dmap;
  461. ULONG plen,dlen;
  462. #define XFREE86_PMAP 0x76
  463. #define PMAP_MAP 0x44
  464. pmap.a.phys = offset;
  465. pmap.size = size + delta;
  466. rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP,
  467.  (PULONG)&pmap, sizeof(pmap), &plen,
  468.  (PULONG)&dmap, sizeof(dmap), &dlen);
  469. if (rc == 0) {
  470. vaddr = dmap.a.user;
  471. }
  472.    }
  473.    if (rc != 0)
  474. return NULL;
  475. #elif defined (Lynx)
  476.     vaddr = (void *)smem_create("XF86DGA", (char *)offset, 
  477. size + delta, SM_READ|SM_WRITE);
  478. #else
  479. #ifndef MAP_FILE
  480. #define MAP_FILE 0
  481. #endif
  482.     if (mapFd < 0) {
  483. if ((mapFd = open(DEV_MEM, O_RDWR)) < 0)
  484.     return NULL;
  485.     }
  486.     vaddr = (void *)mmap(NULL, size + delta, PROT_READ | PROT_WRITE,
  487.                         MAP_FILE | MAP_SHARED, mapFd, (off_t)offset);
  488.     if (vaddr == (void *)-1)
  489. return NULL;
  490. #endif
  491.     if (!vaddr) {
  492. if (!(mp = AddMap()))
  493.     return NULL;
  494. mp->physaddr = address;
  495. mp->size = size;
  496. mp->delta = delta;
  497. mp->vaddr = vaddr;
  498. mp->refcount = 1;
  499.     }
  500.     return (void *)((unsigned long)vaddr + delta);
  501. }
  502. /*
  503.  * Still need to find a clean way of detecting the death of a DGA app
  504.  * and returning things to normal - Jon
  505.  * This is here to help debugging without rebooting... Also C-A-BS
  506.  * should restore text mode.
  507.  */
  508. int
  509. SDL_NAME(XF86DGAForkApp)(int screen)
  510. {
  511.     pid_t pid;
  512.     int status;
  513.     int i;
  514.      /* fork the app, parent hangs around to clean up */
  515.     if ((pid = fork()) > 0) {
  516. ScrPtr sp;
  517. waitpid(pid, &status, 0);
  518. for (i = 0; i < numScrs; i++) {
  519.     sp = scrList[i];
  520.     SDL_NAME(XF86DGADirectVideoLL)(sp->display, sp->screen, 0);
  521.     XSync(sp->display, False);
  522. }
  523.         if (WIFEXITED(status))
  524.     _exit(0);
  525. else
  526.     _exit(-1);
  527.     }
  528.     return pid;
  529. }
  530. Bool
  531. SDL_NAME(XF86DGADirectVideo)(
  532.     Display *dis,
  533.     int screen,
  534.     int enable
  535. ){
  536.     ScrPtr sp;
  537.     MapPtr mp = NULL;
  538.     if ((sp = FindScr(dis, screen)))
  539. mp = sp->map;
  540.     if (enable & XF86DGADirectGraphics) {
  541. #if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) 
  542. && !defined(__EMX__)
  543. if (mp && mp->vaddr)
  544.     mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ | PROT_WRITE);
  545. #endif
  546.     } else {
  547. #if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) 
  548. && !defined(__EMX__)
  549. if (mp && mp->vaddr)
  550.     mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ);
  551. #elif defined(Lynx)
  552. /* XXX this doesn't allow enable after disable */
  553. smem_create(NULL, mp->vaddr, mp->size + mp->delta, SM_DETACH);
  554. smem_remove("XF86DGA");
  555. #endif
  556.     }
  557.     SDL_NAME(XF86DGADirectVideoLL)(dis, screen, enable);
  558.     return 1;
  559. }
  560. static void
  561. XF86cleanup(int sig)
  562. {
  563.     ScrPtr sp;
  564.     int i;
  565.     static char beenhere = 0;
  566.     if (beenhere)
  567. _exit(3);
  568.     beenhere = 1;
  569.     for (i = 0; i < numScrs; i++) {
  570. sp = scrList[i];
  571. SDL_NAME(XF86DGADirectVideo)(sp->display, sp->screen, 0);
  572. XSync(sp->display, False);
  573.     }
  574.     _exit(3);
  575. }
  576. Bool
  577. SDL_NAME(XF86DGAGetVideo)(
  578.     Display *dis,
  579.     int screen,
  580.     char **addr,
  581.     int *width, 
  582.     int *bank, 
  583.     int *ram
  584. ){
  585.     /*unsigned long*/ int offset;
  586.     static int beenHere = 0;
  587.     ScrPtr sp;
  588.     MapPtr mp;
  589.     if (!(sp = FindScr(dis, screen))) {
  590. if (!(sp = AddScr())) {
  591.     fprintf(stderr, "XF86DGAGetVideo: malloc failuren");
  592.     exit(-2);
  593. }
  594. sp->display = dis;
  595. sp->screen = screen;
  596. sp->map = NULL;
  597.     }
  598.     SDL_NAME(XF86DGAGetVideoLL)(dis, screen , &offset, width, bank, ram);
  599.     *addr = MapPhysAddress(offset, *bank);
  600.     if (*addr == NULL) {
  601. fprintf(stderr, "XF86DGAGetVideo: failed to map video memory (%s)n",
  602. strerror(errno));
  603. exit(-2);
  604.     }
  605.     if ((mp = FindMap(offset, *bank)))
  606. sp->map = mp;
  607.     if (!beenHere) {
  608. beenHere = 1;
  609. atexit((void(*)(void))XF86cleanup);
  610. /* one shot XF86cleanup attempts */
  611. signal(SIGSEGV, XF86cleanup);
  612. #ifdef SIGBUS
  613. signal(SIGBUS, XF86cleanup);
  614. #endif
  615. signal(SIGHUP, XF86cleanup);
  616. signal(SIGFPE, XF86cleanup);  
  617.     }
  618.     return 1;
  619. }