This source file includes following definitions.
- get_fs_byte
- get_fs_word
- get_fs_long
- put_fs_byte
- put_fs_word
- put_fs_long
- memcpy_tofs
- memcpy_fromfs
- get_fs
- get_ds
- set_fs
1 extern inline unsigned char get_fs_byte(const char * addr)
2 {
3 unsigned register char _v;
4
5 __asm__ ("movb %%fs:%1,%0":"=q" (_v):"m" (*addr));
6 return _v;
7 }
8
9 extern inline unsigned short get_fs_word(const unsigned short *addr)
10 {
11 unsigned short _v;
12
13 __asm__ ("movw %%fs:%1,%0":"=r" (_v):"m" (*addr));
14 return _v;
15 }
16
17 extern inline unsigned long get_fs_long(const unsigned long *addr)
18 {
19 unsigned long _v;
20
21 __asm__ ("movl %%fs:%1,%0":"=r" (_v):"m" (*addr)); \
22 return _v;
23 }
24
25 extern inline void put_fs_byte(char val,char *addr)
26 {
27 __asm__ ("movb %0,%%fs:%1"::"q" (val),"m" (*addr));
28 }
29
30 extern inline void put_fs_word(short val,short * addr)
31 {
32 __asm__ ("movw %0,%%fs:%1"::"r" (val),"m" (*addr));
33 }
34
35 extern inline void put_fs_long(unsigned long val,unsigned long * addr)
36 {
37 __asm__ ("movl %0,%%fs:%1"::"r" (val),"m" (*addr));
38 }
39
40 extern inline void memcpy_tofs(void * to, void * from, unsigned long n)
41 {
42 __asm__("cld\n\t"
43 "push %%es\n\t"
44 "push %%fs\n\t"
45 "pop %%es\n\t"
46 "testb $1,%%cl\n\t"
47 "je 1f\n\t"
48 "movsb\n"
49 "1:\ttestb $2,%%cl\n\t"
50 "je 2f\n\t"
51 "movsw\n"
52 "2:\tshrl $2,%%ecx\n\t"
53 "rep ; movsl\n\t"
54 "pop %%es"
55 ::"c" (n),"D" ((long) to),"S" ((long) from)
56 :"cx","di","si");
57 }
58
59 extern inline void memcpy_fromfs(void * to, void * from, unsigned long n)
60 {
61 __asm__("cld\n\t"
62 "testb $1,%%cl\n\t"
63 "je 1f\n\t"
64 "fs ; movsb\n"
65 "1:\ttestb $2,%%cl\n\t"
66 "je 2f\n\t"
67 "fs ; movsw\n"
68 "2:\tshrl $2,%%ecx\n\t"
69 "rep ; fs ; movsl"
70 ::"c" (n),"D" ((long) to),"S" ((long) from)
71 :"cx","di","si");
72 }
73
74
75
76
77
78
79
80
81 extern inline unsigned long get_fs()
82 {
83 unsigned short _v;
84 __asm__("mov %%fs,%0":"=r" (_v):);
85 return _v;
86 }
87
88 extern inline unsigned long get_ds()
89 {
90 unsigned short _v;
91 __asm__("mov %%ds,%0":"=r" (_v):);
92 return _v;
93 }
94
95 extern inline void set_fs(unsigned long val)
96 {
97 __asm__ __volatile__("mov %0,%%fs"::"r" ((unsigned short) val));
98 }
99