desc.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ARCH_DESC_H
  2. #define __ARCH_DESC_H
  3. #include <asm/ldt.h>
  4. /*
  5.  * The layout of the GDT under Linux:
  6.  *
  7.  *   0 - null
  8.  *   1 - not used
  9.  *   2 - kernel code segment
  10.  *   3 - kernel data segment
  11.  *   4 - user code segment                  <-- new cacheline 
  12.  *   5 - user data segment
  13.  *   6 - not used
  14.  *   7 - not used
  15.  *   8 - APM BIOS support                   <-- new cacheline 
  16.  *   9 - APM BIOS support
  17.  *  10 - APM BIOS support
  18.  *  11 - APM BIOS support
  19.  *
  20.  * The TSS+LDT descriptors are spread out a bit so that every CPU
  21.  * has an exclusive cacheline for the per-CPU TSS and LDT:
  22.  *
  23.  *  12 - CPU#0 TSS                          <-- new cacheline 
  24.  *  13 - CPU#0 LDT
  25.  *  14 - not used 
  26.  *  15 - not used 
  27.  *  16 - CPU#1 TSS                          <-- new cacheline 
  28.  *  17 - CPU#1 LDT
  29.  *  18 - not used 
  30.  *  19 - not used 
  31.  *  ... NR_CPUS per-CPU TSS+LDT's if on SMP
  32.  *
  33.  * Entry into gdt where to find first TSS.
  34.  */
  35. #define __FIRST_TSS_ENTRY 12
  36. #define __FIRST_LDT_ENTRY (__FIRST_TSS_ENTRY+1)
  37. #define __TSS(n) (((n)<<2) + __FIRST_TSS_ENTRY)
  38. #define __LDT(n) (((n)<<2) + __FIRST_LDT_ENTRY)
  39. #ifndef __ASSEMBLY__
  40. struct desc_struct {
  41. unsigned long a,b;
  42. };
  43. extern struct desc_struct gdt_table[];
  44. extern struct desc_struct *idt, *gdt;
  45. struct Xgt_desc_struct {
  46. unsigned short size;
  47. unsigned long address __attribute__((packed));
  48. };
  49. #define idt_descr (*(struct Xgt_desc_struct *)((char *)&idt - 2))
  50. #define gdt_descr (*(struct Xgt_desc_struct *)((char *)&gdt - 2))
  51. #define load_TR(n) __asm__ __volatile__("ltr %%ax"::"a" (__TSS(n)<<3))
  52. #define __load_LDT(n) __asm__ __volatile__("lldt %%ax"::"a" (__LDT(n)<<3))
  53. /*
  54.  * This is the ldt that every process will get unless we need
  55.  * something other than this.
  56.  */
  57. extern struct desc_struct default_ldt[];
  58. extern void set_intr_gate(unsigned int irq, void * addr);
  59. extern void set_ldt_desc(unsigned int n, void *addr, unsigned int size);
  60. extern void set_tss_desc(unsigned int n, void *addr);
  61. static inline void clear_LDT(void)
  62. {
  63. int cpu = smp_processor_id();
  64. set_ldt_desc(cpu, &default_ldt[0], 5);
  65. __load_LDT(cpu);
  66. }
  67. /*
  68.  * load one particular LDT into the current CPU
  69.  */
  70. static inline void load_LDT (struct mm_struct *mm)
  71. {
  72. int cpu = smp_processor_id();
  73. void *segments = mm->context.segments;
  74. int count = LDT_ENTRIES;
  75. if (!segments) {
  76. segments = &default_ldt[0];
  77. count = 5;
  78. }
  79. set_ldt_desc(cpu, segments, count);
  80. __load_LDT(cpu);
  81. }
  82. #endif /* !__ASSEMBLY__ */
  83. #endif