Subversion Repositories Kolibri OS

Rev

Rev 1906 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1693 serge 1
/* default reentrant pointer when multithread enabled */
2
 
3
#include <_ansi.h>
4
#include 
5
#include 
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__(
1906 serge 27
    "movl %0, %%fs:12"
1693 serge 28
    ::"r"(ent));
29
    __sinit(ent);
30
}
31
 
3065 serge 32
void init_global_reent()
33
{
34
    struct _reent *ent;
1693 serge 35
 
3065 serge 36
    ent =_GLOBAL_REENT;
1693 serge 37
 
3065 serge 38
    _REENT_INIT_PTR(ent);
39
 
40
    __asm__ __volatile__(
41
    "movl %0, %%fs:12"
42
    ::"r"(ent));
43
    __sinit(ent);
44
}
45
 
46
 
1693 serge 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
}