Subversion Repositories Kolibri OS

Rev

Rev 1906 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* default reentrant pointer when multithread enabled */
  2.  
  3. #include <_ansi.h>
  4. #include <string.h>
  5. #include <reent.h>
  6.  
  7. static inline
  8. void *user_alloc(int size)
  9. {
  10.     void  *val;
  11.     __asm__ __volatile__(
  12.     "int $0x40"
  13.     :"=eax"(val)
  14.     :"a"(68),"b"(12),"c"(size));
  15.     return val;
  16. }
  17.  
  18. void init_reent()
  19. {
  20.     struct _reent *ent;
  21.  
  22.     ent = user_alloc(sizeof(struct _reent));
  23.  
  24.     _REENT_INIT_PTR(ent);
  25.  
  26.     __asm__ __volatile__(
  27.     "movl %0, %%fs:12"
  28.     ::"r"(ent));
  29.     __sinit(ent);
  30. }
  31.  
  32. void init_global_reent()
  33. {
  34.     struct _reent *ent;
  35.  
  36.     ent =_GLOBAL_REENT;
  37.  
  38.     _REENT_INIT_PTR(ent);
  39.  
  40.     __asm__ __volatile__(
  41.     "movl %0, %%fs:12"
  42.     ::"r"(ent));
  43.     __sinit(ent);
  44. }
  45.  
  46.  
  47. void __mutex_lock(volatile int *val)
  48. {
  49.     int tmp;
  50.  
  51.     __asm__ __volatile__ (
  52. "0:\n\t"
  53.     "mov %0, %1\n\t"
  54.     "testl %1, %1\n\t"
  55.     "jz 1f\n\t"
  56.  
  57.     "movl $68, %%eax\n\t"
  58.     "movl $1,  %%ebx\n\t"
  59.     "int  $0x40\n\t"
  60.     "jmp 0b\n\t"
  61. "1:\n\t"
  62.     "incl %1\n\t"
  63.     "xchgl %0, %1\n\t"
  64.     "testl %1, %1\n\t"
  65.         "jnz 0b\n"
  66.     : "+m" (*val), "=&r"(tmp)
  67.     ::"eax","ebx" );
  68. }
  69.