home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / config / i386 / win32 / bc / md-threads.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  96 lines

  1. /*
  2.  * i386/win32/bc/md-thread.c
  3.  * Windows'95 (Borland C) i386 thread specific functions.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, June 1996.
  12.  */
  13.  
  14. #include "config.h"
  15. #include "gtypes.h"
  16. #include "object.h"
  17. #include "thread.h"
  18. #include "md.h"
  19.  
  20. extern thread* currentThread;
  21.  
  22. void
  23. threadSwitch(ctx* to, ctx* from)
  24. {
  25.     asm {
  26.         lea esi,t1
  27.         push esi
  28.         mov esi,from
  29.         mov edi,to
  30.         pushad
  31.         mov DWORD PTR [esi.restorePoint],esp
  32.         mov esp,DWORD PTR [edi.restorePoint]
  33.         popad
  34.         ret
  35.     t1:    nop
  36.  
  37.     }
  38. }
  39.  
  40. void
  41. threadInit(ctx* to, void* func)
  42. {
  43.     asm {
  44.         mov esi, func
  45.         mov edi, to
  46.         mov edi, [edi.stackEnd]
  47.         mov DWORD PTR [edi-4],esi
  48.         mov DWORD PTR [edi-8],0
  49.         mov DWORD PTR [edi-12],0
  50.         mov DWORD PTR [edi-16],0
  51.         mov DWORD PTR [edi-20],0
  52.         mov DWORD PTR [edi-24],0
  53.         mov DWORD PTR [edi-28],0
  54.         mov DWORD PTR [edi-32],0
  55.         mov DWORD PTR [edi-36],0
  56.     }
  57.     to->restorePoint = to->stackEnd - 36;
  58. }
  59.  
  60. void
  61. threadInfo(ctx* ee)
  62. {
  63.     void** sptr;
  64.     int i;
  65.     asm {
  66.         mov sptr,ebp
  67.     }
  68.     for (i = 0; i != 4; i++) {
  69.         sptr = (void**)*sptr;
  70.     }
  71.     ee->restorePoint = 0;    
  72.     ee->stackEnd = (uint8*)sptr;
  73.     ee->stackBase = ee->stackEnd - threadStackSize;
  74.     ee->flags = THREAD_FLAGS_NOSTACKALLOC;
  75. }
  76.  
  77. int
  78. threadFrames(thread* tid)
  79. {
  80.     void** sptr;
  81.     int cnt = 0;
  82.     if (tid == currentThread) {
  83.         asm {
  84.             mov sptr,ebp
  85.         }
  86.     }
  87.     else {
  88.         sptr = ((void***)tid->PrivateInfo->restorePoint)[2];
  89.     }
  90.     while (*sptr != 0) {
  91.         cnt++;
  92.         sptr = (void**)*sptr;
  93.     }
  94.     return (cnt);
  95. }
  96.