����14-16 linux/include/asm/segment.h
//// ��ȡfs����ָ����ַ�����ֽڡ�
// ������addr - ָ�����ڴ��ַ��
// %0 - (���ص��ֽ�_v)��%1 - (�ڴ��ַaddr)��
// ���أ������ڴ�fs:[addr]�����ֽڡ�
// ��3�ж�����һ���Ĵ�������_v���ñ�������������һ���Ĵ����У��Ա��ڸ�Ч���ʺͲ�����
1 extern inline unsigned char get_fs_byte(const char * addr)
2 {
3 unsigned register char _v;
4
5 __asm__ ("movb %%fs:%1,%0":"=r" (_v):"m" (*addr));
6 return _v;
7 }
8
//// ��ȡfs����ָ����ַ�����֡�
// ������addr - ָ�����ڴ��ַ��
// %0 - (���ص���_v)��%1 - (�ڴ��ַaddr)��
// ���أ������ڴ�fs:[addr]�����֡�
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
//// ��ȡfs����ָ����ַ���ij���(4�ֽ�)��
// ������addr - ָ�����ڴ��ַ��
// %0 - (���صij���_v)��%1 - (�ڴ��ַaddr)��
// ���أ������ڴ�fs:[addr]���ij��֡�
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
//// ��һ�ֽڴ����fs����ָ���ڴ��ַ����
// ������val - �ֽ�ֵ��addr - �ڴ��ַ��
// %0 - �Ĵ���(�ֽ�ֵval)��%1 - (�ڴ��ַaddr)��
25 extern inline void put_fs_byte(char val,char *addr)
26 {
27 __asm__ ("movb %0,%%fs:%1"::"r" (val),"m" (*addr));
28 }
29
//// ��һ�ִ����fs����ָ���ڴ��ַ����
// ������val - ��ֵ��addr - �ڴ��ַ��
// %0 - �Ĵ���(��ֵval)��%1 - (�ڴ��ַaddr)��
30 extern inline void put_fs_word(short val,short * addr)
31 {
32 __asm__ ("movw %0,%%fs:%1"::"r" (val),"m" (*addr));
33 }
34
//// ��һ���ִ����fs����ָ���ڴ��ַ����
// ������val - ����ֵ��addr - �ڴ��ַ��
// %0 - �Ĵ���(����ֵval)��%1 - (�ڴ��ַaddr)��
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 /*
41 * Someone who knows GNU asm better than I should double check the followig.
42 * It seems to work, but I don't know if I'm doing something subtly wrong.
43 * --- TYT, 11/24/91
44 * [ nothing wrong here, Linus ]
45 */
/*
* ���Ҹ���GNU������Ӧ����ϸ�������Ĵ��롣��Щ������ʹ�ã����Ҳ�֪���Ƿ�
* ����һЩС����
* --- TYT��1991��11��24��
* [ ��Щ����û�д���Linus ]
*/
46
//// ȡfs�μĴ���ֵ(ѡ���)��
// ���أ�fs�μĴ���ֵ��
47 extern inline unsigned long get_fs()
48 {
49 unsigned short _v;
50 __asm__("mov %%fs,%%ax":"=a" (_v):);
51 return _v;
52 }
53
//// ȡds�μĴ���ֵ��
// ���أ�ds�μĴ���ֵ��
54 extern inline unsigned long get_ds()
55 {
56 unsigned short _v;
57 __asm__("mov %%ds,%%ax":"=a" (_v):);
58 return _v;
59 }
60
//// ����fs�μĴ�����
// ������val - ��ֵ��ѡ�������
61 extern inline void set_fs(unsigned long val)
62 {
63 __asm__("mov %0,%%fs"::"a" ((unsigned short) val));
64 }
65
66