����14-17 linux/include/asm/system.h


    //// �ƶ����û�ģʽ���С�

    // �ú�������iretָ��ʵ�ִ��ں�ģʽ�ƶ�����ʼ����0��ȥִ�С�

  1 #define move_to_user_mode() \

  2 __asm__ ("movl %%esp,%%eax\n\t" \      // �����ջָ��esp��eax�Ĵ����С�

  3         "pushl $0x17\n\t" \            // ���Ƚ���ջ��ѡ���(SS)��ջ��

  4         "pushl %%eax\n\t" \            // Ȼ�󽫱���Ķ�ջָ��ֵ(esp)��ջ��

  5         "pushfl\n\t" \                 // ����־�Ĵ���(eflags)������ջ��

  6         "pushl $0x0f\n\t" \            // ��Task0�����ѡ���(cs)��ջ��

  7         "pushl $1f\n\t" \              // ��������1��ƫ�Ƶ�ַ(eip)��ջ��

  8         "iret\n" \                     // ִ���жϷ���ָ������ת��������1����

  9         "1:\tmovl $0x17,%%eax\n\t" \   // ��ʱ��ʼִ������0��

 10         "movw %%ax,%%ds\n\t" \         // ��ʼ���μĴ���ָ�򱾾ֲ��������ݶΡ�

 11         "movw %%ax,%%es\n\t" \

 12         "movw %%ax,%%fs\n\t" \

 13         "movw %%ax,%%gs" \

 14         :::"ax")

 15

 16 #define sti() __asm__ ("sti"::)        // ���ж�Ƕ����꺯����

 17 #define cli() __asm__ ("cli"::)        // ���жϡ�

 18 #define nop() __asm__ ("nop"::)        // �ղ�����

 19

 20 #define iret() __asm__ ("iret"::)      // �жϷ��ء�

 21

    //// �������������ꡣ

    // ���ݲ����е��жϻ��쳣�������̵�ַaddr��������������type����Ȩ����Ϣdpl������λ��

    // ��ַgate_addr����������������ע�⣺���桰ƫ�ơ�ֵ��������ں˴�������ݶ���˵�ģ���

    // ������gate_addr -��������ַ��type -������������ֵ��dpl -��������Ȩ����addr -ƫ�Ƶ�ַ��

    // %0 - (��dpl,type��ϳɵ����ͱ�־��)��%1 - (��������4�ֽڵ�ַ)��

    // %2 - (��������4�ֽڵ�ַ)��%3 - edx(����ƫ�Ƶ�ַaddr)��%4 - eax(�����к��ж�ѡ���0x8)��

 22 #define _set_gate(gate_addr,type,dpl,addr) \

 23 __asm__ ("movw %%dx,%%ax\n\t" \        // ��ƫ�Ƶ�ַ������ѡ�����ϳ���������4�ֽ�(eax)��

 24         "movw %0,%%dx\n\t" \           // �����ͱ�־����ƫ�Ƹ�����ϳ���������4�ֽ�(edx)��

 25         "movl %%eax,%1\n\t" \          // �ֱ��������������ĵ�4�ֽں͸�4�ֽڡ�

 26         "movl %%edx,%2" \

 27         : \

 28         : "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \

 29         "o" (*((char *) (gate_addr))), \

 30         "o" (*(4+(char *) (gate_addr))), \

 31         "d" ((char *) (addr)),"a" (0x00080000))

 32

    //// �����ж��ź������Զ����������жϣ���

    // ������n - �жϺţ�addr - �жϳ���ƫ�Ƶ�ַ��

    // &idt[n]���ж������������жϺ�n��Ӧ���ƫ��ֵ���ж���������������14����Ȩ����0��

 33 #define set_intr_gate(n,addr) \

 34         _set_gate(&idt[n],14,0,addr)

 35

    //// ���������ź�����

    // ������n - �жϺţ�addr - �жϳ���ƫ�Ƶ�ַ��

    // &idt[n]���ж������������жϺ�n��Ӧ���ƫ��ֵ���ж���������������15����Ȩ����0��

 36 #define set_trap_gate(n,addr) \

 37         _set_gate(&idt[n],15,0,addr)

 38

    //// ����ϵͳ�����ź�����

    // ����set_trap_gate()���õ�����������Ȩ��Ϊ0����������3�����set_system_gate()���õ�

    // �жϴ��������ܹ������г���ִ�С����絥�����ԡ���������ͱ߽糬������������

    // ������n - �жϺţ�addr - �жϳ���ƫ�Ƶ�ַ��

    // &idt[n]���ж������������жϺ�n��Ӧ���ƫ��ֵ���ж���������������15����Ȩ����3��

 39 #define set_system_gate(n,addr) \

 40         _set_gate(&idt[n],15,3,addr)

 41

    //// ���ö��������������ں���û���õ�����

    // ������gate_addr -��������ַ��type -��������������ֵ��dpl -��������Ȩ��ֵ��

    // base - �εĻ���ַ��limit - ���޳���

    // ��μ����������ĸ�ʽ��ע�⣬���︳ֵ����Ū���ˡ�43��Ӧ���� *((gate_addr)+1)����

    // 49�в��� *(gate_addr)�������ں˴�����û���õ�����꣬����Linusû�в�� :-)

 42 #define _set_seg_desc(gate_addr,type,dpl,base,limit) {\

 43         *(gate_addr) = ((base) & 0xff000000) | \             // ��������4�ֽڡ�

 44                 (((base) & 0x00ff0000)>>16) | \

 45                 ((limit) & 0xf0000) | \

 46                 ((dpl)<<13) | \

 47                 (0x00408000) | \

 48                 ((type)<<8); \

 49         *((gate_addr)+1) = (((base) & 0x0000ffff)<<16) | \   // ��������4�ֽڡ�

 50                 ((limit) & 0x0ffff); }

 51

    //// ��ȫ�ֱ�����������״̬��/�ֲ�����������״̬�κ;ֲ����εij��Ⱦ������ó�104�ֽڡ�

    // ������n - ��ȫ�ֱ�����������n����Ӧ�ĵ�ַ��addr - ״̬��/�ֲ��������ڴ�Ļ���ַ��

    //       type - �������еı�־�����ֽڡ�

    // %0 - eax(��ַaddr)��%1 - (��������n�ĵ�ַ)��%2 - (��������n�ĵ�ַƫ��2��)��

    // %3 - (��������n�ĵ�ַƫ��4��)��%4 - (��������n�ĵ�ַƫ��5��)��

    // %5 - (��������n�ĵ�ַƫ��6��)��%6 - (��������n�ĵ�ַƫ��7��)��

 52 #define _set_tssldt_desc(n,addr,type) \

 53 __asm__ ("movw $104,%1\n\t" \          // ��TSS����LDT�����ȷ���������������(��0-1�ֽ�)��

 54         "movw %%ax,%2\n\t" \           // ������ַ�ĵ��ַ�����������2-3�ֽڡ�

 55         "rorl $16,%%eax\n\t" \         // ������ַ������ѭ������ax�У������������ִ�����

 56         "movb %%al,%3\n\t" \           // ������ַ�����е��ֽ�������������4�ֽڡ�

 57         "movb $" type ",%4\n\t" \      // ����־�����ֽ������������ĵ�5�ֽڡ�

 58         "movb $0x00,%5\n\t" \          // �������ĵ�6�ֽ���0��

 59         "movb %%ah,%6\n\t" \           // ������ַ�����и��ֽ�������������7�ֽڡ�

 60         "rorl $16,%%eax" \             // ����ѭ��16���أ�eax�ָ�ԭֵ��

 61         ::"a" (addr), "m" (*(n)), "m" (*(n+2)), "m" (*(n+4)), \

 62          "m" (*(n+5)), "m" (*(n+6)), "m" (*(n+7)) \

 63         )

 64

    //// ��ȫ�ֱ�����������״̬����������

    // n - �Ǹ���������ָ�룻addr - �����������жεĻ���ֵַ������״̬����������������0x89��

 65 #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x89")

    //// ��ȫ�ֱ������þֲ�����������

    // n - �Ǹ���������ָ�룻addr - �����������жεĻ���ֵַ���ֲ�������������������0x82��

 66 #define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x82")

 67