����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