Subversion Repositories Kolibri OS

Rev

Rev 1693 | 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.  
  33.  
  34. void __mutex_lock(volatile int *val)
  35. {
  36.     int tmp;
  37.  
  38.     __asm__ __volatile__ (
  39. "0:\n\t"
  40.     "mov %0, %1\n\t"
  41.     "testl %1, %1\n\t"
  42.     "jz 1f\n\t"
  43.  
  44.     "movl $68, %%eax\n\t"
  45.     "movl $1,  %%ebx\n\t"
  46.     "int  $0x40\n\t"
  47.     "jmp 0b\n\t"
  48. "1:\n\t"
  49.     "incl %1\n\t"
  50.     "xchgl %0, %1\n\t"
  51.     "testl %1, %1\n\t"
  52.         "jnz 0b\n"
  53.     : "+m" (*val), "=&r"(tmp)
  54.     ::"eax","ebx" );
  55. }
  56.